添加圖形腳本時,圖形框框架參考會“丟失”。我正在嘗試繪製一個簡單的 Wafermap,它適用於以下代碼。
但是,當我用變量代替數字時,我得到一個缺少的參考錯誤,並且我一生都無法理解為什麼會發生這種情況。 我需要一些 JSL 專家的智慧 
F_makeWaferMap = function({myScale, myWhiteSpace, myWaferDiameter},{},
myKeepOutZone = 2000;
myGraphBox = graphBox(
frameSize( (myWaferDiameter/2)/myScale, (myWaferDiameter/2)/myScale ),
xScale( -myWhiteSpace, myWaferDiameter + myWhiteSpace),
yScale( -myWhiteSpace, myWaferDiameter + myWhiteSpace)
);
frame = myGraphBox[FrameBox(1)];
frame << Add Graphics Script(penColor( "red" ); circle( {150000,150000}, 150000));
frame << Add Graphics Script(penColor( "red" ); circle( {150000,150000}, 150000-2000));
return(myGraphBox);
);
myWmDispObj = F_makeWaferMap(200, 20000, 300000); // Scale, Whitespace, Wafer Diameter
newWindow("Test", vListBox(myWmDispObj));
正如您從日誌中看到的那樣,我很高興引用 Frame Box:</CODE></P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="thickey_1-1647940813033.png" style="width: 400px;"><IMG src="https://us.v-cdn.net/6038925/uploads/images/41020iDC2927C13A39326F/thickey_1-1647940813033.png" role="button" title="thickey_1-1647940813033.png" alt="Thickey_1-1647940813033.png" /></SPAN></P><P><CODE class=" language-jsl">
所以,現在讓我們替換一些變量。
frame << Add Graphics Script(penColor( "red" ); circle( {myWaferDiameter/2, myWaferDiameter/2}, myWaferDiameter/2));
frame << Add Graphics Script(penColor( "red" ); circle( {myWaferDiameter/2, myWaferDiameter/2}, (myWaferDiameter/2) - myKeepOutZone));我收到以下錯誤,表明當我嘗試將傳入的變量添加到框架框中時,我丟失了對傳入變量的引用。

