基于Qml框架的MicroStation平台二次开发方法设计

2021-07-14 07:02管华明
水利技术监督 2021年7期
关键词:二次开发图标宿主

管华明

(安徽省水利水电勘测设计研究总院有限公司,安徽 合肥 230088)

MicroStation作为强大的基础设计平台, 对大体量模型有良好支持,软件底层对二次开发的开放和支持程度较好,运行着众多的适合水利水电行业相关专业的三维协同设计的专业软件模块。国内部分具备研发实力的设计院基于MicroStation产品二次开发出适用于本院业务逻辑的软件或者工具集服务于实际生产,提高设计效率,取得了一定成果。

1 开发语言选择

目前,MicroStation平台官方发布的软件开发包(SDK)主要支持4种类型的插件开发:MicroStation VBA(简称MVBA,基于VB语言)、Addin(基于C#或其它的.NET开发语言)、MDL(基于C++语言)、混合插件(基于C++/CLI语言)。MVBA最容易上手,适合开发简单的小工具,开发周期最短,但开发出来的项目需要向最终用户提供源代码,对于保护知识产权不利。.NET接口存在封装不全,部分接口不完善等问题。MDL(基于C++)接口丰富功能最全,文档相对详细且包含大量的学习例子,但相对来说复杂一些。

在MicroStation平台上二次开发大型复杂应用应首选MDL(基于C++语言)。.NET和VBA适合小型应用或者工具类的开发。如果要结合C++和.NET开发各自的优点,可选用C++/CLI混合编程,但对开发者的要求较高。

2 界面库选择

在基于C++语言的本机代码应用程序中,可以通过MicroStation应用程序特有的r资源文件来添加图形用户界面,但文档少、技术支持不足、没有可视化的设计界面。一些完全开源优秀的框架以及图形用户界面模块,如Qml、QtQuick等,技术成熟,有所见即所得的可视化设计界面及丰富的学习资料,真正做到了分离界面设计人员与开发人员的工作,同时它为构建用户界面提供了许多全新的可视化组件、模型视图支持、动画框架等,但未受MicroStation平台原生支持,所以研究一种方法将Qml框架及QtQuick模块用于在MicroStation平台二次开发中构建用户界面具有十分重要的意义。

3 Qml框架+MicroStation二次开发融合技术方案

为实现上述目的,将Qml框架用于MicroStation平台二次开发中构建用户界面, 包括下列实施步骤。

3.1 部署MicroStation平台二次开发环境

安装Windows10 64位操作系统,在系统中安装MicroStation Connect Edition软件及对应的SDK开发包,安装5.15.x系列的Qt框架(由于Qt6.0以上版本依赖C++17语言标准,但MicroStation最新版SDK只支持到C++14语言标准,暂时无法使用Qt6.0以上版本的Qml框架)。

3.2 构建动态链接库M1

构建动态链接库M1,实现在MicroStation应用程序拥有事件循环的同时驱动Qt事件循环,并提供其余需要的类和函数。

(1)动态链接库M1中的类C1提供静态API函数F1,如果MicroStation进程中已经有全局QApplication对象qApp,则函数F1什么也不做,返回false;否则函数F1安装一个事件筛选器,实现在MicroStation应用程序拥有事件循环的同时驱动Qt事件循环,并创建一个QApplication实例qApp。最后如果模块M1在MicroStation进程中已被加载,则函数显式加载模块M1以增加引用计数避免从内存中卸载。类C1实现函数F1的流程如图1所示。

图1 类C1实现函数F1的流程

(2)创建QSettings全局对象Q1、全局句柄变量H1、H2。当动态链接库M1被首次映射到了MicroStation进程的地址空间时,该模块的入口函数调用步骤(1)中的函数F1,创建QSettings全局对象Q1用于记录所有QtQuick应用程序窗口的实时位置和大小,句柄变量H1、H2分别保存MicroStation宿主程序的主窗口句柄及图标句柄。

(3)动态链接库M1提供全局API函数F2,将MciroStation主窗口作为QtQuick应用程序窗口的Owner窗口,实现了QtQuick应用程序窗口浮显于MciroStation主窗口上方,并且显示时不会阻塞MicroStation宿主程序的消息,不影响用户与宿主程序的其它交互。函数F2同时把QtQuick应用程序窗口的图标设置成步骤(2)中的H2。如图2所示。

图2 动态链接库M1的主要功能接口

(4)动态链接库M1提供类C2,用于调整QtQuick窗口位置。QtQuick应用程序窗口把该类对象注册为事件过滤器,实现当窗口移动、关闭或销毁时,在步骤(2)中的Q1实时保存上一个窗口位置。QtQuick应用程序窗口在构造函数中调用类C2提供接口函数F3,把窗口位置调整为上一次的位置。

(5)动态链接库M1提供类C3,用于调整QtQuick窗口大小。QtQuick应用程序窗口把该类对象注册为事件过滤器,实现当重新调整窗口大小时,在步骤(2)的Q1实时保存上一次窗口大小。QtQuick应用程序窗口在构造函数中调用类C2提供接口函数F4,把窗口大小调整为上一次的大小。

(6)动态链接库M1提供全局API函数F5,把QtQuick应用程序窗口的图标设置成步骤(2)中的主窗口图标H2。

(7)动态链接库M1提供全局API函数F6,用于宿主程序引入库M1。

3.3 使用QtQuick模块构建用户界面

在二次开发中使用QtQuick模块构建用户界面主要流程如下:在程序中调用动态链接库M1中的函数F6,使MicroStation宿主程序把动态链接库M1引入进程空间,并执行类C1的静态函数F1;创建基于QtQuick模块的窗口类,在构造函数中注册事件过滤器,用于自动实时保存窗口大小与位置,并加载上一次窗口的大小与位置数据;创建窗口类的实例; 调用动态链接库M1中接口函数F2,设置窗口实例的Owner窗口以及图标;显示窗口类的实例。如图3所示。

图3 二次开发中应用QtQuick模块流程

4 结语

通过研发动态链接库,实现了在MicroStation宿主程序拥有事件循环的同时驱动Qt事件循环;实现了将MciroStation主窗口作为QtQuick应用程序窗口的Owner窗口,使QtQuick应用程序窗口浮显于MciroStation主窗口上方,不影响用户与宿主程序的其它交互,这是将Qml框架用于MicroStation平台二次开发的关键技术要点。该技术方案对在其它基础设计平台二次开发中使用Qml框架也具有重要借鉴意义。

由于Qt6.0以上版本依赖C++17语言标准,但MicroStation最新版SDK只支持到C++14语言标准, 本文还未解决如何使用Qt6.0以上版本的Qml框架。

猜你喜欢
二次开发图标宿主
病原体与自然宿主和人的生态关系
龟鳖类不可能是新冠病毒的中间宿主
浅谈Mastercam后处理器的二次开发
Android手机上那些好看的第三方图标包
图标
例谈课本习题的“二次开发”
中国风图标设计
抓住自然宿主
人乳头瘤病毒感染与宿主免疫机制
有意思的厕所图标