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");