X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Revolution.cpp;h=a041268daac7d9d24b8416ce3fbf733232d4804a;hb=98ac3fe4aa897d878ee3ef2bf2ab3a238a8c5977;hp=e7a035cc1b4c4f071bfe8fc08520a763edf66385;hpb=5ae4adba8e5c3406f5dc88c87a63e5cbb0c334f8;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Revolution.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Revolution.cpp index e7a035cc1..a041268da 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Revolution.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Revolution.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2021 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 @@ -12,10 +12,9 @@ // // 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 +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "GeomAlgoAPI_Revolution.h" @@ -71,6 +70,9 @@ static gp_Pnt centreOfMass(const TopoDS_Shape& theShape); /// \return solid. static TopoDS_Shape findClosest(const TopoDS_Shape& theShape, const gp_Pnt& thePoint); +/// \brief Create plane by 3 points. Return empty handle if failed. +static Handle(Geom_Plane) makePlane(const gp_Pnt& theP1, const gp_Pnt& theP2, const gp_Pnt& theP3); + static void storeGenerationHistory(GeomAlgoAPI_Revolution* theRevolutionAlgo, const TopoDS_Shape& theBase, const TopAbs_ShapeEnum theType, @@ -147,31 +149,21 @@ void GeomAlgoAPI_Revolution::build(const GeomShapePtr& theBaseSh aBasePlane = aFindPlane.Plane(); } else { gp_Pnt aPnt1 = anAxis.Location(); - gp_Pnt aPnt2 = aPnt1; - aPnt2.Translate(anAxis.Direction()); - gp_Pnt aPnt3; - - for(TopExp_Explorer anExp(aBaseShape, TopAbs_VERTEX); anExp.More(); anExp.Next()) { - aPnt3 = BRep_Tool::Pnt(TopoDS::Vertex(anExp.Current())); - GC_MakePlane aMkPlane(aPnt1, aPnt2, aPnt3); - if(aMkPlane.IsDone() != Standard_True) { - continue; - } + TopExp_Explorer anExp(aBaseShape, TopAbs_VERTEX); + gp_Pnt aPnt2 = BRep_Tool::Pnt(TopoDS::Vertex(anExp.Current())); + gp_Pnt aPnt3 = aPnt1; - aBasePlane = aMkPlane.Value(); - break; + for (anExp.Next(); anExp.More() && aBasePlane.IsNull(); anExp.Next()) { + aPnt3 = BRep_Tool::Pnt(TopoDS::Vertex(anExp.Current())); + aBasePlane = makePlane(aPnt1, aPnt2, aPnt3); } if(aBasePlane.IsNull()) { - aPnt3 = centreOfMass(aBaseShape); - - GC_MakePlane aMkPlane(aPnt1, aPnt2, aPnt3); - if(aMkPlane.IsDone() != Standard_True) { - return; - } - - aBasePlane = aMkPlane.Value(); + gp_Pnt aPossiblePoints[] = { aPnt1.Translated(anAxis.Direction()), centreOfMass(aBaseShape) }; + for (auto it = std::begin(aPossiblePoints); + it != std::end(aPossiblePoints) && aBasePlane.IsNull(); ++it) + aBasePlane = makePlane(aPnt1, aPnt2, *it); } } @@ -314,11 +306,10 @@ void GeomAlgoAPI_Revolution::build(const GeomShapePtr& theBaseSh if(aResult.ShapeType() == TopAbs_COMPOUND) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aResult)); - ListOfShape aCompSolids, aFreeSolids; + ListOfShape aResults; aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, - aCompSolids, - aFreeSolids); + aResults); aResult = aGeomShape->impl(); } @@ -484,11 +475,10 @@ void GeomAlgoAPI_Revolution::build(const GeomShapePtr& theBaseSh if(aResult.ShapeType() == TopAbs_COMPOUND) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aResult)); - ListOfShape aCompSolids, aFreeSolids; + ListOfShape aResults; aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, - aCompSolids, - aFreeSolids); + aResults); aResult = aGeomShape->impl(); } @@ -594,6 +584,16 @@ TopoDS_Shape findClosest(const TopoDS_Shape& theShape, const gp_Pnt& thePoint) return aResult; } +//================================================================================================ +Handle(Geom_Plane) makePlane(const gp_Pnt& theP1, const gp_Pnt& theP2, const gp_Pnt& theP3) +{ + Handle(Geom_Plane) aPlane; + GC_MakePlane aMkPlane(theP1, theP2, theP3); + if (aMkPlane.IsDone()) + aPlane = aMkPlane.Value(); + return aPlane; +} + //================================================================================================ void storeGenerationHistory(GeomAlgoAPI_Revolution* theRevolutionAlgo, const TopoDS_Shape& theBase,