X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Boolean.cpp;h=c9d9524c41610898521dcb5c621638e44d23b201;hb=b06cf1477fb1ee46d7ae260c234cac5d0000abf2;hp=24598c5416c2047d83f10af67ce6e5a5dd3ac2d8;hpb=4783f146b71a48c651523fcf0e12367bcf3d1fa8;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp index 24598c541..c9d9524c4 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp @@ -1,168 +1,132 @@ -// File: GeomAlgoAPI_Boolean.cpp -// Created: 02 Sept 2014 -// Author: Vitaly Smetannikov +// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or +// email : webmaster.salome@opencascade.com +// #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 GeomShapePtr theObject, + const GeomShapePtr theTool, + 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(); + ListOfShape aListWithObject, aListWithTool; + aListWithObject.push_back(theObject); + aListWithTool.push_back(theTool); + build(aListWithObject, aListWithTool, theOperationType); } - -std::shared_ptr GeomAlgoAPI_Boolean::makeCommon( - std::shared_ptr theShape, - std::shared_ptr theTool) +//================================================================================================= +GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(const GeomShapePtr theObject, + 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; - } - return std::shared_ptr(); + ListOfShape aListWithObject; + aListWithObject.push_back(theObject); + build(aListWithObject, theTools, theOperationType); } -//============================================================================ -GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(std::shared_ptr theObject, - std::shared_ptr theTool, - int theType) -: myOperation(theType), myDone(false), myShape(new GeomAPI_Shape()) +//================================================================================================= +GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(const ListOfShape& theObjects, + const ListOfShape& theTools, + const OperationType theOperationType) { - build(theObject, theTool); + build(theObjects, theTools, theOperationType); } -//============================================================================ -void GeomAlgoAPI_Boolean::build(std::shared_ptr theObject, - std::shared_ptr theTool) +//================================================================================================= +void GeomAlgoAPI_Boolean::build(const ListOfShape& theObjects, + const ListOfShape& theTools, + const OperationType theOperationType) { - 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(theObjects.empty() || theTools.empty()) { + return; } - 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 objects. + TopTools_ListOfShape anObjects; + for(ListOfShape::const_iterator + anObjectsIt = theObjects.begin(); anObjectsIt != theObjects.end(); anObjectsIt++) + { + anObjects.Append((*anObjectsIt)->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; -} + // Getting tools. + TopTools_ListOfShape aTools; + for(ListOfShape::const_iterator + aToolsIt = theTools.begin(); aToolsIt != theTools.end(); aToolsIt++) + { + aTools.Append((*aToolsIt)->impl()); + } -//============================================================================ -void GeomAlgoAPI_Boolean::mapOfShapes (GeomAPI_DataMapOfShapeShape& theMap) const -{ - theMap = myMap; -} + // 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->HasErrors()) + return; + TopoDS_Shape aResult = aBuilder->Shape(); + + 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(); + } -//============================================================================ -GeomAlgoAPI_MakeShape * 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() -{ - if (myImpl) { - myMap.clear(); - } -} \ No newline at end of file