#include "FITKOCCOperBool.h" #include #include #include #include #include #include "FITKOCCComandCommon.h" #include #include #include "FITKOCCVirtualTopoCreator.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKGeoCommandList.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKGeoInterfaceFactory.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelSurface.h" namespace OCC { FITKOCCOperBool::FITKOCCOperBool() :OCCShapeAgent(this) { _shapeAgent = _occShapeAgent; } bool FITKOCCOperBool::update() { const TopoDS_Shape* s1{}; const TopoDS_Shape* s2{}; if (!m_Target.isNull() && !m_Tool.isNull()) { auto geoCmdList = FITKGLODATA->getGeometryData(); auto targetCmd = geoCmdList->getDataByID(m_Target.CmdId); if (targetCmd == nullptr) return false; auto vTargetShape = targetCmd->getShapeT(Interface::FITKGeoEnum::VTopoShapeType::VSSolid, m_Target.VirtualTopoId); if (vTargetShape == nullptr) return false; s1 = &(vTargetShape->getTopoShape()); auto toolCmd = geoCmdList->getDataByID(m_Tool.CmdId); if (toolCmd == nullptr) return false; auto vToolShape = toolCmd->getShapeT(Interface::FITKGeoEnum::VTopoShapeType::VSSolid, m_Tool.VirtualTopoId); if (vToolShape == nullptr) return false; s2 = &(vToolShape->getTopoShape()); } // 兼容旧接口 else if (_shape1 != nullptr && _shape2 != nullptr) { FITKAbstractOCCModel* model1 = dynamic_cast(_shape1); FITKAbstractOCCModel* model2 = dynamic_cast(_shape2); if (model2 == nullptr || model1 == nullptr) return false; s1 = model1->getShape(); s2 = model2->getShape(); } else { return false; } switch (_boolOperType) { case Interface::FITKAbsGeoOperBool::GBTCommon: this->common(s1, s2); break; case Interface::FITKAbsGeoOperBool::GBTCut: this->cut(s1, s2); break; case Interface::FITKAbsGeoOperBool::GBTAdd: this->add(s1, s2); break; default: return false; } return true; } void FITKOCCOperBool::cut(const TopoDS_Shape* shape1, const TopoDS_Shape* shape2) { try { const TopoDS_Shape &aCuttedShape = BRepAlgoAPI_Cut(*shape1, *shape2); _occShapeAgent->updateShape(aCuttedShape); } catch (...) { printLog(tr("Failed to perform a Boolean operation!"), 3); return; } } void FITKOCCOperBool::common(const TopoDS_Shape* shape1, const TopoDS_Shape* shape2) { try { if (shape1 == nullptr || shape2 == nullptr) return; const TopoDS_Shape &ashape = BRepAlgoAPI_Common(*shape1, *shape2); if (!ashape.IsSame(TopoDS_Shape())) { _occShapeAgent->updateShape(ashape); return; } BRepAlgoAPI_Section S(*shape1, *shape2, false); S.Build(); if (S.IsDone()) { _occShapeAgent->updateShape(S.Shape()); } } catch (...) { printLog(tr("Failed to perform a Boolean operation!"), 3); return; } } void FITKOCCOperBool::add(const TopoDS_Shape* shape1, const TopoDS_Shape* shape2) { try { BRepAlgoAPI_Fuse fau(*shape1, *shape2); if (!fau.IsDone()) return; const TopoDS_Shape &aFusedShape = fau.Shape(); if (aFusedShape.IsNull()) return; TopoDS_Shape shape = Command::GeoCommandCommon::removeSplitter(aFusedShape); _occShapeAgent->updateShape(shape); } catch (...) { printLog(tr("Failed to perform a Boolean operation!"), 3); return; } } }