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,需要在用户自己的插件中实现特殊的接口,这些接口包括IBPFunctionCommandIBPPointCommandIBPSelectCommandIExternalApplication。本章将详细介绍这些接口以及它们的注册方式。
    插件开发者可以通过IBPFunctionCommandIBPPointCommandIBPSelectCommand来添加自己的命令,BIMBase通过.plugin文件来识别和加载外部插件。
  • 基本原理
    BIMBase中注册的命令可通过命令名直接被激活,一旦插件被加载,外部命令被创建出来。外部命令被集成到BIMBase之后,也可以通过自定义菜单项来进行调用。
    BIMBase API中的外部命令包括外部函数、基本工具、选择工具三类。外部函数与视图不进行交互,基本工具及选择工具可与视图交互,都可在视图中输入点,选择工具还可选择构件进行过滤。本章将详细介绍这三种命令的实现方式。
  • 外部函数
    IBPFunctionCommand是BIMBase API用户通过外部命令来扩展BIMBase时在外部命令中实现的接口。用户必须在实现IBPFunctionCommand接口时指定BPExternalCommandAttribute属性,用于定义该命令的名称,该名称可在命令行直接输入,也可在菜单上加载。IBPFunctionCommand只有一个抽象函数onExcute,重载这个函数来实现IBPFunctionCommandonExcute函数将作为外部命令的主函数被调用,示例代码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 getBoxSelected() 框选事件响应函数
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的外部应用中重载onStartuponShutdown,在BIMBase启动和关闭的时候定制所需的功能。

表2-3 IExternalApplication接口定义

方法 描述
onStartup(BPUIApplication) 插件加载响应函数
onShutdown(BPUIApplication) 插件卸载响应函数

onStartuponShutdown函数的参数均为BPUIApplication类型。可通过BPUIApplication访问ApplicationDocument类,并对其进行操作,示例代码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 定制菜单效果