Die Rahmenreferenz des Diagrammfelds geht beim Hinzufügen eines Grafikskripts „verloren“.Ich versuche, eine einfache Wafermap zu zeichnen, die mit dem folgenden Code gut funktioniert.
Wenn ich jedoch die Zahlen durch Variablen ersetze, erhalte ich die Fehlermeldung „Fehlende Referenz“ und kann beim besten Willen nicht verstehen, warum das passiert. Ich brauche etwas JSL-Expertenwissen 
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;"><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">
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 die folgende Fehlermeldung, die darauf hindeutet, dass ich den Verweis auf meine übergebenen Variablen verloren habe, wenn ich versuche, sie dem Rahmenfeld hinzuzufügen.

Ich bin ratlos 
Datenexploration und -visualisierungBetreff: Die Rahmenreferenz des Diagrammfelds geht beim Hinzufügen eines Grafikskripts „verloren“.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 dieses Skripts delete symbol() verwenden und nach der Ausführung dieses Skripts show symbols() verwenden, werden Sie feststellen, dass myWaferDiameter1 jetzt eine globale Variable ist. Aus diesem Grund empfehle ich beim Schreiben von Funktionen, {defaultlocal} als zweites Argument zu verwenden oder alle in der Funktion erstellten Variablen in diesem Parameter zu benennen, sodass sie alle nur für diesen Funktionsaufruf lokal 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 dieses Problem beheben können, indem Sie die Variable im Funktionskontext auswerten und den Wert dann an das Diagramm übergeben. Als @Craige_Hales Wie vorgeschlagen, werden Parameter der Funktion auch entfernt, sobald die Ausführung der Funktion beendet ist, was das ursprüngliche Problem verursacht hat.
Also, zur ursprünglichen Frage von @thickey :
Im ursprünglichen Beispiel und bei Verwendung einer lokalen Variablen in der Funktion oder als Argument für eine Funktion existiert der Wert myWaferDiameter im lokalen Namespace der Funktion, bis die Funktion ihre Ausführung beendet und dann aus dem Speicher entfernt wird.Da das Diagramm erst nach Abschluss der Funktion gezeichnet wird, kann es nicht auf den Wert der Variablen zugreifen. Um dieses Problem 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 in der Funktion eine Variable definiert wird, bei der es sich um eine globale Variable handelt, bleibt diese Variable bestehen, bis sie entweder gelöscht wird (z. B. mithilfe von delete symbols()) oder bis JMP neu gestartet wird. Wenn das Fenster also nach Abschluss der Funktion gezeichnet wird, kann es weiterhin auf die Variable zugreifen. Das Ist Eine Lösung, aber es ist wahrscheinlicher, dass Fehler in zukünftigem Code auftreten, da verschiedene Fenster oder Skripte unerwartet miteinander interagieren könnten.
PS: Als schamloses Plug-in für meinen eigenen Wunschlisteneintrag denke ich, dass die Evaluierung von myWaferDiamer im richtigen Kontext durch die Einführung einer neuen Funktion etwas intuitiver gestaltet werden kann: Führen Sie Eval Expr First() als neuen Wrapper für Eval( Eval Expr( ... ) ) ein.
Betreff: Die Rahmenreferenz des Diagrammfelds geht beim Hinzufügen eines Grafikskripts „verloren“.Joseph, das ist mir auch aufgefallen, aber wie du verstehe ich nicht, warum eine lokal (für die Funktion) generierte Variable funktioniert, eine übergebene jedoch nicht. V.Interessant.
Betreff: Die Rahmenreferenz des Diagrammfelds geht beim Hinzufügen eines Grafikskripts „verloren“.Hallo, ich bin mir nicht ganz sicher, warum das funktioniert, würde mich aber über Hinweise freuen. Es scheint, dass, wenn Sie eine andere Variable in Ihrer Funktion festlegen (in diesem Fall nur myWaferDiameter1), diese scheinbar problemlos 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 ));Betreff: Die Rahmenreferenz des Diagrammfelds geht beim Hinzufügen eines Grafikskripts „verloren“.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() ... ) ), um die transienten Variablen in Stein zu verwandeln, vor allem, weil der JSL-Editor immer noch die gesamte Syntaxprüfung für ( und durchführt ).
Betreff: Die Rahmenreferenz des Diagrammfelds geht beim Hinzufügen eines Grafikskripts „verloren“.Ich würde Evil(Parse()) niemals verwenden, wenn es durch die Verwendung von Eval(EvalExpr()) oder Ersatz vermieden werden kann (und in diesem Fall ist es möglich). Zumindest kenne ich außer diesen keine anderen Methoden (oder wenn, dann 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 sie relativ einfach zu debuggen ist und Sie dennoch eine JSL-Hervorhebung im Skripteditor erhalten (die Analysemethode 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);Betreff: Die Rahmenreferenz des Diagrammfelds geht beim Hinzufügen eines Grafikskripts „verloren“.Hallo Jarmo, ja, ich kann einfach ein eval(parse()) durchführen und dabei meine Variable in den String ersetzen, der in JSL konvertiert werden soll, aber das ist meiner Meinung nach nicht der „richtige“ Weg. Sicherlich gibt es dafür einen Mechanismus, der „direkter“ ist.
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));Betreff: Die Rahmenreferenz des Diagrammfelds geht beim Hinzufügen eines Grafikskripts „verloren“.Möglicherweise müssen Sie etwas Eval(EvalExpr())-Magie verwenden Fügen Sie einen Ausdruck in einen anderen ein, indem Sie Eval Insert, Eval Expr, Parse und Substitute verwenden
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));