Salome HOME
Adding error handling.
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_EdgeBuilder.cpp
index 3c177a1787e65cce0425633c6ba3540bf2cf2c2e..97e62158a5adfb6f0875bf681de1a1d86af06f57 100644 (file)
@@ -130,9 +130,16 @@ std::shared_ptr<GeomAPI_Edge> GeomAlgoAPI_EdgeBuilder::lineCircleArc(
     std::shared_ptr<GeomAPI_Pnt> theCenter, std::shared_ptr<GeomAPI_Pnt> theStartPoint,
     std::shared_ptr<GeomAPI_Pnt> theEndPoint, std::shared_ptr<GeomAPI_Dir> theNormal)
 {
+  std::shared_ptr<GeomAPI_Edge> aRes;
+
   const gp_Pnt& aCenter = theCenter->impl<gp_Pnt>();
   const gp_Dir& aDir = theNormal->impl<gp_Dir>();
 
+  /// OCCT creates an edge on a circle with empty radius, but visualization
+  /// is not able to process it
+  if (theCenter->isEqual(theStartPoint))
+    return aRes;
+
   double aRadius = theCenter->distance(theStartPoint);
   gp_Circ aCircle(gp_Ax2(aCenter, aDir), aRadius);
 
@@ -140,18 +147,13 @@ std::shared_ptr<GeomAPI_Edge> GeomAlgoAPI_EdgeBuilder::lineCircleArc(
   const gp_Pnt& anEnd = theEndPoint->impl<gp_Pnt>();
 
   BRepBuilderAPI_MakeEdge anEdgeBuilder;
-  if (aStart.IsEqual(anEnd, Precision::Confusion())
-      || gp_Pnt(0, 0, 0).IsEqual(anEnd, Precision::Confusion()))
-    anEdgeBuilder = BRepBuilderAPI_MakeEdge(aCircle);
-  else
-    anEdgeBuilder = BRepBuilderAPI_MakeEdge(aCircle, aStart, anEnd);
+  anEdgeBuilder = BRepBuilderAPI_MakeEdge(aCircle, aStart, anEnd);
 
-  std::shared_ptr<GeomAPI_Edge> aRes(new GeomAPI_Edge);
   anEdgeBuilder.Build();
 
-  if (anEdgeBuilder.IsDone())
+  if (anEdgeBuilder.IsDone()) {
+    aRes = std::shared_ptr<GeomAPI_Edge>(new GeomAPI_Edge);
     aRes->setImpl(new TopoDS_Shape(anEdgeBuilder.Edge()));
-  else
-    aRes = std::shared_ptr<GeomAPI_Edge>();
+  }
   return aRes;
 }