我很難過:)
腳本回复:添加圖形腳本時,圖形框框架參考會“丟失”。你可能不得不使用一些 Eval(EvalExpr()) 魔法使用 Eval Insert、Eval Expr、Parse 和 Substitute 將一個表達式插入另一個表達式
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));回复:添加圖形腳本時,圖形框框架參考會“丟失”。嗨 Jarmo,是的,我可以簡單地做一個 eval(parse()),將我的變量替換為要轉換為 JSL 的字符串,但在我看來,這不是“正確”的方式。 當然,有一種更“直接”的方式來實現這一點。
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));回复:添加圖形腳本時,圖形框框架參考會“丟失”。如果可以通過使用 Eval(EvalExpr()) 或替代來避免(在這種情況下可以),我永遠不會使用 Evil(Parse())。 至少我不知道除了這些之外的任何其他方法(或者如果我知道它們會更複雜),我如何用值替換某些平台/jmp 函數中的值(如公式中的值)。 我首選的方法是 EvalExpr(),因為它相當容易調試,並且仍然可以在腳本編輯器中突出顯示 JSL(解析方法不會)。
Names Default To Here(1);
F_makeWaferMap = function({myScale, myWhiteSpace, myWaferDiameter},{},
myKeepOutZone = 2000;
myGraphBox = graphBox(
frameSize( (myWaferDiameter/2)/myScale, (myWaferDiameter/2)/myScale ),
xScale( -myWhiteSpace, myWaferDiameter + myWhiteSpace),
yScale( -myWhiteSpace, myWaferDiameter + myWhiteSpace)
);
frame = myGraphBox[FrameBox(1)];
expr_sub = Substitute(
Expr(frame << Add Graphics Script(
penColor("red");
circle({myWaferDiameter/2, myWaferDiameter/2}, myWaferDiameter/2)
)),
Expr(myWaferDiameter),
myWaferDiameter
);
expr_evalexpr = EvalExpr(
frame << Add Graphics Script(
penColor( "red" );
circle({Expr(myWaferDiameter)/2, Expr(myWaferDiameter)/2}, (Expr(myWaferDiameter)/2) - Expr(myKeepOutZone)));
);
show(expr_sub);
show(expr_evalexpr);
Eval(expr_sub);
Eval(expr_evalexpr);
return(myGraphBox);
);
myWmDispObj = F_makeWaferMap(200, 20000, 300000); // Scale, Whitespace, Wafer Diameter
newWindow("Test", vListBox(myWmDispObj));
Show(myWmDispObj << Get Graphics Script);回复:添加圖形腳本時,圖形框框架參考會“丟失”。參數晶圓直徑在函數中MakeWaferMap僅在函數運行時存在。 稍後,當圖形重繪並嘗試使用它時,提供給 <
我也喜歡 eval(evalexpr( ... expr() ... expr() ... ) ) 將瞬態變量轉換成石頭的方法,主要是因為 JSL 編輯器仍將對 ( 和)。
回复:添加圖形腳本時,圖形框框架參考會“丟失”。您好,我不確定為什麼會這樣,但希望您能提供任何見解。 似乎如果您在函數中設置另一個變量(在本例中為 myWaferDiameter1),它似乎可以很好地傳遞給幀消息?
Names Default to Here( 1 );
F_makeWaferMap = function({myScale, myWhiteSpace, myWaferDiameter},{},
myWaferDiameter1 = myWaferDiameter; //new variable here?
myKeepOutZone = 2000;
<BR /> //Use myWaferDiameter1 instead
myGraphBox = graphBox(
frameSize( (myWaferDiameter1/2)/myScale, (myWaferDiameter1/2)/myScale ),
xScale( -myWhiteSpace, myWaferDiameter1 + myWhiteSpace),
yScale( -myWhiteSpace, myWaferDiameter1 + myWhiteSpace)
);
frame = myGraphBox[FrameBox(1)];<BR />
frame << Add Graphics Script(penColor( "red" ); circle( {myWaferDiameter1/2, myWaferDiameter1/2}, myWaferDiameter1/2));
frame << Add Graphics Script(penColor( "red" ); circle( {myWaferDiameter1/2, myWaferDiameter1/2}, (myWaferDiameter1/2) - myKeepOutZone));
return(myGraphBox);
);
myWmDispObj = F_makeWaferMap( 200, 20000, 300000 ); // Scale, Whitespace, Wafer Diameter
newWindow("Test", vListBox( myWmDispObj ));回复:添加圖形腳本時,圖形框框架參考會“丟失”。約瑟夫,我也注意到了這一點,但和你一樣,我不明白為什麼本地(函數)生成的變量有效,而傳入的變量無效。 五、有趣。
回复:添加圖形腳本時,圖形框框架參考會“丟失”。你好@Joseph_Reese ,
這是因為在函數內部定義的變量默認情況下不是該函數的本地變量。 如果您之前使用 delete symbols() 並在運行該腳本後顯示 symbols(),您會發現 myWaferDiameter1 現在是一個全局變量。 每當編寫函數時,出於這個原因,我建議使用 {defaultlocal} 作為第二個參數,或者在該參數中命名函數中創建的所有變量,以便它們都是該函數調用的本地變量。如果您使用默認本地,您會發現錯誤再次出現,因為在繪製圖形時變量不再存在。作為@jthi指出,您可以通過評估函數上下文中的變量然後將值傳遞給圖形來解決此問題。 作為@Craige_Hales建議,一旦函數完成運行,函數的參數也會被刪除,這就是導致原始問題的原因。
所以,對於原來的問題@thickey :
在原始示例中,當在函數中使用局部變量或作為函數的參數時,值 myWaferDiameter 存在於函數的本地命名空間中,直到函數完成運行,然後將其從內存中刪除。由於直到函數完成運行後才繪製圖形,因此無法訪問變量的值。 要解決這個問題,請在函數的上下文中評估變量。我也更喜歡這樣做的方法@jthi描述:
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));
當一個變量在函數中定義為全局變量時,該變量會一直存在,直到它被刪除(例如使用 delete symbols())或直到重新啟動 JMP。 因此,當函數完成後繪製窗口時,它仍然可以訪問該變量。 這是一個解決方案,但它更有可能在未來的代碼中導致錯誤,因為不同的窗口或腳本可能會意外地相互交互。
PS:作為我自己的願望清單項目的無恥插件,我認為通過引入一個新功能可以使在正確的上下文中評估 myWaferDiamer 更加直觀:引入 Eval Expr First() 作為 Eval( Eval Expr( ... ) ) 的新包裝器