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>