無法在 Project 中運行插件我們已經將許多腳本組織到我們公司的插件中。插件響應,但在“項目”中調用時腳本不會運行。這是否可以通過插件腳本來補救,或者腳本本身是否必須單獨包含在項目中?
腳本回复:無法在項目中運行插件JMP 中的每個項目都有自己的全局變量和命名空間列表。 JMP 的非項目部分也是如此。 因此,如果您在項目外部創建一個 global:a,它將不會在任何項目中可見。 如果您在 Project01 中創建了一個 global:b,那麼它在該項目之外或任何其他項目中都將不可見。 此外,如果您在項目外創建命名空間“A”,則它在任何項目內都將不可見(按名稱,如 A:symbol)。 與在項目中創建命名空間類似。 這樣做是為了使項目彼此隔離並與非項目隔離。 它允許跨多個項目運行同一腳本的多個副本,即使它們使用全局變量,它們也不會相互衝突。
如果您需要跨項目或非項目與項目之間進行通信,最好的方法是根命名空間(:: 或 As Root 語法)。 此命名空間中的符號在運行的 JMP 實例中是唯一的。
因此,正如 Craig 所建議的,您可以將命名空間分配給根命名空間中的符號。 然後按符號使用該命名空間,例如 As Root(myNsSym):x,而不是按名稱。
如果您只需要對菜單項和按鈕做出響應,那麼上面的建議是將插件的初始化延遲到每個菜單項和按鈕都是一個不錯的選擇。 然後,插件會在第一次使用時在每個項目中初始化。 您可以使用全局檢查先前的初始化。 過去我已經為幾個加載項完成了此操作。 然而,這意味著您的啟動和退出腳本需要非常簡單,因為當 JMP 啟動/退出時您沒有做太多事情。 如果您需要對菜單做出響應之外的某些事情,或者如果您需要跨項目進行交流,這也不起作用。 在這些情況下,根命名空間可能是最好的。
最後,您也可以使用 Project OnOpen 腳本或 Workspace Startup 腳本來初始化。 看https://www.jmp.com/support/help/en/16.0/index.shtml#page/jmp/write-a-project-on-open-script-2.shtml和https://www.jmp.com/support/help/en/16.0/index.shtml#page/jmp/run-startup-scripts-to-control-workspaces.shtml#ww632187有關這些的更多信息。 如果您在加載項的啟動/退出腳本中已經做的不多,您甚至可以嘗試 Try(Get Addin("...")<<
回复:無法在項目中運行插件我不知道; @aaron_andersen就會知道正確答案。 我的快速測試表明你需要一個全局的多變的持有命名空間;各種命名空間函數(和類函數)似乎對項目外部的命名空間視而不見。 我所做的看起來會起作用:從項目外部分配一個全局變量。 我用過 ::: 但我認為這只在項目中很特別。
:::myNameSpace = namespace("myNameSpace"); // "globalize" a namespace在項目中,::::myNameSpace 似乎可以正常工作。
我不確定項目 OnOpen 腳本何時運行以及它在什麼上下文中運行,但它可能是解決方案的一部分。 它可能會運行加載項以在項目範圍內重新創建功能。 (我之前玩過它,它似乎對打開項目時排列窗口很有用。 我不需要那個。)
我理解在不創建全局變量的情況下將 JSL 函數隔離在命名空間中的原因。 我希望有一種方法可以讓它繼續工作。 (當然,名稱空間名稱是另一個全局空間......我想這就是項目可能正在戰鬥的東西。)
回复:無法在項目中運行插件嗨,克雷格,
我編寫了 Lynn 在她的問題中使用的插件。我為每個加載項創建了一個命名空間以避免變量衝突。這些命名空間是否只存在於非項目全局範圍內?有沒有一種方法可以在“:::”全局範圍內創建名稱空間?
非常感謝,
約翰
回复:無法在項目中運行插件Craige 的想法也是我首先要研究的。 (如果這不起作用,我需要查看 adin-in,或者至少更多地了解它的作用,以提出其他建議)。
啊
回复:無法在項目中運行插件我找到了這個:
https://www.jmp.com/support/help/en/16.0/?os=win&source=application&utm_source=helpmenu&utm_medium=application#page/jmp/running-scripts-in-a-project.shtml
“JMP 可以有幾個項目同時打開,以及未打開的項目項目。每個項目有它自己的全球的作用域,它防止在不同的環境中由同名變量引起的衝突項目秒。 在極少數情況下,您確實希望在所有打開的對象之間共享特定變量項目小號,使用::::根運算符。”
我認為如果您的加載項加載了您想從項目中使用的腳本,那麼 :::: 可能就是您所需要的。 我沒試過。
@aaron_andersen
回复:無法在項目中運行插件我猜您的加載項依賴於全局變量,這些變量在加載項加載時定義,稍後在調用加載項功能時引用。在項目中,全局上下文不同於其他項目和 JMP 的其餘部分,並且插件定義的任何內容都無法從項目中訪問。為了解決這個問題,您可以將所有菜單選項設置為打開文件或運行腳本,其中包括檢查加載項是否已加載(例如:檢查是否存在適當的全局變量),如果未加載,則重新加載加載項。 這樣,加載項命名空間和變量會在用戶第一次在項目中調用加載項時加載。
如果您不依賴加載項中的全局變量,您能否提供有關哪些功能不起作用的更多詳細信息?
回覆:無法在專案中運行插件命名空間和項目 - 不幸的是比這裡討論的更複雜...
I thought it'd be a good idea to create the functions from the Recall Function Library as custom functions and load them via an AddIn when JMP starts.這樣,功能就可以透過腳本索引很好地記錄下來 - 並且用戶不必費心將庫包含在他們的 AddIn 或專案中 - 它已經存在了。
然後我意識到原始命名空間僅在 JMP 的全局命名空間中創建 - 並且我必須通過以下方式全局化命名空間
:::myNameSpace = namespace("myNameSpace"); // "globalize" a namespace使其可以從項目中存取。
不幸的是,我遇到了其他問題,我在這裡記錄了這些問題:
命名空間和項目
回覆:無法在專案中運行插件一個很酷的技巧,謝謝@Jasean :
本地化根命名空間以在專案中使用它
myVar = :::myNs
myVar:x // success
為什麼我的問題在 2021 年沒有被討論?
有人擁有適用於 JMP16 及以下版本的許可證 - 並且可以檢查 2021 年是否有問題?
或者你「預設」使用了@Jasean的技巧...