2.3.1 插件注册及加载
如果想在BIMBase中调用插件,需要对插件进行注册。安装完SDK,会在 C:\ProgramData\PKPM\BIMBase\Plugins\SDK类别\SDK版本号\c#plugin 路径下放置一个默认的plugin文件,用于插件加载。其中路径里SDK类别为不同类型的软件,例如lite/pro版本等,示例中下载的BIMBase建模软件,所以插件加载在pro这个路径下。SDK版本号,可在软件启动后,“关于”功能中查看。plugin文件放置位置示意如图1-9(第一章)所示,以及plugin文件配置1-3(第一章)所示,范例中基于的SDK版本号为V1.2,加载具体流程参考附录一。
2.3.2 外部命令
BIMBase API是建立在BIMBase产品的基础之上的,它是一个类库,需要在BIMBase运行时才能工作。通过这套强大的API,可以添加用于基于BIMBase API开发的插件来扩展和增强BIMBase的功能和应用。BIMBaseNet.UI.dll程序集包含了所有操作和定制UI的接口,包括:
IBPFunctionCommand相关接口IBPPointCommand相关接口IBPSelectCommand相关接口IExternalApplication相关接口- 菜单类及其子类
想通过BIMBase API来访问和扩展BIMBase,需要在用户自己的插件中实现特殊的接口,这些接口包括IBPFunctionCommand、IBPPointCommand、IBPSelectCommand和IExternalApplication。本章将详细介绍这些接口以及它们的注册方式。
插件开发者可以通过IBPFunctionCommand、IBPPointCommand、IBPSelectCommand来添加自己的命令,BIMBase通过.plugin文件来识别和加载外部插件。 - 基本原理
BIMBase中注册的命令可通过命令名直接被激活,一旦插件被加载,外部命令被创建出来。外部命令被集成到BIMBase之后,也可以通过自定义菜单项来进行调用。
BIMBase API中的外部命令包括外部函数、基本工具、选择工具三类。外部函数与视图不进行交互,基本工具及选择工具可与视图交互,都可在视图中输入点,选择工具还可选择构件进行过滤。本章将详细介绍这三种命令的实现方式。 - 外部函数
IBPFunctionCommand是BIMBase API用户通过外部命令来扩展BIMBase时在外部命令中实现的接口。用户必须在实现IBPFunctionCommand接口时指定BPExternalCommandAttribute属性,用于定义该命令的名称,该名称可在命令行直接输入,也可在菜单上加载。IBPFunctionCommand只有一个抽象函数onExcute,重载这个函数来实现IBPFunctionCommand。onExcute函数将作为外部命令的主函数被调用,示例代码2-1演示如何在onExcute函数中取到BIMBase的Application和Document。
[BPExternalCommandAttribute(name = "TestDemo")]
public class BPDemoCommand:IBPFunctionCommand
{
public override void onExcute(BPCommandContext context){
BPDocument doc = BPApplication.singleton().activeDocument;
base.onExcute(context);
}
}
代码2-1 在onExcute中获取Application和Document
- 基本工具
BIMBase API用户可通过IBPPointCommand来实现用户所需的布置工具,在软件中布置所需的构件。IBPPointCommand提供了各种接口用于实现在不同时机需要实现的功能。
表2-1 布置工具接口列表
| 方法 | 描述 |
|---|---|
| onPostInstall() | 工具启动响应函数 |
| onLeftClick(BPCommandContext) | 点击鼠标左键响应函数 |
| onRightClick(BPCommandContext) | 点击鼠标右键响应函数 |
| onDynamicDraw(BPCommandContext) | 动态函数 |
| onKeyDown(BPVirtualKey,bool,bool) | 键盘按下响应函数 |
| onKeyUp(BPVirtualKey, bool, bool) | 键盘弹起响应函数 |
| onTracerChanged(BPTracerInfo) | 追踪器赋值函数 |
| onExitTool() | 退出工具响应函数 |
| callExitTool() | 退出工具 |
- 选择工具
BIMBase API用户可通过IBPSelectCommand来实现用户所需的选择工具。IBPSelectCommand提供了各种接口用于实现在不同时机需要实现的功能。
表2-2 选择工具接口列表
| 方法 | 描述 |
|---|---|
| onPostInstall() | 工具启动响应函数 |
| onLeftClick(BPCommandContext) | 点击鼠标左键响应函数 |
| onRightClick(BPCommandContext) | 点击鼠标右键响应函数 |
| canBeSelect(BPGraphics) | 过滤函数 |
| List |
框选事件响应函数 |
| onClickSelected(BPGraphics, BPCommandContext) | 点选事件响应函数 |
| onKeyDown(BPVirtualKey, bool, bool) | 键盘按下响应函数 |
| onKeyUp(BPVirtualKey, bool, bool) | 键盘弹起响应函数 |
| onTracerChanged(BPTracerInfo) | 追踪器赋值函数 |
| onExitTool() | 退出工具响应函数 |
| callExitTool() | 退出工具 |
2.3.3 外部应用
插件开发者同样可以通过实现IExternalApplication来添加自己的应用。BIMBase同样通过.plugin文件来识别和加载实现IExternalApplication的外部插件。IExternalApplication有两个抽象函数onStartup和onShutdown。用户可以通过在实现了IExternalApplication的外部应用中重载onStartup和onShutdown,在BIMBase启动和关闭的时候定制所需的功能。
表2-3 IExternalApplication接口定义
| 方法 | 描述 |
|---|---|
| onStartup(BPUIApplication) | 插件加载响应函数 |
| onShutdown(BPUIApplication) | 插件卸载响应函数 |
onStartup和onShutdown函数的参数均为BPUIApplication类型。可通过BPUIApplication访问Application和Document类,并对其进行操作,示例代码2-2演示如何在onStartup实现定制UI。
public class ApplicationDemo : IExternalApplication
{
public override void onStartup(BPUIApplication uiApp)
{
//添加分类Category
BIMBaseCS.UI.tagsize size = new BIMBaseCS.UI.tagsize();
size.cx = 32;
size.cy = 32;
BPUIApplication.singleton().uiManager.uiRibbonPanel.ribbonAddCategory("测试分类", 16, 16, size, size, -1);
//在分类Category下添加面板
IntPtr panelTmp = IntPtr.Zero;
Bitmap bmp = Resourcel.triangle;
panelTmp = bmp.GetHicon();
BPUIApplication.singleton().uiManager.uiRibbonPanel.ribbonAddPanel("测试分米", "测试面板", panelTmp, 1, -1);
//在指定分类下的指定面板添加按钮
BPUIApplication.singleton().uiManager.uiRibbonPanel.ribbonAddButton("测试分类", "测试面板", "画线", "TestExPlaceLine", panelTmp);
base.onStartup(uiApp);
}
public override void onShutdown(BPUIApplication uiApp)
{
base.onShutdown(uiApp);
}
}
代码2-2 IExternalApplication实现定制菜单
图2-6 定制菜单效果