大型CAx(CAD/CAE/CAM)软件开发中的关键组件
时间:2022-08-11 06:30:00
通过对FreeCAD、SALOME分析和研究各种代码,发现这些软件在架构设计、模块实现在其他方面,有许多相似的(相同的)技术思想。因此,有必要总结和分析这些共性和主流技术。
Structuring a system into subsystems helps reduce complexity. ---GoF. Design Patterns.
通过不断的分析和总结,旨在系统地分析和总结大规模的分析CAx(CAD/CAE/CAM)软件开发中的关键组件设计方法。希望从事国内工作CAx软件开发的朋友在技术选型、系统设计有所帮助,也很欢迎大家批评指教。
注1:仅限于研究水平,分析难免不当,欢迎批评指正。
注2:文章内容会不时更新。
一、工程组织
工程组织注重组织管理CAx软件开发过程中的相关代码、文档、工程配置文件等。虽然在软件开发的初始阶段很难设计出能够满足许多需求的工程组织形式。然而,有一件事是肯定的,良好的工程组织对软件文件的管理和维护大有裨益。
从现在开始,基于Qt的桌面CAx软件开发仍然是主流,在未来有限的时间内仍将占据更大的份额。
CMakeQt是GitHub上一个开源Qt软件开发的CMake模板,已被接受Blender很多开源项目都采用了,值得借鉴。
二、MVC类框架
在面向对象的程序设计语言中,软件框架通常使用虚拟(接口)来构建对象之间的关系。
A framework is a set of cooperating classes that make up a resuable design clas of software.
Frameworks use abstract classes to define and maintain relationships between objects.
MVC(Model-View-Controller,模型-视图-控制器是一种客户端软件设计框架,依据GoF(Gang of Foure)的Design Patterns书中介绍的23种模式,MVC框架使用到了Observer、Facade、Proxy、Mediator、Command、Iterator等设计模式。

Ref. from PureMVC
源于文档/视图架构MVC实现数据与显示分离的模式。\视图架构要点在于处理应用程序组件、主框架、文档、子框架、视图等之间的关系。
在文档/视图框架中,将每个数据抽象成一个数据项(Document Item),文档以一定的方式组织一系列数据项,实现数据项访问、编辑等独立于底层具体存储模式的功能。视图以GUI编辑数据项的形式显示和编辑。
GoF's Design Patterns:The Application class is responsible for managing Documents and will create them as required—when the user selects Open or New from a menu, for example.
MVVM(Model-View-ViewModel)框架是微软架构师John Gossman2005年提出的设计模式。MVVM对MVC改进:通过双向绑定数据和视图,实现了View和Model的完全隔离与自动同步。
三、日志系统
用于输出运行过程中的信息,方便跟踪软件运行状态及其异常错误。
Qt 提供了QMessageLogger将日志输出到文件中;Boos Log v2它提供了更强大的日志输出功能。
QMessageLogger is used to generate messages for the Qt logging framework.
四、类型系统
提供了类型系统运行时的类型信息(RTTI, RunTime Type Information)、动态生成和管理对象等功能。
Qt Meta-Object System借助于Qt RTTI,基于信号/槽的对象动态生成和通信功能。
Qt's meta-object system provides the signals and slots mechanism for inter-object communication, run-time type information, and the dynamic property system.
五、属性系统
在面向对象对象程序设计属性与方法属性所有者称为属性容器。属性用于表达对象的状态,属性通常由属性类型、属性名称、属性值构成等元素;操作属性包括:添加、删除、编辑等。
对于C 等静态编程语言,对象中包含的属性由对象的类型决定,不能动态添加或删除属性,只能编辑属性。因此,需要动态添加/删除属性。
在OSG,osg::Object包含一个osg::userDataContainer对象,osg::ValueObject、osg::UserDataContainer对象属性表示对象属性和属性容器,派生于osg::ValueObject的osg::TemplateValueObject模板用于特化bool、char、int、float、double等属性。
在Qt中,QObject任何属性数据都可以关联,QVaraint、QMetaObject用于表示属性和属性容器。
在FreeCAD中,App::DocumentObject间接继承于App::PropertyContainer(App::DocumentObject继承自App::TransactionalObject,而App::TransactionalObject继承自App::PropertyContainer),App::Property、App::PropertyContainer属性和属性容器分别表示。
六、文档对象模型
文档对象模型(Document Object Model)主要用于管理软件中的数据,将数据抽象成对象,然后以一定的方式将对象(Directed Acyclic Graph,DAG)组装成文档。从这个角度来看,
Qt将对象组织成树状结构,这的确可以满足大部分的场景应用,但却难以处理对象的多引用与数据一致性问题。
QObjects organize themselves in object trees. When you create a QObject with another object as parent, it's added to the parent's children() list, and is deleted when the parent is
OSG则将对象组织成了DAG以优化OpenGL渲染性能,但所提供的DAG节点主要是面向OpenGL渲染管线。
数据模型还需要支持对象串行化功能。Boost Archive/Serialization模块提供了非常完善、强大的对象串行化功能。
七、命令系统
八、资源系统
九、窗口系统
十、插件系统
十一、接口扩展
十二、 分布式计算
分布式计算(Distributed Computing,又称分散计算)是利用网络把大量计算资源连接起来以解决大型计算问题的一种计算科学。分布式计算研究主要集中在分布式操作系统与分布式计算环境等两个方面。主流的分布式计算技术包括中间件技术、网格技术、移动Agent技术、P2P技术、Web Service技术等。
随着高性能计算特别是超级计算平台的兴起,CAx软件正逐渐由桌面系统逐渐向基于云计算平台的网络应用进行转变。
近十年来,国家也建立了天津、济南、郑州、无锡、昆山、广州、深圳、长沙、成都等八大超算中心。不少新型的CAx软件公司也瞅准了这个时机,相继推出了自己的产品,国外有PTC OneShape,国内有华云三维的CrownCAD。
鉴于目前的形式,CAx软件在设计之初就应当考虑云计算赋能的问题,因此,需要对目前云计算平台(特别是国内的八大超算中心)的软硬件情况做深入的研究,为前期软件系统设计、技术选型等提供依据。
关于HPC集群架设相关的技术,笔者在前面的博文中,已经以此进行了论述。
参见:部署HPC集群的实施方案
超算中心大都基于Linux操作系统或者其衍生版本,其中又以CentOS系统居多,大都提供Web登录、VPN SSH登录等访问方式。济南超算中心山河计算平台提供了Web Services、SDK、CLI等三种开发接口。
单从CAx软件研发来看,基于云计算的CAx软件开发至少会涉及到远程登录、文件/数据传输、命令执行、作业管理等功能模块。
基于B/S架构的CAx软件研发,在实时性等方面还存在一些技术难点;基于C/S架构方案中,缺少专门的CAx软件通信协议。
近几年,以虚拟化、云计算等技术为基础的云桌面逐渐兴起,这或许为发展基于云计算的CAx软件提供了可行性。
参考文献
Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides. Design Patterns:elements of reusable object-oriented software. Addison Wesley, 1994.
EURIWARE. SALOME GUI Architecture. 2010.
网络资源
FreeCADhttps://www.freecadweb.org/
SALOMEhttps://www.salome-platform.org/
SALOME GUI Architecture https://docs.salome-platform.org/latest/extra/SALOME_GUI_Architecture.pdf
SALOME - CMake build procedure https://docs.salome-platform.org/latest/dev/cmake/html/index.html
Salome JobManagerhttps://github.com/FedoraScientific/salome-jobmanager
Mayohttps://github.com/fougue/mayo/tree/v0.5.2
CMakeQthttps://github.com/bhaisaab/cmakeqt
The PureMVC Frameworkhttp://puremvc.org/
Cliff Hall. PureMVC Implementation Idioms and Best Practices. http://puremvc.org/docs/PureMVC_IIBP_English.pdf
GitHub Googlehttps://github.com/google
GItHub Apachehttps://github.com/apache
QMessageLogger https://doc.qt.io/qt-6/qmessagelogger.html
Boost.Log v2 https://www.boost.org/doc/libs/1_79_0/libs/log/doc/html/index.html
Boost UUID https://www.boost.org/doc/libs/1_79_0/libs/uuid/doc/uuid.html
The Meta-Object Systemhttps://doc.qt.io/qt-6/metaobjects.html
Property System https://doc.qt.io/qt-5/properties.html
Object Modelhttps://doc.qt.io/qt-6/object.html
Boost Serializationhttps://www.boost.org/doc/libs/1_79_0/libs/serialization/doc/index.html
Boost Preprocessors https://www.boost.org/doc/libs/1_79_0/libs/preprocessor/doc/index.html
Mick West. Evolve Your Hierarchyhttps://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
Service Architecture https://www.service-architecture.com/
国家超级计算济南中心https://www.nsccjn.cn/
libsshhttps://www.libssh.org/libssh2https://www.libssh2.org/
OpenSSHhttps://www.openssh.com/
gSOAP https://www.genivia.com/products.html
Slurmhttps://slurm.schedmd.com/