X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Partition.cpp;h=63a1ddc9e4b87a9cf3aaa7a27e72e73f30518ebe;hb=530f5aff42069e844c4a4ef164088ea23ba0e2dd;hp=c9baa888eb48bf84dc31fddf53fa9c2e4a5bed2e;hpb=1b93f1881c5fec599aa79707f93c84dd9c287bc0;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp index c9baa888e..63a1ddc9e 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp @@ -11,31 +11,16 @@ #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include #include -#include -#include //================================================================================================= std::shared_ptr GeomAlgoAPI_Partition::make(const ListOfShape& theObjects, const ListOfShape& theTools) { - GeomAlgoAPI_Partition aBoolAlgo(theObjects, theTools); - if(aBoolAlgo.isDone() && !aBoolAlgo.shape()->isNull() && aBoolAlgo.isValid()) { - return aBoolAlgo.shape(); + GeomAlgoAPI_Partition aPartitionAlgo(theObjects, theTools); + if(aPartitionAlgo.isDone() && !aPartitionAlgo.shape()->isNull() && aPartitionAlgo.isValid()) { + return aPartitionAlgo.shape(); } return std::shared_ptr(); } @@ -43,7 +28,6 @@ std::shared_ptr GeomAlgoAPI_Partition::make(const ListOfShape& th //================================================================================================= GeomAlgoAPI_Partition::GeomAlgoAPI_Partition(const ListOfShape& theObjects, const ListOfShape& theTools) -: myDone(false) { build(theObjects, theTools); } @@ -59,77 +43,27 @@ void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects, // Creating partition operation. GEOMAlgo_Splitter* anOperation = new GEOMAlgo_Splitter; - myMkShape.reset(new GeomAlgoAPI_MakeShape(anOperation, GeomAlgoAPI_MakeShape::BOPAlgoBuilder)); - - // Bounding box of all objects. - Bnd_Box aBndBox; + this->setImpl(anOperation); + this->setBuilderType(OCCT_BOPAlgo_Builder); // Getting objects. for (ListOfShape::const_iterator anObjectsIt = theObjects.begin(); anObjectsIt != theObjects.end(); anObjectsIt++) { const TopoDS_Shape& aShape = (*anObjectsIt)->impl(); - BRepBndLib::Add(aShape, aBndBox); anOperation->AddArgument(aShape); } - // We enlarge bounding box just to be sure that plane will be large enough to cut all objects. - aBndBox.Enlarge(1.0); - Standard_Real aXArr[2] = {aBndBox.CornerMin().X(), aBndBox.CornerMax().X()}; - Standard_Real aYArr[2] = {aBndBox.CornerMin().Y(), aBndBox.CornerMax().Y()}; - Standard_Real aZArr[2] = {aBndBox.CornerMin().Z(), aBndBox.CornerMax().Z()}; - gp_Pnt aPoints[8]; - int aNum = 0; - for(int i = 0; i < 2; i++) { - for(int j = 0; j < 2; j++) { - for(int k = 0; k < 2; k++) { - aPoints[aNum] = gp_Pnt(aXArr[i], aYArr[j], aZArr[k]); - aNum++; - } - } - } - // Getting tools. for (ListOfShape::const_iterator aToolsIt = theTools.begin(); aToolsIt != theTools.end(); aToolsIt++) { - TopoDS_Shape aShape = (*aToolsIt)->impl(); - if(aShape.ShapeType() == TopAbs_FACE) { - TopoDS_Face aFace = TopoDS::Face(aShape); - Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace); - if (!aSurf.IsNull()) { - GeomLib_IsPlanarSurface isPlanar(aSurf); - if(isPlanar.IsPlanar()) { - Standard_Real UMin, UMax, VMin, VMax; - BRepTools::UVBounds(aFace, UMin, UMax, VMin, VMax); - if(UMin == -Precision::Infinite() && UMax == Precision::Infinite() && - VMin == -Precision::Infinite() && VMax == Precision::Infinite()) { - const gp_Pln& aFacePln = isPlanar.Plan(); - Handle(Geom_Plane) aFacePlane = new Geom_Plane(aFacePln); - IntAna_Quadric aQuadric(aFacePln); - UMin = UMax = VMin = VMax = 0; - for(int i = 0; i < 8; i++) { - gp_Lin aLin(aPoints[i], aFacePln.Axis().Direction()); - IntAna_IntConicQuad anIntAna(aLin, aQuadric); - const gp_Pnt& aPntOnFace = anIntAna.Point(1); - Standard_Real aPntU(0), aPntV(0); - GeomLib_Tool::Parameters(aFacePlane, aPntOnFace, Precision::Confusion(), aPntU, aPntV); - if(aPntU < UMin) UMin = aPntU; - if(aPntU > UMax) UMax = aPntU; - if(aPntV < VMin) VMin = aPntV; - if(aPntV > VMax) VMax = aPntV; - } - aShape = BRepLib_MakeFace(aFacePln, UMin, UMax, VMin, VMax).Face(); - } - } - } - } + const TopoDS_Shape& aShape = (*aToolsIt)->impl(); anOperation->AddTool(aShape); } // Building and getting result. anOperation->Perform(); - TopoDS_Shape aResult = anOperation->Shape(); - myDone = !aResult.IsNull(); - if (!myDone) { + if(anOperation->ErrorStatus() != 0) { return; } + TopoDS_Shape aResult = anOperation->Shape(); if(aResult.ShapeType() == TopAbs_COMPOUND) { aResult = GeomAlgoAPI_DFLoader::refineResult(aResult); @@ -155,44 +89,8 @@ void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects, } } - // 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); - } - myShape.reset(new GeomAPI_Shape()); - myShape->setImpl(new TopoDS_Shape(aResult)); -} - -//================================================================================================= -const bool GeomAlgoAPI_Partition::isDone() const -{ - return myDone; -} - -//================================================================================================= -const bool GeomAlgoAPI_Partition::isValid() const -{ - BRepCheck_Analyzer aChecker(myShape->impl()); - return (aChecker.IsValid() == Standard_True); -} - -//================================================================================================= -const std::shared_ptr& GeomAlgoAPI_Partition::shape() const -{ - return myShape; -} - -//================================================================================================= -std::shared_ptr GeomAlgoAPI_Partition::mapOfShapes() const -{ - return myMap; -} - -//================================================================================================= -std::shared_ptr GeomAlgoAPI_Partition::makeShape() const -{ - return myMkShape; + std::shared_ptr aShape(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aResult)); + this->setShape(aShape); + this->setDone(true); }