Aiuto con JSL Throw() che non funziona come previstoCarissimi,
(JMP Pro 16.1.0, Win10)
Ho un problema relativo ad un mio post precedente Qui , se sei interessato a qualche "retrostoria".
Il problema principale che sto riscontrando ora è che il comando Throw() non funziona come previsto. Nel mio codice (vedi alla fine per il codice completo), ho in alcuni punti un test per vedere se c'è attualmente un report di generatore di grafici aperto, assomiglia a questo, ed è racchiuso in un'istruzione Expr():
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
Il problema è che, ogni volta che eseguo il codice (come se lo eseguissi da un pulsante di scelta rapida della barra degli strumenti), sembra saltare queste righe e ignorare se non è aperto alcun report. Ma, quando eseguo il codice "riga per riga", rileverà correttamente che non vi è alcun rapporto aperto e informerà l'utente.
Sto cercando di scrivere codice da distribuire agli utenti della mia organizzazione e di renderlo abbastanza robusto da gestire diversi tipi di situazioni, ad esempio se un utente ha una o più tabelle di dati aperte e/o uno o più progetti aperti (che può contenere più tabelle di dati).
Ecco il concetto del codice (il problema si verifica al punto 6): un utente sta creando un grafico in Graph Builder, quindi desidera eseguire una modifica di routine del grafico (vedere il collegamento sopra per i dettagli in merito), quindi l'utente fa clic sulla barra degli strumenti tasto di scelta rapida per eseguire detta azione.
- Il codice esegue l'espressione Graphic_Expr per determinare la posizione dell'immagine: è in una tabella dati "autonoma" o all'interno di un progetto (è possibile selezionare solo un'opzione). -> (vai a)
- A seconda della casella di controllo selezionata, il codice esegue quindi il codice dt_win_Expr o prj_win_Expr (in questo momento, l'ho impostato solo per l'opzione della tabella dati mentre collaudo il codice, ma idealmente dovrebbe funzionare più o meno allo stesso modo alla fine) . -> (vai a)
- Se si tratta di una tabella di dati autonoma, esegue dt_win_Expr e crea una finestra in cui l'utente può selezionare la tabella di dati in cui risiede l'immagine che desidera modificare. Ricorda che l'utente potrebbe avere più di una tabella di dati aperta con potenzialmente più di un Costruttore di grafici aperto. | (O)
- Allo stesso modo, se l'utente seleziona un progetto, eseguirà prj_win_Expr (non ancora completato) per fare in modo che l'utente selezioni quale progetto (se più di uno è aperto) e le successive tabelle di dati all'interno di quel progetto. -> (vai a)
- Dopo aver selezionato una tabella dati, indipendente o all'interno di un progetto, il codice esegue l'espressione SquarifyWin_Expr. La prima cosa che fa qui è verificare se esiste effettivamente un rapporto corrente: il codice If () dall'alto (potrei aver bisogno di modificare e verificare se il rapporto corrente è un generatore di grafici o meno). **Qui è dove il codice NON funziona come previsto. Anche se non è aperto alcun Generatore di grafici, continuerà con il resto del codice quando dovrebbe generare l'avviso.** Se tutto funziona....-> (vai a)
- In base alle dimensioni in pixel e all'eventuale squadratura, il codice esegue quindi l'espressione RprtUpdate_Expr, dove invia gli aggiornamenti desiderati al report di Generatore di grafici.
Spero che questa descrizione abbia senso e aiuti a contestualizzare quale sia il mio percorso di programmazione/funzionalità desiderato.
Molte grazie in anticipo per qualsiasi aiuto nel trovare una soluzione. Codice JSL completo alla fine.
Grazie!,
DS
Names Default To Here( 1 );
Clear Symbols();
RprtUpdate_Expr = Expr(
gb = Current Report()[Outline Box( 1 )] << Get Scriptable Object;
Report( gb )[framebox( 1 )] << FrameSize( widthN, heightN );
theMax = Max( Report( gb )[axisbox( 1 )] << get max, Report( gb )[axisbox( 2 )] << get max );
theMin = Min( Report( gb )[axisbox( 1 )] << get min, Report( gb )[axisbox( 2 )] << get min );
Report( gb )[framebox( 1 )] << Xaxis( Min( theMin ), Max( theMax ) );
Report( gb )[framebox( 1 )] << Yaxis( Min( theMin ), Max( theMax ) );
Report( gb )[framebox( 1 )] << AddGraphicsScript(
xmin = X Origin();
xmax = X Origin() + X Range();
ymin = Y Origin();
ymax = Y Origin() + Y Range();
Pen Color( "blue" );
Pen Size( 1 );
Line Style( "solid" );
Line( {xmin, ymin}, {xmax, ymax} );
);
);
SquarifyWin_Expr = Expr(
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
nwin = New Window( "Enter Size of Desired Graph",
<<RETURN result=""></RETURN>Personalizzazione di massaRi: Aiuto con JSL Throw() non funziona come previstoCIAO @jthi E @David_Burnham ,
Grazie a entrambi per il feedback e le idee. Mi piace la mini finestra modale, è stata utile durante i test per vedere se QUALSIASI Graph Builder era aperto.
Ho deciso di cambiare le cose e riscrivere completamente il codice. Ora fa quello che voglio, ma tiene anche traccia attraverso array associativi di quale istanza di generatore di grafici è per quale progetto. Con le tabelle di dati, anche con più schede aperte, non ha problemi a distinguere tra le diverse istanze di Graph builder, anche all'interno di una singola tabella di dati, ma poiché i progetti hanno più schede, ho dovuto assicurarmi dell'assegnazione del grab builder oggetto scriptabile è stato associato al progetto corretto. Sono stato abbastanza felice di poter usare gli AA e che anche loro mi aiutassero! Il nuovo codice cambia anche la prima finestra a seconda che tu abbia solo tabelle di dati (o progetti) aperti o entrambi.
Questo è stato un bel piccolo sforzo e mi è piaciuto lavorarci. Dopo averlo testato ancora un po', lo condividerò con la mia organizzazione. Di seguito è riportato il codice se sei interessato. Non riuscivo a capire come far funzionare For Each () quando passavo attraverso tutti i possibili progetti e poi attraverso tutte le finestre all'interno di un progetto, quindi ho fatto invece i cicli For ().
Grazie!,
DS
//JSL to add diagonal line and automatically resize to desired size
//Written by SDF1 with help/input from jthi, txnelson, Craige_Hales, David_Burnham, and Mark_Bailey
Names Default To Here( 1 );
Clear Symbols();
lb_width = 80;
Lines_n = 6;
mmw = Function( {title, text, text_icon = "BlankIndex", window_icon = "NewApplication"},
{Default Local},
New Window( title,
<<MODAL></MODAL>Ri: Aiuto con JSL Throw() non funziona come previstoEsempio di ricerca delle finestre del generatore di grafici:
getGraphBuilderWindows = function({},{default local},
lst = {};
winList = getWindowList();
for each({win},winList,
winTitle = win << getWindowTitle;
if (contains(winTitle,"Graph Builder"),
insertinto(lst,win)
)
);
return(lst);
);
lstGBWindows = getGraphBuilderWindows();Ri: Aiuto con JSL Throw() non funziona come previstoTieni inoltre presente che CurrentReport cercherà qualsiasi finestra aperta, comprese quelle che stai creando.Dovrai ispezionare l'albero di visualizzazione ( ad esempio OutlineBox(1) ) per identificare una finestra come Graph Builder e, se hai aperto altre finestre, potrebbe non essere corrente, quindi forse cerca in un elenco di finestre aperte.
Ri: Aiuto con JSL Throw() non funziona come previstoProva a inserire la diagnostica nel tuo codice.
metto
show ( Current Report() );
prima del test, e ha riportato questo:
Current Report() = DisplayBox[HeadBox];
Non vuoto.
Ri: Aiuto con JSL Throw() non funziona come previstoHai controllato se ci sono stampe nel log di JMP? Il lancio potrebbe attivarsi ma non c'è semplicemente una "finestra di errore". Almeno quando lavoro con i componenti aggiuntivi utilizzo la finestra modale di errore personalizzata perché Throw non crea una finestra di errore come quando viene eseguito come script.
Dialoghi modali ha una funzione di avviso abbastanza semplice che potresti usare al posto di Throw (puoi anche lanciare ma usare la finestra modale per mostrare l'errore all'utente).
Modificare:
Ho trovato una funzione che ho usato per le finestre modali informative:
Names Default To Here(1);
mini_modal_window = function({title, text, text_icon = "BlankIndex", window_icon = "NewApplication"}, {Default Local},
New Window(title, <<MODAL></MODAL>