User Tools

Site Tools


reference:architecture

XT 架构平台

XT是一个支持多应用多文档多视图、可扩展的工业软件平台框架。

程序包结构

XT的工作目录如下:
–bin
—-x64
——debug
——release
–build
–common
—-database
—-help
—-icons
—-image
—-python
—-sample
—-script
—-shader
—-solution
—-solver
—-uisetting
–include
—-dll
—-headers
—-libs
–src
—-core
—-advanced
—-interface
—-solution

其中bin主要用于存放编译好的动态库以及可执行文件,用于调试或者发布;build目录包含编译的配置文件以及入口文件,用于启动编译环境;common目录包含各种共用的资源文件以及应用方案所用到的资源文件;include目录包含头文件、静态链接库和动态链接库,方便被第三方程序调用;src目录为源码目录。

XT的源码由核心包、高级功能包、接口包和应用包组成,包结构如下图所示:

核心包在目录src\core下面,主要包含如下模块

包目录 说明
XT_os 系统相关调用库,封装了和系统相关的系统调用功能
XT_kernel 内核功能库,封装了数学类、哈希类、数组类以及多种空间索引类
XT_utility 基础工具库,封装了内存池、文件IO类、Log类、线程类以及XML读写类库和Json读写类库等基础工具类
XT_pykit Python接口类库
XT_domain 物理对象抽象类库,封装了包含坐标系、几何、单元以及材料等大量CAE数据对象类
XT_application 基础应用类库,封装了文档类、选择容器类、命令管理器等多个应用框架类库
XT_commands 通用命令模块,包含打开、保存等通用功能
XT_ui 基础图形界面库,封装了主框架、菜单、工具栏等各种图形界面类库

在核心包的基础上开发有高级功能包,它封装了大量的工具算法类,尤其是几何、网格相关的算法,主要包含如下模块:

包目录 说明
XKit_pre 前处理工具库,封装了前处理功能相关的逻辑较复杂的API
XKit_post 后处理工具库,封装了后处理功能相关的逻辑较复杂的API
XKit_occ 基于OCC的CAD模块库,封装了各种CAD对象类
XKit_meshing 网格算法库,封装了多种网格优化、划分、重构算法
XKit_ps parasolid工具库,封装了基于Parasolid库的CAD对象类库与CAD操作API

基于核心包和高级功能包,XT提供了与第三方格式文件进行转换的导入或导出接口类库,列举如下:

包目录 说明
analysisabaqus abaqus求解文件导出接口
analysisadvc advc求解文件导出接口
analysisansys ansys求解文件导出接口
analysiscalculix calculix求解文件导出接口
analysisfepg fepg求解文件导出接口
analysismarc marc求解文件导出接口
analysisnastran nastran求解文件导入导出接口
cadiges iges几何文件导入接口
cadobj obj几何文件导入接口
cadosg osg文件导入接口
cadparasolid x_t几何文件导入接口
cadstep step几何文件导入接口
cadstl stl几何文件导入接口
cadvtk vtk几何文件导入接口
datacsv csv数据文件导入接口
resultabaqus abaqus结果导入接口
resultadvc advc结果导入接口
resultansys ansys结果导入接口
resultcalculix calculix结果导入接口
resulthdf5 hdf5结果导入接口(由Nastran输出)
resultlydyna lsdyan结果导入接口
resultmarc marc结果导入接口
resultnastran op2结果导入接口
resultvtk vtk格式结果导入接口

应用包根据具体应用场景而定制,一般会包含定制的application、ui以及程序入口,根据实际需要可另外定制domain以及toolkit模块,以XT的前后处理应用方案为例,包含如下模块:

包目录 说明
pre-commands XT通用前处理命令模块,实现前处理各种功能命令
pre-application XT通用前处理应用模块,从核心包application继承,封装了前处理文档和视图数据管理功能
pre-ui XT通用前处理界面模块,封装了前处理文档界面代理以及用户交互的消息处理机制
post-commands XT通用后处理命令模块,实现后处理各种功能命令
post-application XT通用后处理应用模块,从核心包application继承,封装了后处理文档和视图数据管理功能
post-ui XT通用后处理界面模块,封装了后处理文档界面代理以及用户交互的消息处理机制

架构设计

