You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/FITK_Component/FITKOFDictWriter/FITKOFSetFieldsDictWriter.cpp

220 lines
9.6 KiB
C++

#include "FITKOFSetFieldsDictWriter.h"
#include "FITKDictObject.h"
#include "FITKDictArray.h"
#include "FITKDictGroup.h"
#include "FITKDictVector.h"
#include "FITKDictValue.h"
#include "FITK_Kernel/FITKCore/FITKEnumTransformer.hpp"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKOFPhysicsData.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKAbstractOFSolver.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKOFRunControl.h"
#include "FITK_Kernel/FITKEasyParam/FITKParameter.h"
#include "FITK_Kernel/FITKEasyParam/FITKParamBoolGroup.h"
#include "FITK_Kernel/FITKEasyParam/FITKParamDoubleList.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKOFInitialConditions.h"
#include "FITK_Kernel/FITKEasyParam/FITKParamInt.h"
#include "FITK_Kernel/FITKEasyParam/FITKParamDouble.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoCommand.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoShapeAgent.h"
#include "FITK_Interface/FITKInterfaceModel/FITKAbstractGeoModel.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelBox.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelCylinder.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelSphere.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoOperBool.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelImport.h"
#include <QFileInfo>
#include <QtMath>
//命名空间
namespace IO
{
FITKOFSetFieldsDictWriter::FITKOFSetFieldsDictWriter()
{
}
FITKOFSetFieldsDictWriter::~FITKOFSetFieldsDictWriter()
{
}
void FITKOFSetFieldsDictWriter::setFilePath(const QString& filePath)
{
FITKOFAbstractDictWriter::setFilePath(filePath);
QFileInfo fileInfo(filePath);
//判断是否是路径
if (!fileInfo.isDir())return;
m_fileName = QString("%1/system/setFieldsDict").arg(filePath);
}
bool FITKOFSetFieldsDictWriter::run()
{
//判断文件是否存在
if (m_fileName.isEmpty())return false;
//获取字典工程
this->openDictObject();
if (!m_objectDict)return false;
//写出FoamFile
this->dictObjectFoamFile();
//设置写出的网格区域数据
bool Ok = this->setFieldsDictW();
//写出字典文件
if (Ok)
Ok = this->writeDictFile();
//关闭字典工程
this->closeDictObject();
return Ok;
}
QString FITKOFSetFieldsDictWriter::getFileName()
{
return m_fileName;
}
void FITKOFSetFieldsDictWriter::dictObjectFoamFile()
{
if (!m_objectDict)return;
//FoamFile
DICT::FITKDictGroup* group = new DICT::FITKDictGroup;
group->append("version", 2.0);
group->append("format", "ascii");
group->append("class", "dictionary");
group->append("location", "\"system\"");
group->append("object", "setFieldsDict");
m_objectDict->append("FoamFile", group);
}
bool FITKOFSetFieldsDictWriter::setFieldsDictW()
{
if (!m_objectDict)return false;
m_objectDict->append("defaultFieldValues", new DICT::FITKDictArray());
DICT::FITKDictArray* regions = new DICT::FITKDictArray;
m_objectDict->append("regions", regions);
//获取全局数据管理器
AppFrame::FITKGlobalData* globalData = FITKAPP->getGlobalData();
if (!globalData)return false;
//获取物理数据
Interface::FITKOFPhysicsData* physicsData = globalData->getPhysicsData<Interface::FITKOFPhysicsData>();
if (!physicsData)return false;
//获取initial
Interface::FITKOFInitialConditions* initialCond = physicsData->getInitialConditions();
if (!initialCond)return false;
int count = initialCond->getPatchCount();
for (int i = 0; i < count; ++i)
{
Interface::FITKOFGeometryPatch* patch = initialCond->getPatch(i);
if (!patch)continue;
Interface::FITKAbsGeoCommand* geoCommand = patch->getGeometryModel();
if (!geoCommand)continue;
//获取应用类型
Interface::FITKOFSolverInitialEnum::FITKPatchApplyObjectType applyType = patch->getAppltTo();
DICT::FITKDictGroup* cellGroup = nullptr;
DICT::FITKDictGroup* faceGroup = nullptr;
//获取类型
Interface::FITKGeoEnum::FITKGeometryComType type = geoCommand->getGeometryCommandType();
if (type == Interface::FITKGeoEnum::FITKGeometryComType::FGTBox)
{
Interface::FITKAbsGeoModelBox* box = dynamic_cast<Interface::FITKAbsGeoModelBox*>(geoCommand);
if (!box)return false;
//第一个点
double minP[3]{ 0.0, 0.0, 0.0 };
box->getPoint1(minP);
//长度
double length[3]{ 0.0, 0.0, 0.0 };
box->getLength(length);
//最高点
double maxP[3]{ minP[0], minP[1], minP[2] };
length[0] < 0 ? minP[0] = minP[0] + length[0] : maxP[0] = minP[0] + length[0];
length[1] < 0 ? minP[1] = minP[1] + length[1] : maxP[1] = minP[1] + length[1];
length[2] < 0 ? minP[2] = minP[2] + length[2] : maxP[2] = minP[2] + length[2];
QString value = QString("(%1 %2 %3) (%4 %5 %6)").arg(minP[0]).arg(minP[1]).arg(minP[2]).arg(maxP[0]).arg(maxP[1]).arg(maxP[2]);
if (applyType == Interface::FITKOFSolverInitialEnum::FITKPatchApplyObjectType::Cells || applyType == Interface::FITKOFSolverInitialEnum::FITKPatchApplyObjectType::Both)
{
cellGroup = new DICT::FITKDictGroup;
regions->append(cellGroup, "boxToCell");
cellGroup->append("box", value);
}
if (applyType == Interface::FITKOFSolverInitialEnum::FITKPatchApplyObjectType::Faces || applyType == Interface::FITKOFSolverInitialEnum::FITKPatchApplyObjectType::Both)
{
faceGroup = new DICT::FITKDictGroup;
regions->append(faceGroup, "boxToFace");
faceGroup->append("box", value);
}
}
else if (type == Interface::FITKGeoEnum::FITKGeometryComType::FGTCylinder)
{
Interface::FITKAbsGeoModelCylinder* cylinder = dynamic_cast<Interface::FITKAbsGeoModelCylinder*>(geoCommand);
if (!cylinder)return false;
}
else if (type == Interface::FITKGeoEnum::FITKGeometryComType::FGTSphere)
{
Interface::FITKAbsGeoModelSphere* sphere = dynamic_cast<Interface::FITKAbsGeoModelSphere*>(geoCommand);
if (!sphere)return false;
}
else if (type == Interface::FITKGeoEnum::FITKGeometryComType::FGTBool)
{
Interface::FITKAbsGeoOperBool* boolOper = dynamic_cast<Interface::FITKAbsGeoOperBool*>(geoCommand);
if (!boolOper)return false;
}
else if (type == Interface::FITKGeoEnum::FITKGeometryComType::FGTImport)
{
Interface::FITKAbsGeoModelImport* importModel = dynamic_cast<Interface::FITKAbsGeoModelImport*>(geoCommand);
if (!importModel)return false;
}
if (cellGroup) this->writeFieldValue(patch, cellGroup);
if (faceGroup) this->writeFieldValue(patch, faceGroup);
}
return true;
}
bool FITKOFSetFieldsDictWriter::writeFieldValue(Interface::FITKOFGeometryPatch* patch, DICT::FITKDictGroup* group)
{
if (!patch || !group)return false;
Core::FITKParameter* para = patch->getFieldPara();
if (!para)return false;
DICT::FITKDictArray* fieldValues = new DICT::FITKDictArray;
group->append("fieldValues", fieldValues);
int count = para->getDataCount();
for (int i = 0; i < count; ++i)
{
Core::FITKAbstractEasyParam* data = para->getDataByIndex(i);
if (!data)continue;
QString name = data->getDataObjectName();
QString value;
Core::FITKAbstractEasyParam::FITKEasyParamType type = data->getParamType();
if (type == Core::FITKAbstractEasyParam::FITKEasyParamType::FEPDouble)
{
Core::FITKParamDouble* p = dynamic_cast<Core::FITKParamDouble*>(data);
if (!p)continue;
value = QString("%1 %2").arg(name).arg(p->getValue());
}
else if (type == Core::FITKAbstractEasyParam::FITKEasyParamType::FEPInt)
{
Core::FITKParamInt* p = dynamic_cast<Core::FITKParamInt*>(data);
if (!p)continue;
value = QString("%1 %2").arg(name).arg(p->getValue());
}
else if (type == Core::FITKAbstractEasyParam::FITKEasyParamType::FEPDoubleList)
{
Core::FITKParamDoubleList* p = dynamic_cast<Core::FITKParamDoubleList*>(data);
if (!p)continue;
int num = p->getCount();
QStringList valueList;
for (int i = 0; i < num; ++i)
valueList.append(QString::number(p->getValue(i)));
value = QString("%1 (%2)").arg(name).arg(valueList.join(' '));
}
DICT::FITKDictVector* scalar = new DICT::FITKDictVector;
scalar->setParenthesesType(DICT::FITKDictVector::ParenthesesType::NoneParentheses);
scalar->append(QString("volScalarFieldValue\t%2").arg(value));
fieldValues->append(scalar);
}
return true;
}
}