Barre di avanzamento – il mio viaggio personale (anche domande sulla manipolazione delle finestre nell'ambiente del progetto)[JMP 17.0.0]
Ho un file di progetto su cui sto lavorando che contiene molte tabelle di dati, ciascuna con uno script relativamente di lunga durata che utilizzo per generare un diario come output.Ho uno script separato in un'altra tabella che richiama ciascuno degli script delle singole tabelle, quindi raccoglie i singoli diari in un unico diario per creare un rapporto finale.[Probabilmente avrei potuto rendere questo approccio molto più pulito, ma non sono un programmatore a tempo pieno (o addirittura part-time).]
Volevo implementare una sorta di barra di avanzamento/finestra di messaggio di aggiornamento "X di Y completata" per tenere traccia dell'avanzamento dell'esecuzione dopo l'esecuzione di ogni singolo script di tabella.
Questa è la storia di come sono arrivato alla mia soluzione attuale.
TL;DR – Dopo aver trascorso una giornata a elaborare un approccio intelligente per me, mi sono imbattuto in Caption(), che sarebbe stata la cosa più semplice da fare.
Ma ho ancora alcune domande generali su come le finestre possono essere manipolate all'interno dell'ambiente del progetto, quindi resta con me se sei interessato.
Ci sono diverse ottime idee di implementazione in cui mi sono imbattuto durante la ricerca nelle discussioni, tra cui:
https://community.jmp.com/t5/Uncharted/Progress-Bar/ba-p/21160
https://community.jmp.com/t5/Uncharted/Progress-Bar-with-Cancel-Button/ba-p/433560#U433560
https://community.jmp.com/t5/Discussions/Suggestion-on-how-to-script-a-small-update-progress-window-for/mp/250419
Tuttavia, quando provo a implementare queste soluzioni all'interno di un ambiente di progetto, la nuova barra di avanzamento che viene creata viene sempre creata come una nuova scheda nel progetto. Quando viene avviato lo script successivo della serie, la finestra della barra di avanzamento viene sepolta dalle successive manipolazioni della tabella dati associate allo script, quindi non viene mai visualizzato il messaggio di avanzamento aggiornato.
Domanda generale n. 1: non riesco a capire come creare una finestra "pop-out" come finestra di messaggio senza che sia una finestra modale.Da quanto ho capito, le finestre modali mettono in pausa lo script finché l'utente non ha interagito con la finestra, che è ciò che non voglio.C'è qualcosa che mi manca su come posso creare una nuova finestra non modale come "pop-out" anziché come nuova scheda?
[Ancora una volta, mi rendo conto ora che esiste una cosa come Caption().Ma ho ancora questa domanda generale sul fatto se tutte le nuove finestre in un progetto debbano essere aperte come nuove schede anziché come finestre pop-out.]
Domanda generale n. 2: Poi ho pensato... forse c'è un modo per agganciare questa finestra della barra di avanzamento appena creata in un'altra posizione nel layout del progetto in modo che sia separata dal resto dell'azione – ad esempio, Nuova finestra() << Dock( “ Giusto").Ma non sono riuscito a trovare nulla del genere.C'è un modo per scrivere la posizione di aggancio di una finestra?
Poi ho passato molto tempo a imparare come funzionano i layout di progetto e come possono essere scritti in script.Ho imparato tantissimo da quell'esercizio.Alla fine, ho creato uno script che modifica temporaneamente il layout del progetto per sostituire la finestra "File recenti" con una finestra personalizzata "Aggiornamento avanzamento" che fa quello che sto cercando, per poi tornare alla finestra "File recenti". " finestra.Come puoi immaginare, è una sceneggiatura piuttosto goffa, ma porta a termine il lavoro.Ho provato a generalizzarlo nel miglior modo possibile e l'ho allegato qui nel caso qualcuno fosse interessato a vedere come funziona.
Ad un certo punto della giornata mi sono reso conto che forse c'è un modo per far funzionare questo forzando le nuove finestre create dai singoli script a essere invisibili, in modo che la finestra della barra di avanzamento rimanga in primo piano.Ma sarebbe stato meglio se ci avessi pensato in anticipo.A questo punto dovrei apportare un paio di centinaia di modifiche allo script per ottenere questa opzione (se possibile).
Dopo tutto questo, stamattina sono venuto al lavoro per raccontarvi tutta questa storia e quasi immediatamente mi sono imbattuto in Caption(), che fa praticamente tutto ciò che volevo fare in due concise righe di codice.Vorrei solo averlo capito prima.Immagino che se volessi davvero avere una vera "barra" di avanzamento e non solo testo, forse Caption() non funzionerebbe.Ma non avevo davvero bisogno che fosse così stravagante.
Grazie per l'attenzione.
Gioele
Automazione e scriptingRi: Barre di avanzamento – il mio viaggio personale (anche domande sulla manipolazione delle finestre nell'ambiente del progetto)Quando ho partecipato al laboratorio di esperienza utente di JMP (o qualcosa di simile) al Discovery Summit, è stata una delle prime volte in cui ho utilizzato i progetti (li avevo utilizzati in precedenza ma ho smesso rapidamente a causa del furto di finestre). Ho dato alcuni suggerimenti sull'usabilità e ne ho trasformati alcuni in elementi della lista dei desideri.
Aggiungi l'opzione per non contenere tutte le finestre del progetto JMP (relativo a questo argomento)
Aggiunta di un'opzione di raggruppamento (per tabella dati) al selettore di schede/fogli/report del progetto JMP - Comunità utenti JMP
Aggiunta un'opzione per creare nuovi report nel progetto JMP da aprire dopo la scheda dati... - Comunità di utenti JMP
Migliora la gestione dei contenuti (non)autonomi nei progetti JMP (questo è stato creato più tardi)
Quel furto di finestre è ancora la ragione principale per cui al momento non provo nemmeno i progetti.
Fortunatamente la didascalia può essere utilizzata nei progetti e puoi persino trasformarla in una barra di avanzamento abbastanza utilizzabile. Non sono sicuro del tipo di barra di avanzamento che hai creato utilizzando Caption() ma ho modificato rapidamente una delle mie classi della barra di avanzamento che utilizza testo anziché caselle di visualizzazione poiché la stessa idea potrebbe essere utilizzata con la didascalia
Names Default To Here(1);
// https://www.jmp.com/support/help/en/17.2/index.shtml#page/jmp/send-information-to-a-user.shtml
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat(":black_large_square:", cur_val);
progress_left = Repeat(":white_large_square:", 10 - cur_val);
progress_text_line = Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
Caption({800, 900}, progress_text, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
update_txt;
Caption(progress_text, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
wait(0.1);
);
Caption(remove);
</CODE></P>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_0-1700199991012.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><img src="https://us.v-cdn.net/6038925/uploads/images/58845i7B2DA85C421D9547/jthi_0-1700199991012.png" role="button" title="jthi_0-1700199991012.png" alt="jthi_0-1700199991012.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P>
<P>Molto probabilmente userò qualcosa di simile l'anno prossimo, quando dovrò realizzare uno script che utilizzi i progetti JMP.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-700215" slang="en-US" mode="NONE">Ri: Barre di avanzamento – il mio viaggio personale (anche domande sulla manipolazione delle finestre nell'ambiente del progetto)</LINGO-SUB><LINGO-BODY id="lingo-body-700215" slang="en-US" mode="NONE"><P>Haha, il mio tentativo originale di didascalia era semplice come questo:</P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jc510_2_0-1700254043192.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><span class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><img src="https://us.v-cdn.net/6038925/uploads/images/58893iDA1A9DE7B3CD3C76/jc510_2_0-1700254043192.png" role="button" title="jc510_2_0-1700254043192.png" alt="jc510_2_0-1700254043192.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> - La tua soluzione è decisamente più elegante e ho già abbandonato tutti i miei approcci precedenti in favore del tuo.Grazie per il suggerimento Jarmo!</P><P>Ho dovuto apportare un paio di modifiche al tuo script per farlo funzionare per me: ho cambiato la stringa per il parametro Caption() da progress_text a update_txt e ho sostituito i caratteri "black/white_large_square" con caratteri Unicode.Ho anche aggiunto alcune righe per centrare approssimativamente la casella della didascalia nella finestra del progetto.Ho pubblicato lo script rivisto di seguito.</P><P>Grazie anche per avermi indicato la sezione "Invia informazioni a un utente" della libreria di documentazione.Ora vedo che esiste anche un modo per inviare messaggi alla barra di stato con StatusMsg().Sostituendo le chiamate a Caption() con le chiamate a StatusMsg(), puoi ottenere lo stesso effetto senza bisogno di una finestra pop-up o di modificare il layout del progetto come stavo facendo io.Ho anche pubblicato quella versione qui sotto.</P><P>[EDIT: Dopo aver giocato ancora un po' con l'opzione StatusMsg(), sto scoprendo che potrebbe essere difficile mantenere la barra di avanzamento costantemente visualizzata a seconda di quanti altri messaggi associati a script (ma non script) vengono inviati allo stato bar mentre lo script viene eseguito.L'approccio Caption() funziona ancora bene ed è probabilmente il migliore dei due approcci nella maggior parte degli scenari.]</P><P>Per quanto mi riguarda, lavoro con progetti da un po' ormai.Immagino di sapere inconsciamente che non è un requisito per lavorare nei progetti, ma mi piace l'aspetto dell'organizzazione di tabelle/schede.Questa è la prima volta che riscontro un problema significativo lavorando con i progetti, ma dopo aver esaminato gli altri potenziali miglioramenti che hai sollevato, sono d'accordo che ci sono cose che possono essere migliorate.</P><P>Script Caption() rivisto:</P><PRE><CODE class=" language-jsl">Names Default To Here(1);
proj = This Project();
projWidth = proj << Get Width;
projHeight = proj << Get Height;
windowPos = proj << Get Window Position();
capPos_h = windowPos[1] + ( projWidth / 2) - 75;
capPos_v = windowPos[2] + ( projHeight / 2);
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat("\!U2B1B", cur_val);
progress_left = Repeat("\!U2B1C", 10 - cur_val);
progress_text_line = " " || Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
Caption({capPos_h, capPos_v}, update_txt, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
Caption( update_txt, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
Wait(0.1);
);
Caption(remove);
Script StatusMsg():
Names Default To Here(1);
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat("\!U2B1B", cur_val);
progress_left = Repeat("\!U2B1C", 10 - cur_val);
progress_text_line = " " || Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
StatusMsg( update_txt);
Wait(0.1);
);
StatusMsg( "Done! " || progress_done || progress_left || progress_text_line);
Wait(2);
StatusMsg( " ");-Gioele
Ri: Barre di avanzamento – il mio viaggio personale (anche domande sulla manipolazione delle finestre nell'ambiente del progetto)Sembra che tu stia facendo buoni progressi 