幫助解決 JSL Throw() 未按預期運行的問題各位,
(JMP 專業版 16.1.0、Win10)
我有一個與我之前的帖子相關的問題這裡,如果您對一些“背景故事”感興趣。
我現在遇到的主要問題是 Throw() 命令沒有按預期工作。 在我的代碼中(完整代碼請參閱末尾),我在幾個地方進行了測試,以查看當前是否存在打開的圖形生成器報告,如下所示,並且它包含在 Expr() 語句中:
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
問題是,每當我運行代碼(就像從工具欄熱按鈕運行它一樣),它似乎會跳過這些行並忽略是否沒有打開的報告。 但是,當我“逐行”運行代碼時,它將正確捕獲沒有打開的報告並通知用戶。
我正在嘗試編寫要分發給整個組織中的用戶的代碼,並嘗試使其足夠強大以處理不同類型的情況,例如,如果用戶打開了一個或多個數據表和/或打開了一個或多個項目(其中可以包含多個數據表)。
代碼的概念如下(問題出現在第 6 項):用戶正在 Graph Builder 中創建圖形,然後想要對圖形進行常規修改(有關詳細信息,請參閱上面的鏈接),然後用戶單擊工具欄執行上述操作的熱按鈕。
- 該代碼運行 Graphic_Expr 表達式來確定圖形的位置 - 是在“獨立”數據表中,還是在項目內(只能選擇一個選項)。 ->(轉到)
- 根據選擇的複選框,代碼然後運行 dt_win_Expr 或 prj_win_Expr 代碼(現在,我在測試代碼時只為數據表選項設置了它,但理想情況下最終的功能應該大致相同) 。 ->(轉到)
- 如果是獨立數據表,則它運行 dt_win_Expr 並創建一個窗口,供用戶選擇要編輯的圖形所在的數據表。 回想一下,用戶可能會打開多個數據表,並且可能會打開多個圖形生成器。 | (或者)
- 同樣,如果用戶選擇一個項目,它將運行 prj_win_Expr(尚未完成)來讓用戶選擇哪個項目(如果打開多個項目)以及該項目中的後續數據表。 ->(轉到)
- 選擇數據表後,無論是獨立的還是在項目內,代碼都會運行 SquarifyWin_Expr 表達式。 它在這裡做的第一件事是測試是否確實存在當前報告 - 上面的 If() 代碼(我可能需要修改和測試當前報告是否是圖形生成器)。 **這是代碼無法按預期運行的地方。 即使沒有打開圖形生成器,當它應該拋出警告時,它也會繼續執行其餘代碼。** 如果一切正常...->(轉到)
- 根據像素尺寸和是否方形化,代碼然後運行 RprtUpdate_Expr 表達式,將所需的更新發送到圖形生成器報告。
我希望這個描述有意義,並有助於將我想要的編程路徑/功能放在上下文中。
預先非常感謝您為尋找解決方案提供的任何幫助。 完整的 JSL 代碼在最後。
謝謝!,
DS
Names Default To Here( 1 );
Clear Symbols();
RprtUpdate_Expr = Expr(
gb = Current Report()[Outline Box( 1 )] << Get Scriptable Object;
Report( gb )[framebox( 1 )] << FrameSize( widthN, heightN );
theMax = Max( Report( gb )[axisbox( 1 )] << get max, Report( gb )[axisbox( 2 )] << get max );
theMin = Min( Report( gb )[axisbox( 1 )] << get min, Report( gb )[axisbox( 2 )] << get min );
Report( gb )[framebox( 1 )] << Xaxis( Min( theMin ), Max( theMax ) );
Report( gb )[framebox( 1 )] << Yaxis( Min( theMin ), Max( theMax ) );
Report( gb )[framebox( 1 )] << AddGraphicsScript(
xmin = X Origin();
xmax = X Origin() + X Range();
ymin = Y Origin();
ymax = Y Origin() + Y Range();
Pen Color( "blue" );
Pen Size( 1 );
Line Style( "solid" );
Line( {xmin, ymin}, {xmax, ymax} );
);
);
SquarifyWin_Expr = Expr(
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
nwin = New Window( "Enter Size of Desired Graph",
<<RETURN result=""></RETURN>大規模定制回复:有關 JSL Throw() 未按預期運行的幫助你好@jthi和@大衛_伯納姆,
感謝你們的反饋和想法。 我喜歡迷你模式窗口,在測試是否有任何圖形生成器打開時它派上用場。
我決定改變一切並完全重寫代碼。 它現在可以執行我想要的操作,但它還通過關聯數組跟踪哪個圖形生成器實例適用於哪個項目。 對於數據表,即使多個打開,區分圖形構建器的不同實例也不存在問題,即使在單個數據表中也是如此,但由於項目有多個選項卡,我必須確保抓取構建器的分配可編寫腳本的對象與正確的項目相關聯。 我很高興能夠使用 AA 並讓他們也幫助我! 新代碼還會更改第一個窗口,具體取決於您是否僅打開數據表(或項目)或兩者都打開。
這是一個很好的小嘗試,我很享受為它工作。 經過更多測試後,我將與我的組織分享。 如果您有興趣,下面是代碼。 在遍歷所有可能的項目,然後遍歷項目中的所有窗口時,我無法弄清楚如何讓 For Each() 工作,因此我改為使用 For() 循環。
謝謝!,
DS
//JSL to add diagonal line and automatically resize to desired size
//Written by SDF1 with help/input from jthi, txnelson, Craige_Hales, David_Burnham, and Mark_Bailey
Names Default To Here( 1 );
Clear Symbols();
lb_width = 80;
Lines_n = 6;
mmw = Function( {title, text, text_icon = "BlankIndex", window_icon = "NewApplication"},
{Default Local},
New Window( title,
<<MODAL></MODAL>回复:有關 JSL Throw() 未按預期運行的幫助掃描圖形生成器窗口的示例:
getGraphBuilderWindows = function({},{default local},
lst = {};
winList = getWindowList();
for each({win},winList,
winTitle = win << getWindowTitle;
if (contains(winTitle,"Graph Builder"),
insertinto(lst,win)
)
);
return(lst);
);
lstGBWindows = getGraphBuilderWindows();回复:有關 JSL Throw() 未按預期運行的幫助另請注意,CurrentReport 將查找任何打開的窗口,包括您正在創建的窗口。您需要檢查顯示樹(例如 OutlineBox(1) )以將窗口標識為圖形生成器,如果您打開了其他窗口,它可能不是當前的,因此可能會搜索打開的窗口列表。
回复:有關 JSL Throw() 未按預期運行的幫助嘗試將診斷放入您的代碼中。
我放
show ( Current Report() );
在你的測試之前,它報告了這一點:
Current Report() = DisplayBox[HeadBox];
不是空的。
回复:有關 JSL Throw() 未按預期運行的幫助您檢查過 JMP Log 中是否有打印內容嗎? 拋出可能會觸發,但只是沒有“錯誤窗口”。 至少當我使用插件時,我使用自定義錯誤模式窗口,因為 Throw 不會像作為腳本運行時那樣創建錯誤窗口。
模態對話框有相當簡單的警報功能,您可以使用它來代替拋出(您也可以拋出但使用模式窗口向用戶顯示錯誤)。
編輯:
找到了我用於信息模式窗口的一個函數:
Names Default To Here(1);
mini_modal_window = function({title, text, text_icon = "BlankIndex", window_icon = "NewApplication"}, {Default Local},
New Window(title, <<MODAL></MODAL>