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

私は困惑しています:)
スクリプティングRe: グラフィック スクリプトを追加すると、グラフ ボックスのフレーム参照が失われます。こんにちは@ジョセフ・リース、
これが機能するのは、関数内で定義された変数がデフォルトではその関数に対してローカルではないためです。 そのスクリプトを実行する前に delete symbols() を使用し、実行後に show symbols() を使用すると、myWaferDiameter1 がグローバル変数になっていることがわかります。 この理由から、関数を記述するときはいつでも、{defaultlocal} を 2 番目の引数として使用することをお勧めします。または、関数で作成されたすべての変数にそのパラメーターで名前を付けて、それらがすべてその関数呼び出しに対してのみローカルになるようにすることをお勧めします。デフォルトのローカルを使用すると、グラフが描画されたときに変数が存在しなくなるため、エラーが再表示されることがわかります。として@jthi関数コンテキストで変数を評価し、値をグラフに渡すことでこれを解決できます。 として@Craige_Hales提案されているように、関数の実行が終了すると、関数のパラメーターも削除されます。これが元の問題の原因です。
だから、からの元の質問に@シックキー:
元の例で、関数内または関数の引数としてローカル変数を使用する場合、値 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( Eval Expr( ... ) ) の新しいラッパーとして Eval Expr First() を導入
Re: グラフィック スクリプトを追加すると、グラフ ボックスのフレーム参照が失われます。ジョセフ、私もこれに気づきましたが、あなたと同じように、ローカルで (関数に対して) 生成された変数が機能するのに、渡された変数が機能しない理由がわかりません。 V.おもしろい。
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: グラフィック スクリプトを追加すると、グラフ ボックスのフレーム参照が失われます。パラメータウェーハ直径関数でMakeWaferMap関数の実行中にのみ存在します。 <
また、一時変数をストーンにキャストするための eval(evalexpr( ... expr() ... expr() ... ) ) メソッドも気に入っています。これは主に、JSL エディターが ( および)。
Re: グラフィック スクリプトを追加すると、グラフ ボックスのフレーム参照が失われます。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);Re: グラフィック スクリプトを追加すると、グラフ ボックスのフレーム参照が失われます。こんにちは、Jarmo さん、はい、単純に eval(parse()) を実行して、変数を文字列に置き換えて JSL に変換することはできますが、私の意見では「適切な」方法ではありません。 確かに、これにはもっと「直接的な」方法のメカニズムがあります。
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));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);
);
));