添加图形脚本时,图形框框架参考会“丢失”。我正在尝试绘制一个简单的晶圆图,它可以与以下代码配合使用。
然而,当我用变量代替数字时,我得到了一个丢失参考错误,并且我一生都无法理解为什么会发生这种情况。 我需要一些 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);
);
));