Salome HOME
updated copyright message
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_Revolution.cpp
index 193dcbfbb94b2bdbcedad042f02886738127c55d..dbd5ef788bde3bbb419b788d369949e2d764d624 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2020  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -70,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,
@@ -146,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);
     }
   }
 
@@ -591,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,