新增圖形腳本時,圖形框框架參考會「遺失」。我正在嘗試繪製一個簡單的晶圓圖,它可以與以下程式碼配合使用。
然而,當我用變數代替數字時,我得到了一個丟失參考錯誤,我一生都無法理解為什麼會發生這種情況。 我需要一些 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));
我很高興引用框架框,正如您從日誌中看到的那樣:</CODE></P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="thickey_1-1647940813033.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="thickey_1-1647940813033.png" style="width: 347px;"><span class="lia-inline-image-display-wrapper" image-alt="thickey_1-1647940813033.png" style="width: 347px;"><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></SPAN></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));我收到以下錯誤,表明當我嘗試將傳入變數新增至框架框中時,我丟失了對它們的引用。

我很困惑:)
數據探索和視覺化回覆:新增圖形腳本時圖形框框參考「遺失」。你好@約瑟夫_里斯,
這是有效的,因為預設情況下,函數內部定義的變數不是該函數的本地變數。 如果您在運行該腳本之前使用deletesymbols()並在運行該腳本之後showsymbols(),您會發現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);
);
));
當函數中定義的變數為全域變數時,該變數將一直存在,直到被刪除(例如使用刪除符號())或重新啟動 JMP。 因此,當函數完成後繪製視窗時,它仍然可以存取該變數。 這是一個解決方案,但它更有可能在未來的程式碼中導致錯誤,因為不同的視窗或腳本可能會意外地相互互動。
PS:作為我自己的願望清單項目的無恥插件,我認為透過引入一個新函數,在正確的上下文中評估 myWaferDiamer 可以變得更加直觀:引入 Eval Expr First() 作為 Eval( Eval Expr( ... ) ) 的新包裝器
回覆:新增圖形腳本時圖形框框參考「遺失」。約瑟夫,我也注意到了這一點,但和你一樣,我不明白為什麼本地(對函數)產生的變數可以工作,而傳入的變數卻不能。 五、有趣。
回覆:新增圖形腳本時圖形框框參考「遺失」。您好,我不太確定為什麼會這樣,但希望有任何見解。 看來,如果您在函數中設定另一個變數(在本例中只是 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 ));回覆:新增圖形腳本時圖形框框參考「遺失」。參數晶圓直徑在函數中製作晶圓圖僅在函數運行時存在。 當圖形重繪並嘗試使用它時,提供給 <
我也喜歡 eval(evalexpr( ... expr() ... expr() ... ) ) 方法,用於將瞬態變數轉換為石頭,主要是因為 JSL 編輯器仍然會對 ( 和)。
回覆:新增圖形腳本時圖形框框參考「遺失」。如果可以透過使用 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);回覆:新增圖形腳本時圖形框框參考「遺失」。嗨,Jarmo,是的,我可以簡單地執行 eval(parse()),將我的變數替換為要轉換為 JSL 的字串,但在我看來,這不是「正確」的方法。 當然,有一種更「直接」方式的機制。
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));回覆:新增圖形腳本時圖形框框參考「遺失」。您可能需要使用一些 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);
);
));