JSL: lorsque les analyses dépendent de données temporaires, fermer les données lorsque l'analyse est fermée ...Salut à tous,
Contexte: J'écris actuellement un complément dans lequel je dois créer une table de données temporaire pour contenir certains points de données qui sont ensuite introduits dans Graph Builder. Lorsque l'utilisateur ferme le générateur de graphes, je souhaite que les données temporaires disparaissent. Assez simple, si j'enregistre l'appel de Graph Builder à une variable, je peux ajouter un << On Close () pour fermer également les données temporaires.
Cependant, des choses étranges se produisent si mon utilisateur souhaite exécuter le complément deux fois sur deux entrées différentes, créant ainsi deux tables de données temporaires et deux générateurs de graphiques. Maintenant, dans ce cas, la fermeture de l'un des Générateurs de Graphiques peut fermer la mauvaise table temporaire (faisant tomber l'autre Générateur de Graphiques avec elle).
J'imagine qu'il doit y avoir une solution simple à cela. Je pense que la solution devrait être avec les espaces de noms, mais je ne peux pas comprendre comment garder tout lié ensemble! Il semble que chaque fois que je crée un nouvel espace de noms, le "ns" est écrasé. L'énigme que j'ai est de savoir comment conserver chaque instance distincte du complément en utilisant sa propre valeur "ns", et de telle manière que je puisse insérer la valeur "ns" correcte dans chacun des plusieurs "On Close "codes qui finissent par être créés.
Voici une version simplifiée de ce que j'essaie de faire. L'idée serait que si j'exécute ceci, puis que je clique sur le bouton "Créer un autre" une ou plusieurs fois, puis que je rejette l'un des Générateurs de Graphiques, les autres resteront intacts - sans se soucier de quel graphique Builder, je choisis de rejeter en premier.
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table("Test Table",
<< New Column("Random X", << Formula(Random Normal())),
<< New Column("Random Y", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window("Test Output",
Button Box("Make Another One",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();
À la recherche de la sagesse: que dois-je essayer ensuite?
ScriptingRe: JSL: lorsque les analyses dépendent de données temporaires, fermer les données lorsque l'analyse est fermée ...Le problème est que votre variable "ns" est remplacée lors de la deuxième exécution et des suivantes de la fonction.Par conséquent, vous devez utiliser une référence unique à la table de données.Vous trouverez ci-dessous une version de votre code, qui utilise le nom de la table de données pour la fermer.
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>
Re: JSL: lorsque les analyses dépendent de données temporaires, fermer les données lorsque l'analyse est fermée ...Merci. Ceci est utile pour des solutions simples comme celle-ci.
Je suis peut-être pour une énorme réécriture de code et même dans ce cas, je ne suis pas sûr qu'il soit possible de faire ce que je veux faire. Mon complément réel stocke également un tas de références DisplayBox dans ns, et les DisplayBox déclenchent diverses actions supplémentaires à la fois dans les plates-formes et dans la table de données. Toutes les références DisplayBox sont cannibalisées lorsque le complément est également lancé. Je suppose que si j'ai de la chance, je peux convertir la plupart de mes DisplayBox en fonctions de déclenchement afin que je puisse frapper ceci << Parent et revenir à d'autres boîtes pour mettre à jour les sorties, etc. Il semble que je vais devoir repenser sérieusement ce que je fais.
J'avais espéré que Names Default to Here créerait un espace de noms Here distinct à chaque fois que le code serait réexécuté, mais cela ne semble pas être le cas ...
Y a-t-il d'autres bonnes options avant de commencer cette autre voie?
Re: JSL: lorsque les analyses dépendent de données temporaires, fermer les données lorsque l'analyse est fermée ...Je suis parfois frustré que "Names Default to Here ()" n'ait pas d'espaces de noms séparés à chaque invocation du code.Mais, j'en profite également lors du débogage du code.Je vois donc les deux avantages.Mais voici une idée décalée qui crée des espaces de nom séparés «Ici».
Si vous prenez votre JSL d'origine, et ajoutez //! comme première ligne, ce code s'exécutera automatiquement lorsqu'il sera ouvert à partir de votre disque dur.Lorsque ce script est ouvert, il a son espace de noms unique "Ici".Si vous ouvrez le fichier une deuxième fois, il possède son propre espace de noms unique "Ici".
A quelques reprises dans le passé, j'ai utilisé ceci ???? fonctionnalité ????.Mon programme principal utilise un Save Text File (), pour enregistrer le JSL en question dans un emplacement $ TEMP, puis chaque fois que le code suivant doit exécuter le code dans le JSL enregistré, vous utilisez un Open () pour exécuter le fichier.Le passage des valeurs vers et depuis le JSL enregistré se fait via un espace de noms défini à la fois dans le programme principal et dans le programme JSL enregistré.
Voici votre exemple de configuration de code d'origine de cette manière, et lorsqu'elle est exécutée, chaque instance est indépendante dans son exécution
names default to here(1);
graphJSL = "//!
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table(\!"Test Table\!",
<< New Column(\!"Random X\!", << Formula(Random Normal())),
<< New Column(\!"Random Y\!", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window(\!"Test Output\!",
Button Box(\!"Make Another One\!",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();";
Save Text File( "$TEMP/Graph1.jsl", graphJSL );
open("$TEMP/Graph1.jsl");
open("$TEMP/Graph1.jsl");