JSL: Quando le analisi dipendono da dati temporanei, chiudendo i dati quando l'analisi è chiusa ...Ciao a tutti,
Contesto: sto attualmente scrivendo un componente aggiuntivo in cui ho bisogno di creare una tabella di dati temporanea per contenere alcuni punti dati che vengono poi inseriti in Graph Builder. Quando l'utente chiude il generatore di grafici, desidero che i dati temporanei vadano via. Abbastanza facile, se salvo la chiamata di Graph Builder in una variabile, posso aggiungere un << On Close () per chiudere anche i dati temporanei.
Tuttavia, accadono cose strane se il mio utente vuole eseguire il componente aggiuntivo due volte su due input diversi, creando così due tabelle di dati temporanee e due costruttori di grafici. In questo caso, la chiusura di uno dei costruttori di grafici potrebbe chiudere la tabella temporanea sbagliata (facendo cadere l'altro generatore di grafici con essa).
Immagino che ci debba essere una soluzione semplice a questo. Penso che la soluzione dovrebbe essere con Namespaces, ma non riesco a capire come mantenere tutto collegato insieme! Sembra che ogni volta che creo un nuovo Namespace, il "ns" venga sovrascritto. L'enigma che ho è capire come mantenere ogni istanza separata del componente aggiuntivo utilizzando il proprio valore "ns" e in modo tale da poter inserire il valore "ns" corretto in ciascuno dei numerosi "On Close "codici che finiscono per essere creati.
Ecco una versione semplificata di quello che sto cercando di fare. L'idea sarebbe che se lo eseguo, quindi clicchi una o più volte sul pulsante "Crea un altro" e poi chiudi uno dei costruttori di grafici, gli altri rimarranno intatti, senza alcuna preoccupazione su quale grafico Builder ho scelto di ignorare prima.
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();
Alla ricerca della saggezza: cosa dovrei provare dopo?
ScriptingOggetto: JSL: Quando le analisi dipendono da dati temporanei, chiusura dei dati quando l'analisi è chiusa ...Il problema è che la variabile "ns" viene sostituita nella seconda e nelle successive esecuzioni della funzione.Pertanto è necessario utilizzare un riferimento univoco alla tabella dati.Di seguito è una versione del codice, che utilizza il nome della tabella dati per chiuderla.
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>
Oggetto: JSL: Quando le analisi dipendono da dati temporanei, chiusura dei dati quando l'analisi è chiusa ...Grazie. Questo è utile per soluzioni semplici come questa.
Potrei essere pronto per un'enorme riscrittura del codice e anche in questo caso non sono sicuro che sia possibile fare quello che voglio fare. Il mio attuale componente aggiuntivo memorizza anche un sacco di riferimenti DisplayBox in ns e i DisplayBox attivano varie azioni aggiuntive sia nelle piattaforme che nella tabella dati. Tutti i riferimenti DisplayBox vengono cannibalizzati anche quando il componente aggiuntivo viene riavviato. Suppongo che, se sono fortunato, posso convertire la maggior parte dei miei DisplayBox in funzioni di attivazione in modo da poter premere questo << Parent ed eseguire il drill-down su altre caselle per aggiornare gli output, ecc. Sembra che dovrò ripensare seriamente a quello che sto facendo.
Avevo sperato che Names Default to Here avrebbe creato uno spazio dei nomi Here separato ogni volta che il codice veniva rieseguito, ma non sembra essere il caso ...
Qualche altra buona opzione prima di iniziare questa altra strada?
Oggetto: JSL: Quando le analisi dipendono da dati temporanei, chiudendo i dati quando l'analisi è chiusa ...A volte sono frustrato dal fatto che "Names Default to Here ()" non abbia spazi dei nomi separati a ogni invocazione del codice.Ma approfitto anche di questo fatto durante il debug del codice.Quindi vedo entrambi i vantaggi.Ma ecco un'idea insolita che crea spazi dei nomi separati "Qui".
Se prendi il tuo JSL originale e aggiungi //! come prima riga, quel codice verrà eseguito automaticamente quando viene aperto dal disco rigido.Quando lo script viene aperto, ha il suo spazio dei nomi "Qui" univoco.Se apri il file una seconda volta, ha il suo spazio dei nomi "Qui" univoco.
In un paio di occasioni in passato, ho usato questo ???? caratteristica ????.Il mio programma principale utilizza un file di testo di salvataggio (), per salvare il JSL in questione in una posizione $ TEMP, e quindi ogni volta che il codice successivo deve eseguire il codice nel JSL salvato, si utilizza Open () per eseguire il file.Il passaggio di valori da e verso il JSL salvato viene effettuato tramite uno spazio dei nomi definito sia nel programma principale che nel programma JSL salvato.
Ecco il tuo codice di esempio originale impostato in questo modo e, quando viene eseguito, ogni istanza è indipendente nella sua esecuzione
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");