本帖最后由 Jorin 于 2016-3-22 15:51 编辑
本教学是在Rhino中文论坛解答的一个问题。该贴发帖人希望自己的插件能够像 TSpline 一样,在打开含有自己插件生成数据的 3dm 文件时能够自动调用插件进行处理。以下做一个简单的讲解和示例:
要在打开一个含有插件数据的 Rhino 文件时,不需要人为干涉的情况下自动处理文件,这个功能的实现思路是这样:
1.首先要为我们插件所使用的 Rhino 文件用户数据中加入一个特有的标记,有这个标记,就表示这是需要我们的插件来处理的。
2.文件中有了插件信息标记,我们在打开这个文件时若能读到这个标记,就判断此文件为我们的插件要处理的,若没有读到,就不做任何操作。
然后我们来看看如何具体操作,第一步在 Rhino 的 3dm 文件中加入标记,这个你已经做到了。难点在第二步,要如何在每次打开文件时判断这个文件有没有标记呢?你这里提到了 TS,为什么在打开含有 TS 数据的 Rhino 文档时,不用我们执行任何操作 TS 就可以处理其数据?那我们先分析一下 TS 插件的属性。
在“选项”/“插件程序”中找到 TS 打开他的插件程序属性,从这个对话框中我们就可以发现这个插件程序和大多数插件的载入时间是不同的,从下图可以看到,TS 的载入时间是“启动时载入”
而大多数插件都如下图所示,是“需要时载入”
来想想为什么 TS 需要在启动 Rhino 的时候就载入呢,结合前面我们提出的问题,不难发现,TS 启动以后就等在后台,如果打开了含有 TS 数据的问题, TS 介入处理。所以这里得出第一个必要条件,我们要写的插件载入时间必须是启动时载入。查阅 RhinoCommon 说明文件,可以在 Rhino.PlugIns 下的 PlugIn 类中找到 LoadTime 属性。要修改这个属性,必须要重写。重写的语句如下:
public override PlugInLoadTime LoadTime
{
get { return Rhino.PlugIns.PlugInLoadTime.AtStartup; }
}
有了上面这句,程序就可以在 Rhino 起点时加载了,当然仅加载是不够的,还需要在 3dm 文件打开时做出判断,所以程序需要“监听”打开的文件,当然“监听”只是表象,.NET编程并非监听机制,而是通过事件订阅。 继续查阅 RhinoCommon 文档,在 Rhino.RhinoDoc 类下面可以找到 EndOpenDocument 事件,如果我们订阅了这个事件,在文件打开完成以后就可以做一些操作了(比如你对你的模型进行一些处理)。
订阅打开文件结束事件代码示例:
Rhino.RhinoDoc.EndOpenDocument += new System.EventHandler<Rhino.DocumentOpenEventArgs>(WriteSomething);
上面代码中 WriteSomething 是这个事件传递来以后要执行的函数,可以自由定义。
我用上面的方法写了一个非常简单的插件
LoadTest.rhp
(6 KB, 下载次数: 129)
来测试以上思路是否正确,提前准备好了一个3dm 文件
test.3dm
(220.25 KB, 下载次数: 126)
,在文档层面包含了一个字符串,通过"Plugin", "Name"索引可以查找到"LoadTest"字符串。这个程序写好以后要检查的有两个方面,第一,插件是否随 Rhino 启动,第二,是否能正确读出我藏在 3dm 文件中的字符串。
通过实际运行,下图验证了以上方法:
范例源码如下:
LoadTest.zip
(22.52 KB, 下载次数: 36)
|