无法在 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 的其余部分,并且插件定义的任何内容都无法从项目中访问。为了解决这个问题,您可以将所有菜单选项设置为打开文件或运行脚本,其中包括检查加载项是否已加载(例如:检查是否存在适当的全局变量),如果未加载,则重新加载加载项。 这样,加载项命名空间和变量会在用户第一次在项目中调用加载项时加载。
如果您不依赖加载项中的全局变量,您能否提供有关哪些功能不起作用的更多详细信息?
回复:无法在项目中运行插件命名空间和项目 - 不幸的是比这里讨论的更复杂......
我认为将调用函数库中的函数创建为自定义函数并在 JMP 启动时通过插件加载它们是一个好主意。这样,功能就可以通过脚本索引很好地记录下来 - 用户无需费心将库包含在他们的插件或项目中 - 它已经存在了。
然后我意识到原始命名空间仅在 JMP 的全局命名空间中创建 - 并且我必须通过以下方式全球化命名空间
:::myNameSpace = namespace("myNameSpace"); // "globalize" a namespace使其可以从项目中访问。
不幸的是,我遇到了其他问题,并在这里记录下来:
命名空间和项目
回复:无法在项目中运行插件很酷的技巧,谢谢@Jasean :
本地化根命名空间以便在项目中使用它
myVar = :::myNs
myVar:x // success
为什么我的问题在 2021 年没有被讨论?
是否有人拥有适用于 JMP16 及以下版本的许可证 - 并且可以检查 2021 年是否存在问题?
或者你“默认”使用了@Jasean的技巧......