Ri: Comportamento variabile nelle funzioni JSLgzmorgan, grazie per l'intuizione. L'attuale soluzione window() sembrava essere la soluzione più semplice ma non ha funzionato per me... almeno, non nel modo in cui ho provato a codificarla. Ho provato a utilizzare principalmente il comando eval sub() per la maggior parte delle variabili, che funziona, ma non funziona per nw (la mia nuova variabile della finestra) o _cw per la finestra corrente. Probabilmente mi sono perso qualcosa, ma va bene.
Ho finito per tornare al tuo altro suggerimento, che Vince aveva suggerito in precedenza, lo spazio dei nomi della finestra. Finora non ho avuto problemi con esso.
Per quanto riguarda il generatore di applicazioni, ne sono a conoscenza ma non l'ho usato. In genere codifico solo la mia GUI e le mie funzioni e creo il componente aggiuntivo manualmente. Ho avuto difficoltà a capire la funzione set e this (o self) e cosa stava chiamando cosa, ma penso di vedere ora ... Darò un'occhiata più da vicino.
Grazie a tutti per gli input. Apprezzo molto i diversi approcci / suggerimenti. Il mio script prende una serie di parametri correlati e li traccia in diversi modi, ma ci vogliono un paio di minuti per configurarlo e fare clic manualmente sui parametri e quindi esportarlo. Con questi aggiornamenti e il looping da un file master posso chiamare lo script da uno script di chiamata separato anziché dalla GUI e fare in modo che generi non un set di grafici ma N grafici. Prima mi ci volevano un paio d'ore... ora sono dieci secondi.ovviamente mi ci è voluto molto tempo per arrivare qui, ma posso riutilizzarlo per anni.
Ri: Comportamento variabile nelle funzioni JSLops!Ho dimenticato di menzionare, invece di "questo" e degli spazi dei nomi delle finestre puoi anche fare riferimento alla finestra corrente.Ho allegato lo script alternativo,
Ri: Comportamento variabile nelle funzioni JSLStavo per suggerire di utilizzare lo spazio dei nomi della finestra che è un buon suggerimento.Di solito non uso le funzioni per le finestre dell'interfaccia utente.Un altro metodo per fare riferimento agli oggetti locali consiste nell'usare la funzione Set e ottenere un controllo su questo. La sceneggiatura è sotto.Ho usato dichiarazioni di stampa più semplici.Potresti voler esplorare utilizzando l'Application Builder, ci vuole un piccolo investimento per imparare come funziona, ma può essere utile.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
<<SET function=""></SET>Ri: Comportamento variabile nelle funzioni JSLGrazie Vince. Non sapevo dello spazio dei nomi della finestra. Potrebbe funzionare bene, lo proverò.
In questo momento ho la mia parte GUI in un file e ho intenzione di passare le variabili a quella che chiamerò la funzione principale. Vorrei chiamare la GUI da una barra degli strumenti addin o eseguire un piccolo script personalizzato che eseguirà il ciclo N volte, chiamando lo script principale per N set di parametri di input. La riusabilità potrebbe essere un problema qui, ma la sovrascrittura delle variabili potrebbe non avere importanza ... Vedrò come va. Grazie per l'aiuto.
Ri: Comportamento variabile nelle funzioni JSLIl problema se lo fai con globals o global namespace è la riusabilità (che potrebbe non interessarti).
se esegui myFun due volte con due pulsanti diversi (diciamo che vuoi essere in grado di eseguire il sandbox della tua finestra ed eseguirne due istanze).Avrai una collisione e la seconda chiamata sovrascriverà le prime.
Vedi sotto.
names default to here(1);
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
x = [2,3];
y ="string";
test:myFun(x,y);
test:myFun([12, 14], "something else");
se stai usando uno spazio dei nomi, ti consiglio di usare lo spazio dei nomi della finestra. Si cancella automaticamente quando la finestra è sparita e non avrai collisioni tra due finestre identiche.
names default to here(1);
myFun = Function({A1, Z1},{DEFAULT LOCAL},
A = A1;
Z = Z1;
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
//::g_b = b;
//::g_z = z;
nw = new window("test",
window:B = B; //uses the builtin window namespace
window:Z = Z; //works because this is a glue statement that returns the last thing
window:box = vlistbox( //which in this case is the vlistbox
textbox(window:Z),
textbox(char(window:B)),
buttonbox("Show array B (works)",
show(window:B)
),
buttonbox("Show string Z (works)",
show(window:Z)
),
buttonbox("show and close (works)",
show(window:Z, window:B); window:box << closewindow())
)
);
);
x = [2,3];
y ="string";
myFun(x,y);
myFun([12, 14], "something else");Ri: Comportamento variabile nelle funzioni JSLGrazie Vince. Non avevo pensato a eval(substitute(expr())). Per alcuni dei miei script più complessi penso che potrebbe essere troppo difficile tenere traccia di ciò che è stato sostituito e dove. Il mio codice non è esattamente ben organizzato e il debug sarebbe difficile.Ri: Comportamento variabile nelle funzioni JSLGrazie, la tua idea globale mi ha dato un'altra idea.Non mi dispiace tanto il fatto che le variabili siano globali, ma se hanno bisogno di essere globali preferirei inserirle in uno spazio dei nomi contenuto.
Non credo che il comando clear globals() mi morderebbe qui, ma mi ha preso con le mie funzioni di richiamo (le mie variabili di richiamo globale sono state cancellate da un altro script usando clear globals()).Avevo inviato un'e-mail a JMP e mi hanno suggerito due alternative: proteggere le variabili globali bloccandole o inserendole nel proprio spazio dei nomi. Lo spazio dei nomi era in realtà più semplice in termini di robustezza.
Comunque, il codice aggiornato qui sotto sembra funzionare bene. Lo svantaggio è la digitazione extra "test:" per ogni volta che faccio riferimento a una variabile. Mi rendo conto che potrei non averne bisogno per ogni uso variabile nello script ma d'altra parte, probabilmente è una buona pratica e poiché questo uso particolare è uno spazio dei nomi globale, posso vedere il contenuto delle variabili passando il cursore sopra i nomi delle variabili.
Si noti l'uso di A1 e Z1. Non mi ha permesso di assegnare a test:A e test:Z.
Errore: l'argomento deve essere elencato nell'accesso o nella valutazione di 'Function' , Function/*###*/({test:A, test:Z}, .....
Vedrò se riesco a farlo funzionare con più file.
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
test:x = [2,3];
test:y ="string";
test:myFun(x,y);Ri: Comportamento variabile nelle funzioni JSLHo dovuto ricorrere all'impostazione di variabili globali per farlo funzionare.Sembra che il codice della finestra di dialogo non riesca a vedere correttamente le variabili.Questa non è un'ottima soluzione perché vanifica lo scopo di avere variabili locali all'interno di una funzione.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
::g_b = b;
::g_z = z;
::g_nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(::g_B)
),
buttonbox("Show string Z (does not work)",
show(::g_Z)
),
buttonbox("show and close (does not work)",
show(::g_Z, ::g_B); ::g_nw << closewindow())
)
)
);
x = [2,3];
y ="string";
myFun(x,y);Ri: Comportamento variabile nelle funzioni JSLB non ha funzionato nemmeno per me.
Questo è normalmente il modo in cui eseguo le cose con la GUI.È eccessivamente complicato per l'esempio che hai fornito, ma penso che mostri un paio di metodi diversi.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
Eval(
Substitute(
Expr(
nw = new window("test",
vlistbox(
textbox(char(DV_Z)),
textbox(char(DV_B)),
buttonbox("Show array B (works)",
show([]||DV_B); //otherwise you run into an invalid matrix token
),
buttonbox("Show string Z (does not work)",
//show([]||DV_Z); //shouldn't work, you can't make a string a matrix
show(DV_Z);
//or
show(list(DV_Z));
),
buttonbox("show and close (does not work)",
<<SET function=""></SET>Comportamento delle variabili nelle funzioni JSL
I miei script generalmente hanno due componenti principali: una funzione principale seguita dal codice della GUI, tutto nello stesso file. In genere utilizzo le variabili contenute nello spazio dei nomi Here, ottengo le variabili dall'input dell'utente e chiamo la funzione principale da una casella del pulsante "OK". Non passo alcuna variabile alla funzione principale e utilizzo solo le variabili che sono state assegnate allo script della casella del pulsante "OK". Sto pensando di cambiare almeno uno dei miei script in modo che ci sia un file con la GUI e un secondo file con la funzione principale. Prima di farlo, sto controllando come funziona all'interno di un file JSL. Di seguito è riportato un esempio ridotto, che aggira la GUI e definisce semplicemente le variabili dopo che la funzione è stata definita ma prima che venga chiamata.
Una cosa che ho notato è che è più difficile eseguire il debug dopo l'esecuzione di uno script, perché quando passo il mouse sopra x e y posso vedere il contenuto nella barra di stato nella parte inferiore della finestra. Ma non è così per le variabili locali A, B, Z e nw. Chissà se qualcuno ha qualche consiglio in merito.
Inoltre, non sono sicuro di come accedere al contenuto della variabile dallo script della casella dei pulsanti. Se esegui il codice qui sotto puoi vedere che A, B, Z vengono visualizzati nel registro come previsto (appena prima della creazione della nuova finestra) e anche B e Z vengono visualizzati nelle nuove caselle di testo della finestra, ma il pulsante box script non può accedere direttamente a queste variabili. Sono stato in grado di utilizzare eval(parse(eval insert())) per ottenere l'array B ma non sono stato in grado di ottenere la stringa Z.Ci sono metodi più diretti per farlo funzionare?
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(parse(Eval(Parse(Eval Insert(
"\[^"char(B)"^]\"
)))))
),
buttonbox("Show string Z (does not work)",
show(Eval(Parse(Eval Insert(
"\[^"char(Z)"^]\"
))))
),
buttonbox("show and close (does not work)", show(Z, B); nw << closewindow())
)
)
);
x = [2,3];
y="string";
myFun(x,y);
Grazie,
Mike
Automazione e scriptingQualità e ingegneria di processo