Salome HOME
Issue #3055: Fatal error when setting angle
authorazv <azv@opencascade.com>
Thu, 17 Oct 2019 12:04:30 +0000 (15:04 +0300)
committerazv <azv@opencascade.com>
Thu, 17 Oct 2019 12:04:30 +0000 (15:04 +0300)
Improve calculation of flyout point position to avoid the crash.

src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp

index 2bfd5c34be1cdb0a4c8a782e840b44ec01fd823e..b856543b3921c3ca51a3eb9f7213912b4fddd554 100644 (file)
@@ -307,9 +307,19 @@ bool SketchPlugin_ConstraintAngle::compute(const std::string& theAttributeId)
   if (aStartA->distance(aEndA) < tolerance)
     return false;
 
+  std::shared_ptr<GeomDataAPI_Point2D> aPointB1 = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+      aLineB->attribute(SketchPlugin_Line::START_ID()));
+  std::shared_ptr<GeomDataAPI_Point2D> aPointB2 = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+      aLineB->attribute(SketchPlugin_Line::END_ID()));
+
+  std::shared_ptr<GeomAPI_Pnt2d> aStartB = aPointB1->pnt();
+  std::shared_ptr<GeomAPI_Pnt2d> aEndB = aPointB2->pnt();
+  if (aStartB->distance(aEndB) < tolerance)
+    return false;
+
   myFlyoutUpdate = true;
-  double aX = (aStartA->x() + aEndA->x()) / 2.;
-  double aY = (aStartA->y() + aEndA->y()) / 2.;
+  double aX = (aStartA->x() + aEndA->x() + aStartB->x() + aEndB->x()) / 4.;
+  double aY = (aStartA->y() + aEndA->y() + aStartB->y() + aEndB->y()) / 4.;
 
   aFlyOutAttr->setValue(aX, aY);
   myFlyoutUpdate = false;