#include "FITKFlowOFHDF5AdaptorRegionMesh.h" #include "FITK_Kernel/FITKCore/FITKEnumTransformer.hpp" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoCommand.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKRegionMeshSize.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKRegionMeshSizeBox.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKRegionMeshSizeCylinder.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKRegionMeshSizeSphere.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKRegionMeshSizeGeom.h" #include "FITKFlowOFHDF5Reader.h" #include "FITKFlowOFHDF5Writer.h" #include namespace IO { QString FITKFlowOFHDF5AdaptorRegionMesh::getAdaptorClass() { return "FITKFlowOFHDF5AdaptorRegionMesh"; } bool FITKFlowOFHDF5AdaptorRegionMesh::adaptR() { _regionMeshData = dynamic_cast(_dataObj); if (!_reader || !_regionMeshData) return false; bool isR = false; readNDataObject(_regionMeshData, *_h5Group); int type = _regionMeshData->getRegionType(); if (type == Interface::FITKAbstractRegionMeshSize::RegionType::RigonGeom) isR = this->regionGeometryR(*_h5Group); else if (type == Interface::FITKAbstractRegionMeshSize::RegionType::RegionBox) isR = this->regionBoxR(*_h5Group); else if (type == Interface::FITKAbstractRegionMeshSize::RegionType::RegionCylinder) isR = this->regionCylinderR(*_h5Group); else if (type == Interface::FITKAbstractRegionMeshSize::RegionType::RegionSphere) isR = this->regionSphereR(*_h5Group); return isR; } bool FITKFlowOFHDF5AdaptorRegionMesh::adaptW() { _regionMeshData = dynamic_cast(_dataObj); if (!_writer || !_regionMeshData) return false; std::string name = createParentAttribute(_regionMeshData, *_h5Group); if (name.empty()) { name = std::to_string(_regionMeshData->getDataObjectID()); int numAttrCount = _h5Group->getNumAttrs(); writeStrAttribute(*_h5Group, std::to_string(numAttrCount), name); } H5::Group h5Group = _h5Group->createGroup(name); bool isW = false; int type = _regionMeshData->getRegionType(); writeIntAttribute(h5Group, "RegionType", &type); if (type == Interface::FITKAbstractRegionMeshSize::RegionType::RigonGeom) isW = this->regionGeometryW(h5Group); else if (type == Interface::FITKAbstractRegionMeshSize::RegionType::RegionBox) isW = this->regionBoxW(h5Group); else if (type == Interface::FITKAbstractRegionMeshSize::RegionType::RegionCylinder) isW = this->regionCylinderW(h5Group); else if (type == Interface::FITKAbstractRegionMeshSize::RegionType::RegionSphere) isW = this->regionSphereW(h5Group); return isW; } bool FITKFlowOFHDF5AdaptorRegionMesh::regionGeometryW(H5::Group& h5Group) { Interface::FITKRegionMeshSizeGeom* geoRegion = dynamic_cast(_regionMeshData); if (!_writer || !geoRegion) return false; //几何id int geomId = geoRegion->getGeomID(); writeIntAttribute(h5Group, "geomId", &geomId); //最值 int min = int(geoRegion->getMinSize()); int max = int(geoRegion->getMaxSize()); writeIntAttribute(h5Group, "minValue", &min); writeIntAttribute(h5Group, "maxValue", &max); return true; } bool FITKFlowOFHDF5AdaptorRegionMesh::regionGeometryR(H5::Group& h5Group) { Interface::FITKRegionMeshSizeGeom* geoRegion = dynamic_cast(_regionMeshData); if (!_reader || !geoRegion) return false; //几何Id int geomId = readIntAttribute(h5Group, "geomId"); geoRegion->setGeomID(geomId); //最值 int max = readIntAttribute(h5Group, "maxValue"); int min = readIntAttribute(h5Group, "minValue"); geoRegion->setMinSize(min); geoRegion->setMaxSize(max); return true; } bool FITKFlowOFHDF5AdaptorRegionMesh::regionBoxW(H5::Group& h5Group) { Interface::FITKRegionMeshSizeBox* boxRegion = dynamic_cast(_regionMeshData); if (!_writer || !boxRegion) return false; //第一点坐标 double point1[3]{ 0 }; boxRegion->getPoint1(point1); writeDoubleAttribute(h5Group, "point1", &point1, 1, 3); //长度 double length[3]{ 0 }; boxRegion->getLength(length); writeDoubleAttribute(h5Group, "length", &length, 1, 3); //离散数量 int division1 = boxRegion->getDivision(0); int division2 = boxRegion->getDivision(1); int division3 = boxRegion->getDivision(2); writeIntAttribute(h5Group, "division1", &division1); writeIntAttribute(h5Group, "division2", &division2); writeIntAttribute(h5Group, "division3", &division3); //离散比例 double grading1 = boxRegion->getGrading(0); double grading2 = boxRegion->getGrading(1); double grading3 = boxRegion->getGrading(2); writeDoubleAttribute(h5Group, "grading1", &grading1); writeDoubleAttribute(h5Group, "grading2", &grading2); writeDoubleAttribute(h5Group, "grading3", &grading3); //boundary for (int i = 0; i < 6; ++i) { int boundType = boxRegion->getBoundary(i); std::string faceName = boxRegion->getFaceName(i).toStdString(); std::string boundTypeKey = (QString("boundType%1").arg(i)).toStdString(); std::string faceNameKey = (QString("faceName%1").arg(i)).toStdString(); writeIntAttribute(h5Group, boundTypeKey, &boundType); writeStrAttribute(h5Group, faceNameKey, faceName); } return true; } bool FITKFlowOFHDF5AdaptorRegionMesh::regionBoxR(H5::Group& h5Group) { Interface::FITKRegionMeshSizeBox* boxRegion = dynamic_cast(_regionMeshData); if (!_reader || !boxRegion) return false; //第一点坐标 if (!h5Group.attrExists("point1"))return false; double point1[3] = { 0 }; H5::Attribute att1 = h5Group.openAttribute("point1"); att1.read(H5::PredType::NATIVE_DOUBLE, &point1); boxRegion->setPoint1(point1); //长度 if (!h5Group.attrExists("length"))return false; double length[3] = { 0 }; att1 = h5Group.openAttribute("length"); att1.read(H5::PredType::NATIVE_DOUBLE, &length); boxRegion->setLength(length); //离散数量 int division1 = readIntAttribute(h5Group, "division1"); int division2 = readIntAttribute(h5Group, "division2"); int division3 = readIntAttribute(h5Group, "division3"); boxRegion->setDivision(0, division1); boxRegion->setDivision(1, division2); boxRegion->setDivision(2, division3); //离散比例 double grading1 = readDoubleAttribute(h5Group, "grading1"); double grading2 = readDoubleAttribute(h5Group, "grading2"); double grading3 = readDoubleAttribute(h5Group, "grading3"); boxRegion->setGrading(0, grading1); boxRegion->setGrading(1, grading2); boxRegion->setGrading(2, grading3); //boundary for (int i = 0; i < 6; ++i) { std::string boundTypeKey = (QString("boundType%1").arg(i)).toStdString(); std::string faceNameKey = (QString("faceName%1").arg(i)).toStdString(); int type = readIntAttribute(h5Group, boundTypeKey); std::string name = readStrAttribute(h5Group, faceNameKey); boxRegion->insertBoundary(i, Interface::FITKAbstractRegionMeshSize::BoundaryType(type)); boxRegion->insertFaceName(i, QString::fromStdString(name)); } return true; } bool FITKFlowOFHDF5AdaptorRegionMesh::regionCylinderW(H5::Group& h5Group) { Interface::FITKRegionMeshSizeCylinder* cylinderRegion = dynamic_cast(_regionMeshData); if (!_writer || !cylinderRegion) return false; //圆心坐标 double location[3] = { 0,0,0 }; cylinderRegion->getLocation(location); writeDoubleAttribute(h5Group, "location", &location, 1, 3); //轴线方向 double direction[3] = { 0,0,0 }; cylinderRegion->getDirection(direction); writeDoubleAttribute(h5Group, "direction", &direction, 1, 3); //半径 double radius = cylinderRegion->getRadius(); writeDoubleAttribute(h5Group, "radius", &radius); //长度 double length = cylinderRegion->getLength(); writeDoubleAttribute(h5Group, "length", &length); //半径因子 double radiusFaction = cylinderRegion->getRadialFraction(); writeDoubleAttribute(h5Group, "radiusFaction", &radiusFaction); //离散数量 int division1 = cylinderRegion->getDivision(0); int division2 = cylinderRegion->getDivision(1); int division3 = cylinderRegion->getDivision(2); writeIntAttribute(h5Group, "division1", &division1); writeIntAttribute(h5Group, "division2", &division2); writeIntAttribute(h5Group, "division3", &division3); //离散比例 double grading1 = cylinderRegion->getGrading(0); double grading2 = cylinderRegion->getGrading(1); double grading3 = cylinderRegion->getGrading(2); writeDoubleAttribute(h5Group, "grading1", &grading1); writeDoubleAttribute(h5Group, "grading2", &grading2); writeDoubleAttribute(h5Group, "grading3", &grading3); //boundary for (int i = 0; i < 3; ++i) { int boundType = cylinderRegion->getBoundary(i); std::string faceName = cylinderRegion->getFaceName(i).toStdString(); std::string boundTypeKey = (QString("boundType%1").arg(i)).toStdString(); std::string faceNameKey = (QString("faceName%1").arg(i)).toStdString(); writeIntAttribute(h5Group, boundTypeKey, &boundType); writeStrAttribute(h5Group, faceNameKey, faceName); } return true; } bool FITKFlowOFHDF5AdaptorRegionMesh::regionCylinderR(H5::Group& h5Group) { Interface::FITKRegionMeshSizeCylinder* cylinderRegion = dynamic_cast(_regionMeshData); if (!_reader || !cylinderRegion) return false; //圆心坐标 if (!h5Group.attrExists("location"))return false; double location[3] = { 0 }; H5::Attribute att1 = h5Group.openAttribute("location"); att1.read(H5::PredType::NATIVE_DOUBLE, &location); cylinderRegion->setLocation(location); //轴线方向 if (!h5Group.attrExists("direction"))return false; double direction[3] = { 0 }; att1 = h5Group.openAttribute("direction"); att1.read(H5::PredType::NATIVE_DOUBLE, &direction); cylinderRegion->setDirection(direction); //半径 double radius = readDoubleAttribute(h5Group, "radius"); cylinderRegion->setRadius(radius); //长度 double length = readDoubleAttribute(h5Group, "length"); cylinderRegion->setLength(length); //半径因子 double radiusFaction = readDoubleAttribute(h5Group, "radiusFaction"); cylinderRegion->setRadialFraction(radiusFaction); //离散数量 int division1 = readIntAttribute(h5Group, "division1"); int division2 = readIntAttribute(h5Group, "division2"); int division3 = readIntAttribute(h5Group, "division3"); cylinderRegion->setDivision(0, division1); cylinderRegion->setDivision(1, division2); cylinderRegion->setDivision(2, division3); //离散比例 double grading1 = readDoubleAttribute(h5Group, "grading1"); double grading2 = readDoubleAttribute(h5Group, "grading2"); double grading3 = readDoubleAttribute(h5Group, "grading3"); cylinderRegion->setGrading(0, grading1); cylinderRegion->setGrading(1, grading2); cylinderRegion->setGrading(2, grading3); //boundary for (int i = 0; i < 3; ++i) { std::string boundTypeKey = (QString("boundType%1").arg(i)).toStdString(); std::string faceNameKey = (QString("faceName%1").arg(i)).toStdString(); int type = readIntAttribute(h5Group, boundTypeKey); std::string name = readStrAttribute(h5Group, faceNameKey); cylinderRegion->insertBoundary(i, Interface::FITKAbstractRegionMeshSize::BoundaryType(type)); cylinderRegion->insertFaceName(i, QString::fromStdString(name)); } return true; } bool FITKFlowOFHDF5AdaptorRegionMesh::regionSphereW(H5::Group& h5Group) { if (!_writer || !_regionMeshData) return false; return false; } bool FITKFlowOFHDF5AdaptorRegionMesh::regionSphereR(H5::Group& h5Group) { return false; } }