# 序言 ``` 项目概况: 前处理(电子学院陈新蕾老师负责网格处理):完成CFD计算和IR计算的准备工作, 1.建模(主要由京航数码提前建好模型),软件中可能需要对模型进行简单处理(opencascade)开源库 2.三维模型的标准格式(stp/step/iges/igs/brep)导入和展示,OCC解析、VTK渲染 3.网格划分:面网格划分(gmsh)->体网格划分(cfmsh) 4.网格模型的导入和展示,主要流程 导入的标准格式几何模型通过gmsh划分表面网格输出.stl文件,stl文件通过cfMesh划分实体网格(openFORM格式)并转换成fluent的.msh格式文件 CFD计算模块(航空学院肖天航老师): 输入:参数文件、.msh网格文件 输出:主要为tecplot(非开源)的plt结果文件 IR红外可见光模块(601所黄伟老师): CFD的输出计算结果作为红外部分的输入 后处理(电子学院陈新蕾老师):对计算结果的输出文件进行一些操作并展示,fastcae也有后处理模块,但是电子学院使用的paraview开源库 ``` ``` fastcae: 官网:http://www.fastcae.com 可以参考用户使用说明和用户开发说明 主要是基于fastcae上改的代码,程序中还有很多用不到的部分没有删,可能看着比较乱 opencascade: 帮助文档:https://dev.opencascade.org/doc/overview/html/ csdn博主教程:http://t.csdn.cn/ZSRLX occ开源项目实例: https://github.com/fougue/mayo VTK渲染: github地址:https://github.com/Kitware/VTK Gmsh、cfMesh:: 网格划分的工具,简单了解一下 tecplot: 可视化后处理软件,简单了解一下 openFOAM: 计算流体力学库,简单了解一下 paraview: 数据分析和可视化工具 https://github.com/Kitware/ParaView SARibbon主界面风格库: https://github.com/czyt1988/SARibbon spdlog日志库: https://github.com/gabime/spdlog 还有个类似的开源软件freecae: https://github.com/FreeCAD/FreeCAD 不过他的渲染用的是Coin3D ``` ``` 代码仓库: http://47.101.131.235:3000/wzj/GJDM.git 第一次编译可能需要修改最外层CMAKE中 line37 - line 43 中的Qt5_DIR内容 ``` # cmake ``` 描述:项目CMake资源文件夹,通过CMAKE_MODULE_PATH指定额外的模块路径,以便 CMake 可以在该路径中查找自定义的 CMake 模块文件。通常,这些模块文件包含用于寻找特定库、设置自定义构建选项或执行其他与项目构建相关的任务的 CMake 代码。 ``` ## 1.CMakePack ```cmake 功能:软件打包,使用CMake中CPack组件创建各种不同格式的打包和安装工具的软件分发包 CPack允许生成使用不同操作系统和发行方式的打包文件,如二进制安装包、源代码分发包、RPM、DEB、NSIS安装程序、ZIP文件等 常见CPack相关变量 CPACK_PACKAGE_NAME # 声明包的名称 CPACK_PACKAGE_VENDOR # 声明包的供应商 CPACK_PACKAGE_VERSION # 声明包的版本 CPACK_PACKAGE_VERSION_MAJOR # 声明包的主要版本 CPACK_PACKAGE_VERSION_MINOR # 声明包的次要版本 CPACK_PACKAGE_VERSION_PATCH # 声明包的补丁版本 CPACK_PACKAGE_DESCRIPTION_FILE # 打包的源代码将包括一个描述文件。这是带有安装说明的纯文本文件 CPACK_PACKAGE_DESCRIPTION_SUMMARY # 添加包的描述 CPACK_RESOURCE_FILE_LICENSE # 许可证文件 CPACK_SITE #指定项目主页网址 CPACK_PACKAGE_INSTALL_DIRECTORY #从发布包中安装时的路径 CPACK_SOURCE_IGNORE_FILES # 设置了在包装的时候需要忽略的文件列表和目录 CPACK_SOURCE_GENERATOR # 列出了源代码归档的打包生成器 CPACK_GENERATOR # 二进制存档生成器 在win和unix下两种打包方式: lin: 使用dpkg-deb(Debian)或rpmbuild(RedHat)打包 win:NSIS安装程序 另外还有ZIP(.zip)和TGZ(tar.gz)打包成压缩文件 关于NSIS安装程序:Nullsoft Scriptable Install System是一个免费的、开源的 Windows 安装程序创建工具,它允许您创建用于安装和卸载 Windows 应用程序的可执行安装程序。以下是创建一个简单的 NSIS 安装程序的基本步骤: 1.安装NSIS https://nsis.sourceforge.io/Download 2.编写NSIS脚本 NSIS 使用脚本文件来定义安装程序的行为和外观。您需要创建一个包含安装指令的 NSIS 脚本文件(通常具有 .nsi 扩展名),并在其中定义安装程序的细节 3.编译NSIS脚本 要创建安装程序,您需要使用 NSIS 编译器编译 NSIS 脚本。在命令行中,导航到包含脚本文件的目录,并运行以下命令:makensis YourScript.nsi 4.运行生成的安装程序 编译成功可得到一个可执行的安装程序文件.exe ``` ## 2.Deployqt ```cmake 功能:定义该函数用于查找 Qt 依赖库并将其复制到 bin 目录中 WINDEPLOYQT_EXECUTABLE:通常在WIN上用于构建Qt应用程序时使用,该变量指定了Qt工具'windeployqt.exe'的路径,该工具用于将Qt依赖项复制到Qt应用程序的发布目录,以便应用程序能在没Qt安装的计算机上运行。 首先判断系统是否能查找到windeployqt.exe,查找不到则通过下面方式关联根CMake中相关设置确定其路径: get_target_property : 获取目标的属性信息。 将 Qt5::qmake 目标的 IMPORTED_LOCATION 属性的值存储在 _qmake_executable 变量中 get_filename_component :从文件路径中提取不同部分,如文件名、目录名等。 获取_qmake_executable变量所包含的文件路径的目录部分,并将结果存储 find_program:查找系统上可执行程序的路径 查找名为 windeployqt 的可执行程序,并将其路径存储在 WINDEPLOYQT_EXECUTABLE 变量中 定义函数deployqt 背景:cmake中function函数用于自定义函数,可在脚本中多次调用以执行特定的操作 funtion(function_name arg1 arg2 ...) #函数体 endfunction() 输入:target dir 分析: 首先在构建完执行命令,拷贝文件到构建目录; 其次生成路径保存到文件; 由于 windeployqt 无法正确使用系统运行库,最后只能用CMake自带的模板将它们复制过来。 mark_as_advanced:将变量标记为高级选项(不会在CMake的图形用户界面工具或者常规构建文件中显示,以减少用户的干扰) ``` ## 3.FindXXX ``` 功能:查找应用程序的依赖库,项目包含CGNS、HDF5、Gmsh、OpenCASCADE、Python、PythonModule、QuaZIP、Qwt、Sphinx、TecIO、VTK 分析:Find 模块是用于查找和配置外部依赖项的脚本文件。这些模块通常以 Find.cmake 的形式命名,用于查找和配置特定软件包或库的支持。Find 模块的目标是提供一种标准的方式来查找、配置和导入外部依赖项,以使 CMake 项目能够更轻松地与这些依赖项集成。CMAKE_MODULE_PATH指定额外的模块路径后,配置额外模块的相关参数配置(主要是依赖文件的地址和find_package_handle_standard_args),最后通过find_package来引入具体的模块。 通过find_path 在${CMAKE_SOURCE_DIR}/extlib 搜索包含某个文件的路径,如果在某个路径下发现了该文件,该结果会被存储到该变量中;如果没有找到,存储的结果将会是-NOTFOUND NO_SYSTEM_ENVIRONMENT_PATH # 禁用系统环境路径搜索 NO_CMAKE_SYSTEM_PATH # 禁用系统级默认库路径搜索 ``` + #### FindCGNS:CGNS(computational Fluid Dynamics General Notation System)用于描述和存储计算流体力学数据的开放性数据格式和库 ``` CGNS提供了一种标准的方式来存储和交换CFD数据,这使得不同CFD软件之间的数据共享和迁移变得更加容易。这有助于研究人员和工程师在不同工具之间无缝地转移模拟数据。支持多种CFD相关数据类型,包括网格信息、边界条件、结果数据等。允许用户完整地描述CFD模拟的所有方面。可以在各种操作系统上使用,并且与多种编程语言兼容,如C、Fortran、Python等。设计用于处理大规模CFD模拟的数据,支持高性能计算集群和超级计算机上的数据处理。 通过find_path查找 cgnslib.h路径传给 CGNS_DIRS 设置CGNS_VERSION 由 XX_VERSION_MAJOR、XX_VERSION_MINOR、XX_VERSION_PATCH组成 通过find_path查找设置变量CGNS_INCLUDE_DIRS、CGNS_LIBRARY_DIRS 设置CGNS_LIBRARIES为GJDM::CGNS 通过add_library创建一个名为GJDM::CGNS的被导入的共享库目标 通过set_property和set_target_properties来设置目标、文件或其他CMake对象的属性 最后通过find_package_handle_standard_args找到所有需要的变量,并且版本匹配 ``` + #### FindGmsh:Gmsh网格剖分 ``` 查找gmsh.exe 原理步骤同上 ``` + #### FindHDF5:HDF5(Hierarchical Data Format version 5)是一种用于管理和存储科学数据的开放文件格式和库。 ``` 原理步骤同上 ``` + #### FindOpenCASCADE:OpenCASCADE(Open Cascade Technology)是一个开源的三维计算机辅助设计(CAD)和计算机辅助工程(CAE)库,用于开发和构建 CAD、CAM、CAE、数值模拟和三维可视化应用程序。 ``` 原理步骤同上 ``` + #### FindPython:查找python依赖库 ``` 原理步骤同上 ``` + #### FindPythonModule:查找python需要的相关模块 ``` 原理步骤同上 ``` + #### FindQuaZIP:用于在 C++ 程序中处理 ZIP 压缩文件格式的开源库。 ``` 原理步骤同上 QuaZIP允许在应用程序中创建、读取和修改ZIP文件,以进行压缩和解压缩操作 ``` + #### FindQwt:用于在 Qt C++ 应用程序中创建和显示科学数据图表和绘图的开源库。 ``` 原理步骤同上 ``` + #### FindSphinx:开源文档生成工具,用于创建高质量的文档、教程和用户手册。 ``` 原理步骤同上 ``` + #### FindTecIO:TECIO 是一个用于处理 Tecplot 数据文件的库,它允许开发人员创建、读取和修改 Tecplot 数据文件,以进行科学可视化和后处理 ``` 原理步骤同上 ``` + #### FindVTK:全名为 Visualization Toolkit,是一个用于三维可视化和科学数据分析的开源库。它提供了一系列用于创建、渲染、操作和分析三维数据的工具和类,适用于多种应用领域 ``` 原理步骤同上 ``` ## 4.InitRuntime ``` 功能:拷贝依赖文件到目标文件夹中 ``` ## 5.UseXXX ``` 功能:定义CMake宏检测相关插件是否安装和设置相关CMake变量 ``` + ### UseDoxygen:生成Doxygen文档 ``` Doxygen是一种广泛用于生成代码文档的自动化工具,特别是用于C++和类似语言的项目。它能够从源代码中提取注释、代码结构和关联信息,然后生成各种格式的文档,包括HTML、PDF、LaTeX等 ``` + ### UseSphinx:开源文档生成工具,用于创建高质量的文档、教程和用户手册。 # extlib ``` 描述:第三方依赖的头文件和库文件等,包含CGNS、Gmsh、HDF5、OpenCASCADE、Python、QuaZIP、Qwt、TecIO、VTK ``` # src ## 1.GJDM主程序 + #### main : 主程序 + #### CommandLine: 无界面命令行 + #### XBeautyUI:界面美化单例 ## 2.MainWindow主界面 + #### MainWindow主窗口 ``` 功能:用户交互界面,各功能模块主入口 SignalHandler* _signalHandler{}; SubWindowManager* _subWindowManager{}; Translator* _translator{}; ``` + #### MainWindowPy ```c++ 功能:封装主界面操作C++函数为C函数,最后通过python脚本调用 //static MainWindow* MainWindowPy::_mainWindow = nullptr; SignalHandler* MainWindowPy::_signalHander = nullptr; SubWindowManager* MainWindowPy::_subWindowManager = nullptr; Py::PythonAgent* MainWindowPy::_pyAgent = nullptr; ``` + #### SARibbonMWUI ``` 功能:Ribbon风格显示主窗口 void setupRibbonUi(QMainWindow* MainWindow); void retranslateRibbonUi(QMainWindow* MainWindow); ``` + #### SubWindowManager ``` 功能:窗口管理 ``` + #### SignalHandler ``` 功能:信号分发处理 ``` + #### Translator ``` 功能:翻译 ``` + #### SolveProcessManager ``` 功能:求解器进程管理,用QHash存储管理每个求解器 QHash _solvingProcess; 底层:SolverControlBase ->stopSolver() ->startMPI() ->startSolver() 函数: isSolving() insertProcess() solveFinished() removeSolve() ``` + #### DialogAbout ``` 功能:弹窗展示软件相关信息 信息来源:全局单例ConfigOption::GlobalConfig中存储的信息,logo\version\corporation\website\email等 ``` + #### CustomizerHelper ``` 功能:用户定制修改主界面帮助类 实现: startCustomizer():开始定制 finishCustomizer():结束定制 registerInterface():注册主界面(根据配置文件开放接口) connect(mainwindow,updateInterfaces,customizerHelper,registerInterface) readConfigOptions():读取配置文件ConfigFiles/GlobalConfig.config updateBasicInfo():根据全局单例类ConfigOption中globalConfig设置标题、logo等 成员: QList _menuList; QList _toolBarList; ``` ## 3.Setting项目设置 ```c++ QSettings 用于读取和写入应用程序的设置,支持多种存储格式INI、XML和JSON INI文件格式构造函数 QSettings(const QString &fileName, Format format, QObject *parent = nullptr); 读取和写入设置 QVariant QSettings::value(const QString &key, const QVariant &defaultValue = QVariant()) const; void QSettings::setValue(const QString &key, const QVariant &value); 清除设置 void QSettings::remove(const QString &key); ``` + #### BusAPI:设置项单例类 ``` 功能:配置全局设置信息管理类, 读取/写入设置信息的ini文件 成员: MainSetting* _mainSetting; GraphOption* _graphOption; MessageSetting* _messageSetting; WorkingDirDialog* _workDialog; 主要函数: readINI() writeINI() ``` + #### MainSetting:管理主窗口配置信息 ```c++ QString _workingDir; //工作目录 QString _language{"English"}; //强制中文,无需更改 QStringList _recentFiles{}; //最近文件 QString _licensePath; //license位置 QStringList _plugins{}; //插件列表 bool _showUserGuidance{true}; //显示用户指导 bool _useRibbon{true}; //强制Ribbon,无需更改 void writeINI(QSettings *seeting); void readINI(QSettings *seeting); void setWorkingDir(const QString &dir); void appendRecentFile(QString f); void setPlugins(QStringList ps); void setLicensePath(const QString &path); /* QStringList.contains(QString,Qt::CaseSensitivity) 检查是否包含特定字符串 Qt::CaseSensitive 区分大小写 Qt::CaseInsensitive 不区分大小写 */ /* 最近打开文件,如果当前列表中存在该项目,则删除再插入到开头;没有则插入。最多显示最近的五个项目 */ ``` + #### MessageSetting:控制台设置 ```c++ 功能:管理控制台设置,主要是控制台背景颜色、输出设置、字体颜色等 关联MainWidget::MessageWindow ///< MG setting if show normal . warning . error message int m_showMode; ///< MG if show the message type bool m_showType; ///< MG if show the message time bool m_showTime; ///< MG font size in pts int m_fontPts; ///< MG background color of the message window QColor m_bkColor; ``` + #### GraphOption:绘图选项配置信息 ```c++ 功能:管理显示的背景颜色,如图形的显示颜色、背景颜色、高亮颜色、设置渐变等 QColor _bgTop{}; QColor _bgBottom{}; QColor _highLightColor{}; QColor _preHighLightColor{}; QColor _geoSurfaceColor{}; QColor _geoCurveColor{}; QColor _geoPointColor{}; QColor _meshFaceColor{}; QColor _meshEdgeColor{}; QColor _meshNodeColor{}; float _meshNodeSize{1.0}; float _meshEdgeWidth{1.0}; float _geoPointSize{1.0}; float _geoCurveWidth{1.0}; bool _showGeoPoint{false}; bool _showGeoEdge{false}; bool _showGeoSurface{false}; bool _showMeshNode{false}; bool _showMeshEdge{false}; bool _showMeshFace{false}; int _transparency{0}; 透明度 ``` + #### ColorCombobox ``` 功能:自定义颜色选择下拉框 ``` + #### DialogGraphOption ``` 功能:绘图选项设置对话框 ``` + #### DialogWorkingDir ``` 功能:设置工作目录 ``` ## 4.项目管理 ``` MainWindow: actionSave actionSaveAs actionOpen actionNew ``` + FastCAE项目管理大概逻辑 ```c++ 判断Setting::BusAPI->workingDir是否存在,不存在则设置,所有的文件都会保存在workingDir中 actionNew响应的是新建算例: Mainwindow->SignalHander->on_actionNew->emit _mainWindow->createPhysiceModelSig(); actionSave响应保存当前工程文件: _currentFile不为空,通过PythonAgent::getInstance->submit脚本来执行打开动作 actionSaveAs响应另存当前工程: actionOpen响应的是打开工程文件: 对比MD5是否有变化,有变化会提示是否保存当前工程; 然后弹出打开文件窗口,最后通过PythonAgent::getInstance->submit脚本来执行打开动作 ``` ## 5.PythonModule:脚本方法 ```c++ c++中python的嵌入式接口 1.初始化和终止python解释器 Py_Initialize(); // 初始化Python解释器 // 执行Python代码或调用Python函数 Py_Finalize(); // 终止Python解释器 2.调用Python代码 PyRun_SimpleString("print('Hello from Python!')"); 3.调用Python函数 PyObject *pName = PyUnicode_DecodeFSDefault("module_name"); PyObject *pModule = PyImport_Import(pName); PyObject *pFunc = PyObject_GetAttrString(pModule, "function_name"); PyObject *pValue = PyObject_CallObject(pFunc, NULL); if (pValue != NULL) { // 处理pValue,可能是int、str等Python对象 Py_DECREF(pValue); } else { PyErr_Print(); } Py_DECREF(pFunc); Py_DECREF(pModule); Py_DECREF(pName); 4.传递数据到Python中 PyObject *pValue = PyLong_FromLong(42); // 将整数转换为Python对象 5.从Python中获取数据 long result = PyLong_AsLong(pValue); // 将Python对象转换为C整数 6.错误处理 if (PyErr_Occurred()) { PyErr_Print(); } ``` + #### PyAgent: Python脚本单例类 ```c++ 负责管理整个项目中的有关Python脚本的实现 static PythonAgent *_instance; PyInterpreter *_interpreter{}; RecordThread *_recordScript{}; ScriptReader *_reader{}; bool _islock{false};//控制读取脚本状态 bool _append{true}; //控制脚本是否附加到记录文件 bool _noGUI{false}; //控制主界面关闭 Signal:将调用的脚本传递给MainWindow打印在控制台中 /* 是 Active Template Library (ATL) 中的一个头文件,用于在 Windows 环境中开发 COM(Component Object Model)组件和应用程序。COM 是由 Microsoft 引入的用于软件组件的二进制接口标准。提供了帮助在不同字符编码之间进行转换的函数和类,主要用于 ANSI 和 Unicode 字符串之间的转换。在 Windows 编程中处理字符串转换,特别是在处理使用 ANSI 字符串的传统 API 和使用 Unicode 字符串的新 API 时,通常会使用这个头文件。 用于处理地区(locale)和文化相关的设置。它提供了一些函数和定义,用于在程序中设置和查询与地区相关的信息,例如数字和日期格式、货币符号、语言特定的字符排序等。 用于处理宽字符(wide character)和字符串。宽字符是用于支持多语言和国际化的字符类型,通常用于表示 Unicode 字符。 */ ``` + #### PyInterpreter:c++->python脚本执行类 ```c++ /* import sys 导入标准库模块'sys'提供与Python解释器和运行时环境相关的函数和变量 sys.path 包含Python模块的搜索路径列表 import os 提供访问操作系统功能的接口,用于执行与文件、目录、进程等操作系统相关任务 QDir.setNameFilters() 设置目录中文件名的过滤器,以便获取符合特定模式的文件 QDir.entryInfoList() 获取目录中文件和子目录的详细信息,函数返回一个 QFileInfoList,其中包含了目录中每个条目的文件信息 fileinfo.baseName() 获取文件名,不包含后缀 QReadWriteLock 用于在多线程编程中实现读写锁,允许多个线程同时读取共享数据,但在写入数据时会阻塞其他的读取和写入操作,以保证数据的一致性和完整性。 读锁(共享锁):多个线程可以同时持有读锁,以便并发读取共享数据。 写锁(排他锁):只有一个线程可以持有写锁,以确保在写入数据时没有其他线程同时读写数据。 lockForRead() 获取读锁,如果有写锁被持有,则阻塞线程 lockForWrite() 获取写锁,会阻塞其他的读写操作 tryLockForRead()尝试获取读锁,如果成功则返回true tryLockForWrite()尝试获取写锁,如果成功则返回true unlock() 释放当前线程 */ 负责执行python的脚本、加载环境、保存脚本列表等 QStringList _codelist{}; //保存所执行的脚本列表 bool init(PythonAgent *agent); //初始化和加载python环境 int execCode(QString code, bool save = true); //执行脚本,QReadWriteLock来管理多线程的读写一致性 void execFile(QString file); //读取脚本文件并执行文件中所有脚本 ``` + #### RecordScript:Python脚本记录线程类 ```c++ 负责记录保存运行过程中的python脚本的线程类 将内容写入temp文件夹中 void pause(); void stop(); void reStart(); 三个状态通过 int _states来控制 -1暂停 0正常运行 1停止 ``` + #### ScriptReader:Python脚本读取线程类 ```c++ 负责读取执行文件中的Python脚本的线程类 void pause(); void stop(); void reStart(); 暂停和启动通过_lockCount来控制 pause ++ ; restart--; 停止通过_stop来控制 ``` ## 6.PluginManager:插件管理 ```c++ /* 属于POSIX标准的一部分,用于类Unix操作系统中进行共享库的动态链接 HMODULE 不是标准 C 或 C++ 的术语,而是 Windows 操作系统中用于表示模块,在 Windows 环境中,HMODULE 是一个句柄类型,用于标识已加载的可执行模块(如动态链接库 DLL)的实例 */ PluginType: None IOExtend UserTool ModelExtend Mesher 网格 ``` + #### pluginBase:插件管理基类 ```c++ virtual bool install() //加载插件 virtual bool uninstall() //卸载插件 virtual void reTranslate(QString lang) //翻译 virtual void exec(int commandType = 0); //执行插件 void setType(PluginType t);//设置类型 virtual void writeToProjectFile(QDomDocument* doc, QDomElement* parent);//写出工程文件 virtual void readFromProjectFile(QDomElement* parentEle);//从工厂文件读入 virtual bool hasInfoToSave();//是否有信息需要保存到工程文件 virtual void readINI(QSettings* settings); virtual void writeINI(QSettings* settings); //上面两个方法为从INI中读取配置信息的接口,readINI由基类的install()函数调用,writeINI由基类的uninstall()函数调用。 ``` + #### pluginManageDialog:插件管理窗口 ```c++ _ui->availableList //左侧可安装的插件列表 _ui->selectedList //右侧已安装的插件列表 /* QListWidget::setSelectionMode 用于设置列表中的项目选择模式 QAbstractItemView::NoSelection:不允许选择任何项目。 QAbstractItemView::SingleSelection:允许选择一个项目。选中一个项目会自动取消之前选中的项目。 QAbstractItemView::MultiSelection:允许选择多个项目。按住 Ctrl 键可以多选。 QAbstractItemView::ExtendedSelection:允许扩展选择,按住 Shift 键可以选择范围内的项目。 QAbstractItemView::ContiguousSelection:允许连续选择,按住 Shift 键可以选择范围内的项目,但不需要按住 Ctrl 键来进行多选。 */ 通过Setting::BusAPI->getPlugins()来读取INI文件来获取所有已安装的插件并加载到右侧selectedList中 设置suffix后缀为dll,前缀为plugin,并在plugins文件夹中寻找可安装的插件并添加到左侧availableList中 查找规则:通过QDir设置过滤器,再用QDir::entryInfoList()将文件列表加载到QFIleInforList中,遍历List,如果存在已安装、不是plugin开头或dll结尾的则不加入availableList中 /* QDir::setFilter用于设置在获取目录内容时应用的过滤器 QDir::NoFilter:不应用任何过滤,返回所有项目(默认值)。 QDir::Dirs:只返回子目录。 QDir::Files:只返回文件。 QDir::Drives:只返回驱动器列表(Windows)。 QDir::AllDirs:返回所有子目录,包括隐藏的。 QDir::NoDotAndDotDot:排除 "." 和 ".." 目录。 QDir::AllEntries:返回所有项目,包括文件和子目录。 QDir::Readable:只返回可读取的文件。 QDir::Writable:只返回可写入的文件。 QDir::Executable:只返回可执行的文件。 */ addButton_clicked:安装插件 通过availableList->selectedItems()将选中的items保存在itemList中,逐个addItem()添加到selectedList中,takeItem()从availableList移除 removeButton_clicked:卸载插件 同上 void accept()处理对话框确定按钮 获取selectedList中ItemName和已安装的plugins,分别存在selectedNames和installedNames中,遍历installedNames,对比selectedNames中itemName,如果存在则添加到commonList中 再遍历对比installedNames,如果commonList中没有则通过_manager->releasePlugin来卸载插件,未成功添加到failres中 再遍历selectedNames,有不存在与commonList中的项目通过_manager->loadPlugin装载插件,失败添加到failins中 最后将所有安装的插件记录到INI文件中 ``` + #### pluginManager:插件管理单例类 ```c++ QList _pluginList{}; //存储每个已安装的插件 //获取加载的插件个数 int getPluginsCount(); //加载插件 void loadPlugs(GUI::MainWindow* m); //加载单个插件 bool loadPlugin(QString name); //卸载插件 bool releasePlugin(QString name); //卸载所有插件 void releasePlugs(); //翻译 void reTranslate(QString lang); //获取插件 PluginBase* getPluginByDescribe(QString des); //根据类型获取插件 QList getPluginsByType(PluginType t); //写出工程文件 QDomElement& writeToProjectFile(QDomDocument* doc, QDomElement* parent) override; //从工程文件读入 void readDataFromProjectFile(QDomElement* e) override; //是否有数据需要保存到工程文件 bool hasInfoToSave(); //文件是否已经被加载 bool isFileLoaded(const QString fileName) ``` ## 7.IO + #### rapidjson ``` 功能: C++ 的 JSON 解析器及生成器 RapidJSON 是只有头文件的 C++ 库。只需把 include/rapidjson 目录复制至系统或项目的 include 目录中。 ``` + #### rapidxml ``` 功能:XML DOM解析工具包,是一个快速的读写xml文件的库文件(hpp)。 ``` + #### xml2json ``` 功能:将xml文件加载并转化为json格式 ``` + #### IOConfig ```c++ 功能:网格输入输出格式配置 //写出的路径与模型 typedef bool(*WRITEINPFILE)(QString, ModelData::ModelDataBase*); //转换原文件路径 typedef bool(*TRANSFEROUTFILE)(QString); //导入网格 文件名称 typedef bool(*IMPORTMESHFUN)(QString, int); //导出网格 文件名称 id typedef bool(*EXPORTMESHFUN)(QString, int); //模板关键字替换方法 关键字, 模型 返回替换之后的结果 typedef QString(*REPLACEKEYWORDFUN)(QString, ModelData::ModelDataBase*); ``` + #### ProjectFileIO ```c++ 功能:工程文件管理 Geometry::GeometryData *_geoData{}; //几何模型数据 MeshData::MeshData *_meshData{}; //网格数据 ModelData::ModelDataSingleton *_modelData{}; //模型数据 Material::MaterialSingleton *_materialData{}; //材料数据 Plugins::PluginManager *_plugins{}; //插件数据 bool _read{true}; 关联:ModuleBase -> ThreadTask -> IOBase 实现: write()/read()判断写出/读取两种格式 XML和DISO中哪一种,再由 writeXXX()/readXXX()实现具体的读写 由ModelData/GeoData/MeshData/MaterialData/PluginData几部分组成 ``` + #### ProjectTemplete ```c++ 功能:项目算例模板类,读取模板文件并解析导入 QStringList getTempletefromFile() void importTemplete(int itemID,QStringList file_text) ``` + #### SolverIO ```c++ 功能:求解器读取类 writeInpFile() 写出文件 replaceTemplate() 求解输入文件模板替换 transformFile() 结果文件转换 ``` + #### vtkDataRelated ```c++ 功能:共面点/共面单元数据类 vtkSmartPointer _transform; vtkSmartPointer _cellIDs; vtkDataSet* _data; ``` ## 8.ModelData ## 9.MainWidgets ## 10.ConfigOptions ## 11.Common ## 12.Geometry几何类 + #### geometryData 几何数据单例类 + #### GeometrySet 几何形状列表 ``` ``` + #### GeometryDatum 基准列表 + #### GeoComponent 组件列表 ## 13.GmshModule网格剖分类 + #### GmeshModule ``` 通过该单例类中exec函数准备相应的剖分操作需要的数据部分 commandType 1面网格 2体网格 3流体网格 再通过emit generateSig 相应slot generateSlot开启剖分线程并且实现参数的接收和传递 slot generateSlot主要完成三个工作: 1.创建线程 GMshThread* thread = initGmshThread(para); 从initGmshThread中setPara实现参数传递给thread 2.创建线程工作进度条 auto processBar = new ModuleBase::ProcessBar 3.创建的线程和进度条通过threadManager管理 _threadManager->insertThread(processBar,thread) ``` + #### GmshDialogBase ``` public GeoDialogBase (public QFDialog) 处理局部加密和高亮选择 emit showDialog slot showDialogSig emit highLightMeshKernal slot hightLightKernelSig ``` + #### SolidMeshDialog ``` public GmshDialogBase 面网格参数设置窗口,传递给GmshThread QMultiHash _geoHash{}; bool _selectFace{false}; GmshSettingData *_settingData{}; MeshData::MeshData *_meshData{}; MeshData::MeshKernal *_kernalData{}; 构造函数不传index默认-1 如果传>0的index值表示对网格进行编辑重新剖分 通过index在_meshData单例中索引具体哪个网格 key-Component: geoSelectSurface 选择面pushBnt selectall 全选checkBox selectvisible 选择可见项checkBox 前处理窗口选择点线面的逻辑: emit setSelectMode((int)ModuleBase::XXX) -> MainWindow::slot selectModelChangedSig(int) emit -> preWindow::slot setSelectModel(int) GeometryViewProvider::setGeoSelectMode(int) 改变完选择方式之后在preWindow上处理相应的动作 ->emit geoshapeSelected(Geometry::GeometrySet*, int) ->preWindow::slot geoShapeSelected(Geometry::GeometrySet*, int) ->geoDialogBase::slot shapeSelected(Geometry::GeometrySet*, int) 在主界面选面的操作通过shapeSlected实现: 1.on_geoSelectSurface_clicked将selectall和selectvisible关闭 selectFace打开 2.避免一个面被选中两次(bug待修复) 3.高亮选中的面 4.将选中信息打印更新 accept: 1.判断是否选择了面 2.pyAgent执行gmsher = Mesher.Gmsher() 、gmsher.setDim(2) 3.将选中的面的信息通过_pyAgent执行保存 4.判断类型 Tri 三角形网格; Quad 四边形网格、剖分方法、单元尺寸等信息通过_pyAgent执行相关操作将数据写入脚本 5.最后通过_pyAgent执行startGenerationThread()启动传递参数给线程(GmshPy中的GenerateMesh2D()函数emit->generateSig()) ``` + #### GmshThreadManager ``` QHash _threadHash{} //线程哈希表 void insertThread(QWidget* w, GmshThread *t); //新增线程 w:线程运行进度条 t:线程 void stopAll() void isRuning() signals: void threadStarted(QWidget*) slots: void stopThread(QWidget* w) void threadFinished(GmshThread* t) ``` + #### GmshThread ```c++ public DataProperty::DataBase GmshModule* _gmshModule{} FluidMeshPreProcess *_fluidMeshProcess{}; QProcess _process{}; ModuleBase::ProcessBar *_processBar{}; int _dim{-1}; //维度 TopoDS_Compound *_compounnd{}; //复合几何体或集合 QMultiHash _solidHash{}; //实体哈希表 QMultiHash _surfaceHash{}; //面哈希表 QString _elementType{}; //网格类型 quad/hex int _elementOrder{-1}; // int _method{-1}; // double _sizeFactor{0.0}; double _minSize{0.0}; double _maxSize{0.0}; bool _geoclean{false}; int _smoothIteration{0}; bool _isGridCoplanar{false}; QString _sizeAtPoints{}; QString _sizeFields{}; bool _selectall{false}; bool _selectvisible{false}; bool _isSaveToKernal{true}; int _meshID{-1}; bool _fluidMesh{false}; QList _cellTypeList{}; GmshScriptWriter *_scriptWriter{}; 所有数据通过pyAgent的startGenerationThread()脚本执行GmshPy中的GenerateMesh程序emit->generateSig()传递 主要函数: 1.生成brep文件 void mergeGeometry(): ->mergeVisibleGeo()/mergetAllGeo()/mergetSelectGeo()将几何内容写入_compounnd中 ->BRepTools::Write(*_compounnd, arr.data());写出几何模型brep文件 2.初始化Gmsh环境,生成geo脚本文件 void initGmshEnvoirment(); ->setGmshScriptData() 将参数写出到Gmsh中geo脚本中(GmshScriptWriter完成) 3.执行剖分程序 void generate(); 将gmsh.exe \ gmsh.geo \ 命令行 \ 输出文件等结合起来 并用QProcess开启剖分线程 void GmshThread::mergeSelectGeo(): //遍历一系列的GeometrySet和其对应的索引 //将每个GeometrySet中的形状添加到BRep_Compound对象中 //最终生成的BRep_Compound对象包含了所有这些形状。 ```