#include "FITKOCCHDF5AdaptorOperGeometrySolid.h" #include "FITKOCCHDF5AdaptorCommand.h" #include "FITKOCCShapeIO.h" // OCC #include //Geommtry #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelBox.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelSphere.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelCylinder.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelOperSolid.h" //Component #include "FITK_Component/FITKGeoCompOCC/FITKAbstractOCCModel.h" namespace IO { // Reader. //@{ QString FITKOCCHDF5AdaptorOperGeometrySolid::getAdaptorClass() { return "FITKOCCHDF5AdaptorOperGeometrySolid"; } bool FITKOCCHDF5AdaptorOperGeometrySolid::adaptR() { auto comm = dynamic_cast(_dataObj); if (!_reader || !comm || !_h5Group) return false; return readOperGeometrySolid(comm, *_h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::adaptW() { auto comm = dynamic_cast(_dataObj); if (!_writer || !comm || !_h5Group) return false; return writeOperGeometrySolid(comm, *_h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolid(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { if (comm == nullptr) return false; //获取命令类型 switch (comm->getGeometryCommandType()) { case Interface::FITKGeoEnum::FGTBox: return readOperGeometrySolidBox(comm, h5Group); case Interface::FITKGeoEnum::FGTSphere: return readOperGeometrySolidSphere(comm, h5Group); case Interface::FITKGeoEnum::FGTCylinder: return readOperGeometrySolidCylinder(comm, h5Group); case Interface::FITKGeoEnum::FGTChamferSolid: return readOperGeometrySolidChamfer(comm, h5Group); case Interface::FITKGeoEnum::FGTRemoveChamfer: return readOperGeometrySolidRemoveChamfer(comm, h5Group); case Interface::FITKGeoEnum::FGTFilletSolid: return readOperGeometrySolidFillet(comm, h5Group); case Interface::FITKGeoEnum::FGTRemoveFillet: return readOperGeometrySolidRemoveFillet(comm, h5Group); case Interface::FITKGeoEnum::FGTDefeature: return readOperGeometrySolidDefeature(comm, h5Group); case Interface::FITKGeoEnum::FGTFillHole: return readOperGeometrySolidFillHole(comm, h5Group); case Interface::FITKGeoEnum::FGTClosedSurfaceSolid: return readOperGeometrySolidClosedSurface(comm, h5Group); case Interface::FITKGeoEnum::FGTExtrudeSolid: return readOperGeometrySolidExtrude(comm, h5Group); case Interface::FITKGeoEnum::FGTRevolSolid: return readOperGeometrySolidRevol(comm, h5Group); case Interface::FITKGeoEnum::FGTSweepSolid: return readOperGeometrySolidSweep(comm, h5Group); case Interface::FITKGeoEnum::FGTMultiSectionSolid: return readOperGeometrySolidMultiSection(comm, h5Group); default: return false; } return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolid(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { if (comm == nullptr) return false; //获取命令类型 switch (comm->getGeometryCommandType()) { case Interface::FITKGeoEnum::FGTBox: return writeOperGeometrySolidBox(comm, h5Group); case Interface::FITKGeoEnum::FGTSphere: return writeOperGeometrySolidSphere(comm, h5Group); case Interface::FITKGeoEnum::FGTCylinder: return writeOperGeometrySolidCylinder(comm, h5Group); case Interface::FITKGeoEnum::FGTChamferSolid: return writeOperGeometrySolidChamfer(comm, h5Group); case Interface::FITKGeoEnum::FGTRemoveChamfer: return writeOperGeometrySolidRemoveChamfer(comm, h5Group); case Interface::FITKGeoEnum::FGTFilletSolid: return writeOperGeometrySolidFillet(comm, h5Group); case Interface::FITKGeoEnum::FGTRemoveFillet: return writeOperGeometrySolidRemoveFillet(comm, h5Group); case Interface::FITKGeoEnum::FGTDefeature: return writeOperGeometrySolidDefeature(comm, h5Group); case Interface::FITKGeoEnum::FGTFillHole: return writeOperGeometrySolidFillHole(comm, h5Group); case Interface::FITKGeoEnum::FGTClosedSurfaceSolid: return writeOperGeometrySolidClosedSurface(comm, h5Group); case Interface::FITKGeoEnum::FGTExtrudeSolid: return writeOperGeometrySolidExtrude(comm, h5Group); case Interface::FITKGeoEnum::FGTRevolSolid: return writeOperGeometrySolidRevol(comm, h5Group); case Interface::FITKGeoEnum::FGTSweepSolid: return writeOperGeometrySolidSweep(comm, h5Group); case Interface::FITKGeoEnum::FGTMultiSectionSolid: return writeOperGeometrySolidMultiSection(comm, h5Group); default: return false; } return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidChamfer(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelChamferSolid* cSolid = dynamic_cast(comm); if (cSolid == nullptr) return false; int inputID = readIntAttribute(h5Group, "InputCmdID"); cSolid->setInputCmdId(inputID); int edgesCount = readIntAttribute(h5Group, "Count"); QList edgesList; int* edges = new int[edgesCount]; if (!readIntAttribute(h5Group, "Edges", edges, 1, edgesCount)) { delete[] edges; return false; } for (int i = 0; i < edgesCount; i++) { edgesList.append(edges[i]); } delete[] edges; cSolid->setEdgeIds(edgesList); double distance = readDoubleAttribute(h5Group, "Distance"); cSolid->setDistance(distance); return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidChamfer(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelChamferSolid* cSolid = dynamic_cast(comm); if (cSolid == nullptr) return false; int inputID = cSolid->getInputCmdId(); writeIntAttribute(h5Group, "InputCmdID", &inputID); auto edges = cSolid->getEgdeIds(); int edgesCount = edges.size(); writeIntAttribute(h5Group, "Count", &edgesCount); writeIntAttribute(h5Group, "Edges", &edges, 1, edgesCount); double distance = cSolid->getDistance(); writeDoubleAttribute(h5Group, "Distance", &distance); return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidFillet(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelFilletSolid* fSolid = dynamic_cast(comm); if (fSolid == nullptr) return false; int inputID = readIntAttribute(h5Group, "InputCmdID"); fSolid->setInputCmdId(inputID); int edgesCount = readIntAttribute(h5Group, "Count"); QList edgesList; int* edges = new int[edgesCount]; if (!readIntAttribute(h5Group, "Edges", edges, 1, edgesCount)) { delete[] edges; return false; } for (int i = 0; i < edgesCount; i++) { edgesList.append(edges[i]); } delete[] edges; fSolid->setEdgeIds(edgesList); double radius = readDoubleAttribute(h5Group, "Radius"); fSolid->setRadius(radius); return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidFillet(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelFilletSolid* fSolid = dynamic_cast(comm); if (fSolid == nullptr) return false; int inputID = fSolid->getInputCmdId(); writeIntAttribute(h5Group, "InputCmdID", &inputID); auto edges = fSolid->getEgdeIds(); int edgesCount = edges.size(); writeIntAttribute(h5Group, "Count", &edgesCount); writeIntAttribute(h5Group, "Edges", &edges, 1, edgesCount); double radius = fSolid->getRadius(); writeDoubleAttribute(h5Group, "Radius", &radius); return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidRemoveChamfer(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelRemoveChamferSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; return readOperGeometrySolidDefeature(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidRemoveChamfer(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelRemoveChamferSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; return writeOperGeometrySolidDefeature(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidRemoveFillet(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelRemoveFilletSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; return readOperGeometrySolidDefeature(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidRemoveFillet(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelRemoveFilletSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; return writeOperGeometrySolidDefeature(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidDefeature(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelDefeatureSolid* dSolid = dynamic_cast(comm); if (dSolid == nullptr) return false; int inputID = readIntAttribute(h5Group, "InputCmdID"); dSolid->setInputCmdId(inputID); int facesCount = readIntAttribute(h5Group, "Count"); QList facesList; int* faces = new int[facesCount]; if (!readIntAttribute(h5Group, "Faces", faces, 1, facesCount)) { delete[] faces; return false; } for (int i = 0; i < facesCount; i++) { facesList.append(faces[i]); } delete[] faces; dSolid->setFaceIds(facesList); return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidDefeature(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelDefeatureSolid* dSolid = dynamic_cast(comm); if (dSolid == nullptr) return false; int inputID = dSolid->getInputCmdId(); writeIntAttribute(h5Group, "InputCmdID", &inputID); auto faces = dSolid->getFaceIds(); int faccesCount = faces.size(); writeIntAttribute(h5Group, "Count", &faccesCount); writeIntAttribute(h5Group, "Faces", &faces, 1, faccesCount); return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidFillHole(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelFillHoleSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; return readOperGeometrySolidDefeature(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidFillHole(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelFillHoleSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; return writeOperGeometrySolidDefeature(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidBase(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidBase(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; return true; } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidClosedSurface(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelClosedSurfaceSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; int count = readIntAttribute(h5Group, "Count"); for (int i = 0; i < count; i++) { int faceArray[2]; writeIntAttribute(h5Group, std::to_string(i), faceArray, 1, 3); Interface::VirtualShape vshape; vshape.CmdId = faceArray[0]; vshape.VirtualTopoId = faceArray[1]; rSolid->addFace(vshape); } return readOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidClosedSurface(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelClosedSurfaceSolid* csSolid = dynamic_cast(comm); if (csSolid == nullptr) return false; auto faces = csSolid->faces(); int count = faces.size(); for (int i = 0; i < count; i++) { auto face = faces[i]; int faceArray[2]{ face.CmdId, face.VirtualTopoId }; writeIntAttribute(h5Group, std::to_string(i), faceArray, 1, 3); } writeIntAttribute(h5Group, "Count", &count); return writeOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidExtrude(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelExtrudeSolid* eSolid = dynamic_cast(comm); if (eSolid == nullptr) return false; auto sourceSurface = eSolid->sourceSurface(); int sourceSurfaceArray[2]; double directionArray[3]; if (!readIntAttribute(h5Group, "SourceSurface", sourceSurfaceArray, 1, 2)) return false; Interface::VirtualShape vShape; vShape.CmdId = sourceSurfaceArray[0]; vShape.VirtualTopoId = sourceSurfaceArray[1]; eSolid->setSourceSurface(vShape); if (!readDoubleAttribute(h5Group, "Direction", directionArray, 1, 3)) return false; eSolid->setDirection(directionArray[0], directionArray[1], directionArray[2]); double length = readDoubleAttribute(h5Group, "Length"); eSolid->setLength(length); return readOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidExtrude(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelExtrudeSolid* eSolid = dynamic_cast(comm); if (eSolid == nullptr) return false; auto sourceSurface = eSolid->sourceSurface(); int sourceSurfaceArray[2]{ sourceSurface.CmdId,sourceSurface.VirtualTopoId }; writeIntAttribute(h5Group, "SourceSurface", sourceSurfaceArray, 1, 2); auto direction = eSolid->direction(); double directionArray[3]{ direction[0],direction[1],direction[2] }; writeDoubleAttribute(h5Group, "Direction", directionArray, 1, 3); double length = eSolid->length(); writeDoubleAttribute(h5Group, "Length", &length); return writeOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidRevol(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelRevolSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; int sourceSurfaceArray[2]; double rotateAxisPoint1[3], rotateAxisPoint2[3]; if (!readIntAttribute(h5Group, "SourceSurface", sourceSurfaceArray, 1, 2)) return false; Interface::VirtualShape vShape; vShape.CmdId = sourceSurfaceArray[0]; vShape.VirtualTopoId = sourceSurfaceArray[1]; rSolid->setSourceSurface(vShape); if (!readDoubleAttribute(h5Group, "RotateAxisPoint1", rotateAxisPoint1, 1, 3)) return false; rSolid->setRotateAxisPoint1(rotateAxisPoint1[0], rotateAxisPoint1[1], rotateAxisPoint1[2]); if (!readDoubleAttribute(h5Group, "RotateAxisPoint2", rotateAxisPoint2, 1, 3)) return false; rSolid->setRotateAxisPoint2(rotateAxisPoint2[0], rotateAxisPoint2[1], rotateAxisPoint2[2]); return readOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidRevol(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelRevolSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; auto sourceSurface = rSolid->sourceSurface(); int sourceSurfaceArray[2]{ sourceSurface.CmdId,sourceSurface.VirtualTopoId }; writeIntAttribute(h5Group, "SourceSurface", sourceSurfaceArray, 1, 2); std::array rotateAxisPoint1 = rSolid->rotateAxisPoint1(); double rotateAxisPoint1Array[3]{ rotateAxisPoint1[0], rotateAxisPoint1[1], rotateAxisPoint1[2] }; writeDoubleAttribute(h5Group, "RotateAxisPoint1", rotateAxisPoint1Array, 1, 3); std::array rotateAxisPoint2 = rSolid->rotateAxisPoint2(); double rotateAxisPoint2Array[3]{ rotateAxisPoint2[0], rotateAxisPoint2[1], rotateAxisPoint2[2] }; writeDoubleAttribute(h5Group, "RotateAxisPoint2", rotateAxisPoint2Array, 1, 3); return writeOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidSweep(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelSweepSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; int profileArray[2], curveArray[2]; if (!readIntAttribute(h5Group, "Profile", profileArray, 1, 2)) return false; Interface::VirtualShape profile; profile.CmdId = profileArray[0]; profile.VirtualTopoId = profileArray[1]; rSolid->setProfile(profile); if (!readIntAttribute(h5Group, "Curve", curveArray, 1, 2)) return false; Interface::VirtualShape curve; curve.CmdId = curveArray[0]; curve.VirtualTopoId = curveArray[1]; rSolid->setCurve(curve); return readOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidSweep(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelSweepSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; auto profile = rSolid->profile(); int profileArray[2]{ profile.CmdId,profile.VirtualTopoId }; writeIntAttribute(h5Group, "Profile", profileArray, 1, 2); auto curve = rSolid->curve(); int curveArray[2]{ curve.CmdId,curve.VirtualTopoId }; writeIntAttribute(h5Group, "Curve", curveArray, 1, 2); return writeOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::readOperGeometrySolidMultiSection(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelMultiSectionSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; int count = readIntAttribute(h5Group, "Count"); int sectionArray[2]; for (int i = 0; i < count; i++) { if (!readIntAttribute(h5Group, std::to_string(i), sectionArray, 1, 2)) return false; Interface::VirtualShape section; section.CmdId = sectionArray[0]; section.VirtualTopoId = sectionArray[1]; rSolid->addSection(section); } return writeOperGeometrySolidBase(comm, h5Group); } bool FITKOCCHDF5AdaptorOperGeometrySolid::writeOperGeometrySolidMultiSection(Interface::FITKAbsGeoCommand * comm, H5::Group & h5Group) { Interface::FITKAbsGeoModelMultiSectionSolid* rSolid = dynamic_cast(comm); if (rSolid == nullptr) return false; auto sections = rSolid->sections(); int count = sections.size(); for (int i = 0; i < count; i++) { auto section = sections[i]; int sectionArray[2]{ section.CmdId,section.VirtualTopoId }; writeIntAttribute(h5Group, std::to_string(i), sectionArray, 1, 2); } writeIntAttribute(h5Group, "Count", &count); return writeOperGeometrySolidBase(comm, h5Group); } //@} } // namespace IO