序言
项目概况:
前处理(电子学院陈新蕾老师负责网格处理):完成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中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
功能:定义该函数用于查找 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<PackageName>.cmake 的形式命名,用于查找和配置特定软件包或库的支持。Find 模块的目标是提供一种标准的方式来查找、配置和导入外部依赖项,以使 CMake 项目能够更轻松地与这些依赖项集成。CMAKE_MODULE_PATH指定额外的模块路径后,配置额外模块的相关参数配置(主要是依赖文件的地址和find_package_handle_standard_args),最后通过find_package来引入具体的模块。
通过find_path 在${CMAKE_SOURCE_DIR}/extlib 搜索包含某个文件的路径,如果在某个路径下发现了该文件,该结果会被存储到该变量中;如果没有找到,存储的结果将会是<VAR>-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找到所有需要的变量,并且版本匹配
查找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主界面
功能:用户交互界面,各功能模块主入口
SignalHandler* _signalHandler{};
SubWindowManager* _subWindowManager{};
Translator* _translator{};
功能:封装主界面操作C++函数为C函数,最后通过python脚本调用
//static
MainWindow* MainWindowPy::_mainWindow = nullptr;
SignalHandler* MainWindowPy::_signalHander = nullptr;
SubWindowManager* MainWindowPy::_subWindowManager = nullptr;
Py::PythonAgent* MainWindowPy::_pyAgent = nullptr;
功能:Ribbon风格显示主窗口
void setupRibbonUi(QMainWindow* MainWindow);
void retranslateRibbonUi(QMainWindow* MainWindow);
功能:窗口管理
功能:信号分发处理
功能:翻译
功能:求解器进程管理,用QHash存储管理每个求解器
QHash<int,SolverControl::SolverControlBase*> _solvingProcess;
底层:SolverControlBase
->stopSolver()
->startMPI()
->startSolver()
函数:
isSolving()
insertProcess()
solveFinished()
removeSolve()
功能:弹窗展示软件相关信息
信息来源:全局单例ConfigOption::GlobalConfig中存储的信息,logo\version\corporation\website\email等
功能:用户定制修改主界面帮助类
实现:
startCustomizer():开始定制
finishCustomizer():结束定制
registerInterface():注册主界面(根据配置文件开放接口)
connect(mainwindow,updateInterfaces,customizerHelper,registerInterface)
readConfigOptions():读取配置文件ConfigFiles/GlobalConfig.config
updateBasicInfo():根据全局单例类ConfigOption中globalConfig设置标题、logo等
成员:
QList<QMenu*> _menuList;
QList<QToolBar*> _toolBarList;
3.Setting项目设置
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);
功能:配置全局设置信息管理类, 读取/写入设置信息的ini文件
成员:
MainSetting* _mainSetting;
GraphOption* _graphOption;
MessageSetting* _messageSetting;
WorkingDirDialog* _workDialog;
主要函数:
readINI()
writeINI()
- #### MainSetting:管理主窗口配置信息
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:控制台设置
功能:管理控制台设置,主要是控制台背景颜色、输出设置、字体颜色等
关联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:绘图选项配置信息
功能:管理显示的背景颜色,如图形的显示颜色、背景颜色、高亮颜色、设置渐变等
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}; 透明度
功能:自定义颜色选择下拉框
功能:绘图选项设置对话框
功能:设置工作目录
4.项目管理
MainWindow:
actionSave
actionSaveAs
actionOpen
actionNew
判断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++中python的嵌入式接口
<Python.h>
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脚本单例类
负责管理整个项目中的有关Python脚本的实现
static PythonAgent *_instance;
PyInterpreter *_interpreter{};
RecordThread *_recordScript{};
ScriptReader *_reader{};
bool _islock{false};//控制读取脚本状态
bool _append{true}; //控制脚本是否附加到记录文件
bool _noGUI{false}; //控制主界面关闭
Signal:将调用的脚本传递给MainWindow打印在控制台中
/*
<atlconv.h>是 Active Template Library (ATL) 中的一个头文件,用于在 Windows 环境中开发 COM(Component Object Model)组件和应用程序。COM 是由 Microsoft 引入的用于软件组件的二进制接口标准。提供了帮助在不同字符编码之间进行转换的函数和类,主要用于 ANSI 和 Unicode 字符串之间的转换。在 Windows 编程中处理字符串转换,特别是在处理使用 ANSI 字符串的传统 API 和使用 Unicode 字符串的新 API 时,通常会使用这个头文件。
<locale.h>用于处理地区(locale)和文化相关的设置。它提供了一些函数和定义,用于在程序中设置和查询与地区相关的信息,例如数字和日期格式、货币符号、语言特定的字符排序等。
<wchar.h>用于处理宽字符(wide character)和字符串。宽字符是用于支持多语言和国际化的字符类型,通常用于表示 Unicode 字符。
*/
- #### PyInterpreter:c++->python脚本执行类
/*
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脚本记录线程类
负责记录保存运行过程中的python脚本的线程类
将内容写入temp文件夹中
void pause();
void stop();
void reStart();
三个状态通过 int _states来控制 -1暂停 0正常运行 1停止
- #### ScriptReader:Python脚本读取线程类
负责读取执行文件中的Python脚本的线程类
void pause();
void stop();
void reStart();
暂停和启动通过_lockCount来控制 pause ++ ; restart--;
停止通过_stop来控制
6.PluginManager:插件管理
/*
<dlfcn.h>属于POSIX标准的一部分,用于类Unix操作系统中进行共享库的动态链接
HMODULE 不是标准 C 或 C++ 的术语,而是 Windows 操作系统中用于表示模块,在 Windows 环境中,HMODULE 是一个句柄类型,用于标识已加载的可执行模块(如动态链接库 DLL)的实例
*/
PluginType:
None
IOExtend
UserTool
ModelExtend
Mesher 网格
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:插件管理窗口
_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:插件管理单例类
QList<PluginBase*> _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<PluginBase*> getPluginsByType(PluginType t);
//写出工程文件
QDomElement& writeToProjectFile(QDomDocument* doc, QDomElement* parent) override;
//从工程文件读入
void readDataFromProjectFile(QDomElement* e) override;
//是否有数据需要保存到工程文件
bool hasInfoToSave();
//文件是否已经被加载
bool isFileLoaded(const QString fileName)
7.IO
功能: C++ 的 JSON 解析器及生成器
RapidJSON 是只有头文件的 C++ 库。只需把 include/rapidjson 目录复制至系统或项目的 include 目录中。
功能:XML DOM解析工具包,是一个快速的读写xml文件的库文件(hpp)。
功能:将xml文件加载并转化为json格式
功能:网格输入输出格式配置
//写出的路径与模型
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*);
功能:工程文件管理
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几部分组成
功能:项目算例模板类,读取模板文件并解析导入
QStringList getTempletefromFile()
void importTemplete(int itemID,QStringList file_text)
功能:求解器读取类
writeInpFile() 写出文件
replaceTemplate() 求解输入文件模板替换
transformFile() 结果文件转换
功能:共面点/共面单元数据类
vtkSmartPointer<vtkTransform> _transform;
vtkSmartPointer<vtkIdTypeArray> _cellIDs;
vtkDataSet* _data;
8.ModelData
9.MainWidgets
10.ConfigOptions
11.Common
12.Geometry几何类
geometryData 几何数据单例类
GeometryDatum 基准列表
GeoComponent 组件列表
13.GmshModule网格剖分类
通过该单例类中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<Geometry::GeometrySet *, int> _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<QWidget* , GmshThread*> _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
public DataProperty::DataBase
GmshModule* _gmshModule{}
FluidMeshPreProcess *_fluidMeshProcess{};
QProcess _process{};
ModuleBase::ProcessBar *_processBar{};
int _dim{-1}; //维度
TopoDS_Compound *_compounnd{}; //复合几何体或集合
QMultiHash<int, int> _solidHash{}; //实体哈希表
QMultiHash<int, int> _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<int> _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对象包含了所有这些形状。