GJDM国产CAE项目

wangzhe a07f2cee7d 开发licensecc初始版本 vor 11 Monaten
cmake 129a6a7035 opt:新增license vor 11 Monaten
src 129a6a7035 opt:新增license vor 11 Monaten
.clang-format 894970fd5f platformDM-origin vor 1 Jahr
.gitignore 6c98c8ee0a feature: update IR vor 1 Jahr
CMakeLists.txt 129a6a7035 opt:新增license vor 11 Monaten
README.md 11ab88bbb0 feature:面网格Gmsh相关梳理 添加截图功能 vor 1 Jahr

README.md

序言

项目概况:
前处理(电子学院陈新蕾老师负责网格处理):完成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找到所有需要的变量,并且版本匹配
  • #### 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函数,最后通过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<int,SolverControl::SolverControlBase*> _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<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);

  • #### BusAPI:设置项单例类
功能:配置全局设置信息管理类, 读取/写入设置信息的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};      透明度
  • #### ColorCombobox
功能:自定义颜色选择下拉框
  • #### DialogGraphOption
功能:绘图选项设置对话框
  • #### DialogWorkingDir
功能:设置工作目录

4.项目管理

MainWindow:
	actionSave     
	actionSaveAs
	actionOpen
	actionNew
  • FastCAE项目管理大概逻辑
	判断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			网格
  • #### pluginBase:插件管理基类
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

  • #### rapidjson
功能: C++ 的 JSON 解析器及生成器

RapidJSON 是只有头文件的 C++ 库。只需把 include/rapidjson 目录复制至系统或项目的 include 目录中。
  • #### rapidxml
功能:XML DOM解析工具包,是一个快速的读写xml文件的库文件(hpp)。
  • #### xml2json
功能:将xml文件加载并转化为json格式
  • #### IOConfig
功能:网格输入输出格式配置

//写出的路径与模型
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
功能:工程文件管理

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
功能:项目算例模板类,读取模板文件并解析导入

QStringList getTempletefromFile()
void importTemplete(int itemID,QStringList file_text)
  • #### SolverIO
功能:求解器读取类

writeInpFile()		写出文件
replaceTemplate()	求解输入文件模板替换
transformFile()		结果文件转换
  • #### vtkDataRelated
功能:共面点/共面单元数据类

vtkSmartPointer<vtkTransform> _transform;
vtkSmartPointer<vtkIdTypeArray> _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<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对象包含了所有这些形状。