XT是一个界面与应用功能解耦且扩展灵活方便的框架系统,在开发上,它提供了多种机制将需要定制的特性从基础框架中解耦出来,避免定制代码分支的修改对基础框架的影响,支持多个应用方案的平行独立开发线;在运行上,支持同时接入多个不用场景的应用方案。在架构设计上,基于XT的应用软件包含三个部分,第一部分是集成底座,第二部分是应用方案,第三部分是外部数据文件接口。

1. 集成底座

集成底座按照四个层次设计,包含内核(Kernel)、对象域(Domain)、应用(Application)和界面(UI)四个层次。

1.1. 内核层(Kernel)

内核层提供了基础的内存管理器、数据结构、算法库以及常用工具类。

  • 平台框架使用C++语言编写,它并不像Java等语言一样具有自动的内存回收机制,为了提高内存资源使用效率和性能,开发了基于内存池技术的内存管理器(XMemPool),它负责为数据结构和算法分配和回收内存资源,避免内存的碎片化,使应用程序可以长时间稳定健壮的运行;
  • 平台框架面向工业应用,需要对种类繁多形态各异的对象抽象建模,基础数据结构为数据建模提供最基本的原材料,如哈希(XHash)、数组(XArray)、向量(XDataVec)、矩阵(XDataMatrix)等通用基础数据结构,开发者以聚合的方式像搭积木一样搭建面向应用场景的复杂数据结构,方便且可靠;
  • 通用算法库基于通用基础数据结构构建,包括广泛使用的排序、插值、空间搜索、矩阵运算、向量运算等基础算法,经过反复的测试验证和优化,为更复杂的功能算法提供高效可靠的基础算法支持;
  • 通用工具类提供了常用的工具类,包括文本文件IO、二进制文件IO、HDF5文件IO、XML格式文件处理、JSON文件处理、字符串处理、日志处理、脚本序列化/反序列化处理、高阶方程求解、表达式求值、线程管理、共享内存、渲染数据管理、迭代器以及和操作系统相关的系统调用等,使应用场景的功能开发更加高效快捷;

内核是集成底座的其他层次以及应用方案的基础部分,集成底座的其他层次以及应用方案的实现都依赖于Kernel。

1.2. 对象域层(Domain)

为应用程序提供通用业务数据对象管理功能和专用业务数据对象扩展机制。

  • 数据结构是应用程序的核心,基于平台框架构建的应用程序由面向使用场景的数据驱动,框架定义了统一的数据抽象定义机制,它基于字符串注册数据对象(XItem)及对象管理器(XManager);框架还定义了统一的数据对象访问接口,实现了基于整数ID的对象管理模板,包括对象的创建、对象的索引和访问、对象的销毁等,这些方法都针对对象规模在1000万以上的大规模应用场景做了精细的优化,性能优异且鲁棒;框架还实现了基于HDF5格式的序列化接口和底层方法,通过这些接口和方法可以以结构化的方式方便的将所有数据对象序列化到HDF5文件中,或者从HDF5文件中将数据对象反序列化到内存中,框架还特别考虑了版本信息对对象序列化的影响,引入了全局本地版本号以支持框架与应用分支不同的版本协同管理;除此以外,框架还参照数据库的运行方式通过将操作前和操作后的数据对象的状态记录到二进制文件中实现了数据对象操作全过程的记录,激活该特性可支持应用功能的undo、redo以及回滚操作,可有效提升用户使用体验。
  • 框架已经积累定义实现了大量常见仿真场景中所使用的业务数据对象和方法,包括几何对象、网格对象、材料对象、载荷约束条件对象、分析设定对象、结果对象以及表格、坐标系、单位系等通用对象,所有应用方案可直接使用这些预置好的数据对象,或者也可以参照预置的数据对象继承实现新的数据对象,或者也可以参照数据对象的定义机制和访问接口扩展定制全新的数据对象,不论是预置对象、继承对象还是扩展对象,都将以统一的方式被管理,以统一的接口被访问,这使得不同应用方案可以相互访问各自独有的数据。对象域为应用方案提供数据支撑,它为应用程序定义了一条数据总线,应用方案的功能实现依赖于对象域及其扩展。

1.3. 应用层(Application)

