Die Rahmenreferenz des Diagrammfelds geht verloren, wenn ein Grafikskript hinzugefügt wird.Ich versuche, eine einfache Wafermap zu zeichnen, die mit dem folgenden Code gut funktioniert.
Wenn ich jedoch die Zahlen durch Variablen ersetze, erhalte ich einen fehlenden Referenzfehler und kann für mein ganzes Leben nicht verstehen, warum dies geschieht. Ich brauche etwas JSL Expert Wisdom 
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));
Ich verweise gerne auf die Frame Box, wie Sie dem Protokoll entnehmen können:</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="dickey_1-1647940813033.png" /></SPAN></P><P><CODE class=" language-jsl">
Lassen Sie uns nun einige Variablen ersetzen.
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));Und ich erhalte den folgenden Fehler, was darauf hindeutet, dass ich den Verweis auf meine übergebenen Variablen verloren habe, wenn ich versuche, sie der Rahmenbox hinzuzufügen.

Ich bin ratlos 
SkripterstellungRe: Graph Box Frame Reference geht 'verloren' wenn man ein Grafikskript hinzufügt.Möglicherweise müssen Sie etwas Eval(EvalExpr())-Magie verwenden Fügen Sie mit Eval Insert, Eval Expr, Parse und Substitute einen Ausdruck in einen anderen ein
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));Re: Graph Box Frame Reference geht 'verloren' wenn man ein Grafikskript hinzufügt.Hallo Jarmo, ja, ich kann einfach ein eval(parse()) machen, indem ich meine Variable in die Zeichenfolge einsetze, die in JSL konvertiert werden soll, aber das ist meiner Meinung nach nicht der 'richtige' Weg. Sicherlich gibt es dafür einen Mechanismus auf eine „direktere“ Weise.
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));Re: Graph Box Frame Reference geht 'verloren' wenn man ein Grafikskript hinzufügt.Ich würde niemals Evil(Parse()) verwenden, wenn es vermieden werden kann (und in diesem Fall kann es sein), indem ich Eval(EvalExpr()) oder Ersatz verwende. Zumindest kenne ich außer diesen keine anderen Methoden (oder wenn ich sie tue, sind sie komplizierter), wie ich Werte in einigen Plattformen/jmp-Funktionen durch Werte ersetzen könnte (wie in Formeln). Meine bevorzugte Methode ist EvalExpr(), da es ziemlich einfach zu debuggen ist und Sie immer noch JSL-Hervorhebungen im Skripteditor erhalten (Parse-Methode wird nicht verwendet).
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: Graph Box Frame Reference geht 'verloren' wenn man ein Grafikskript hinzufügt.Der Parameter WaferDurchmesser in der Funktion MakeWaferMap existiert nur, während die Funktion ausgeführt wird. Die an <
Ich mag auch die Methode eval(evalexpr( ... expr() ... expr() ... ) ) zum Umwandeln der transienten Variablen in Stein, vor allem, weil der JSL-Editor immer noch die gesamte Syntaxprüfung für ( und ).
Re: Graph Box Frame Reference geht 'verloren' wenn man ein Grafikskript hinzufügt.Hallo, ich bin mir nicht ganz sicher, warum das funktioniert, wäre aber für jeden Einblick dankbar. Es scheint, dass, wenn Sie eine andere Variable in Ihrer Funktion setzen (in diesem Fall nur myWaferDiameter1), es scheint, dass es gut an die Frame-Nachrichten übergeben wird?
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: Graph Box Frame Reference geht 'verloren' wenn man ein Grafikscript hinzufügt.Joseph, ich habe das auch bemerkt, aber wie Sie verstehe ich nicht, warum eine lokal (an der Funktion) generierte Variable funktioniert, während eine übergebene nicht funktioniert. V.Interessant.
Re: Graph Box Frame Reference geht 'verloren' wenn man ein Grafikskript hinzufügt.Hallo @Joseph_Reese ,
Dies funktioniert, weil innerhalb der Funktion definierte Variablen standardmäßig nicht lokal für diese Funktion sind. Wenn Sie vor dem Ausführen des Skripts delete Symbols() und nach dem Ausführen des Skripts show Symbols() verwenden, werden Sie feststellen, dass myWaferDiameter1 jetzt eine globale Variable ist. Beim Schreiben von Funktionen empfehle ich aus diesem Grund, {defaultlocal} als zweites Argument zu verwenden oder alle in der Funktion erstellten Variablen in diesem Parameter zu benennen, damit sie alle nur lokal für diesen Funktionsaufruf sind.Wenn Sie default local verwenden, wird der Fehler erneut auftreten, da die Variable beim Zeichnen des Diagramms nicht mehr vorhanden ist.Als @jthi weist darauf hin, dass Sie dies beheben können, indem Sie die Variable im Funktionskontext auswerten und den Wert dann an den Graphen übergeben. Als @Craige_Hales vorgeschlagen, Parameter für die Funktion werden ebenfalls entfernt, sobald die Funktion beendet ist, was das ursprüngliche Problem verursacht hat.
Also, zur Ausgangsfrage von @dicke :
Im ursprünglichen Beispiel und wenn eine lokale Variable in der Funktion oder als Argument für eine Funktion verwendet wird, existiert der Wert myWaferDiameter im lokalen Namespace der Funktion, bis die Funktion beendet ist und zu diesem Zeitpunkt aus dem Speicher entfernt wird.Da der Graph erst gezeichnet wird, nachdem die Funktion beendet ist, kann sie nicht auf den Wert der Variablen zugreifen. Um dies zu lösen, werten Sie die Variable im Kontext der Funktion aus.Ich bevorzuge auch die Methode, dies zu tun @jthi beschrieben:
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));
Wenn eine Variable in der Funktion definiert ist, die eine globale Variable ist, bleibt diese Variable bestehen, bis sie entweder gelöscht wird (z. B. mit delete Symbols()) oder bis JMP neu gestartet wird. Wenn also das Fenster gezeichnet wird, nachdem die Funktion beendet ist, kann es immer noch auf die Variable zugreifen. Das ist eine Lösung, aber es ist wahrscheinlicher, dass es Fehler in zukünftigem Code verursacht, da verschiedene Fenster oder Skripte unerwartet miteinander interagieren könnten.
PS: Als schamloser Plug für meinen eigenen Wunschlistenartikel denke ich, dass die Bewertung von myWaferDiamer im richtigen Kontext durch die Einführung einer neuen Funktion etwas intuitiver gestaltet werden kann: Eval Expr First() als neuen Wrapper für Eval( Eval Expr( ... ) ) einführen