La referencia del marco del cuadro de gráficos se 'pierde' al agregar un script de gráficos.Estoy tratando de dibujar un Wafermap simple que funciona bien con el siguiente código.
Sin embargo, cuando sustituyo las variables por los números, aparece un error de referencia faltante y no puedo entender por qué sucede esto. Necesito un poco de sabiduría experta de 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));
Estoy felizmente haciendo referencias al cuadro de marco como puede ver en el 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="grueso_1-1647940813033.png" /></SPAN></P><P><CODE class=" language-jsl">
Entonces, ahora sustituyamos algunas variables.
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));Y obtengo el siguiente error, lo que sugiere que he perdido la referencia a mis variables pasadas cuando intento agregarlas al cuadro de marco.

Estoy perplejo 
secuencias de comandosRe: La referencia del marco del cuadro de gráficos se 'pierde' al agregar un script de gráficos.Es posible que deba usar algo de magia Eval (EvalExpr ()) Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));Re: La referencia del marco del cuadro de gráficos se 'pierde' al agregar un script de gráficos.Hola, Jarmo, sí, simplemente puedo hacer una evaluación (parse()), sustituyendo mi variable en la cadena para convertirla a JSL, pero en mi opinión, no es la forma "adecuada" de hacerlo. Seguramente, hay un mecanismo para esto de una manera más 'directa'.
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));Re: La referencia del marco del cuadro de gráficos se 'pierde' al agregar un script de gráficos.Nunca usaría Evil(Parse()) si se puede evitar (y en este caso se puede) usando Eval(EvalExpr()) o sustituirlo. Al menos no conozco ningún otro método además de estos (o si los conozco, son más complicados), cómo podría reemplazar valores en algunas plataformas/funciones jmp con valores (como en Fórmulas). Mi método preferido es EvalExpr(), ya que es bastante fácil de depurar y aún le brinda resaltado JSL en el editor de scripts (el método de análisis no lo hará).
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: La referencia del marco del cuadro de gráficos se 'pierde' al agregar un script de gráficos.El parámetro Diámetro de la oblea en la función HacerWaferMapa solo existe mientras la función se está ejecutando. La fórmula suministrada a <
También me gusta el método eval(evalexpr( ... expr() ... expr() ... ) ) para convertir las variables transitorias en piedra, principalmente porque el editor JSL seguirá haciendo todas las comprobaciones de sintaxis para ( y ).
Re: La referencia del marco del cuadro de gráficos se 'pierde' al agregar un script de gráficos.Hola, no estoy exactamente seguro de por qué esto funciona, pero agradecería cualquier información. Parece que si configura otra variable en su función (en este caso, solo myWaferDiameter1), ¿parece pasar bien a los mensajes del marco?
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: La referencia del marco del cuadro de gráficos se 'pierde' al agregar un script de gráficos.Joseph, también me di cuenta de esto, pero al igual que tú, no entiendo por qué funciona una variable generada localmente (para la función), mientras que una pasada no lo hace. V.Interesante.
Re: La referencia del marco del cuadro de gráficos se 'pierde' al agregar un script de gráficos.Hola @Joseph_Reese ,
Esto funciona porque las variables definidas dentro de la función no son, por defecto, locales para esa función. Si usa eliminar símbolos () antes y muestra símbolos () después de ejecutar ese script, encontrará que myWaferDiameter1 ahora es una variable global. Siempre que escriba funciones, recomiendo usar {defaultlocal} como segundo argumento por este motivo, o para nombrar todas las variables creadas en la función en ese parámetro para que todas sean locales solo para esa llamada de función.Si usa el valor local predeterminado, encontrará que el error vuelve a aparecer ya que la variable ya no existe cuando se dibuja el gráfico.Como @jthi señala, puede resolver esto evaluando la variable en el contexto de la función y luego pasando el valor al gráfico. Como @Craige_Hales sugerido, los parámetros de la función también se eliminan una vez que la función termina de ejecutarse, que es lo que causó el problema original.
Entonces, a la pregunta original de @thickey :
En el ejemplo original y cuando se utiliza una variable local en la función o como argumento de una función, el valor myWaferDiameter existe en el espacio de nombres local de la función hasta que la función termina de ejecutarse, momento en el que se elimina de la memoria.Dado que el gráfico no se dibuja hasta que la función termina de ejecutarse, no puede acceder al valor de la variable. Para resolver esto, evalúe la variable en el contexto de la función.También prefiero el método de hacer esto que @jthi descrito:
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));
Cuando se define una variable en la función que es una variable global, esa variable existe hasta que se elimina (usando símbolos de eliminación() por ejemplo) o hasta que se reinicia JMP. Entonces, cuando la ventana se dibuja después de que finaliza la función, aún puede acceder a la variable. Este es una solución, pero es más probable que cause errores en el código futuro, ya que diferentes ventanas o scripts podrían interactuar entre sí de forma inesperada.
PD: Como complemento desvergonzado para mi propio elemento de la lista de deseos, creo que evaluar myWaferDiamer en el contexto correcto se puede hacer un poco más intuitivo mediante la introducción de una nueva función: Introducir Eval Expr First() como un nuevo contenedor para Eval( Eval Expr( ... ) )