应用层定义了应用场景边界的界定方式以及应用功能的接口,实现了应用功能的管理。

  • 应用场景决定了应用方案所用到的数据对象的范围,这一范围就是应用场景的边界,应用层提供了文档接口(XDocument)来帮助开发者界定应用场景的边界。开发者在文档接口中选择应用场景所需要的数据对象管理器,它负责数据对象的创建和销毁,这里所涉及到的数据对象应定义完备,它们或者来源于对象域已预置好的定义,或者通过继承扩展而来,应用场景的数据对象可能会随需求变化而增加或者删除,因此文档接口也提供了版本机制以帮助界定不同时间点应用场景的边界;文档接口提供了直接访问数据对象的统一接口,因此文档接口还是与外部数据文件交换数据的统一入口,应用层为数据转换提供了转换接口(XInterface);应用层还提供了向界面层视图提供数据支持的接口(XViewData),使得开发者在接口下面定义不同的视图数据,但更新视图的方式却是统一的。具体的应用方案均从文档接口继承定制实现,为了区分不同的应用方案,文档接口也提供了唯一的字符串标识。
  • 应用功能的接口是一套模板(ICommand),它定义了如何注册和标识功能,如何创建激活功能,在需要用户交互的情况下如何初始化功能对话框、如何将应用数据与界面控件相互交换、如何响应界面事件,如何向功能对象传递并检查参数,如何将功能脚本化,如何销毁功能等应用功能的各个方面,在平台框架中,所有应用功能均从(没有例外)该接口模板继承实现,这些功能都被应用层提供的应用功能管理器(XCommandManager)所管理,应用功能管理器为注册功能提供了静态函数,使用字符串和文档标识符共同索引功能的方式使得开发者可以在不同的开发线上独立开发,互不影响。应用层也实现了对拾取对象的管理,拾取对象是用户在交互时的操作对象的统一封装,应用层通过拾取对象管理器(XPicker)向所用应用方案提供了统一的拾取对象添加、删除以及访问方法,在基于功能模板开发应用功能时这一设计使得功能在获取交互对象时非常简洁方便。需要强调的是,为了将应用层和界面层解耦,功能接口的界面并不直接管理对话框,XT开发了一套低代码界面配置工具仅通过XML结构化文件来配置生成界面对话框和完成简单的动态事件响应,复杂的动态交互则通过功能窗口(ICommandWindow)提供的虚接口完成(不依赖于功能窗口的具体实现)。

1.4. 界面层(UI)

