Salome HOME
Fix for stable processing of mirror constraint (eliminating SolveSpace problems)
[modules/shaper.git] / src / GeomAPI / GeomAPI_Edge.cpp
index d2d0248f29a880bccb33505b4145ed5cabc1c25d..4b758eb90da225df14b56d7a9cf0e3c519de3ec1 100644 (file)
@@ -46,8 +46,12 @@ bool GeomAPI_Edge::isCircle() const
   const TopoDS_Shape& aShape = const_cast<GeomAPI_Edge*>(this)->impl<TopoDS_Shape>();
   double aFirst, aLast;
   Handle(Geom_Curve) aCurve = BRep_Tool::Curve((const TopoDS_Edge&)aShape, aFirst, aLast);
-  if (aCurve->IsKind(STANDARD_TYPE(Geom_Circle)) && aCurve->IsClosed())
-    return true;
+  if (aCurve->IsKind(STANDARD_TYPE(Geom_Circle)))
+  {
+    // Check the difference of first and last parameters to be equal to the curve period
+    if (Abs(aLast - aFirst - aCurve->Period()) < Precision::PConfusion())
+      return true;
+  }
   return false;
 }
 
@@ -56,8 +60,12 @@ bool GeomAPI_Edge::isArc() const
   const TopoDS_Shape& aShape = const_cast<GeomAPI_Edge*>(this)->impl<TopoDS_Shape>();
   double aFirst, aLast;
   Handle(Geom_Curve) aCurve = BRep_Tool::Curve((const TopoDS_Edge&)aShape, aFirst, aLast);
-  if (aCurve->IsKind(STANDARD_TYPE(Geom_Circle)) && !aCurve->IsClosed())
-    return true;
+  if (aCurve->IsKind(STANDARD_TYPE(Geom_Circle)))
+  {
+    // Check the difference of first and last parameters is not equal the curve period
+    if (Abs(aLast - aFirst - aCurve->Period()) >= Precision::PConfusion())
+      return true;
+  }
   return false;
 }
 
@@ -100,11 +108,14 @@ std::shared_ptr<GeomAPI_Circ> GeomAPI_Edge::circle()
 }
 
 
-bool GeomAPI_Edge::isEqual(std::shared_ptr<GeomAPI_Shape> theEdge)
+bool GeomAPI_Edge::isEqual(const std::shared_ptr<GeomAPI_Shape> theEdge) const
 {
   const TopoDS_Shape& aMyShape = const_cast<GeomAPI_Edge*>(this)->impl<TopoDS_Shape>();
   const TopoDS_Shape& aInShape = theEdge->impl<TopoDS_Shape>();
-  
+
+  if (aMyShape.ShapeType() != aInShape.ShapeType())
+    return false;
+
   double aMyStart, aMyEnd;
   Handle(Geom_Curve) aMyCurve = BRep_Tool::Curve(TopoDS::Edge(aMyShape), aMyStart, aMyEnd);
   double aInStart, aInEnd;