#include "FITKOFMesherDriver.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include "FITK_Interface/FITKInterfaceModel/FITKAbstractGeoModel.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKGeoCommandList.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoCommand.h" #include "FITK_Component/FITKGeoCompOCC/FITKAbstractOCCModel.h" #include "FITK_Component/FITKOFDictWriter/FITKOFDictWriterIO.h" #include "FITK_Kernel/FITKAppFramework/FITKComponents.h" #include "FITK_Kernel/FITKCore/FITKDirFileTools.h" #include "FITK_Interface/FITKInterfaceFlowOF/FITKOFGeometryData.h" #include "FITK_Component/FITKOFDriver/FITKOFInputInfo.h" #include "FITK_Kernel/FITKAppFramework/FITKProgramTaskManager.h" #include "FITK_Interface/FITKInterfaceFlowOF/FITKFlowPhysicsHandlerFactory.h" #include namespace OF { void FITKOFMesherDriver::startMesher(QStringList info /*= QStringList()*/) { // 工作路径 QString path = getValue("WorkDir").toString(); if (path.isEmpty() || !Core::CreateDir(path)) return; // 清理算例文件夹 Core::ClearDir(path); // 写出STL文件 QString stlFolder = path + "/constant/geometry"; Core::CreateDir(stlFolder); Interface::FITKFlowPhysicsHandlerFactory* factoryData = FITKAPP->getComponents()->getComponentTByName("FITKFlowPhysicsHandlerFactory"); if (!factoryData) return; factoryData->recordBoundaryMeshName(); Interface::FITKOFGeometryData* geometryData = FITKAPP->getGlobalData()->getGeometryData(); int nModel = geometryData->getDataCount(); for (int i = 0; i < nModel; i++) { Interface::FITKAbsGeoCommand* model = geometryData->getDataByIndex(i); if (model != nullptr) { model->getShapeAgent()->writeSTLFile(stlFolder + "/" + model->getDataObjectName() + ".stl"); } } // 写出字典文件 auto dictIO = FITKAPP->getComponents()->getComponentTByName("IO::FITKOFDictWriterIO"); if (dictIO == nullptr) return; dictIO->setFilePath(path); *dictIO << IO::DictWriteType::BlockMesh << IO::DictWriteType::Control << IO::DictWriteType::SnappyHexMesh << IO::DictWriteType::CreatePatch; bool ok = dictIO->exec(); if (!ok)return; // 调用blockMesh auto proGramManager = FITKAPP->getProgramTaskManager(); if (proGramManager == nullptr) return; AppFrame::FITKProgramInputInfo* inputInfo = new FoamDriver::FITKOFInputInfo(); inputInfo->setArgs({ "-case", path }); auto driver = proGramManager->createProgram(1, "FITKOFBlockMeshDriver", inputInfo); QObject::connect(driver, SIGNAL(sig_Finish()), this, SLOT(blockMeshSlot())); driver->start(); } void FITKOFMesherDriver::stopMesher(QStringList info /*= QStringList()*/) { //todo } void FITKOFMesherDriver::blockMeshSlot() { if (getValue("HasGeoMeshSize").toBool()) { // 调用blockMesh auto proGramManager = FITKAPP->getProgramTaskManager(); if (proGramManager == nullptr) return; AppFrame::FITKProgramInputInfo* inputInfo = new FoamDriver::FITKOFInputInfo(); QString path = getValue("WorkDir").toString(); inputInfo->setArgs({ "-overwrite -case", path }); auto driver = proGramManager->createProgram(1, "FITKOFSnappyHexMeshDriver", inputInfo); QObject::connect(driver, SIGNAL(sig_Finish()), this, SLOT(snappyHexMeshSlot())); driver->start(); } else { emit mesherFinished(); } } void FITKOFMesherDriver::snappyHexMeshSlot() { // 调用createPatch auto proGramManager = FITKAPP->getProgramTaskManager(); if (proGramManager == nullptr) return; AppFrame::FITKProgramInputInfo* inputInfo = new FoamDriver::FITKOFInputInfo(); QString path = getValue("WorkDir").toString(); inputInfo->setArgs({ "-overwrite -case", path }); auto driver = proGramManager->createProgram(1, "FITKOFCreatePatchDriver", inputInfo); QObject::connect(driver, SIGNAL(sig_Finish()), this, SLOT(createPatchSlot())); driver->start(); } void FITKOFMesherDriver::createPatchSlot() { //驱动读取网格生成 emit this->mesherFinished(); } }