Fortschrittsbalken – meine persönliche Reise (auch Fragen zur Manipulation von Fenstern in der Projektumgebung)[JMP 17.0.0]
Ich habe an einer Projektdatei gearbeitet, die viele Datentabellen enthält, jede mit einem relativ lang laufenden Skript, das ich zum Generieren eines Journals als Ausgabe verwende.Ich habe ein separates Skript in einer anderen Tabelle, das jedes der einzelnen Tabellenskripte aufruft und dann die einzelnen Journale in einem einzigen Journal zusammenfasst, um einen Abschlussbericht zu erstellen.[Ich hätte diesen Ansatz wahrscheinlich viel sauberer gestalten können, aber ich bin kein Vollzeit- (oder auch nur Teilzeit-) Programmierer.]
Ich wollte eine Art Update-Fortschrittsbalken/Meldungsfeld „X von Y abgeschlossen“ implementieren, um den Ausführungsfortschritt nach der Ausführung jedes einzelnen Tabellenskripts zu verfolgen.
Dies ist die Geschichte darüber, wie ich zu meiner aktuellen Lösung gekommen bin.
TL;DR – Nachdem ich einen Tag damit verbracht hatte, mir einen cleveren Ansatz auszudenken, bin ich auf Caption() gestoßen, was am einfachsten gewesen wäre.
Aber ich habe noch einige allgemeine Fragen dazu, wie Fenster innerhalb der Projektumgebung manipuliert werden können – also bleiben Sie bei mir, wenn Sie interessiert sind.
Bei der Suche nach Diskussionen bin ich auf mehrere großartige Implementierungsideen gestoßen, darunter:
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
Wenn ich jedoch versuche, diese Lösungen in einer Projektumgebung zu implementieren, wird der neu erstellte Fortschrittsbalken immer als neue Registerkarte im Projekt erstellt. Wenn das nächste Skript in der Reihe startet, wird das Fortschrittsbalkenfenster durch die nachfolgenden mit dem Skript verbundenen Datentabellenmanipulationen verdeckt, sodass Sie nie die aktualisierte Fortschrittsmeldung sehen.
Allgemeine Frage Nr. 1: Ich kann nicht herausfinden, wie ich ein „Popout“-Fenster als Nachrichtenfeld erstellen kann, ohne dass es ein modales Fenster ist.Ich verstehe, dass modale Fenster das Skript anhalten, bis der Benutzer mit dem Fenster interagiert hat, was ich nicht möchte.Fehlt mir etwas daran, wie ich ein neues nicht-modales Fenster als „Popout“ statt als neuen Tab erstellen kann?
[Jetzt wird mir wieder klar, dass es so etwas wie Caption() gibt.Aber ich habe immer noch diese allgemeine Frage, ob alle neuen Fenster in einem Projekt als neue Registerkarten und nicht als Popout-Fenster geöffnet werden müssen.]
Allgemeine Frage Nr. 2: Dann dachte ich ... vielleicht gibt es eine Möglichkeit, dieses neu erstellte Fortschrittsbalkenfenster an einer anderen Stelle im Projektlayout anzudocken, sodass es vom Rest der Aktion getrennt ist – z. B. New Window() << Dock( „ Rechts").Aber so etwas habe ich noch nicht finden können.Gibt es eine Möglichkeit, den Andockort eines Fensters per Skript festzulegen?
Dann habe ich viel Zeit damit verbracht, zu lernen, wie Projektlayouts funktionieren und wie sie in Skripts geschrieben werden können.Ich habe durch diese Übung eine Menge gelernt.Am Ende habe ich mir ein Skript ausgedacht, das das Projektlayout vorübergehend ändert, um das Fenster „Zuletzt verwendete Dateien“ durch ein benutzerdefiniertes Fenster „Fortschrittsaktualisierung“ zu ersetzen, das das tut, was ich suche, und dann wieder auf „Zuletzt verwendete Dateien“ zurückgreift " Fenster.Wie Sie sich vielleicht vorstellen können, ist es ein ziemlich schwerfälliges Skript, aber es erledigt seinen Zweck.Ich habe versucht, es so gut wie möglich zu verallgemeinern und habe es hier angehängt, falls jemand daran interessiert ist, zu sehen, wie es funktioniert.
Irgendwann im Laufe des Tages wurde mir klar, dass es vielleicht eine Möglichkeit gibt, dies zum Laufen zu bringen, indem man erzwingt, dass neue Fenster, die von den einzelnen Skripten erstellt werden, unsichtbar sind, sodass das Fortschrittsbalkenfenster oben bleibt.Aber das wäre besser gewesen, wenn ich vorher darüber nachgedacht hätte.Zu diesem Zeitpunkt müsste ich ein paar hundert Skriptänderungen vornehmen, um diese Option zu erreichen (sofern möglich).
Nach all dem bin ich heute Morgen zur Arbeit gekommen, um Ihnen die ganze Geschichte zu erzählen, und bin fast sofort auf Caption() gestoßen – das im Grunde alles, was ich tun wollte, in zwei prägnanten Codezeilen erledigt.Ich wünschte nur, ich hätte das früher erkannt.Ich denke, wenn Sie wirklich einen echten Fortschrittsbalken und nicht nur Text haben wollten, würde Caption() vielleicht nicht funktionieren.Aber ich brauchte es nicht wirklich, dass es so schick war.
Danke fürs Zuhören.
Joel
Automatisierung und SkripterstellungBetreff: Fortschrittsbalken – meine persönliche Reise (auch Fragen zur Manipulation von Fenstern in der Projektumgebung)Als ich beim Discovery Summit am JMP User Experience Lab (oder etwas Ähnlichem) teilnahm, war es eines der ersten Male, dass ich Projekte nutzte (ich hatte sie schon früher genutzt, aber aufgrund von Fensterdiebstahl schnell damit aufgehört). Ich habe einige Vorschläge zur Benutzerfreundlichkeit gemacht und einige davon in Wunschlistenelemente umgewandelt.
Option hinzufügen, um nicht alle Fenster in JMP-Projekte aufzunehmen (bezogen auf dieses Thema)
Fügen Sie der Registerkarten-/Blatt-/Berichtsauswahl von JMP Project eine Gruppierungsoption (nach Datentabelle) hinzu – JMP User Community
Option hinzufügen, um neue Berichte in JMP-Projekten zu erstellen, die nach der Datentabelle geöffnet werden ... - JMP-Benutzergemeinschaft
Verbessern Sie das (nicht) eigenständige Content-Management in JMP-Projekten (dies wurde später erstellt)
Dieses Fensterdiebstahl ist immer noch mein Hauptgrund dafür, Projekte derzeit nicht einmal auszuprobieren.
Die Beschriftung kann glücklicherweise in Projekten verwendet werden und Sie können sie sogar in einen einigermaßen brauchbaren Fortschrittsbalken umwandeln. Ich bin mir nicht sicher, welche Art von Fortschrittsbalken Sie mit Caption() erstellt haben, aber ich habe schnell eine meiner Fortschrittsbalkenklassen geändert, die Text anstelle von Anzeigefeldern verwendet, da die gleiche Idee mit Beschriftungen verwendet werden könnte
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;"><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></P>
<P> </P>
<P>Höchstwahrscheinlich werde ich nächstes Jahr so etwas verwenden, wenn ich ein Skript erstellen muss, das JMP-Projekte verwendet.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-700215" slang="en-US" mode="NONE">Betreff: Fortschrittsbalken – meine persönliche Reise (auch Fragen zur Manipulation von Fenstern in der Projektumgebung)</LINGO-SUB><LINGO-BODY id="lingo-body-700215" slang="en-US" mode="NONE"><P>Haha – mein ursprünglicher Caption-Versuch war so einfach:</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;"><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></P><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> - Ihre Lösung ist auf jeden Fall eleganter, und ich habe bereits alle meine bisherigen Ansätze zugunsten Ihrer aufgegeben.Vielen Dank für den Vorschlag, Jarmo!</P><P>Ich musste ein paar Änderungen an Ihrem Skript vornehmen, damit es für mich funktioniert – ich habe die Zeichenfolge für den Caption()-Parameter von progress_text in update_txt geändert und die „black/white_large_square“ durch Unicode-Zeichen ersetzt.Ich habe auch einige Linien hinzugefügt, um das Beschriftungsfeld im Projektfenster ungefähr zu zentrieren.Ich habe das überarbeitete Skript unten gepostet.</P><P>Vielen Dank auch für den Hinweis auf den Abschnitt „Informationen an einen Benutzer senden“ in der Dokumentationsbibliothek.Jetzt sehe ich, dass es auch eine Möglichkeit gibt, mit StatusMsg() Nachrichten an die Statusleiste zu senden.Indem Sie die Aufrufe von Caption() durch Aufrufe von StatusMsg() ersetzen, können Sie den gleichen Effekt erzielen, ohne ein Popup-Fenster zu benötigen oder mit dem Projektlayout herumzuspielen, wie ich es bisher getan habe.Ich habe diese Version auch unten gepostet.</P><P>[BEARBEITEN: Nachdem ich noch ein wenig mit der StatusMsg()-Option herumgespielt habe, stelle ich fest, dass es schwierig sein kann, den Fortschrittsbalken dauerhaft angezeigt zu halten, je nachdem, wie viele andere skriptbezogene (aber nicht skriptgesteuerte) Nachrichten an den Status gesendet werden Leiste, während Ihr Skript ausgeführt wird.Der Caption()-Ansatz funktioniert immer noch einwandfrei und ist in den meisten Szenarien wahrscheinlich der beste der beiden Ansätze.]</P><P>Ich persönlich beschäftige mich schon seit einiger Zeit mit Projekten.Ich glaube, ich weiß unbewusst, dass es keine Voraussetzung ist, in Projekten zu arbeiten, aber mir gefällt der Aspekt der Tabellen-/Tab-Organisation.Dies ist das erste Mal, dass ich bei der Arbeit mit Projekten auf ein erhebliches Problem stoße, aber nachdem ich mir die anderen potenziellen Verbesserungen angesehen habe, die Sie angesprochen haben, stimme ich zu, dass es Dinge gibt, die verbessert werden können.</P><P>Überarbeitetes Caption()-Skript:</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);
StatusMsg()-Skript:
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( " ");-Joel
Betreff: Fortschrittsbalken – meine persönliche Reise (auch Fragen zur Manipulation von Fenstern in der Projektumgebung)Klingt, als ob du gute Fortschritte machst 