JSL: Cuando los análisis dependen de datos temporales, cerrar los datos cuando se cierra el análisis...Hola a todos,
Antecedentes: actualmente estoy escribiendo un complemento en el que necesito crear una tabla de datos temporal para contener algunos puntos de datos que luego se introducen en Graph Builder. Cuando el usuario cierra Graph Builder, quiero que desaparezcan los datos temporales. Bastante fácil, si guardo la llamada de Graph Builder en una variable, puedo agregar << On Close() para cerrar también los datos temporales.
Sin embargo, suceden cosas extrañas si mi usuario quiere ejecutar el complemento dos veces con dos entradas diferentes, creando así dos tablas de datos temporales y dos generadores de gráficos. Ahora, en este caso, cerrar uno de los Generadores de gráficos puede cerrar la tabla temporal incorrecta (trayendo consigo el otro Generador de gráficos).
Me imagino que debe haber una solución simple para esto. Creo que la solución debería estar en los espacios de nombres, ¡pero no sé cómo mantener todo conectado! Parece que cada vez que creo un nuevo espacio de nombres, el "ns" se sobrescribe. El enigma que tengo es averiguar cómo mantener cada instancia separada del complemento usando su propio valor "ns", y de tal manera que pueda ingresar el valor "ns" correcto en cada uno de los varios "Al cerrar " códigos que terminan siendo creados.
Aquí hay una versión simplificada de lo que estoy tratando de hacer. La idea sería que si ejecuto esto y luego hago clic en el botón "Crear otro" una o más veces, y luego descarto uno de los generadores de gráficos, los otros permanecerán intactos, sin ninguna preocupación sobre qué gráfico Constructor Elijo descartar primero.
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table("Test Table",
<< New Column("Random X", << Formula(Random Normal())),
<< New Column("Random Y", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window("Test Output",
Button Box("Make Another One",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();
Buscando sabiduría: ¿Qué debo probar a continuación?
secuencias de comandosRe: JSL: Cuando los análisis dependen de datos temporales, cerrar los datos cuando se cierra el análisis...Esta es una gran característica". Mucho más rápido de implementar para mi código, solo tomó una o dos horas hacer los ajustes de esta manera, asegurándome de tener un espacio de nombres con el que trabajar, etc., en lugar de descubrir cómo reemplazar todas mis variables de DisplayBox (que estaba sin ganas).
En esta solución, también agregué Wait() y luego Delete File() después de Open(), ya que mi cuadro de botones que desencadena una nueva ejecución simplemente escribirá un nuevo archivo temporal cada vez que se haga clic en él.
Re: JSL: Cuando los análisis dependen de datos temporales, cerrar los datos cuando se cierra el análisis...A veces, me siento frustrado porque "Nombres predeterminados aquí ()" no tiene espacios de nombres separados en cada invocación del código.Pero también aprovecho ese hecho al depurar el código.Así que veo ambas ventajas.Pero aquí hay una idea extravagante que crea espacios de nombres "Aquí" separados.
Si toma su JSL original y agrega //! como primera línea, ese código se ejecutará automáticamente cuando se abra desde su disco duro.Cuando se abre ese script, tiene su espacio de nombres único "Aquí".Si abre el archivo por segunda vez, tiene su propio espacio de nombres único "Aquí".
En un par de ocasiones en el pasado, he usado esto ???? rasgo ????.Mi programa principal usa Guardar archivo de texto () para guardar el JSL en cuestión en una ubicación $ TEMP, y luego, cada vez que el código posterior necesita ejecutar el código en el JSL guardado, usa un Open () para ejecutar el archivo.El paso de valores hacia y desde el JSL guardado se realiza a través de un espacio de nombres definido tanto en el programa principal como en el programa JSL guardado.
Aquí está su configuración de código de ejemplo original de esta manera, y cuando se ejecuta, cada instancia es independiente en su ejecución
names default to here(1);
graphJSL = "//!
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table(\!"Test Table\!",
<< New Column(\!"Random X\!", << Formula(Random Normal())),
<< New Column(\!"Random Y\!", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window(\!"Test Output\!",
Button Box(\!"Make Another One\!",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();";
Save Text File( "$TEMP/Graph1.jsl", graphJSL );
open("$TEMP/Graph1.jsl");
open("$TEMP/Graph1.jsl");
Re: JSL: Cuando los análisis dependen de datos temporales, cerrar los datos cuando se cierra el análisis...Gracias. Esto es útil para soluciones simples como esta.
Es posible que tenga que reescribir un gran código e incluso entonces no estoy seguro de que sea posible hacer lo que quiero hacer. Mi complemento real también almacena un montón de referencias de DisplayBox en ns, y los DisplayBoxes activan varias acciones adicionales tanto en las plataformas como en la tabla de datos. Todas las referencias de DisplayBox se canibalizan cuando el complemento también se reinicia. Supongo que, si tengo suerte, puedo convertir la mayoría de mis DisplayBoxes en funciones de activación para poder presionar este << Padre y volver a profundizar en otros cuadros para actualizar los resultados, etc. Parece que voy a tener que repensar seriamente lo que estoy haciendo.
Esperaba que Names Default to Here creara un espacio de nombres Here separado cada vez que se volviera a ejecutar el código, pero ese no parece ser el caso...
¿Alguna otra buena opción antes de emprender este otro camino?
Re: JSL: Cuando los análisis dependen de datos temporales, cerrar los datos cuando se cierra el análisis...El problema es que su variable "ns" se reemplaza en la segunda y posteriores ejecuciones de la función.Por lo tanto, debe usar una referencia única a la tabla de datos.A continuación se muestra una versión de su código, que usa el nombre de la tabla de datos para cerrarla.
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>