基于Python对Intergraph Smart® 3D Bulkload Utility的重新设计与实现

2023-02-03 07:00中国石化工程建设有限公司刘宇轩
中国勘察设计 2023年1期
关键词:界面模板程序

■ 中国石化工程建设有限公司 刘宇轩

海克斯康的Smart 3D作为近20年来出现的先进的三维工厂设计软件,凭借其面向数据库、设计规则驱动等特点,简化了工程设计过程,深受用户喜爱,在流程行业中应用广泛。绝大多数使用过该软件进行工程设计的管理员与材料人员都对其配套工具Bulkload Utility(以下简称“Bulkload”)不陌生。作为官方提供的唯一具有图形用户界面的参考数据库(Catalog Database)导入工具,Bulkload在整个工程设计过程中都发挥着至关重要的作用。

近年来,大型化工项目遍地开花。工程公司经常会承担多个装置的设计工作,这就要求Smart 3D管理员与材料工程师同时管理和维护多个参考数据库,任务繁重且易出错。Smart 3D原生的Bulkload由于只支持单一数据库的导入且不具备数据存储功能,在现有复杂紧迫的工程环境下显得捉襟见肘,迫切需要一个可以满足多数据库批量导入且具有数据复用功能的全新Bulkload程序。

1 .程序设计思路

Smart 3D原生的Bulkload一次只支持向一个参考数据库中导入数据,其工作的逻辑关系如图1所示。这种设计面临的最直接问题是向多个参考数据库中导入相同的数据文件时只能串行执行,大大降低了管理员的工作效率。因此,新开发的Bulkload程序(以下简称“Bulkload+”)设计思路的出发点就在于将数据导入文件和参考数据库信息隔离开,使得多个参考数据库的并行导入成为可能。此外,Bulkload+程序还要能够将相对固定的装入文件定制成模板,方便管理员对装入文件进行灵活配置、组合以及复用。新增数据存储功能,使得管理员能够更加轻松的管理装入文件并进行溯源。Bulkload+程序工作的逻辑关系如图2所示。

图1 Bulkload工作逻辑

图2 Bulkload+工作逻辑

2. 程序设计与实现

2.1 程序整体架构设计

Bulkload+程序主要由前端UI交互界面、数据库连接、命令行调用、数据处理和存储四部分组成。UI交互界面主要负责一系列交互功能的实现,包括导入文件的选取和配置、装入步骤的选择和装入模板的定制、项目参考数据库相关信息的编辑与配置、日志文件的存储等;后端数据库连接主要负责调用Python中Pyodbc模块连接SQLServer和Oracle数据库,获取项目所在服务器数据库的相关参数信息;命令行调用主要负责在Python环境下执行特定格式的控制台命令输入,通过命令行的形式调用原生Bulkload程序完成向参考数据库中的数据导入;数据处理和存储部分则是对用户在使用过程中产生的各种数据进行分类、汇总与存储,构造并生成特定格式的数据交换文件(图3)。

图3 程序整体架构设计

2.2 关键技术

2.2.1 GUI应用程序开发工具包——PyQt5

Qt是一个跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,如控制台工具和服务器。PyQt5则是Qt公司在Qt应用程序框架的基础上开发的一组结合Python编程语言的开发库集合,其将Qt类中的1000多个组件实现为一组Python模块,支持以Python的方式开发Qt应用程序。不仅如此,PyQt还支持诸如Windows、Linux、UNIX、Android、macOS和iOS等多个平台,开发快捷友好,应用前景广泛[1]。

PyQt5拥有超过300多个类,在此次开发中主要涉及QtCore和QtGui这两个模块。QtCore模块包含核心的非GUI功能。该模块用于时间、文件和目录、各种数据类型、流、网址、MIME类型、线程或进程[2]。QtWidgets模块提供了一整套UI元素组件来创建经典桌面风格的用户界面[3]。该模块可以显示数据和状态信息,接收用户输入,并为应该组合在一起的其他小部件提供容器。

2.2.2 多线程并发编程技术——Threading

Threading模块是Python支持的多线程编程的重要模块,该模块是在底层模块_Thread的基础上开发的更高层次的多线程编程接口,提供了大量的方法和类型来支持多线程编程。它具有非常丰富的多线程功能模块,主要包括常用线程函数、线程对象、锁对象、递归锁对象、事件对象、条件变量对象、信号量对象、定时器对象、栅栏对象等[4]。Thread是其中最重要也是最基本的一个类,可以通过该类创建线程并控制线程的并发运行。

在Bulkload+程序中执行多数据库批量导入操作时,使用Threading模块进行多线程并发编程,可以提高程序的执行效率,减少管理员的等待时间。一个处理器同时处理多个任务,在硬件资源有限的情况下也能尽可能多地提高CPU的资源使用率。

2.2.3 Python应用程序打包——PyInstaller

PyInstaller模块可以将Python应用程序及其所有依赖项冻结(打包)成独立可执行程序,用户无需安装Python解释器或任何模块即可运行打包的应用程序,这个程序可以被分发在Windows、GNU/Linux、Mac OS X、FreeBSD、Solaris和AIX平台上运行[5]。其优势在于使用简单,仅通过一行命令即可完成程序文件的打包。功能完善且兼容性高,正确捆绑了主要的Python软件包,如Numpy、PyQt5、wxPython、Matplotlib等[6]。

