X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Boolean.cpp;h=21458a9ce2ab14459e803371484d2342e0b391c5;hb=d8101383b10bf780a1acf5a356007ad6dbf17711;hp=4327a194e51d321d2913d3c9fa17352bffcef5c8;hpb=5e90be5a37588dd936e6d5f1a6426141bfda7170;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp index 4327a194e..21458a9ce 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp @@ -6,159 +6,91 @@ #include "GeomAlgoAPI_Boolean.h" -#include -#include -#include -#include -#include #include +#include -std::shared_ptr GeomAlgoAPI_Boolean::makeCut( - std::shared_ptr theShape, - std::shared_ptr theTool) -{ - const TopoDS_Shape& aShape = theShape->impl(); - const TopoDS_Shape& aTool = theTool->impl(); - - BRepAlgoAPI_Cut aCut(aShape, aTool); - if (aCut.IsDone()) { - std::shared_ptr aResult(new GeomAPI_Shape()); - aResult->setImpl(new TopoDS_Shape(aCut.Shape())); - return aResult; - } - return std::shared_ptr(); -} +#include +#include - -std::shared_ptr GeomAlgoAPI_Boolean::makeFuse( - std::shared_ptr theShape, - std::shared_ptr theTool) +//================================================================================================= +GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(const ListOfShape& theObjects, + const ListOfShape& theTools, + const OperationType theOperationType) { - const TopoDS_Shape& aShape = theShape->impl(); - const TopoDS_Shape& aTool = theTool->impl(); - - BRepAlgoAPI_Fuse aFuse(aShape, aTool); - if (aFuse.IsDone()) { - std::shared_ptr aResult(new GeomAPI_Shape()); - aResult->setImpl(new TopoDS_Shape(aFuse.Shape())); - return aResult; - } - return std::shared_ptr(); + build(theObjects, theTools, theOperationType); } -std::shared_ptr GeomAlgoAPI_Boolean::makeCommon( - std::shared_ptr theShape, - std::shared_ptr theTool) +//================================================================================================= +void GeomAlgoAPI_Boolean::build(const ListOfShape& theObjects, + const ListOfShape& theTools, + const OperationType theOperationType) { - const TopoDS_Shape& aShape = theShape->impl(); - const TopoDS_Shape& aTool = theTool->impl(); - - BRepAlgoAPI_Common aCommon(aShape, aTool); - if (aCommon.IsDone()) { - std::shared_ptr aResult(new GeomAPI_Shape()); - aResult->setImpl(new TopoDS_Shape(aCommon.Shape())); - return aResult; + if(theObjects.empty() || theTools.empty()) { + return; } - return std::shared_ptr(); -} - -//============================================================================ -GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(std::shared_ptr theObject, - std::shared_ptr theTool, - int theType) -: myOperation(theType), myDone(false), myShape(new GeomAPI_Shape()), myMap(new GeomAPI_DataMapOfShapeShape()) -{ - build(theObject, theTool); -} - -//============================================================================ -void GeomAlgoAPI_Boolean::build(std::shared_ptr theObject, - std::shared_ptr theTool) -{ - const TopoDS_Shape& anObject = theObject->impl(); - const TopoDS_Shape& aTool = theTool->impl(); - TopoDS_Shape aResult; - switch (myOperation) { - case BOOL_FUSE: - { - BRepAlgoAPI_Fuse* mkFuse = new BRepAlgoAPI_Fuse(anObject, aTool); - if (mkFuse && mkFuse->IsDone()) { - myDone = mkFuse->IsDone() == Standard_True; - myMkShape = std::shared_ptr(new GeomAlgoAPI_MakeShape (mkFuse)); - aResult = mkFuse->Shape();//GeomAlgoAPI_DFLoader::refineResult(aFuse->Shape()); - } - break; - } - case BOOL_CUT: - { - BRepAlgoAPI_Cut* mkCut = new BRepAlgoAPI_Cut(anObject, aTool); - if (mkCut && mkCut->IsDone()) { - myDone = mkCut->IsDone() == Standard_True; - myMkShape = std::shared_ptr(new GeomAlgoAPI_MakeShape (mkCut)); - aResult = mkCut->Shape(); - } - break; - } - case BOOL_COMMON: - { - BRepAlgoAPI_Common* mkCom = new BRepAlgoAPI_Common(anObject, aTool); - if (mkCom && mkCom->IsDone()) { - myDone = mkCom->IsDone() == Standard_True; - myMkShape = std::shared_ptr(new GeomAlgoAPI_MakeShape (mkCom)); - aResult = mkCom->Shape(); - } - break; - } + // Getting objects. + TopTools_ListOfShape anObjects; + for(ListOfShape::const_iterator anObjectsIt = theObjects.begin(); anObjectsIt != theObjects.end(); anObjectsIt++) + { + anObjects.Append((*anObjectsIt)->impl()); } - if(myDone) { - if(aResult.ShapeType() == TopAbs_COMPOUND) - aResult = GeomAlgoAPI_DFLoader::refineResult(aResult); - myShape->setImpl(new TopoDS_Shape(aResult)); - std::shared_ptr aGeomResult(new GeomAPI_Shape()); - aGeomResult->setImpl(new TopoDS_Shape(aResult)); - - // fill data map to keep correct orientation of sub-shapes - for (TopExp_Explorer Exp(aResult,TopAbs_FACE); Exp.More(); Exp.Next()) { - std::shared_ptr aCurrentShape(new GeomAPI_Shape()); - aCurrentShape->setImpl(new TopoDS_Shape(Exp.Current())); - myMap->bind(aCurrentShape, aCurrentShape); - } - } -} + // Getting tools. + TopTools_ListOfShape aTools; + for(ListOfShape::const_iterator aToolsIt = theTools.begin(); aToolsIt != theTools.end(); aToolsIt++) + { + aTools.Append((*aToolsIt)->impl()); + } -//============================================================================ -const bool GeomAlgoAPI_Boolean::isDone() const -{return myDone;} - -//============================================================================ -const bool GeomAlgoAPI_Boolean::isValid() const -{ - BRepCheck_Analyzer aChecker(myShape->impl()); - return (aChecker.IsValid() == Standard_True); -} - -//============================================================================ -const std::shared_ptr& GeomAlgoAPI_Boolean::shape () const -{ - return myShape; -} + // Creating boolean operation. + BOPAlgo_BOP* aBuilder = new BOPAlgo_BOP(); + switch (theOperationType) { + case BOOL_CUT: { + aBuilder->SetOperation(BOPAlgo_CUT); + break; + } + case BOOL_FUSE: { + aBuilder->SetOperation(BOPAlgo_FUSE); + break; + } + case BOOL_COMMON: { + aBuilder->SetOperation(BOPAlgo_COMMON); + break; + } + default: { + return; + } + } + this->setImpl(aBuilder); + this->setBuilderType(OCCT_BOPAlgo_Builder); + aBuilder->SetArguments(anObjects); + aBuilder->SetTools(aTools); + + // Building and getting result. + aBuilder->Perform(); + if(aBuilder->ErrorStatus() != 0) { + return; + } + TopoDS_Shape aResult = aBuilder->Shape(); -//============================================================================ -void GeomAlgoAPI_Boolean::mapOfShapes(std::shared_ptr& theMap) const -{ - theMap = myMap; -} + if(aResult.ShapeType() == TopAbs_COMPOUND) { + aResult = GeomAlgoAPI_DFLoader::refineResult(aResult); + } + if(aResult.ShapeType() == TopAbs_COMPOUND) { + std::shared_ptr aGeomShape(new GeomAPI_Shape); + aGeomShape->setImpl(new TopoDS_Shape(aResult)); + ListOfShape aCompSolids, aFreeSolids; + aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, + GeomAPI_Shape::COMPSOLID, + aCompSolids, + aFreeSolids); + aResult = aGeomShape->impl(); + } -//============================================================================ -const std::shared_ptr& GeomAlgoAPI_Boolean::makeShape() const -{ - return myMkShape; + std::shared_ptr aShape(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aResult)); + this->setShape(aShape); + this->setDone(true); } - -//============================================================================ -GeomAlgoAPI_Boolean::~GeomAlgoAPI_Boolean() -{ -} \ No newline at end of file