我正在尝试通过 JMP 插件分发自定义图谱。我创建了一个插件,它在启动 JMP 时(使用启动脚本)将图谱文件从插件目录复制到自定义图谱目录,然后在关闭 JMP 时(通过退出脚本)删除这些图谱文件。但是,当打开多个 JMP 实例(有时是意外打开)并关闭其中一个实例时,这会导致问题。当关闭第二个 JMP 实例时,退出脚本会运行,从自定义图谱文件夹中删除图谱,并且必须完全关闭 JMP(关闭所有实例),然后重新打开才能重新添加图表。
有没有办法让退出脚本仅在插件卸载时运行,而不是在 JMP 关闭时运行?或者有没有更好的方法来分发自定义地图?
启动脚本:
Names Default To Here( 1 );
//Create Custom Map Path
homePath = Convert File Path( "$HOME", absolute );//get home path
mapPath = Substr( homePath, 1, Length( homePath ) - Length( Word( -1, homePath, "/\" ) ) - 1 ) || "Maps/";
//Create map path if it doesn't exits
If( !Directory Exists( mapPath ),
Create Directory( mapPath )
);
//copy files from addin map folder to JMP map folder
mapFiles = Files In Directory( "$ADDIN_HOME(com.hp.G5iTools)" || "/Maps" );
For( i = 1, i <= N Items( mapFiles ), i++,
newMapFilePath = "$ADDIN_HOME(com.hp.G5iTools)" || "/Maps/" || mapFiles[i];
If( !File Exists( mapPath || mapFiles[i] ),
Copy File( newMapFilePath, mapPath || mapFiles[i] )
);
);
退出脚本:
Names Default To Here( 1 );
//delete map files
homePath = Convert File Path( "$HOME", absolute );//get home path
mapPath = Substr( homePath, 1, Length( homePath ) - Length( Word( -1, homePath, "/\" ) ) - 1 ) || "Maps/";
mapFiles = Files In Directory( "$ADDIN_HOME(com.hp.G5iTools)" || "/Maps" );
For( i = 1, i <= N Items( mapFiles ), i++,
Delete File( mapPath || mapFiles[i] )
);
你好@RM2241 ,
您提到打开多个 JMP 实例,是指打开多个“主屏幕”还是仅仅打开多个平台?如果是后者,那么这是一个已知 bug(更多详情请参见此处)。
为什么关闭时需要删除自定义地图文件?如果地图文件已经存在,脚本只需检查新实例并直接使用即可,这样可以吗?
谢谢,
本
对于新实例,我的意思是多个主屏幕。
我不需要在关闭时删除自定义地图,事实上,我不希望它们在关闭时被删除。但如果插件卸载了,我希望它们被删除,而退出脚本是我能想到的唯一方法。
你好@RM2241 ,
您能否在插件中添加一个“卸载”按钮,让用户在卸载前点击即可运行该脚本?如果您有多个实例(主屏幕),我也会尝试解决这个问题,请查看我下面发送的链接。我认为没有办法主动跟踪插件何时触发卸载。
谢谢,
本
您可以使用退出脚本来检查插件是否仍然存在。
例子:
使用 com.mycompany.myaddin 作为 ID 创建插件

以某种方式使插件创建一些文件(我使用了启动脚本)

在退出脚本中使用 Get Addin + << ID + Try-catch 检查插件

Names Default To Here(1);
Try(
Get Addin("com.mycompany.myaddin") << id
, // if this fails add-in has been removed
Delete File("$DOCUMENTS/test.txt");
);
现在,当您关闭 JMP 时,该文件应该仍然在那里,但是当您从“查看”菜单中删除该插件时,它将删除该文件(至少对我来说是这样)。