Bulkload+程序将使用PyInstaller模块进行Python源文件的打包,生成的独立可执行文件将被部署在服务器端。用户可通过发送桌面快捷方式在本地运行客户端,方便部署和更新。

2.3 程序功能的设计与实现

2.3.1 UI界面及功能设计

本程序采用PyQt5中的QtDesigner进行UI交互界面设计,主要包含四个模块功能:程序运行主界面、方案模板定制界面、导入文件配置界面以及项目信息选择界面。

程序运行主界面:该界面由三块功能部分组成,分别是方案模板的选择、添加与编辑,导入项目的选择、添加与编辑以及日志文件存放路径的选取。

方案模板定制界面:该界面提供了导入方案的选择、添加与编辑功能。用户使用过的导入方案都将被存储在步骤池(StepList)中,通过对导入方案的选取、组合和命名,用户可以定制出个性化的导入方案模板。

导入文件配置界面:该界面继承了Smart 3D原生Bulkload程序的界面设计和布局,方便用户以最低的学习成本过渡到新程序。新增的命名栏可以将导入方案以用户自定义命名的方式存入方案模板定制界面的步骤池中。

项目信息选择界面:该界面也是在延续Bulkload原有界面导入对象数据库选择区域风格的基础上新增了命名栏,使得用户可以按自己的习惯给项目命名并将其存入主界面的项目清单框(Project List)中。

以上界面窗口均通过QtWidgets模块的QMainWindow类实现,而界面上的线条、标签、按钮、下拉选框以及列表框等通过QFrame、QLabel、QPushButton、QCombox、QListWidget等类一一实现。

2.3.2 数据处理和存储

数据处理和存储作为Bulkload+程序重要的组成部分之一,管理着程序全生命周期内的用户数据。通过对这些数据进行分类与梳理,可将其分为三大类:一是方案模板(Plan)、导入步骤(Step)和项目配置(Project)等信息。这部分信息以数据字典的形式存储在JSON格式文件中;二是导入文件的路径。由于命令行输入对文件格式有特殊的要求,所以导入文件信息都被标准化处理后记录在LST文件中;三是日志(Log)文件。每条日志文件都被打上了唯一的标识(方案模板+导入步骤+项目信息+日期),被存放在一个独立的文件夹中,用于对装入记录的回溯与追踪。以上所有数据记录都被存放到程序运行位置同级目录下指定的独立区域内,详细结构如图4所示。

图4 数据存储结构

2.3.3 命令行构造与执行

程序最后的运行是通过命令行调用的方式实现的。为了保证程序的顺利执行,必须构造出符合规范要求的命令行输入。其中,命令行参数的对应关系如表1所示。

表1 命令行参数对应关系

在参照命令行参数关系对应表的基础上,结合前文提到的数据存储的方式和结构,可以构造出命令行输入的字符串。构造好命令行输入后,使用多线程并发编程技术即可实现命令行队列的并发执行。

2.4 程序测试及效果

程序测试分为用户界面交互功能测试、数据导入功能测试与批量导入效率测试。

2.4.1 用户界面交互功能测试

用户界面交互功能测试主要测试按钮功能、数据记录功能以及错误提示功能。测试结果显示各功能都能正常运转,尤其是错误提示功能可以更好地指引新用户熟悉软件,避免一些不规范的使用操作。

2.4.2 数据导入功能测试

程序执行结束后会自动弹出窗口提示导入已完成,用户可以通过点击“是”按钮直接打开日志文件查看导入结果。

2.4.3 批量导入效率测试

通过对比往单个参考数据库和两个参考数据库中导入相同数据的耗时,可以分析出批量导入效率的提升情况。首先,模拟Bulkload程序往单个参考数据库中导入数据,整个过程耗时约为50秒。其次,使用Bulkload+程序同时往两个参考数据库中导入数据,整个过程耗时约为55秒。

经过大量的导入测试与比对,在忽略电脑本身运行状态起伏的情况下,往参考数据库中批量导入的耗时不受数据库数量增加的扰动,基本与往单一数据库中导入耗时持平。由此可以得出以下结论:与Bulkload程序相比,Bulkload+程序对批量执行工作效率的提升是十分显著的,且成线性增长,即参考数据库的数量每增加一个,单次导入的平均耗时便缩小,效率提升表示参考数据库的数量)(图5)。

图5 Bulkload vs Bulkload+导入耗时

3. 总结

本文设计的全新Bulkload+程序,基于Python语言重新设计了图形用户界面,解决了原程序不能同时向多个参考数据库批量导入的问题,极大节省了导入时间。同时在导入文件流程上进行了优化,使得管理员能更加灵活的定制模板,具有较好的实用性和拓展性。此外,界面设计简约且指引完善,最大程度保留了原有的设计风格,新老用户都可以轻松适应该程序。导入数据记录完整,方便复用与溯源管理。

猜你喜欢
界面模板程序
铝模板在高层建筑施工中的应用
铝模板在高层建筑施工中的应用
国企党委前置研究的“四个界面”
试论我国未决羁押程序的立法完善
基于FANUC PICTURE的虚拟轴坐标显示界面开发方法研究
“程序猿”的生活什么样
英国与欧盟正式启动“离婚”程序程序
电子显微打开材料界面世界之门
铝模板在高层建筑施工中的应用
创卫暗访程序有待改进