Usando JSL en JMP ver. 15.2.0. El código JSL está incrustado en la tabla adjunta con el nombre del script = 'Gráficos de control'.
Tengo problemas con el comportamiento en bucles anidados cuando intento agregar límites de especificación (LSL, Target, USL) a través de un script de gráficos personalizado para un número variable de agrupaciones de fase y condiciones de "dónde".Mis bucles anidados actualmente dan como resultado que se apliquen límites de especificación para el último gráfico a todos los gráficos de control creados, en lugar de que cada gráfico/fase/donde la condición reciba sus límites respectivos.
¡Muchas gracias de antemano por un empujón en la dirección correcta!
Todd
Todd, JMP / JSL es un poco raro en comparación con los lenguajes de programación más típicos; en particular, prácticamente tienes que hacer todo el control del alcance tú mismo.
Aquí tengo un ejemplo que ilustra lo que está tratando: uno podría pensar que el siguiente script creará un "Rojo" entonces "Azul" triángulo en el script de gráficos, pero en su lugar solo se crean dos triángulos azules.
Names Default To Here( 1 );
Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = Bivariate( Y( :weight ), X( :height ), FitLine );
rbiv = biv << report;
framebox = rbiv[frame box( 1 )];
/**** Make a red triangle??? ****/
color = "Red";
framebox << Add Graphics Script(
Transparency( 0.5 );
Fill Color( color );
Polygon( [60, 72, 57], [75, 120, 120] );
);
/**** Make a blue triangle??? ****/
color = "Blue";
framebox << Add Graphics Script(
Transparency( 0.5 );
Fill Color( color );
Polygon( [60, 72, 57], [85, 130, 130] );
);
Esto sucede debido a cómo JSL maneja el alcance: cuando usa el <<AGREGAR secuencia="" de="" comandos="" de="" gráficos=""> entonces se agrega como un conjunto de declaraciones no evaluadas (en realidad es una función no evaluada<CODE class=" language-jsl"> Pegamento() función). Cualquier variable que exista dentro del <<AGREGAR secuencia="" de="" comandos="" de="" gráficos=""> el script será evaluado<EM> solo durante la ejecución</EM> del guionCuando el script de gráficos se está ejecutando (recuerde, está adjunto al<CODE class=" language-jsl"> Caja de marco que está incrustado en el árbol de visualización de la ventana), deberá resolver cada variable.Las reglas de resolución de alcance dictan que examinará el Local alcance (si existe), el Aquí alcance (si existe), entonces el Global scope: si no puede encontrarlos en ninguno de estos ámbitos, será reemplazado por un Vacío() valor.
Así que los scripts se agregan a la Caja de marco dentro del script principal, pero solo se ejecuta más tarde.En este último punto, la variable de color es "Azul" , por lo que ambos triángulos son azules.
La forma de resolver esto es resolver cualquier variable de interés. al agregar el script de gráficos, no al ejecutarlo.Para hacer esto usa el Eval( Eval Expr() ) metodología, como se muestra aquí.
Names Default To Here( 1 );
Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = Bivariate( Y( :weight ), X( :height ), FitLine );
rbiv = biv << report;
framebox = rbiv[frame box( 1 )];
/**** Make a red triangle!!! ****/
color = "Red";
Eval( Eval Expr(
framebox << Add Graphics Script(
Transparency( 0.5 );
Fill Color( Expr( color ) );
Polygon( [60, 72, 57], [75, 120, 120] );
);
) );
/**** Make a blue triangle!!! ****/
color = "Blue";
Eval( Eval Expr(
framebox << Add Graphics Script(
Transparency( 0.5 );
Fill Color( Expr( color ) );
Polygon( [60, 72, 57], [85, 130, 130] );
);
) );
Necesita usar este método para todas sus variables dentro del <<AGREGAR secuencia="" de="" comandos="" de="" gráficos=""> para que mantengan el valor en el momento en que<CODE class=" language-jsl"> <<AGREGAR secuencia="" de="" comandos="" de="" gráficos=""> fue llamado</AGREGAR>