Riquadro grafico Riferimento frame viene "perso" quando si aggiunge uno script grafico.Sto cercando di disegnare una semplice Wafermap che funziona bene con il codice seguente.
Tuttavia, quando sostituisco le variabili con i numeri, ottengo un errore di riferimento mancante e non riesco a capire perché questo sta accadendo. Ho bisogno di un po' di saggezza esperta di 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));
Sto felicemente facendo riferimenti al Frame Box come puoi vedere dal registro:</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="thickey_1-1647940813033.png" /></SPAN></P><P><CODE class=" language-jsl">
Quindi, ora sostituiamo alcune variabili.
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));E ottengo il seguente errore, suggerendo che ho perso il riferimento alle mie variabili passate quando provo ad aggiungerle alla casella del frame.

sono stordito 
SceneggiaturaRe: Il riferimento del frame della casella del grafico viene "perso" quando si aggiunge uno script grafico.Potrebbe essere necessario utilizzare un po' di magia Eval(EvalExpr()). Inserisci un'espressione in un'altra usando Eval Insert, Eval Expr, Parse e Substitute
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));Re: Il riferimento del frame della casella del grafico viene "perso" quando si aggiunge uno script grafico.Ciao Jarmo, sì, posso semplicemente fare un eval(parse()), sostituendo la mia variabile nella stringa da convertire in JSL ma secondo me non è il modo "corretto" di andare .. Sicuramente, c'è un meccanismo per questo in un modo più "diretto".
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));Re: Riquadro grafico Il riferimento del frame viene "perso" quando si aggiunge uno script grafico.Non userei mai Evil(Parse()) se può essere evitato (e in questo caso può essere) usando Eval(EvalExpr()) o sostituendo. Almeno non conosco altri metodi oltre a questi (o se lo faccio sono più complicati), come potrei sostituire i valori in alcune piattaforme/funzioni jmp con valori (come nelle formule). Il mio metodo preferito è EvalExpr() in quanto è abbastanza facile da eseguire il debug e ti dà comunque l'evidenziazione JSL nell'editor di script (il metodo di analisi non lo farà).
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: Il riferimento del frame della casella del grafico viene "perso" quando si aggiunge uno script grafico.Il parametro WaferDiametro nella funzione MakeWaferMap esiste solo mentre la funzione è in esecuzione. La formula fornita a <
Mi piace anche il metodo eval(evalexpr( ... expr() ... expr() ... ) ) per trasformare in pietra le variabili transitorie, principalmente perché l'editor JSL eseguirà comunque tutto il controllo della sintassi per ( e ).
Re: Il riferimento del frame della casella del grafico viene "perso" quando si aggiunge uno script grafico.Ciao, non sono esattamente sicuro del motivo per cui questo funziona, ma apprezzerei qualsiasi approfondimento. Sembra che se imposti un'altra variabile nella tua funzione (in questo caso solo myWaferDiameter1) sembra passare bene ai messaggi di frame?
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: Il riferimento del frame della casella del grafico viene "perso" quando si aggiunge uno script grafico.Joseph, l'ho notato anche io ma come te non capisco perché una variabile generata localmente (alla funzione) funzioni, mentre una passata non funziona. V. Interessante.
Re: Il riferimento del frame della casella del grafico viene "perso" quando si aggiunge uno script grafico.Ciao @Joseph_Reese ,
Questo funziona perché le variabili definite all'interno della funzione non sono, per impostazione predefinita, locali a quella funzione. Se usi delete symbols() prima e mostra symbols() dopo aver eseguito lo script, scoprirai che myWaferDiameter1 è ora una variabile globale. Ogni volta che scrivo funzioni, consiglio di usare {defaultlocal} come secondo argomento per questo motivo, o di nominare tutte le variabili create nella funzione in quel parametro in modo che siano tutte locali solo per quella chiamata di funzione.Se utilizzi il locale predefinito, scoprirai che l'errore riappare poiché la variabile non esiste più quando viene disegnato il grafico.Come @jthi sottolinea, è possibile risolvere questo problema valutando la variabile nel contesto della funzione e quindi passando il valore al grafico. Come @Craige_Hales suggerito, anche i parametri della funzione vengono rimossi al termine dell'esecuzione della funzione, che è ciò che ha causato il problema originale.
Quindi, alla domanda originale di @thickey :
Nell'esempio originale e quando si utilizza una variabile locale nella funzione o come argomento per una funzione, il valore myWaferDiameter esiste nello spazio dei nomi locale della funzione fino al termine dell'esecuzione della funzione, momento in cui viene rimossa dalla memoria.Poiché il grafico non viene disegnato fino al termine dell'esecuzione della funzione, non può accedere al valore della variabile. Per risolvere questo problema, valutare la variabile nel contesto della funzione.Preferisco anche il metodo per farlo @jthi descritto:
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));
Quando una variabile è definita nella funzione che è una variabile globale, tale variabile esiste fino a quando non viene eliminata (usando delete simboli() per esempio) o fino al riavvio di JMP. Quindi, quando la finestra viene disegnata al termine della funzione, può comunque accedere alla variabile. Questo è una soluzione, ma è più probabile che causi errori nel codice futuro poiché finestre o script diversi potrebbero interagire tra loro in modo imprevisto.
PS: Come spina spudorata per il mio articolo della lista dei desideri, penso che valutare myWaferDiamer nel giusto contesto possa essere reso leggermente più intuitivo introducendo una nuova funzione: Introduci Eval Expr First() come nuovo wrapper per Eval( Eval Expr( ... ) )