Grafikskripte hinzufügen und entfernenIch habe eine JSL-Routine geschrieben, in der während einer relativ komplexen Animationssequenz mehrere Grafikskripte zum Graph Builder hinzugefügt und daraus entfernt werden. Die Skripte, die hinzugefügt und entfernt werden müssen, hängen vom zu analysierenden Datensatz ab, daher muss ich viele Dinge wie die folgenden skripten (wobei gb mein GraphBuilder-Objekt ist und myScript1 und myScript2 beide Ausdrücke sind, die ich definiert habe). anderswo):
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 )} ));
Mein Problem ist, dass ich den Überblick darüber verliere, welche Skripte ich löschen soll, weil ich sie anhand der Nummer bezeichne – und die ihnen vom Graph Builder zugewiesenen Nummern ändern sich jedes Mal, wenn ein Skript entfernt wird.
ich weiß, ich sollen möglicherweise in der Lage sein, alle Grafikskripte in einem einzigen großen Skript zusammenzufassen, in dem die Steuerung zwischen den verschiedenen Abschnitten durch if-then-else-Klauseln umgeschaltet wird, aber es gibt potenziell Dutzende davon und das Ganze würde wahrscheinlich sehr chaotisch werden.
Ist es möglich, Grafikskripte namentlich zu bezeichnen? Im Wesentlichen möchte ich in der Lage sein, so etwas zu tun:
report(gb) << dispatch( {}, "Graph Builder", FrameBox, {Remove Graphics Script( myScript2 )} );
Das obige funktioniert nicht (offensichtlich, sonst hätte ich kein Problem), aber ich frage mich, ob ich etwas Ähnliches übersehen habe.
Vielen Dank für alle Vorschläge.
Betreff: Grafikskripte hinzufügen und entfernenCraige,
Vielen Dank für das ausführliche Beispiel. Das Beispiel für das Bearbeitungsskript dürfte für viele nützlich sein.
Allerdings denke ich darüber nach, wie schön es wäre, ein decscription-Tag zu haben, und wie einfach es wäre, einen Griff in das Skript zu bekommen
thisOne = rbiv_fb << Xpath( "//TopSeg[@description='bluepoly'] " );
Vielleicht JMP 15?
Betreff: Grafikskripte hinzufügen und entfernenich mag auch @gzmorgan0 2. Ansatz. Hier ist eine weitere Idee, die nach dem Skript sucht, anstatt eine Liste zu verwalten. In einem JSL-Skript kann ein Ausdruck wie 0; oder „Fred“; macht nichts; es wird ausgewertet und weggeworfen. Also ein Grafikskript wie
"red"; fill color(...); circle(...);
kann am Anfang einen Bezeichner haben, der später untersucht werden kann, indem die Funktion arg( script, 1 ) verwendet wird, um wieder „rot“ zu erhalten.
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 outDrei gefüllte Kreise entfernt und einer ausgehöhlt
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 scriptVerwenden Sie den Popup-Menüpunkt „Anpassen“, um die Skripte anzuzeigen. Dies ist das bearbeitete Skript
Betreff: Grafikskripte hinzufügen und entfernenHallo, das ist in der Tat sehr hilfreich – insbesondere die zweite Methode, die Sie beschreiben, die genial ist. Beispiele, die veranschaulichen, wie eval(substitute(expr(...)))-Konstruktionen in dem Kontext funktionieren, in dem ich sie verwenden möchte, sind ziemlich schwer zu finden, daher neige ich dazu, am Ende besser lesbare Texte zu schreiben (zumindest für mich). aber weit weniger intelligente Skripte. In diesem Fall brauche ich jedoch offensichtlich etwas, das Ihrem Beispiel viel näher kommt und das ich anpassen werde.
In Situationen wie dieser ist es oft am wichtigsten, gleich zu Beginn sicherzustellen, dass kein einfacher Trick übersehen wurde, bevor man sich mit voller Kraft an das Problem wendet 
Vielen Dank
Betreff: Grafikskripte hinzufügen und entfernenHerzlichen Glückwunsch oder schreiben Sie Ihr Skript. Aufgrund Ihrer Syntax vermute ich, dass Sie mit JSL noch ziemlich neu sind.
Ich habe 2 Beispielskripte, die helfen könnten.Der erste verwendet den Skriptausdruck reference(name). Nachdem Sie Ihre Skripte hinzugefügt haben, klicken Sie mit der rechten Maustaste auf die Framebox und wählen Sie „Anpassen“.Die JSL für Ihr Grafikskript ist nicht sichtbar, nur die Ausdrucksreferenz. Das funktioniert. Wenn Sie oder der Benutzer jedoch das Diagramm protokollieren, wird das Journal später geschlossen.Wenn Sie das Journal in einer neuen Sitzung öffnen, werden diese Ausdrücke nicht definiert und die Grafiken werden nicht gezeichnet. Diese Methode funktioniert, wenn es in Ihren Grafikskripten keine Variablenkollisionen gibt und das Diagramm nur in der aktuellen Sitzung relevant ist. Xpath wird verwendet, um die Framebox TopSeq, die vom Benutzer hinzugefügten Grafiken und in diesem Fall nur die Skriptreferenz zu finden.
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 );Diese zweite Methode bettet das Skript in die Framebox ein. Nachdem die Skripte hinzugefügt wurden, klicken Sie mit der rechten Maustaste in die Framebox und wählen Sie „Anpassen“. Klicken Sie auf ein Skript, um den Unterschied zwischen den beiden Methoden zu sehen. Nachdem Sie ein Skript hinzugefügt haben, fügen Sie den Skriptnamen in eine Liste ein. Und wenn Sie ein Skript entfernen, entfernen Sie es aus der Liste. Bei der Liste handelt es sich um eine dynamische Auflistung der aktiven Skripte, deren Position mithilfe einer Funktion ermittelt werden kann.
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");Ich stimme Ihrem Wunschlistenpunkt zu: Fügen Sie diesen Skripten ein Beschreibungs-/Namens-Tag hinzu (TopSegs). Framebox <