Ayuda con JSL Throw () que no funciona como se esperabaEstimados,
(JMP Pro 16.1.0, Win10)
Tengo un problema relacionado con una publicación anterior mía. aquí , si está interesado en alguna "historia de fondo".
El problema principal que tengo ahora es que el comando Throw() no funciona como se esperaba. En mi código (ver al final el código completo), tengo en algunos lugares una prueba para ver si actualmente hay un informe de generador de gráficos abierto, se ve así, y está envuelto en una declaración Expr():
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
El problema es que, cada vez que ejecuto el código (como si lo ejecutara desde un botón de la barra de herramientas), parece omitir estas líneas e ignorar si no hay un informe abierto. Pero, cuando ejecuto el código "línea por línea", detectará correctamente que no hay ningún informe abierto y notificará al usuario.
Estoy tratando de escribir código para distribuirlo a los usuarios de mi organización y tratar de hacerlo lo suficientemente robusto para manejar diferentes tipos de situaciones, por ejemplo, si un usuario tiene una o más tablas de datos abiertas y/o uno o más proyectos abiertos (que puede contener múltiples tablas de datos).
Este es el concepto del código (el problema ocurre en el elemento 6): un usuario está creando un gráfico en Graph Builder, luego quiere hacer una modificación de rutina del gráfico (consulte el enlace anterior para obtener detalles al respecto), el usuario luego hace clic en la barra de herramientas hotbutton para realizar dicha acción.
- El código ejecuta la expresión Graphic_Expr para determinar la ubicación del gráfico, ya sea en una tabla de datos "independiente" o dentro de un proyecto (solo se puede seleccionar una opción). -> (ir a)
- Dependiendo de qué casilla de verificación esté seleccionada, el código ejecuta el código dt_win_Expr o prj_win_Expr (en este momento, solo lo tengo configurado para la opción de tabla de datos mientras pruebo el código, pero idealmente debería funcionar más o menos igual al final) . -> (ir a)
- Si es una tabla de datos independiente, ejecuta dt_win_Expr y crea una ventana para que el usuario seleccione la tabla de datos donde reside el gráfico que desea editar. Recuerde que el usuario podría tener más de una tabla de datos abierta con potencialmente más de un Graph Builder abierto. | (o)
- De manera similar, si el usuario selecciona un proyecto, ejecutará prj_win_Expr (aún no completado) para que el usuario seleccione qué proyecto (si hay más de uno abierto) y las tablas de datos subsiguientes dentro de ese proyecto. -> (ir a)
- Una vez que se selecciona una tabla de datos, ya sea independiente o dentro de un proyecto, el código ejecuta la expresión SquarifyWin_Expr. Lo primero que hace aquí es probar si de hecho existe un Informe actual: el código If() de arriba (es posible que deba modificar y probar si el informe actual es un Creador de gráficos o no). **Aquí es donde el código NO funciona como se esperaba. Incluso si no hay Graph Builder abierto, continuará con el resto del código cuando debería mostrar la advertencia.** Si todo funciona....-> (ir a)
- Según las dimensiones de los píxeles y si se debe cuadrar, el código ejecuta la expresión RprtUpdate_Expr, donde envía las actualizaciones deseadas al informe Graph Builder.
Espero que esta descripción tenga sentido y ayude a poner en contexto cuál es mi ruta/funcionalidad de programación deseada.
Muchas gracias de antemano por cualquier ayuda para encontrar una solución. Código JSL completo al final.
¡Gracias!,
SD
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>La personalización en masaRe: Ayuda con JSL Throw() que no funciona como se esperabaHola @jthi y @David_Burnham ,
Gracias a ambos por sus comentarios e ideas. Me gusta la miniventana modal, fue útil al probar para ver si CUALQUIER Generador de gráficos estaba abierto.
Decidí cambiar las cosas y reescribí totalmente el código. Ahora hace lo que quiero, pero también realiza un seguimiento a través de matrices asociativas de qué instancia del generador de gráficos es para qué proyecto. Con tablas de datos, incluso con varias abiertas, no hay problema para distinguir entre las diferentes instancias del generador de gráficos, incluso dentro de una sola tabla de datos, pero como los proyectos tienen varias pestañas, tenía que asegurarme de que la asignación del generador de capturas El objeto programable estaba asociado con el proyecto correcto. ¡Estaba muy feliz de poder usar AA y que me ayudaran también! El nuevo código también cambia la primera ventana dependiendo de si solo tiene abiertas tablas de datos (o proyectos) o ambos.
Este fue un pequeño esfuerzo agradable y disfruté trabajando en él. Después de probarlo un poco más, lo compartiré con mi organización. A continuación se muestra el código si usted está interesado. No pude averiguar cómo hacer que For Each() funcionara al pasar por todos los proyectos posibles y luego por todas las ventanas dentro de un proyecto, así que hice bucles For() en su lugar.
¡Gracias!,
SD
//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>Re: Ayuda con JSL Throw() que no funciona como se esperabaEjemplo de escaneo de ventanas del generador de gráficos:
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();Re: Ayuda con JSL Throw() que no funciona como se esperabaTambién tenga en cuenta que CurrentReport buscará cualquier ventana abierta, incluidas las que está creando.Deberá inspeccionar el árbol de visualización (p. ej., OutlineBox(1) ) para identificar una ventana como Graph Builder, y si ha abierto otras ventanas, es posible que no esté actual, por lo que tal vez busque en una lista de ventanas abiertas.
Re: Ayuda con JSL Throw() que no funciona como se esperabaIntente poner diagnósticos en su código.
pongo
show ( Current Report() );
antes de su prueba, e informó esto:
Current Report() = DisplayBox[HeadBox];
No vacío.
Re: Ayuda con JSL Throw() que no funciona como se esperaba¿Ha comprobado si hay alguna impresión en JMP Log? El lanzamiento puede activarse, pero simplemente no hay una "ventana de error". Al menos cuando trabajo con complementos, uso una ventana modal de error personalizada porque Throw no crea una ventana de error como cuando se ejecuta como un script.
Diálogos modales tiene una función de alerta bastante simple que podría usar en lugar de Throw (también puede lanzar, pero use la ventana modal para mostrar el error al usuario).
Editar:
Encontré una función que he usado para ventanas modales de información:
Names Default To Here(1);
mini_modal_window = function({title, text, text_icon = "BlankIndex", window_icon = "NewApplication"}, {Default Local},
New Window(title, <<MODAL></MODAL>