1.背景介绍
建模平台扩展机制的背景是随着建筑行业数字化的发展,基于BIM技术的建模平台将成为建筑设计、施工和运营的标准工具。为了满足不同用户的需求,BIM建模平台需要具备扩展机制,可以通过插件、API接口等方式,允许用户自定义功能或集成第三方工具。这种扩展机制能够提升建模平台的灵活性和可扩展性,使其适应不同用户的特定需求。
2.设计目标
建模平台扩展机制的设计目标包括:
-
可扩展性:提供灵活的扩展接口和机制,允许用户根据需求定制和扩展功能,同时保持平台的稳定和高性能。
-
开放性:提供开放的API和文档,以便第三方开发者可以轻松地集成和拓展平台的功能。
-
管理性:提供可视化的扩展管理界面,方便用户管理和配置扩展,包括安装、升级、禁用和卸载等操作。
-
兼容性:保持向后兼容性,确保扩展的稳定性和可迁移性,防止扩展对原有功能的冲突和破坏
3.技术方案
3.1 技术框架
3.2 技术方案
平台扩展机制可以分为三个方面来实现:
(1)C++ API二次开发工具包以及Python API 接口
外部用户根据提供C++ API二次开发工具包以及Python API 接口,充分利用平台的基础能力,开发出符合用户业务需求的功能插件。
(2)平台+组件机制
内部用户可以利用该机制拆分为平台和插件,平台赋予基础能力,插件负责业务功能分,有效隔离平台开发和应用开发间的相互影响。平台和应用可以独立进行互不影响,提高开发的效率。
(3)事件订阅处理机制
使用事件订阅处理机制,减少系统耦合,增强可扩展性。平台提供事件定义扩展及事件管理机制,提高用户与定义事件的效率和便捷性。
4.技术实现
4.1 平台+组件机制实现
(1)业务插件组成
插件包含了三个模块,分别是数据模块,业务处理Builder模块和UI交互模块以及一个插件配置文件,描述插件的定义。
(2)业务插件的管理
插件配置文件放在Addins目录下,程序启动时AppImpl模块,平台的插件管理识别插件模块目录下的配置,获取要加载的插件信息,按照依赖关系依次加载插件。
(3)插件两个接口
分别是OnAddInInitialize、OnAddInUnInitialize。插件加载调用OnAddInInitialize,可以在这个函数做一些插件相关的环境准备工作,例如资源、UI菜单设置、插件配置等。插件卸载时调用OnAddInUnInitialize,在做些资源清理工作,例如数据库关闭等。
(4)插件配置文件定义
采用JSON或XML文件定义插件信息,例如插件名称,DLL的名称及依赖库的名称列表等。
(4)其他资源定义
- 每个插件有自己的资源文件。目前涉及到的主要是Qt的资源文件
- 命令定义文件各个插件创建自己的命令定义文件
4.2 事件订阅处理机制实现
4.2.1 事件处理机制介绍
事件处理器是一种编程机制,用于监视和响应特定事件。在图形平台中,这些事件可以是用户交互、对象修改、文档操作等。事件处理器您注册事件处理程序,以在事件发生时执行自定义操作。
事件处理器的核心思想是“触发-响应”。当特定事件触发时,系统会调用相关的事件处理程序,以执行定义的操作。这种机制使您能够实现自动化、自定义和实时反馈,从而提高图形平台的功能和效率。
4.2.2 事件处理机制原理
反应器的工作原理通常包括以下步骤:
(1)注册事件
首先,您需要确定要监视的事件类型。这可以是用户的交互事件(例如鼠标点击或键盘输入)、对象的修改事件(例如图元的移动或属性的更改)或文档级别的事件(例如文档的保存或关闭)。
(2)事件捕获
一旦事件发生,系统会捕获它并识别触发该事件的原因。
(3)事件处理
事件捕获后,系统会查找与事件相关联的事件处理程序。事件处理程序是您编写的代码块,它定义了在事件发生时应执行的操作。
(4)执行操作
事件处理程序包含要执行的操作,这些操作可以涵盖各种任务。例如,您可以创建一个文档保存的反应器,以在文档保存时执行数据验证,或者创建一个对象修改的反应器,以在图元属性更改时更新相关信息。
4.2.3 事件处理机制的应用场景
反应器在自主图形平台中有广泛的应用场景,以下是一些示例:
(1)用户交互事件处理
捕获鼠标点击、键盘输入等用户交互事件,以实现自定义命令或实时反馈。
(2)对象修改事件处理
监视图元的修改事件,以验证数据的有效性、更新关联信息或自动执行特定任务。
(3)文档级别事件处理
用于监听文档级别的事件,例如文档的保存、关闭或打开,以执行自动备份、数据导出等操作。
(4)用户界面交互事件处理
通过在事件中更新用户界面,改进图形平台的用户体验,例如动态显示属性编辑器或工具栏按钮状态。
4.2.4 技术实现
另外,实现UIEventManager来管理事件。
4.3 二次开发工具实现
4.3.1 C++二次接口API实现方案
(1)暴露C++ API(后续还支持Python API)及SDK二次开发工具包,用来支持二次开发人员在平台及各专业插件的基础上,自定义开发新增命令及新增UI菜单项,扩展平台的业务及应用场景,打造软件平台+二次开发插件的生态环境。
(2)为使使用平台的API二次开发的插件DLL在软件启动时被通知Load,并且作为执行入口的新定义Command可以被识别注册,在UI菜单“附加模块”或特定位置自动添加新菜单项,便于用户点击执行自定义开发的新Command。
具体实现可以参照Revit API Addin注册加载机制,需要建立仅通过用户添加符合API Addin配置文件格式要求的新配置文件(如.addin文件),放置于软件约定目录下,软件在启动时按顺序查找并解析这些API Addin配置文件,根据其内容信息,找到并Load相应的Addin DLL。根据其请求注册的Command name,Create对应的Command Class(继承自API IExternalCommand接口),并在平台内部CommandManager中注册新的Command。在平台的菜单“附加模块”或特定位置添加一新菜单项,关联新注册的Command。做到用户点击该菜单项即执行新Command。
4.3.2 Python二次开发API实现
(1)参照FreeCAD,平台的 Python API采用通过Python C API暴露Python API接口,及在C++程序中嵌入Python解释器的方式解释运行Python代码,Python API随C++ API Dll一起编译发布,即可调用C++ API情况下,也可以调用到Python API。
(2)但目前C++ API对应的Python API Class(如APIDocument对应的APIDocumentPy)内部代码既可以使用手写方式暴露,也可以使用Pybind11自动将C++ API Class及接口转化为Python API Class及接口代码.