Barres de progression – mon parcours personnel (également des questions sur la manipulation des fenêtres dans l'environnement du projet)[JMP 17.0.0]
J'ai travaillé sur un fichier de projet qui contient de nombreuses tables de données, chacune avec un script relativement long que j'utilise pour générer un journal en sortie.J'ai un script distinct dans une autre table qui appelle chacun des scripts de table individuels, puis rassemble les journaux individuels en un seul journal pour créer un rapport final.[J'aurais probablement pu rendre cette approche beaucoup plus propre, mais je ne suis pas un codeur temporel complet (ni même partiel).]
Je voulais implémenter une sorte de barre de progression/boîte de message de mise à jour « X sur Y terminé » pour suivre la progression de l'exécution après l'exécution de chaque script de table individuel.
C'est l'histoire de la façon dont je suis arrivé à ma solution actuelle.
TL;DR – Après avoir passé une journée à trouver une approche intelligente pour moi seul, je suis tombé sur Caption(), ce qui aurait été la chose la plus simple à faire.
Mais j'ai encore quelques questions générales sur la façon dont les fenêtres peuvent être manipulées dans l'environnement du projet – alors restez avec moi si vous êtes intéressé.
J'ai découvert plusieurs idées de mise en œuvre intéressantes en recherchant dans les discussions, notamment :
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
Cependant, lorsque j'essaie d'implémenter ces solutions dans un environnement de projet, la nouvelle barre de progression créée est toujours créée en tant que nouvel onglet dans le projet. Lorsque le script suivant de la série démarre, la fenêtre de la barre de progression est recouverte par les manipulations ultérieures de la table de données associées au script, de sorte que vous ne voyez jamais le message de progression mis à jour.
Question générale n°1 : Je n'arrive pas à comprendre comment créer une fenêtre « contextuelle » en tant que boîte de message sans qu'il s'agisse d'une fenêtre modale.Je crois comprendre que les fenêtres modales mettent le script en pause jusqu'à ce que l'utilisateur ait interagi avec la fenêtre, ce que je ne veux pas.Y a-t-il quelque chose qui me manque dans la façon dont je peux créer une nouvelle fenêtre non modale sous forme de « pop-out » plutôt que de nouvel onglet ?
[Encore une fois, je réalise maintenant qu'il existe une chose telle que Caption().Mais j'ai toujours cette question générale de savoir si toutes les nouvelles fenêtres d'un projet doivent être ouvertes sous forme de nouveaux onglets plutôt que de fenêtre contextuelle.]
Question générale n°2 : Ensuite, j'ai pensé… peut-être qu'il existe un moyen d'ancrer cette fenêtre de barre de progression nouvellement créée à un autre emplacement dans la présentation du projet afin qu'elle soit séparée du reste de l'action – par exemple, Nouvelle fenêtre() << Dock( " Droite").Mais je n'ai rien trouvé de tel.Existe-t-il un moyen de scripter l'emplacement d'ancrage d'une fenêtre ?
Ensuite, j'ai passé beaucoup de temps à apprendre comment fonctionnent les présentations de projets et comment elles peuvent être scriptées.J'ai beaucoup appris de cet exercice.En fin de compte, j'ai trouvé un script qui modifie temporairement la présentation du projet pour remplacer la fenêtre « Fichiers récents » par une fenêtre « Mise à jour de progression » personnalisée qui fait ce que je recherche, puis revient à la fenêtre « Fichiers récents ». " fenêtre.Comme vous pouvez l'imaginer, c'est un script assez maladroit, mais il fait le travail.J'ai essayé de le généraliser du mieux que j'ai pu et je l'ai joint ici au cas où quelqu'un serait intéressé de voir comment cela fonctionne.
À un moment donné dans la journée, j'ai réalisé qu'il existait peut-être un moyen de faire fonctionner cela en forçant les nouvelles fenêtres créées par les scripts individuels à être invisibles, afin que la fenêtre de la barre de progression reste en haut.Mais cela aurait été mieux si j’y avais pensé dès le départ.À ce stade, je devrais effectuer quelques centaines de modifications de script pour obtenir cette option (si c'est possible).
Après tout cela, je suis venu travailler ce matin pour vous raconter toute cette histoire, et je suis presque immédiatement tombé sur Caption() – qui fait essentiellement tout ce que je voulais faire en deux lignes de code succinctes.J’aurais juste aimé m’en rendre compte plus tôt.Je suppose que si vous vouliez vraiment avoir une véritable « barre » de progression et pas seulement du texte, peut-être que Caption() ne fonctionnerait pas.Mais je n’avais pas vraiment besoin que ce soit aussi sophistiqué.
Merci de votre attention.
Joël
Automatisation et scriptsRe : Barres de progression – mon parcours personnel (également des questions sur la manipulation des fenêtres dans l'environnement du projet)Lorsque j'ai assisté au laboratoire d'expérience utilisateur JMP (ou quelque chose de similaire) lors du sommet de découverte, c'était l'une des premières fois où j'utilisais des projets (je les avais utilisés plus tôt mais j'ai rapidement arrêté en raison du vol de fenêtres). J'ai fait quelques suggestions d'utilisabilité et j'en ai transformé certaines en éléments de liste de souhaits.
Ajouter une option pour ne pas contenir toutes les fenêtres du projet JMP (en rapport avec ce sujet)
Ajouter une option de regroupement (par table de données) au sélecteur d'onglet/feuille/rapport du projet JMP - JMP User Community
Ajouter une option pour créer de nouveaux rapports dans les projets JMP à ouvrir après le tableau de données... - Communauté d'utilisateurs JMP
Améliorer la gestion de contenu (non) autonome dans les projets JMP (cela a été créé plus tard)
Ce vol de fenêtre reste la principale raison pour laquelle je ne teste même pas de projets actuellement.
Heureusement, la légende peut être utilisée dans les projets et vous pouvez même la transformer en barre de progression assez utilisable. Je ne suis pas sûr du type de barre de progression que vous avez créé à l'aide de Caption() mais j'ai rapidement modifié une de mes classes de barre de progression qui utilise du texte au lieu de zones d'affichage, car la même idée pourrait être utilisée avec la légende.
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;"><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></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P>
<P>J'utiliserai très probablement quelque chose comme ça l'année prochaine, lorsque je devrai créer un script utilisant des projets JMP.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-700215" slang="en-US" mode="NONE">Re : Barres de progression – mon parcours personnel (également des questions sur la manipulation des fenêtres dans l'environnement du projet)</LINGO-SUB><LINGO-BODY id="lingo-body-700215" slang="en-US" mode="NONE"><P>Haha – ma tentative de sous-titre originale était aussi simple que ceci :</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;"><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></SPAN></SPAN></SPAN></SPAN></P><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> - Votre solution est nettement plus élégante, et j'ai déjà abandonné toutes mes approches antérieures au profit de la vôtre.Merci pour la suggestion Jarmo!</P><P>J'ai dû apporter quelques modifications à votre script pour qu'il fonctionne pour moi - j'ai changé la chaîne du paramètre Caption() de progress_text à update_txt et j'ai remplacé les "black/white_large_square" par des caractères Unicode.J'ai également ajouté quelques lignes pour centrer approximativement la zone de légende dans la fenêtre du projet.J'ai publié le script révisé ci-dessous.</P><P>Merci également de m'avoir orienté vers la section "Envoyer des informations à un utilisateur" de la bibliothèque de documentation.Maintenant, je vois qu'il existe également un moyen d'envoyer des messages à la barre d'état avec StatusMsg().En remplaçant les appels à Caption() par des appels à StatusMsg(), vous pouvez obtenir le même effet sans avoir besoin d'une fenêtre contextuelle ni de jouer avec la présentation du projet comme je le faisais.J'ai également publié cette version ci-dessous.</P><P>[EDIT : après avoir joué un peu plus avec l'option StatusMsg(), je trouve qu'il peut être difficile de garder la barre de progression affichée de manière persistante en fonction du nombre d'autres messages associés au script (mais non scriptés) envoyés au statut. barre pendant l'exécution de votre script.L'approche Caption() fonctionne toujours correctement et constitue probablement la meilleure des deux approches dans la plupart des scénarios.]</P><P>Pour ma part, je travaille sur des projets depuis un moment maintenant.Je suppose que je sais inconsciemment que ce n’est pas une obligation pour travailler sur des projets, mais j’aime l’aspect organisation des tables/onglets.C'est la première fois que je rencontre un problème important en travaillant avec des projets, mais après avoir examiné les autres améliorations potentielles que vous avez soulevées, je reconnais qu'il y a des choses qui peuvent être améliorées.</P><P>Script Légende() révisé :</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);
Script StatusMsg() :
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( " ");-Joël
Re : Barres de progression – mon parcours personnel (également des questions sur la manipulation des fenêtres dans l'environnement du projet)Tu as l'air de bien progresser 