La référence de cadre de la zone graphique est « perdue » lors de l'ajout d'un script graphique.J'essaie de dessiner un simple Wafermap qui fonctionne bien avec le code suivant.
Cependant, lorsque je substitue des variables aux nombres, j'obtiens une erreur de référence manquante et je ne peux pas comprendre pourquoi cela se produit. J'ai besoin d'un peu de sagesse d'expert 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));
Je fais volontiers référence à la Frame Box comme vous pouvez le voir dans le journal :</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">
Donc, maintenant, substituons dans certaines 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));Et j'obtiens l'erreur suivante, suggérant que j'ai perdu la référence à mes variables transmises lorsque j'essaie de les ajouter à la zone de cadre.

je suis perplexe 
ScriptRe : La référence de cadre de la boîte graphique est "perdue" lors de l'ajout d'un script graphique.Vous devrez peut-être utiliser un peu de magie Eval(EvalExpr()) Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));Re : La référence de cadre de la boîte graphique est "perdue" lors de l'ajout d'un script graphique.Salut Jarmo, oui, je peux simplement faire un eval(parse()), en remplaçant ma variable dans la chaîne à convertir en JSL mais ce n'est pas la "bonne" façon de procéder à mon avis.. Il y a sûrement un mécanisme à cela d'une manière plus "directe".
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));Re : La référence de cadre de la boîte graphique est "perdue" lors de l'ajout d'un script graphique.Je n'utiliserais jamais Evil(Parse()) si cela peut être évité (et dans ce cas, cela peut l'être) en utilisant Eval(EvalExpr()) ou un substitut. Au moins, je ne connais aucune autre méthode que celles-ci (ou si je le fais, elles sont plus compliquées), comment je pourrais remplacer les valeurs de certaines plates-formes/fonctions jmp par des valeurs (comme dans Formulas). Ma méthode préférée est EvalExpr() car elle est assez facile à déboguer et elle vous donne toujours la mise en évidence JSL dans l'éditeur de script (la méthode d'analyse ne le fera pas).
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 référence de cadre de la boîte graphique est "perdue" lors de l'ajout d'un script graphique.Le paramètre Diamètre de plaquette dans la fonction MarqueWaferMap n'existe que pendant l'exécution de la fonction. La formule fournie à <
J'aime aussi la méthode eval(evalexpr( ... expr() ... expr() ... ) ) pour convertir les variables transitoires en pierre, principalement parce que l'éditeur JSL fera toujours toute la vérification de la syntaxe pour ( et ).
Re : La référence de cadre de la boîte graphique est "perdue" lors de l'ajout d'un script graphique.Bonjour, je ne sais pas exactement pourquoi cela fonctionne, mais j'apprécierais toute idée. Il semble que si vous définissez une autre variable dans votre fonction (dans ce cas juste myWaferDiameter1), elle semble bien passer aux messages de cadre ?
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 référence de cadre de la boîte graphique est "perdue" lors de l'ajout d'un script graphique.Joseph, j'ai remarqué cela aussi mais comme vous, je ne comprends pas pourquoi une variable générée localement (à la fonction) fonctionne, alors qu'une transmise ne fonctionne pas. V. Intéressant.
Re : La référence de cadre de la boîte graphique est "perdue" lors de l'ajout d'un script graphique.Bonjour @Joseph_Reese ,
Cela fonctionne car les variables définies à l'intérieur de la fonction ne sont pas, par défaut, locales à cette fonction. Si vous utilisez supprimer les symboles() avant et afficher les symboles() après avoir exécuté ce script, vous constaterez que myWaferDiameter1 est maintenant une variable globale. Chaque fois que vous écrivez des fonctions, je recommande d'utiliser {defaultlocal} comme deuxième argument pour cette raison, ou de nommer toutes les variables créées dans la fonction dans ce paramètre afin qu'elles soient toutes locales à cet appel de fonction uniquement.Si vous utilisez le local par défaut, vous constaterez que l'erreur réapparaît puisque la variable n'existe plus lorsque le graphique est tracé.Comme @jthi le souligne, vous pouvez résoudre ce problème en évaluant la variable dans le contexte de la fonction, puis en transmettant la valeur au graphique. Comme @Craige_Hales suggéré, les paramètres de la fonction sont également supprimés une fois l'exécution de la fonction terminée, ce qui a causé le problème d'origine.
Donc, à la question initiale de @thickey :
Dans l'exemple d'origine et lors de l'utilisation d'une variable locale dans la fonction ou comme argument d'une fonction, la valeur myWaferDiameter existe dans l'espace de noms local de la fonction jusqu'à ce que la fonction finisse de s'exécuter, moment auquel elle est supprimée de la mémoire.Étant donné que le graphique n'est pas dessiné tant que la fonction n'a pas fini de s'exécuter, il ne peut pas accéder à la valeur de la variable. Pour résoudre ce problème, évaluez la variable dans le contexte de la fonction.Je préfère aussi la méthode de faire cela qui @jthi décrit :
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));
Lorsqu'une variable est définie dans la fonction qui est une variable globale, cette variable existe jusqu'à ce qu'elle soit supprimée (à l'aide de delete symboles() par exemple) ou jusqu'au redémarrage de JMP. Ainsi, lorsque la fenêtre est dessinée après la fin de la fonction, elle peut toujours accéder à la variable. Cette est une solution, mais il est plus susceptible de provoquer des erreurs dans le code futur car différentes fenêtres ou scripts pourraient interagir les uns avec les autres de manière inattendue.
PS : En tant que plug sans vergogne pour mon propre élément de liste de souhaits, je pense que l'évaluation de myWaferDiamer dans le bon contexte peut être rendue légèrement plus intuitive en introduisant une nouvelle fonction : Introduisez Eval Expr First() comme nouveau wrapper pour Eval( Eval Expr( ... ) )