界面层它包含三个部分,第一个部分是通用窗口以及面向应用方案的界面代理(UIProxy),第二个部分是视图接口(XView),第三个部分是为用户与应用程序的交互提供了基于事件消息驱动的主框架(MainFrame),应用方案从视图接口继承实现应用视图,并从界面代理继承选择并布局窗口,在主框架中被创建并在主框架的事件循环机制中运行,与用户交互,完成应用功能。

  • 第一部分的通用窗口包含常见的窗口,包括功能窗口(CommandWindow)、对象树窗口(XTreeView)、拾取对象窗口(XPickWnd)、属性窗口(XPropertyWnd)、脚本窗口(XScriptWnd)、消息窗口(XMessageWnd)、菜单栏(XMainMenu)、工具栏以及功能导航栏(XToolBar)等,其中功能窗口主要面向应用功能,它实现了基于XML结构化文本定制对话框的功能,向应用功能提供了大量虚接口以方便应用功能调用,和应用方案没有直接关系;对于拾取对象窗口、属性窗口、脚本窗口、消息窗口,它们不依赖于具体应用方案,交互方式通用且统一,在定制应用方案时直接使用即可;而对象树窗口、菜单栏、工具栏和功能导航栏则依赖于具体应用方案,用户与这些窗口控件的交互会直接触发面向给定应用场景的应用功能,对于对象树窗口,它是对应用数据的树状显示,它展现的数据对象依赖应用方案,但交互方式仅限定于单击、双击、拖拽、多选和右键菜单这几种形式,对于菜单栏、工具栏和功能导航栏,它们一般仅包含菜单、按钮、编辑框、下拉框四种控件中的若干种类,用户的交互行为也限定在点击菜单项、点击按钮、编辑框回车以及改变下拉框当前选项这几种形式,在总结了这些规律之后,平台框架实现了通过XML结构化文本配置对象树窗口、菜单栏、工具栏和功能导航栏的不同交互行为的响应规则,交互行为的响应方式只有一种,即触发相应的应用功能,在应用方案的空间内,任何一个应用功能都有一个唯一的字符串标识,这些字符串标识有意义且易于理解,因此编写和维护这样的配置文件变得非常简单,为了进一步减少耦合性,平台框架将对象树窗口、菜单栏、工具栏和功能导航栏的配置文件分开管理,这样的方式使得基于已有的应用方案定制更加专用的业务方案非常容易,不用修改源码,修改这些配置文件即可。对于不同应用方案,窗口的布局甚至是需要的窗口也有可能是不一样的,这一可变的部分被封装在界面代理的接口中,每一个应用方案需要从它继承实现独有的界面代理,选择需要的窗口并根据需要把它们放置在合适的位置,需要强调的是配置文件并不是应用方案的固定组成部分,它是可变的,配置文件的设定在主框架中完成。
  • 第二部分视图接口,视图是基于应用数据的可视化显示,应用数据的可视化形式可能包含多种形式,如三维显示、曲线绘制或者图像显示等,这些可视化形式区别很大,且强烈依赖于应用数据,因此应用方案需要基于应用场景重新实现应用视图,应用视图一般被放置于主框架的中心位置,同一个应用方案可以包含多个应用视图,应用视图可以在应用界面上根据需要被手动切换或者自动切换。三维模型显示是仿真应用中最常见的视图,框架基于OpenGL和GLSL预置实现了面向预置模型对象(XModel)的通用三维模型视图类(XRender),它支持常见的交互(如平移、缩放或旋转)以及多种渲染模式(线框模式、面模式、网格线模式等),该视图的显示数据来源于预置模型对象的数据的再组织,对于大规模的应用场景也使用VBO做了针对性的优化,在需要三维视图的场景下,应用方案可基于该视图类做少量修改即可完成三维视图的定制。
  • 第三部分主框架是应用程序的入口,它负责管理应用实例。一个在内存中处于运行状态的应用方案被称为应用实例,主框架允许同一个应用方案的多个实例同时存在,也允许多个属于不同应用方案的应用实例并存,还支持在不同应用实例间来回切换,但同一时刻只能有一个当前实例处于激活状态。应用方案本身也是可配置的,它在一个独立的XML文件中配置,应用方案的配置属性包括方案标识、它所对应的文档标识符、应用方案资源目录、界面标题以及对象树窗口、菜单栏、工具栏和功能导航栏的配置文件路径,方案配置文件中还定义了载入动态库的清单,应用方案所对应的应用文档需要在这些动态库中被实现,否则该方案不能被实例化,应用方案中所用到的那些应用功能需要在这些动态库中被实现,否则在应用实例中这些功能不会被触发。主框架通过事件循环机制响应当前应用实例中用户的各种交互操作,进程和线程的管理也在主框架中进行。

2. 应用方案

基于集成底座面向应用场景的定制化实现称为应用方案,在结构上参照集成底座的层次它分为两部分,一部分是应用层,它从集成底座的应用层继承,包含数据对象的扩展定制以及应用功能的扩展定制;另一部分是界面层,它从集成底座的界面层继承,包含视图的扩展以及界面定制。

2.1. 数据对象的扩展定制

应用方案的实现首先要完成面向应用场景的数据对象扩展,它包含预置对象的扩展子类型和全新的数据对象,如果是预置对象的扩展子类型被预置对象管理器所管理,扩展子类型使用唯一的类型标识符注册,如果是全新的数据对象类型,那么还需要从集成底座提供的对象管理器继承实现新的对象管理器用以管理全新的数据对象,数据对象以及数据对象管理器使用唯一的类型标识符注册,完成注册的数据对象就可以在应用场景中使用。如果集成底座预置的数据对象已经足够覆盖应用场景的需要,那么数据对象的扩展可以省略。在数据对象定义完备的情况下,从文档接口继承的应用文档使用唯一的标识符被注册到框架中,然后就可以通过添加所有需要的对象管理器界定应用方案的数据边界,通过统一的接口开发者就可以访问在应用场景中创建的任何数据对象,这些将为后续的功能开发提供数据基础;为了支持后续数据对象的迭代扩展,应用文档还应声明它的本地版本号,全局版本号由集成底座确定且不可修改;除此以外,为了便于应用视图的使用,在应用层还会单独实现视图数据的接口以将原始的应用数据组织为视图数据。

