グラフィックスクリプトを追加すると、グラフボックスのフレーム参照が「失われ」ます。次のコードで正常に動作する単純な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));
ログからわかるように、私はフレームボックスを喜んで参照しています。</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="厚さ_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));そして、次のエラーが発生します。これは、渡された変数をフレームボックスに追加しようとしたときに、渡された変数への参照が失われたことを示しています。

私は困惑しています:)
スクリプティングRe:グラフィックスクリプトを追加すると、グラフボックスのフレーム参照が「失われ」ます。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);
);
));Re:グラフィックスクリプトを追加すると、グラフボックスのフレーム参照が「失われ」ます。こんにちはJarmo、はい、私は単にeval(parse())を実行して、変数を文字列に置き換えてJSLに変換することができますが、それは私の意見では「適切な」方法ではありません。 確かに、これにはもっと「直接的な」方法でのメカニズムがあります。
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));Re:グラフィックスクリプトを追加すると、グラフボックスのフレーム参照が「失われ」ます。Eval(EvalExpr())またはsubstituteを使用して回避できる(この場合は回避できる)場合は、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);Re:グラフィックスクリプトを追加すると、グラフボックスのフレーム参照が「失われ」ます。パラメータWaferDiameter関数内MakeWaferMap関数の実行中にのみ存在します。 << addGraphicsScriptに提供された数式は、後でグラフが再描画されて使用しようとしたときに、その変数に不満を抱きます。
また、一時変数を石にキャストするためのeval(evalexpr(... expr()... expr()...))メソッドも気に入っています。これは主に、JSLエディターが(および)。
Re:グラフィックスクリプトを追加すると、グラフボックスのフレーム参照が「失われ」ます。こんにちは、なぜこれが機能するのか正確にはわかりませんが、洞察をいただければ幸いです。 関数に別の変数(この場合は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 ));Re:グラフィックスクリプトを追加すると、グラフボックスのフレーム参照が「失われ」ます。ジョセフ、私もこれに気づきましたが、あなたのように、ローカルで(関数に対して)生成された変数が機能するのに、渡された変数が機能しない理由がわかりません。 V.おもしろい。
Re:グラフィックスクリプトを追加すると、グラフボックスのフレーム参照が「失われ」ます。こんにちは@Joseph_Reese 、
これが機能するのは、関数内で定義された変数が、デフォルトではその関数に対してローカルではないためです。 そのスクリプトの実行前にdeletesymbols()を使用し、実行後にshow symbol()を使用すると、myWaferDiameter1がグローバル変数になっていることがわかります。 関数を作成するときは常に、この理由から2番目の引数として{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 symbol()を使用して)、またはJMPが再起動されるまで存在します。 したがって、関数の終了後にウィンドウが描画されても、変数にアクセスできます。 これは解決策ですが、異なるウィンドウまたはスクリプトが予期せず相互作用する可能性があるため、将来のコードでエラーが発生する可能性が高くなります。
PS:私自身のウィッシュリストアイテムの恥知らずなプラグとして、新しい関数を導入することで、myWaferDiamerを正しいコンテキストで評価することを少し直感的にすることができると思います。 Eval(Eval Expr(...))の新しいラッパーとしてEval Expr First()を導入します