JSL:当分析依赖于临时数据时,分析关闭时关闭数据......大家好,
背景:我目前正在编写一个插件,需要创建一个临时数据表来保存一些数据点,然后将这些数据点输入到图形生成器中。 当用户关闭图形生成器时,我希望临时数据消失。 很简单,如果我将图形生成器调用保存到变量,我可以添加 << On Close() 来关闭临时数据。
但是,如果我的用户想要针对两个不同的输入运行加载项两次,从而创建两个临时数据表和两个图形生成器,则会发生奇怪的事情。 现在,在这种情况下,关闭其中一个图形生成器可能会关闭错误的临时表(同时关闭另一个图形生成器)。
我想一定有一个简单的解决方案。 我认为解决方案应该是使用命名空间,但我不知道如何将所有内容链接在一起! 似乎每次我创建一个新的命名空间时,“ns”都会被覆盖。 我遇到的难题是弄清楚如何使用自己的“ns”值来保留加载项的每个单独实例,并且以这种方式我可以将正确的“ns”值输入到每个“关闭时” “最终创建的代码。
这是我正在尝试做的事情的简化版本。 这个想法是,如果我运行这个,然后单击“制作另一个”按钮一次或多次,然后关闭其中一个图形生成器,其他图形生成器将保持不变 - 无需关心哪个图形建造者我选择先解散。
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();
寻找智慧:接下来我应该尝试什么?
质量和工艺工程回复:JSL:当分析依赖于临时数据时,分析关闭时关闭数据......这是一个很棒的“功能”。 实现我的代码要快得多,只花了一两个小时以这种方式进行调整,确保我有一个可以使用的命名空间等,而不是弄清楚如何替换我的所有 DisplayBox 变量(我是这样的)不期待)。
在此解决方案中,我还在 Open() 之后添加了一个 Wait(),然后添加了一个删除文件(),因为触发新运行的按钮框每次单击时都会简单地写出一个新的临时文件。
回复:JSL:当分析依赖于临时数据时,分析关闭时关闭数据......有时,我会因为“Names Default to Here()”在每次调用代码时没有单独的名称空间而感到沮丧。但是,我在调试代码时也利用了这一事实。所以我看到了这两个优点。但这里有一个非常规的想法,它确实创建了单独的“Here”名称空间。
如果您采用原始 JSL,并添加 //!作为第一行,该代码在从硬盘驱动器打开时将自动运行。当该脚本打开时,它具有唯一的“此处”名称空间。如果您第二次打开该文件,它有自己独特的“Here”命名空间。
过去有几次,我用过这个???特征 ????。我的主程序使用 Save Text File() 将相关 JSL 保存到 $TEMP 位置,然后每当后续代码需要执行保存的 JSL 中的代码时,您就使用 Open() 来运行该文件。与保存的 JSL 之间的值传递是通过主程序和保存的 JSL 程序中定义的命名空间完成的。
这是您以这种方式设置的原始示例代码,运行时,每个实例在执行中都是独立的
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");
回复:JSL:当分析依赖于临时数据时,分析关闭时关闭数据......谢谢。 这对于像这样的简单解决方案很有用。
我可能需要进行大量的代码重写,即使如此,我也不确定是否可以做我想做的事情。 我的实际加载项也将一堆 DisplayBox 引用存储到 ns 中,并且 DisplayBox 会在平台和数据表中触发各种附加操作。 当加载项重新启动时,所有 DisplayBox 引用也会被蚕食。 我想如果幸运的话我可以将大部分 DisplayBox 转换为触发函数,这样我就可以点击这个 << Parent 并向下钻取到其他框以更新输出等。 听起来我必须认真地重新考虑我正在做的事情。
我曾希望每次重新运行代码时“Names Default to Here”都会创建一个单独的“Here”命名空间,但情况似乎并非如此......
在我开始走另一条路之前,还有其他好的选择吗?
回复:JSL:当分析依赖于临时数据时,分析关闭时关闭数据......问题是您的变量“ns”在函数的第二次和后续运行时被替换。因此,您需要使用对数据表的唯一引用。下面是代码的一个版本,它使用数据表的名称来关闭它。
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>