JSL: cuando los análisis dependen de datos temporales, cerrar datos cuando el análisis está cerrado ...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 ingresan en Graph Builder. Cuando el usuario cierra el generador de gráficos, quiero que los datos temporales desaparezcan. Bastante fácil, si guardo la llamada al generador de gráficos en una variable, puedo agregar un << On Close () para cerrar también los datos temporales.
Sin embargo, suceden cosas extrañas si mi usuario quiere ejecutar el complemento dos veces contra 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 (derribando el otro Generador de gráficos con él).
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 puedo averiguar cómo mantener todo vinculado! Parece que cada vez que creo un nuevo espacio de nombres, las "ns" se sobrescriben. 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 correcto "ns" en cada uno de los varios "On Close "códigos que se acaban creando.
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 Constructores de gráficos, los otros permanecerán intactos, sin preocuparme por qué Gráfico Constructor elijo despedir 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 intentar a continuación?
ScriptingRe: JSL: cuando los análisis dependen de datos temporales, cerrar datos cuando el análisis está cerrado ...El problema es que la variable "ns" se reemplaza en la segunda ejecución y en las siguientes de la función.Por lo tanto, debe utilizar 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>
Re: JSL: cuando los análisis dependen de datos temporales, cerrar datos cuando el análisis está cerrado ...Gracias. Esto es útil para soluciones simples como esta.
Puede que tenga que reescribir un código enorme 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 desencadenan 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 explorar otros cuadros para actualizar los resultados, etc. Parece que voy a tener que repensar seriamente lo que estoy haciendo.
Tenía la esperanza de que los nombres predeterminados aquí crearan 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 datos cuando el análisis está cerrado ...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 código.Entonces veo ambas ventajas.Pero aquí hay una idea fuera de lo común que crea espacios de nombres separados "Aquí".
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 "Aquí" único.Si abre el archivo por segunda vez, tiene su propio espacio de nombres "Aquí" único.
En un par de ocasiones en el pasado, he usado esto ???? característica ????.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 subsiguiente necesita ejecutar el código en el JSL guardado, usa 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");