X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Boolean.cpp;h=9d3a05873507cc28a76d59a47d59f0ace60616cc;hb=0cea3be102af7247b2fe2c8035a1bb38b7bf82ae;hp=0f68186e4b67cc01235f573e72d640783e09693b;hpb=ba737434252ae41c4bee1b792a0f0bb098ffae87;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp index 0f68186e4..9d3a05873 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: GeomAlgoAPI_Boolean.cpp // Created: 02 Sept 2014 // Author: Vitaly Smetannikov @@ -5,20 +7,164 @@ #include "GeomAlgoAPI_Boolean.h" #include +#include +#include +#include +#include +#include - -boost::shared_ptr GeomAlgoAPI_Boolean::makeCut( - boost::shared_ptr theShape, - boost::shared_ptr theTool) +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()) { - boost::shared_ptr aResult(new GeomAPI_Shape()); + std::shared_ptr aResult(new GeomAPI_Shape()); aResult->setImpl(new TopoDS_Shape(aCut.Shape())); return aResult; } - return boost::shared_ptr(); + return std::shared_ptr(); +} + + +std::shared_ptr GeomAlgoAPI_Boolean::makeFuse( + std::shared_ptr theShape, + std::shared_ptr theTool) +{ + 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(); +} + + +std::shared_ptr GeomAlgoAPI_Boolean::makeCommon( + std::shared_ptr theShape, + std::shared_ptr theTool) +{ + 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; + } + 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()) +{ + 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()) { + setImpl(mkFuse); + myDone = mkFuse->IsDone() == Standard_True; + myMkShape = 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()) { + setImpl(mkCut); + myDone = mkCut->IsDone() == Standard_True; + myMkShape = new GeomAlgoAPI_MakeShape (mkCut); + aResult = mkCut->Shape(); + } + break; + } + case BOOL_COMMON: + { + BRepAlgoAPI_Common* mkCom = new BRepAlgoAPI_Common(anObject, aTool); + if (mkCom && mkCom->IsDone()) { + setImpl(mkCom); + myDone = mkCom->IsDone() == Standard_True; + myMkShape = new GeomAlgoAPI_MakeShape (mkCom); + aResult = mkCom->Shape(); + } + break; + } + } + 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); + } + } } + + +//============================================================================ +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; +} + +//============================================================================ +void GeomAlgoAPI_Boolean::mapOfShapes (GeomAPI_DataMapOfShapeShape& theMap) const +{ + theMap = myMap; +} + +//============================================================================ +GeomAlgoAPI_MakeShape * GeomAlgoAPI_Boolean::makeShape() const +{ + return myMkShape; +} + +//============================================================================ +GeomAlgoAPI_Boolean::~GeomAlgoAPI_Boolean() +{ + if (myImpl) { + myMap.clear(); + } +} \ No newline at end of file