X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_PaveFiller.cpp;h=6f9d183aa051b982da4108e6d5c6ff1619bc5d95;hb=f0cec241aae9ca16d86e166f45cb5c4987d2c792;hp=6d3d04dd96dd1ee8d9a9c8bcf1f73ff6a2810f15;hpb=a95effb94656e5d4721f86ccb6ffbc2572bb1214;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_PaveFiller.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_PaveFiller.cpp index 6d3d04dd9..6f9d183aa 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_PaveFiller.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_PaveFiller.cpp @@ -4,20 +4,18 @@ // Created: 27 August 2015 // Author: Dmitry Bobylev -#include +#include "GeomAlgoAPI_PaveFiller.h" #include #include #include #include -#include -#include #include +#include //================================================================================================= GeomAlgoAPI_PaveFiller::GeomAlgoAPI_PaveFiller(const ListOfShape& theListOfShape, const bool theIsMakeCompSolids) -: myDone(false) { build(theListOfShape, theIsMakeCompSolids); } @@ -29,7 +27,14 @@ void GeomAlgoAPI_PaveFiller::build(const ListOfShape& theListOfShape, const bool BOPAlgo_PaveFiller aPaveFiller; BOPCol_ListOfShape aListOfShape; for(ListOfShape::const_iterator anIt = theListOfShape.cbegin(); anIt != theListOfShape.cend(); anIt++) { - aListOfShape.Append((*anIt)->impl()); + const TopoDS_Shape& aShape = (*anIt)->impl(); + if(aShape.ShapeType() == TopAbs_COMPOUND) { + for(TopoDS_Iterator anIter(aShape); anIter.More(); anIter.Next()) { + aListOfShape.Append(anIter.Value()); + } + } else { + aListOfShape.Append(aShape); + } } aPaveFiller.SetArguments(aListOfShape); aPaveFiller.Perform(); @@ -39,7 +44,8 @@ void GeomAlgoAPI_PaveFiller::build(const ListOfShape& theListOfShape, const bool } BOPAlgo_Builder* aBuilder = new BOPAlgo_Builder(); - myMkShape.reset(new GeomAlgoAPI_MakeShape(aBuilder, GeomAlgoAPI_MakeShape::BOPAlgoBuilder)); + this->setImpl(aBuilder); + this->setBuilderType(OCCT_BOPAlgo_Builder); aBuilder->SetArguments(aListOfShape); aBuilder->PerformWithFiller(aPaveFiller); iErr = aBuilder->ErrorStatus(); @@ -52,67 +58,18 @@ void GeomAlgoAPI_PaveFiller::build(const ListOfShape& theListOfShape, const bool aResult = GeomAlgoAPI_DFLoader::refineResult(aResult); } if(theIsMakeCompSolids && aResult.ShapeType() == TopAbs_COMPOUND) { - std::shared_ptr aCompound(new GeomAPI_Shape); - aCompound->setImpl(new TopoDS_Shape(aResult)); + std::shared_ptr aGeomShape(new GeomAPI_Shape); + aGeomShape->setImpl(new TopoDS_Shape(aResult)); ListOfShape aCompSolids, aFreeSolids; - GeomAlgoAPI_ShapeTools::combineShapes(aCompound, GeomAPI_Shape::COMPSOLID, aCompSolids, aFreeSolids); - if(aCompSolids.size() == 1 && aFreeSolids.size() == 0) { - aResult = aCompSolids.front()->impl(); - } else if (aCompSolids.size() > 1 || (aCompSolids.size() >= 1 && aFreeSolids.size() >= 1)) { - TopoDS_Compound aResultComp; - TopoDS_Builder aBuilder; - aBuilder.MakeCompound(aResultComp); - for(ListOfShape::const_iterator anIter = aCompSolids.cbegin(); anIter != aCompSolids.cend(); anIter++) { - aBuilder.Add(aResultComp, (*anIter)->impl()); - } - for(ListOfShape::const_iterator anIter = aFreeSolids.cbegin(); anIter != aFreeSolids.cend(); anIter++) { - aBuilder.Add(aResultComp, (*anIter)->impl()); - } - aResult = aResultComp; - } - } - - // fill data map to keep correct orientation of sub-shapes - myMap.reset(new GeomAPI_DataMapOfShapeShape()); - 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); + aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, + GeomAPI_Shape::COMPSOLID, + aCompSolids, + aFreeSolids); + aResult = aGeomShape->impl(); } - myShape.reset(new GeomAPI_Shape()); - myShape->setImpl(new TopoDS_Shape(aResult)); - - myDone = true; -} - -//================================================================================================= -const bool GeomAlgoAPI_PaveFiller::isDone() const -{ - return myDone; -} - -//================================================================================================= -const bool GeomAlgoAPI_PaveFiller::isValid() const -{ - BRepCheck_Analyzer aChecker(myShape->impl()); - return (aChecker.IsValid() == Standard_True); -} - -//================================================================================================= -std::shared_ptr GeomAlgoAPI_PaveFiller::shape() const -{ - return myShape; -} - -//================================================================================================= -std::shared_ptr GeomAlgoAPI_PaveFiller::mapOfShapes() const -{ - return myMap; -} - -//================================================================================================= -std::shared_ptr GeomAlgoAPI_PaveFiller::makeShape() const -{ - return myMkShape; + std::shared_ptr aShape(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aResult)); + this->setShape(aShape); + this->setDone(true); }