JSL: Quando le analisi dipendono da dati temporanei, la chiusura dei dati quando l'analisi è chiusa...Ciao a tutti,
Sfondo: sto attualmente scrivendo un componente aggiuntivo in cui devo creare una tabella di dati temporanea per contenere alcuni punti dati che vengono quindi inseriti in Graph Builder. Quando l'utente chiude il Generatore di grafici, voglio che i dati temporanei scompaiano. 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 desidera eseguire il componente aggiuntivo due volte su due input diversi, creando così due tabelle di dati temporanei e due Generatori di grafici. Ora, in questo caso, la chiusura di uno dei Generatori di grafici potrebbe chiudere la tabella temporanea errata (portando giù 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 spazio dei nomi, "ns" viene sovrascritto. L'enigma che ho è capire come mantenere ogni istanza separata del componente aggiuntivo usando 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 eseguo questo, e quindi faccio clic sul pulsante "Crea un altro" una o più volte, e quindi elimino uno dei costruttori di grafici, l'altro o gli altri rimarranno intatti, senza alcuna preoccupazione su quale grafico Builder Ho scelto di licenziare per primo.
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?
SceneggiaturaRe: JSL: Quando le analisi dipendono da dati temporanei, la chiusura dei dati quando l'analisi è chiusa...Questa è una grande "caratteristica". Molto più veloce da implementare per il mio codice, ci sono volute solo un'ora o due per apportare le modifiche in questo modo, assicurandomi di avere uno spazio dei nomi con cui lavorare, ecc., invece di capire come sostituire tutte le mie variabili DisplayBox (cosa che stavo non vedo l'ora).
In questa soluzione ho anche aggiunto un Wait() e poi un Delete File() dopo Open() poiché il mio Button Box che attiva una nuova corsa scriverà semplicemente un nuovo file Temp ogni volta che viene cliccato.
Re: JSL: Quando le analisi dipendono da dati temporanei, la chiusura dei dati quando l'analisi è chiusa...A volte sono frustrato dal fatto che "Names Default to Here()" non abbia spazi dei nomi separati su ogni chiamata del codice.Ma ne approfitto anche durante il debug del codice.Quindi vedo entrambi i vantaggi.Ma ecco un'idea originale che crea spazi dei nomi "Qui" separati.
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 Save Text File(), 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 un Open() per eseguire il file.Il passaggio di valori da e verso la JSL salvata avviene attraverso uno spazio dei nomi definito sia nel programma principale, sia nel programma JSL salvato.
Ecco la configurazione del codice di esempio originale in questo modo e, quando viene eseguita, 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");
Re: JSL: Quando le analisi dipendono da dati temporanei, la chiusura dei dati quando l'analisi è chiusa...Grazie. Questo è utile per soluzioni semplici come questa.
Potrei essere in un'enorme riscrittura del codice e anche allora non sono sicuro che sia possibile fare quello che voglio fare. Il mio componente aggiuntivo effettivo memorizza anche un sacco di riferimenti DisplayBox in ns e i DisplayBox attivano varie azioni aggiuntive sia nelle piattaforme che nella tabella dei dati. Tutti i riferimenti DisplayBox vengono cannibalizzati quando anche il componente aggiuntivo viene riavviato. Suppongo che se sono fortunato posso convertire la maggior parte dei miei DisplayBox per attivare funzioni in modo da poter premere questo << Genitore e tornare indietro ad altre scatole per aggiornare gli output, ecc. Sembra che dovrò ripensare seriamente a quello che sto facendo.
Speravo che Names Default to Here creasse uno spazio dei nomi Here separato ogni volta che il codice veniva eseguito nuovamente, ma non sembra essere così...
Qualche altra buona opzione prima di iniziare quest'altra strada?
Re: JSL: Quando le analisi dipendono da dati temporanei, la chiusura dei dati quando l'analisi è chiusa...Il problema è che la tua variabile "ns" viene sostituita nella seconda e nelle successive esecuzioni della funzione.Pertanto è necessario utilizzare un riferimento univoco alla tabella dei dati.Di seguito è riportata 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>