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