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的应用软件包含三个部分,第一部分是集成底座,第二部分是应用方案,第三部分是外部数据文件接口。
集成底座按照四个层次设计,包含内核(Kernel)、对象域(Domain)、应用(Application)和界面(UI)四个层次。
内核层提供了基础的内存管理器、数据结构、算法库以及常用工具类。
内核是集成底座的其他层次以及应用方案的基础部分,集成底座的其他层次以及应用方案的实现都依赖于Kernel。
为应用程序提供通用业务数据对象管理功能和专用业务数据对象扩展机制。
应用层定义了应用场景边界的界定方式以及应用功能的接口,实现了应用功能的管理。
界面层它包含三个部分,第一个部分是通用窗口以及面向应用方案的界面代理(UIProxy),第二个部分是视图接口(XView),第三个部分是为用户与应用程序的交互提供了基于事件消息驱动的主框架(MainFrame),应用方案从视图接口继承实现应用视图,并从界面代理继承选择并布局窗口,在主框架中被创建并在主框架的事件循环机制中运行,与用户交互,完成应用功能。
基于集成底座面向应用场景的定制化实现称为应用方案,在结构上参照集成底座的层次它分为两部分,一部分是应用层,它从集成底座的应用层继承,包含数据对象的扩展定制以及应用功能的扩展定制;另一部分是界面层,它从集成底座的界面层继承,包含视图的扩展以及界面定制。
应用方案的实现首先要完成面向应用场景的数据对象扩展,它包含预置对象的扩展子类型和全新的数据对象,如果是预置对象的扩展子类型被预置对象管理器所管理,扩展子类型使用唯一的类型标识符注册,如果是全新的数据对象类型,那么还需要从集成底座提供的对象管理器继承实现新的对象管理器用以管理全新的数据对象,数据对象以及数据对象管理器使用唯一的类型标识符注册,完成注册的数据对象就可以在应用场景中使用。如果集成底座预置的数据对象已经足够覆盖应用场景的需要,那么数据对象的扩展可以省略。在数据对象定义完备的情况下,从文档接口继承的应用文档使用唯一的标识符被注册到框架中,然后就可以通过添加所有需要的对象管理器界定应用方案的数据边界,通过统一的接口开发者就可以访问在应用场景中创建的任何数据对象,这些将为后续的功能开发提供数据基础;为了支持后续数据对象的迭代扩展,应用文档还应声明它的本地版本号,全局版本号由集成底座确定且不可修改;除此以外,为了便于应用视图的使用,在应用层还会单独实现视图数据的接口以将原始的应用数据组织为视图数据。
基于已经定义完备的数据对象,将业务流程分为一个个输入输出明确的功能点,对于每一个功能点按照它的输入输出以及交互方式,为每一个功能点指定一个唯一的字符串标识符,从功能接口模板继承重新所需要的接口,完成应用功能的扩展。在需要对话框交互的情况下还应编写对话框配置文件,对话框的配置文件基于XML文件,这一工作对编程技能没有要求,可以由开发者以外的人员完成。需要注意的是应用功能的注册会将应用功能与应用文档绑定,这意味着这些应用功能不会在属于不同应用文档的应用方案中使用。
在应用功能已经完备的基础上,就可以按照应用场景的需要定制应用视图、用户界面以及用户交互行为如何触发相应的应用功能,包括从集成底座的视图接口继承实现新的视图,从继承底座的界面代理接口继承定制实现满足应用场景需要的界面布局,对于模型树、菜单栏、工具栏以及功能导航栏,分别编写满足应用场景需要的配置文件。
最后,为了在主框架中创建并激活应用方案的实例,需要在程序的入口配置文件中添加应用方案的配置定义,应用方案的标识符、它所对应的文档标识符、应用方案资源目录、界面标题以及对象树窗口、菜单栏、工具栏和功能导航栏的配置文件路径都将在配置块中被定义,方案配置文件中还应加入包含应用方案应用层界面层的所有动态库,这样应用实例才可以被构建,应用方案中所用到的那些应用功能才可能在合适的交互操作下被触发。
一个应用方案包含了它所有需要的数据对象,但这些数据对象并不一定是在应用实例中完全从零开始构造,它有可能是通过第三方数据文件转换而来,比如从CAD几何文件中导入原始几何模型或者从计算结果中导入结果模型和数据;类似的,应用实例里的数据对象也需要经常转换为第三方数据文件以供第三方程序使用,比如将几何数据导出供网格划分程序使用完成网格划分,将建模数据导出给求解器计算求解等。这种应用数据与外部数据文件的转换需求在几乎所有的仿真软件中广泛存在,因此,与外部数据文件的接口也是一个完整的应用方案必不可少的组成部分。为此,框架在集成底座的应用层提供了转换接口(XInterface),对于每一种需要进行数据转换的文件格式,都可以从该接口继承实现转换工程。转换过程基于集成底座应用层所提供的文档接口实现,不论应用方案所包含的数据对象种类多少,无论它们是预置数据对象还是扩展定制而成,在转换过程中均可使用同一的接口形式创建和访问数据对象,这使得转换接口的具体实现只依赖于数据对象的定义而不依赖于应用方案,可以并行的安排接口的开发工作而不影响绝大部分应用功能的开发,有效的实现开发协同提高团队工作效率。
启动XT时,程序会读入应用方案配置文件,然后按照下图所示的流程首先构建菜单栏、工具栏,接着创建选择器和命令管理器,完成主程序的上下文构造工作;接下来载入不同的模块,模块中所包含的命令以及文档会自动注册到主程序中,它将告诉主程序如何构建文档、文档视图以及如何显示视图;第三步菜单栏、工具导航栏会分别从XML配置文件中读取内容完成对菜单栏、工具栏的定制,并对各控件窗口布局,设置全局属性之后显示,从而进入与用户的交互流程中。
新建一个文档时,程序会先检查该类型的文档是否被注册,如被注册,就按照注册的构造函数为文档分配内存空间,如成功创建文档,那么接下来要对命令窗口进行重置以避免在关闭上一个文档时未完成的命令的影响,接着要把命令管理器绑定到该文档上,创建文档的UI代理,根据文档属性自动更新主窗口中各命令按钮的状态(如不支持文档,则控件会失效),最后通过UI代理更新视图,进入该文档与用户的交互流程中。