通过对、分析和研究各种代码,发现这些软件在、在其他方面,有许多相似的(相同的)技术思想。因此,有必要总结和分析这些共性和主流技术。
Structuring a system into subsystems helps reduce complexity. ---GoF. Design Patterns.
通过不断的分析和总结,旨在系统地分析和总结大规模的分析(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.
是一种客户端软件设计,依据的Design Patterns书中介绍的23种模式,MVC使用到了、、、、、等设计模式。

源于文档/视图架构MVC实现数据与显示分离的模式。\视图架构要点在于。
在文档/视图框架中,。。
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.
()是微软架构师2005年提出的设计模式。对改进:通过,实现了和的与。
三、日志系统
用于输出运行过程中的信息,方便跟踪软件运行状态及其异常错误。
Qt 提供了将日志输出到文件中;它提供了更强大的日志输出功能。
QMessageLogger is used to generate messages for the Qt logging framework.
四、类型系统
提供了类型系统(, )、等功能。
借助于,基于信号/槽的对象动态生成和通信功能。
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属性和属性容器分别表示。
六、文档对象模型
()主要用于管理软件中的数据,将数据抽象成对象,然后以一定的方式将对象()组装成文档。从这个角度来看,
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渲染管线。
数据模型还需要支持功能。模块提供了非常完善、强大的对象串行化功能。
七、命令系统
九、窗口系统
十、插件系统
十一、接口扩展
十二、 分布式计算
(,又称)是利用把连接起来以解决的一种。分布式计算研究主要集中在与等两个方面。主流的分布式计算技术包括、、、、等。
随着高性能计算特别是超级计算平台的兴起,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/