Hilfe, wenn JSL Throw() nicht wie erwartet funktioniertVerehrte Gäste,
(JMP Pro 16.1.0, Win10)
Ich habe ein Problem im Zusammenhang mit einem früheren Beitrag von mir Hier , wenn Sie an einer „Hintergrundgeschichte“ interessiert sind.
Das Hauptproblem, das ich jetzt habe, ist, dass der Befehl Throw() nicht wie erwartet funktioniert. In meinem Code (den vollständigen Code finden Sie am Ende) habe ich an einigen Stellen einen Test, um zu sehen, ob es derzeit einen offenen Graph Builder-Bericht gibt, der so aussieht und in eine Expr()-Anweisung eingeschlossen ist:
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
Das Problem besteht darin, dass er diese Zeilen immer dann zu überspringen scheint, wenn ich den Code ausführe (als ob er über einen Hotbutton in der Symbolleiste ausgeführt würde) und ignoriert, wenn kein Bericht geöffnet ist. Aber wenn ich den Code „Zeile für Zeile“ ausführe, erkennt er korrekt, dass kein Bericht geöffnet ist, und benachrichtigt den Benutzer.
Ich versuche, Code zu schreiben, der an Benutzer in meiner Organisation verteilt wird, und versuche, ihn robust genug zu machen, um verschiedene Arten von Situationen zu bewältigen, z. B. wenn ein Benutzer eine oder mehrere Datentabellen und/oder ein oder mehrere Projekte geöffnet hat (was kann mehrere Datentabellen enthalten).
Hier ist das Konzept des Codes (das Problem tritt bei Punkt 6 auf): Ein Benutzer erstellt eine Grafik in Graph Builder und möchte dann eine routinemäßige Änderung der Grafik durchführen (Einzelheiten hierzu finden Sie im Link oben). Anschließend klickt der Benutzer auf die Symbolleiste Hotbutton, um diese Aktion auszuführen.
- Der Code führt den Graphic_Expr-Ausdruck aus, um den Speicherort der Grafik zu bestimmen – sei es in einer „eigenständigen“ Datentabelle oder innerhalb eines Projekts (es kann nur eine Option ausgewählt werden). -> (gehe zu)
- Je nachdem, welches Kontrollkästchen aktiviert ist, führt der Code dann entweder den dt_win_Expr- oder den prj_win_Expr-Code aus (im Moment habe ich ihn nur für die Datentabellenoption eingerichtet, während ich den Code teste, aber im Idealfall sollte er am Ende mehr oder weniger gleich funktionieren). . -> (gehe zu)
- Wenn es sich um eine eigenständige Datentabelle handelt, wird dt_win_Expr ausgeführt und ein Fenster erstellt, in dem der Benutzer die Datentabelle auswählen kann, in der sich die Grafik befindet, die er bearbeiten möchte. Denken Sie daran, dass der Benutzer möglicherweise mehr als eine Datentabelle geöffnet hat und möglicherweise mehr als einen Graph Builder geöffnet hat. | (oder)
- Wenn der Benutzer ein Projekt auswählt, wird in ähnlicher Weise prj_win_Expr (noch nicht abgeschlossen) ausgeführt, damit der Benutzer das Projekt (falls mehr als eines geöffnet ist) und nachfolgende Datentabellen innerhalb dieses Projekts auswählen kann. -> (gehe zu)
- Sobald eine Datentabelle ausgewählt ist, egal ob eigenständig oder innerhalb eines Projekts, führt der Code den SquarifyWin_Expr-Ausdruck aus. Das erste, was hier durchgeführt wird, ist zu testen, ob tatsächlich ein aktueller Bericht vorhanden ist – der If()-Code von oben (möglicherweise muss ich ihn ändern und testen, ob der aktuelle Bericht ein Graph Builder ist oder nicht). **Hier funktioniert der Code NICHT wie erwartet. Auch wenn kein Graph Builder geöffnet ist, fährt er mit dem Rest des Codes fort, wenn die Warnung ausgegeben werden sollte.** Wenn alles funktioniert...-> (gehe zu)
- Basierend auf den Pixelabmessungen und der Frage, ob quadriert werden soll, führt der Code dann den Ausdruck RprtUpdate_Expr aus, wo er die gewünschten Aktualisierungen an den Graph Builder-Bericht sendet.
Ich hoffe, dass diese Beschreibung Sinn macht und dabei hilft, meinen gewünschten Programmierpfad/meine gewünschte Programmierfunktion in einen Kontext zu bringen.
Vielen Dank im Voraus für jede Hilfe bei der Lösungsfindung. Vollständiger JSL-Code am Ende.
Danke!,
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>MassenanpassungBetreff: Hilfe dazu, dass JSL Throw() nicht wie erwartet funktioniertHallo @jthi Und @David_Burnham ,
Vielen Dank euch beiden für euer Feedback und eure Ideen. Mir gefällt das Mini-Modalfenster. Es war praktisch, wenn ich testen wollte, ob irgendein Graph Builder geöffnet war.
Ich beschloss, etwas zu ändern und den Code komplett neu zu schreiben. Es macht jetzt, was ich will, aber es verfolgt auch über assoziative Arrays, welche Graph Builder-Instanz für welches Projekt geeignet ist. Bei Datentabellen, selbst wenn sie mehrfach geöffnet sind, ist es kein Problem, zwischen den verschiedenen Instanzen des Graph Builders zu unterscheiden, selbst innerhalb einer einzelnen Datentabelle. Da Projekte jedoch mehrere Registerkarten haben, musste ich die Zuweisung des Grab Builders sicherstellen Das skriptfähige Objekt wurde mit dem richtigen Projekt verknüpft. Ich war ziemlich froh, AAs nutzen zu können und dass sie mir auch helfen konnten! Der neue Code ändert auch das erste Fenster, je nachdem, ob Sie nur Datentabellen (oder Projekte) oder beides geöffnet haben.
Das war ein nettes kleines Unterfangen und es hat mir Spaß gemacht, daran zu arbeiten. Nachdem ich es noch einmal getestet habe, werde ich es mit meiner Organisation teilen. Unten finden Sie den Code, falls Sie interessiert sind. Ich konnte nicht herausfinden, wie ich For Each() zum Laufen bringen kann, wenn ich alle möglichen Projekte und dann alle Fenster innerhalb eines Projekts durchlaufe, also habe ich stattdessen For()-Schleifen ausgeführt.
Danke!,
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>Betreff: Hilfe dazu, dass JSL Throw() nicht wie erwartet funktioniertBeispiel für die Suche nach Graph Builder-Fenstern:
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();Betreff: Hilfe dazu, dass JSL Throw() nicht wie erwartet funktioniertBitte beachten Sie auch, dass CurrentReport nach allen geöffneten Fenstern sucht, einschließlich der Fenster, die Sie erstellen.Sie müssen den Anzeigebaum (z. B. OutlineBox(1)) untersuchen, um ein Fenster als Graph Builder zu identifizieren. Wenn Sie andere Fenster geöffnet haben, ist es möglicherweise nicht aktuell. Suchen Sie daher möglicherweise in einer Liste geöffneter Fenster.
Betreff: Hilfe dazu, dass JSL Throw() nicht wie erwartet funktioniertVersuchen Sie, Diagnosen in Ihren Code einzubauen.
Ich legte
show ( Current Report() );
vor Ihrem Test, und es wurde Folgendes gemeldet:
Current Report() = DisplayBox[HeadBox];
Nicht leer.
Betreff: Hilfe dazu, dass JSL Throw() nicht wie erwartet funktioniertHaben Sie überprüft, ob im JMP-Protokoll Ausdrucke vorhanden sind? Der Throw könnte ausgelöst werden, aber es gibt einfach kein „Fehlerfenster“. Zumindest wenn ich mit Add-Ins arbeite, verwende ich ein benutzerdefiniertes modales Fehlerfenster, da Throw kein Fehlerfenster erstellt, wie wenn es als Skript ausgeführt wird.
Modale Dialoge verfügt über eine ziemlich einfache Warnfunktion, die Sie anstelle von Throw verwenden können (Sie können auch werfen, aber das modale Fenster verwenden, um dem Benutzer den Fehler anzuzeigen).
Bearbeiten:
Ich habe eine Funktion gefunden, die ich für Info-Modalfenster verwendet habe:
Names Default To Here(1);
mini_modal_window = function({title, text, text_icon = "BlankIndex", window_icon = "NewApplication"}, {Default Local},
New Window(title, <<MODAL></MODAL>