Aggiunta e rimozione di script graficiHo scritto una routine JSL in cui diversi script grafici vengono aggiunti e rimossi da Graph Builder durante una sequenza di animazione relativamente complessa. Gli script che devono essere aggiunti e rimossi dipendono dal set di dati analizzato, quindi devo scrivere molte cose come le seguenti (dove gb è il mio oggetto GraphBuilder e myScript1 e myScript2 sono entrambe espressioni che ho definito altrove):
If( k == 5, Report( gb ) << dispatch( {}, "Graph Builder", FrameBox, {Add Graphics Script( 1, Description( "Script" ), myScript1 )} ));
If( k == 10, Report( gb ) << dispatch( {}, "Graph Builder", FrameBox, {Remove Graphics Script( 2 )} ));
If( k == 15, Report( gb ) << dispatch( {}, "Graph Builder", FrameBox, {Add Graphics Script( 1, Description( "Script" ), myScript2 )} ));
Il mio problema è che sto perdendo traccia di quali script dovrei eliminare, perché mi riferisco a loro per numero e i numeri assegnati loro dal Generatore di grafici cambiano ogni volta che uno script viene rimosso.
lo so io Dovrebbe essere potenzialmente in grado di combinare tutti gli script grafici in un unico grande script in cui il controllo viene commutato tra le varie sezioni mediante clausole if-then-else, ma potenzialmente ce ne sono dozzine e l'intera faccenda probabilmente diventerebbe molto disordinata.
È possibile fare riferimento a script grafici per nome? In sostanza voglio essere in grado di fare qualcosa del genere:
report(gb) << dispatch( {}, "Graph Builder", FrameBox, {Remove Graphics Script( myScript2 )} );
Quanto sopra non funziona (ovviamente, o non avrei problemi), ma mi chiedo se c'è qualcosa di simile che mi è sfuggito.
Molte grazie per eventuali suggerimenti.
Ri: Aggiunta e rimozione di script graficiCraig,
Grazie per l'esempio dettagliato. L'esempio dello script di modifica dovrebbe essere utile a molti.
Tuttavia, mi sto fissando su quanto sarebbe bello avere un tag di descrizione e ottenere un handle per lo script sarebbe semplice come
thisOne = rbiv_fb << Xpath( "//TopSeg[@description='bluepoly'] " );
Forse JMP 15?
Ri: Aggiunta e rimozione di script graficimi piace anche @gzmorgan0 2° approccio. Ecco un'altra idea che cerca lo script piuttosto che mantenere un elenco. In uno script JSL un'espressione come 0; o "fred"; non fa niente; viene valutato e buttato via. Quindi uno script grafico come
"red"; fill color(...); circle(...);
può avere un identificatore all'inizio che può essere studiato in seguito, usando la funzione arg( script, 1 ) per tornare "rosso".
dt = Open( "$sample_data/big class.jmp" );
gb = dt << Graph Builder(
Size( 525, 452 ),
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 6 ) ) )
);
colors = {"red", "green", "blue", "yellow", "cyan", "magenta", "orange", "purple", "gray"};
For( i = 1, i <= N Items( colors ), i++,
Eval( // the "i" variable needs to be cast-in-stone so it will not be needed if the graph
Eval Expr( // is saved in a journal. EvalExpr will pre-eval the expr() below...
(Report( gb )[framebox( 1 )]) << addGraphicsScript(
1,
Expr( colors[i] ); // this will be the identifier for the script
Fill Color( Expr( colors[i] ) ); // pre-eval the color name, not just the subscript
Circle( {80 + 5 * Expr( i ), 50 + 2 * Expr( i )}, 1, "FILL" );
)
)
)
);
findSegById = Function( {frame, id}, // locate a graphics script by an id string
{child = frame << childSeg, script}, // the frame has a list of graphics scripts
While( !Is Empty( child ),
If( child << className == "TopSeg", // TopSeg is the className of a graphics script
script = child << getscript; // check the script to see if the first
If( Arg( script, 1 ) == id, // statement is the id name
Return( child )
);
);
child = child << sib;
);
Return( child ); // empty, not found
);
Wait( 1 );
thisOne = findSegById( Report( gb )[framebox( 1 )], colors[5] ); // the cyan script
thisOne << delete;
Wait( 1 );
thisOne = findSegById( Report( gb )[framebox( 1 )], "green" );
thisOne << delete;
Wait( 1 );
thisOne = findSegById( Report( gb )[framebox( 1 )], colors[9] ); // the gray script
thisOne << delete;
Wait( 1 );
// if needed, you can retrieve, edit, and replace the script
thisOne = findSegById( Report( gb )[framebox( 1 )], "blue" );
oldScript = thisOne << getscript;
newScript = Substitute( Name Expr( oldScript ), "FILL", Empty() ); // hollow black outline remains
Eval( Eval Expr( thisOne << setscript( Expr( Name Expr( newscript ) ) ) ) );
// gb << inval;
Print( If( Is Empty( findSegById( Report( gb )[framebox( 1 )], "argyle" ) ), "Good", "Bad" ) );
Three filled circles removed and one hollowed outThree filled circles removed and one hollowed outTre cerchi pieni rimossi e uno svuotato
Use the customize popup menu item to see the scripts; this is the edited scriptUse the customize popup menu item to see the scripts; this is the edited scriptUtilizzare la voce di menu popup personalizza per vedere gli script; questo è lo script modificato
Ri: Aggiunta e rimozione di script graficiCiao, è davvero molto utile, specialmente il secondo metodo che descrivi, che è geniale. Esempi che illustrano come funzionano le costruzioni eval(substitute(expr(...))) nel contesto in cui vorrei usarle sono piuttosto difficili da trovare, quindi tendo a scrivere in modo più leggibile (almeno per me) ma script molto meno intelligenti. Tuttavia in questo caso evidentemente avrò bisogno di qualcosa di molto più vicino al tuo esempio, che adatterò.
Spesso la cosa più importante in situazioni come questa è solo assicurarsi all'inizio di non aver perso un semplice trucco prima di rivolgere le armi pesanti al problema 
Grazie molto
Ri: Aggiunta e rimozione di script graficiCongratulazioni o stai scrivendo la tua sceneggiatura. Dalla tua sintassi, immagino che tu sia abbastanza nuovo in JSL.
Ho 2 script di esempio che potrebbero aiutare.Il primo utilizza l'espressione di script riferimento(nome). Dopo aver aggiunto i tuoi script, fai clic con il pulsante destro del mouse sulla cornice e seleziona Personalizza.Il JSL per il tuo script grafico non è visibile, solo il riferimento expr. Questo funziona. Tuttavia, se tu o l'utente inserite nel journal il grafico, successivamente chiudete il journal.Se apri la rivista in una nuova sessione, quelle espressioni non vengono definite e la grafica non verrà disegnata. Questo metodo funzionerà se non ci sono collisioni variabili nei tuoi script grafici e il grafico è rilevante solo nella sessione corrente. Xpath viene utilizzato per trovare il framebox TopSeq, la grafica aggiunta dall'utente e in questo caso solo il riferimento allo script.
Names Default To Here( 1 );
Open( "$SAMPLE_DATA/Big Class.jmp" );
orangepoly = Expr( Transparency( 0.5 );
Fill Color( {1.0, 0.5, 0.0} );
Polygon( [60, 72, 57], [75, 120, 120] );
);
bluepoly = Expr(
Transparency( 0.5 );
Fill Color( {0.0, 0.5, 1.0} );
Polygon( [60, 72, 57], [150, 120, 120] );
);
biv = Bivariate( Y( :weight ), X( :height ), FitLine );
rbiv = biv << report;
rbiv_fb = rbiv[frame box( 1 )];
rbiv_fb << Add Graphics Script(orangepoly);
rbiv_fb << Add Graphics Script(bluepoly);
//right click on the framebox and select Customize
/*just the expr reference is visible
If this graph is journaled, the journal is closed and reopened the graphics from the script
will not appear. look up Freeze All for the journal. */
glist = (rbiv_fb << XPath("//TopSeg")) << get script;
idx = contains(glist, expr(bluepoly));
Wait( 3 );
rbiv_fb << Remove Graphics Script( idx );Questo secondo metodo incorpora lo script nel framebox. Dopo che gli script sono stati aggiunti, fare clic con il tasto destro nel framebox e selezionare personalizzare, fare clic su uno script per vedere la differenza tra i due metodi. Dopo aver aggiunto uno script inserito in un elenco, il nome dello script. E quando rimuovi uno script, rimuovilo dall'elenco. L'elenco è una contabilità dinamica di quali script sono attivi e viene utilizzata una funzione per localizzarne la posizione.
Names Default To Here( 1 );
Open( "$SAMPLE_DATA/Big Class.jmp" );
glist={};
orangepoly = Expr(
Transparency( 0.5 );
Fill Color( {1.0, 0.5, 0.0} );
Polygon( [60, 72, 57], [75, 120, 120] );
);
bluepoly = Expr(
Transparency( 0.5 );
Fill Color( {0.0, 0.5, 1.0} );
Polygon( [60, 72, 57], [150, 120, 120] );
);
addgraph = Function({gnme}, {gexpr}, //"orangepoly")
Eval(Parse("gexpr = NameExpr("||gnme||")" ) );
Eval(Substitute(Expr(rbiv_fb << Add Graphics Script(_xxx)), Expr(_xxx), NameExpr(gexpr) ) );
insert into(glist, gnme );
); //end addgraph
rmvgraph = Function({gnme}, {idx},
idx = contains(glist, gnme);
if(idx>0,
rbiv_fb << Remove Graphics Script(idx);
removefrom(glist, idx)
);
); //end rmvgrph
biv = Bivariate( Y( :weight ), X( :height ), FitLine );
rbiv = biv << report;
rbiv_fb = rbiv[frame box( 1 )];
addgraph("orangepoly");
addgraph("bluepoly");
//right click on the framebox and select Customize
//the actual script is embedded
Wait( 3 );
rmvgraph("bluepoly");Sono d'accordo con l'elemento della tua lista dei desideri: aggiungi un tag Descrizione/Nome a questi script (TopSegs) framebox <