Barras de progreso: mi viaje personal (también preguntas sobre la manipulación de ventanas en el entorno del proyecto)[JMP 17.0.0]
Tengo un archivo de proyecto en el que he estado trabajando que tiene muchas tablas de datos, cada una con un script de ejecución relativamente larga que uso para generar un diario como resultado.Tengo un script separado en otra tabla que llama a cada uno de los scripts de las tablas individuales y luego recopila los diarios individuales en un solo diario para crear un informe final.[Probablemente podría haber hecho este enfoque mucho más limpio, pero no soy un codificador a tiempo completo (ni siquiera parcial).]
Quería implementar algún tipo de barra de progreso/cuadro de mensaje de actualización "X de Y completado" para realizar un seguimiento del progreso de la ejecución después de la ejecución de cada script de tabla individual.
Esta es la historia de cómo llegué a mi solución actual.
TL;DR – Después de pasar un día ideando un enfoque inteligente solo para mí, me encontré con Caption(), que habría sido lo más fácil de hacer.
Pero todavía tengo algunas preguntas generales sobre cómo se pueden manipular las ventanas dentro del entorno del proyecto, así que quédate conmigo si estás interesado.
Hay varias ideas de implementación excelentes que encontré mientras buscaba en Discusiones, que incluyen:
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
Sin embargo, cuando intento implementar estas soluciones dentro de un entorno de proyecto, la nueva barra de progreso que se crea siempre se crea como una nueva pestaña en el proyecto. Cuando comienza el siguiente script de la serie, la ventana de la barra de progreso queda oculta por las manipulaciones posteriores de la tabla de datos asociadas con el script, por lo que nunca verá el mensaje de progreso actualizado.
Pregunta general n.º 1: No sé cómo crear una ventana “emergente” como cuadro de mensaje sin que sea una ventana modal.Tengo entendido que las ventanas modales pausan el script hasta que el usuario haya interactuado con la ventana, que es lo que no quiero.¿Hay algo que me falta acerca de cómo puedo crear una nueva ventana no modal como una "ventana emergente" en lugar de una nueva pestaña?
[Nuevamente, ahora me doy cuenta de que existe algo llamado Caption().Pero todavía tengo esta pregunta general sobre si todas las ventanas nuevas de un proyecto deben abrirse como pestañas nuevas en lugar de una ventana emergente.]
Pregunta general n.º 2: Entonces pensé... tal vez haya una manera de acoplar esta ventana de barra de progreso recién creada a otra ubicación en el diseño del proyecto para que esté separada del resto de la acción; por ejemplo, Nueva ventana() << Acoplar( “ Bien").Pero no he podido encontrar nada de eso.¿Hay alguna manera de programar la ubicación de acoplamiento de una ventana?
Luego dediqué mucho tiempo a aprender cómo funcionan los diseños de proyectos y cómo se pueden escribir guiones.Aprendí muchísimo de ese ejercicio.Al final, se me ocurrió un script que cambia temporalmente el diseño del proyecto para reemplazar la ventana "Archivos recientes" con una ventana personalizada de "Actualización de progreso" que hace lo que estoy buscando y luego vuelve a la ventana "Archivos recientes". " ventana.Como puedes imaginar, es un guión bastante torpe, pero hace el trabajo.Intenté generalizarlo lo mejor que pude y lo adjunto aquí por si alguien está interesado en ver cómo funciona.
En algún momento del día me di cuenta de que tal vez hay una manera de hacer que esto funcione forzando que las nuevas ventanas creadas por los scripts individuales sean invisibles, de modo que la ventana de la barra de progreso permanezca en la parte superior.Pero habría sido mejor si lo hubiera pensado desde el principio.En este punto, tendría que realizar un par de cientos de ediciones de script para lograr esta opción (si es posible).
Después de todo eso, vine a trabajar esta mañana para contarles toda esta historia y casi de inmediato encontré Caption(), que hace básicamente todo lo que quería hacer en dos líneas de código concisas.Ojalá me hubiera dado cuenta de eso antes.Supongo que si realmente quisieras tener una “barra” de progreso real y no solo texto, tal vez Caption() no funcionara.Pero realmente no necesitaba que esto fuera tan sofisticado.
Gracias por escuchar.
joel
Automatización y secuencias de comandosRe: Barras de progreso: mi viaje personal (también preguntas sobre la manipulación de ventanas en el entorno del proyecto)Cuando asistí al laboratorio de experiencia de usuario de JMP (o algo similar) en la cumbre de descubrimiento, fue una de las primeras veces que usé proyectos (los había usado antes pero los dejé rápidamente debido al robo de ventanas). Hice algunas sugerencias de usabilidad y convertí algunas en elementos de la lista de deseos.
Agregar opción para no contener todas las ventanas del proyecto JMP (relacionado con este tema)
Agregar opción de agrupación (por tabla de datos) al selector de pestañas/hojas/informes de JMP Project - Comunidad de usuarios de JMP
Agregue la opción para crear nuevos informes en los proyectos JMP que se abrirán después de la tabla de datos... - Comunidad de usuarios de JMP
Mejorar la gestión de contenidos (no) autónomos en JMP Projects (esto fue creado más tarde)
Ese robo de ventanas sigue siendo mi principal razón para ni siquiera probar proyectos actualmente.
Afortunadamente, los subtítulos se pueden usar en proyectos e incluso puedes convertirlos en una barra de progreso bastante útil. No estoy seguro de qué tipo de barra de progreso creaste usando Caption(), pero modifiqué rápidamente una de mis clases de barra de progreso que usa texto en lugar de cuadros de visualización, ya que la misma idea podría usarse con el título.
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;"><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></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P>
<P>Lo más probable es que use algo como esto el próximo año, cuando tenga que hacer un script que use proyectos JMP.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-700215" slang="en-US" mode="NONE">Re: Barras de progreso: mi viaje personal (también preguntas sobre la manipulación de ventanas en el entorno del proyecto)</LINGO-SUB><LINGO-BODY id="lingo-body-700215" slang="en-US" mode="NONE"><P>Jaja, mi intento de título original fue tan simple como este:</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;"><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></SPAN></P><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> - Su solución es definitivamente más elegante y ya abandoné todos mis enfoques anteriores en favor del suyo.¡Gracias por la sugerencia Jarmo!</P><P>Tuve que hacer un par de ediciones en su secuencia de comandos para que funcionara: cambié la cadena del parámetro Caption() de Progress_text a update_txt y reemplacé los "black/white_large_square" con caracteres Unicode.También agregué algunas líneas para centrar aproximadamente el cuadro de título en la ventana del proyecto.Publiqué el guión revisado a continuación.</P><P>También gracias por indicarme la sección "Enviar información a un usuario" de la biblioteca de documentación.Ahora veo que también hay una manera de enviar mensajes a la barra de estado con StatusMsg().Al reemplazar las llamadas a Caption() con llamadas a StatusMsg(), puedes obtener el mismo efecto sin necesidad de una ventana emergente o sin alterar el diseño del proyecto como lo había estado haciendo yo.También publiqué esa versión a continuación.</P><P>[EDITAR: Después de jugar un poco más con la opción StatusMsg(), descubro que puede ser difícil mantener la barra de progreso mostrada de manera persistente dependiendo de cuántos otros mensajes asociados con secuencias de comandos (pero no con secuencias de comandos) se envían al estado. bar mientras se ejecuta el script.El enfoque Caption() todavía funciona bien y probablemente sea el mejor de los dos enfoques en la mayoría de los escenarios.]</P><P>Para mí, llevo un tiempo trabajando con proyectos.Supongo que inconscientemente sé que no es un requisito trabajar en proyectos, pero me gusta el aspecto de organización de tablas/pestañas.Esta es la primera vez que me encuentro con un problema importante al trabajar con proyectos, pero después de observar las otras posibles mejoras que ha planteado, estoy de acuerdo en que hay cosas que se pueden mejorar.</P><P>Script de título revisado():</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 de mensaje de estado():
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
Re: Barras de progreso: mi viaje personal (también preguntas sobre la manipulación de ventanas en el entorno del proyecto)Parece que estás haciendo buenos progresos;)