2.2. 应用功能的扩展定制

基于已经定义完备的数据对象,将业务流程分为一个个输入输出明确的功能点,对于每一个功能点按照它的输入输出以及交互方式,为每一个功能点指定一个唯一的字符串标识符,从功能接口模板继承重新所需要的接口,完成应用功能的扩展。在需要对话框交互的情况下还应编写对话框配置文件,对话框的配置文件基于XML文件,这一工作对编程技能没有要求,可以由开发者以外的人员完成。需要注意的是应用功能的注册会将应用功能与应用文档绑定,这意味着这些应用功能不会在属于不同应用文档的应用方案中使用。

2.3. 视图的扩展和界面的定制

在应用功能已经完备的基础上,就可以按照应用场景的需要定制应用视图、用户界面以及用户交互行为如何触发相应的应用功能,包括从集成底座的视图接口继承实现新的视图,从继承底座的界面代理接口继承定制实现满足应用场景需要的界面布局,对于模型树、菜单栏、工具栏以及功能导航栏,分别编写满足应用场景需要的配置文件。

最后,为了在主框架中创建并激活应用方案的实例,需要在程序的入口配置文件中添加应用方案的配置定义,应用方案的标识符、它所对应的文档标识符、应用方案资源目录、界面标题以及对象树窗口、菜单栏、工具栏和功能导航栏的配置文件路径都将在配置块中被定义,方案配置文件中还应加入包含应用方案应用层界面层的所有动态库,这样应用实例才可以被构建,应用方案中所用到的那些应用功能才可能在合适的交互操作下被触发。

3. 外部数据文件接口

一个应用方案包含了它所有需要的数据对象,但这些数据对象并不一定是在应用实例中完全从零开始构造,它有可能是通过第三方数据文件转换而来,比如从CAD几何文件中导入原始几何模型或者从计算结果中导入结果模型和数据;类似的,应用实例里的数据对象也需要经常转换为第三方数据文件以供第三方程序使用,比如将几何数据导出供网格划分程序使用完成网格划分,将建模数据导出给求解器计算求解等。这种应用数据与外部数据文件的转换需求在几乎所有的仿真软件中广泛存在,因此,与外部数据文件的接口也是一个完整的应用方案必不可少的组成部分。为此,框架在集成底座的应用层提供了转换接口(XInterface),对于每一种需要进行数据转换的文件格式,都可以从该接口继承实现转换工程。转换过程基于集成底座应用层所提供的文档接口实现,不论应用方案所包含的数据对象种类多少,无论它们是预置数据对象还是扩展定制而成,在转换过程中均可使用同一的接口形式创建和访问数据对象,这使得转换接口的具体实现只依赖于数据对象的定义而不依赖于应用方案,可以并行的安排接口的开发工作而不影响绝大部分应用功能的开发,有效的实现开发协同提高团队工作效率。

启动逻辑

启动XT时,程序会读入应用方案配置文件,然后按照下图所示的流程首先构建菜单栏、工具栏,接着创建选择器和命令管理器,完成主程序的上下文构造工作;接下来载入不同的模块,模块中所包含的命令以及文档会自动注册到主程序中,它将告诉主程序如何构建文档、文档视图以及如何显示视图;第三步菜单栏、工具导航栏会分别从XML配置文件中读取内容完成对菜单栏、工具栏的定制,并对各控件窗口布局,设置全局属性之后显示,从而进入与用户的交互流程中。

新建一个文档时,程序会先检查该类型的文档是否被注册,如被注册,就按照注册的构造函数为文档分配内存空间,如成功创建文档,那么接下来要对命令窗口进行重置以避免在关闭上一个文档时未完成的命令的影响,接着要把命令管理器绑定到该文档上,创建文档的UI代理,根据文档属性自动更新主窗口中各命令按钮的状态(如不支持文档,则控件会失效),最后通过UI代理更新视图,进入该文档与用户的交互流程中。

reference/architecture.txt · Last modified: 2025/05/09 14:46 (external edit)