Salome HOME
Incorrect processing of middle point on line (issue #1511)
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintMiddle.cpp
index 826a429af129d5b796ec0b7c9d1fc1b19f1c2aa5..5c1a98604aa781cb60ad09099d8fbc34f2b40b03 100644 (file)
@@ -1,5 +1,10 @@
 #include <SketchSolver_ConstraintMiddle.h>
 
+#include <SketchSolver_Builder.h>
+#include <SketchSolver_Manager.h>
+
+#include <GeomAPI_XY.h>
+
 SketchSolver_ConstraintMiddle::SketchSolver_ConstraintMiddle(ConstraintPtr theConstraint)
   : SketchSolver_Constraint(theConstraint)
 {
@@ -39,3 +44,31 @@ void SketchSolver_ConstraintMiddle::notifyCoincidenceChanged(
     process();
   }
 }
+
+void SketchSolver_ConstraintMiddle::adjustConstraint()
+{
+  BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
+
+  ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front();
+  const std::list<EntityWrapperPtr>& aSubs = aConstraint->entities();
+  std::shared_ptr<GeomAPI_Pnt2d> aMidPoint, aStart, aEnd;
+  std::list<EntityWrapperPtr>::const_iterator aSIt = aSubs.begin();
+  for (; aSIt != aSubs.end(); ++aSIt) {
+    if ((*aSIt)->type() == ENTITY_POINT)
+      aMidPoint = aBuilder->point(*aSIt);
+    else if ((*aSIt)->type() == ENTITY_LINE) {
+      const std::list<EntityWrapperPtr>& aLinePoints = (*aSIt)->subEntities();
+      aStart = aBuilder->point(aLinePoints.front());
+      aEnd = aBuilder->point(aLinePoints.back());
+    }
+  }
+
+  if (aMidPoint && aStart && aEnd) {
+    std::shared_ptr<GeomAPI_XY> aMP = aMidPoint->xy();
+    double aDot = aMP->decreased(aStart->xy())->dot(aMP->decreased(aEnd->xy()));
+    if (aDot > 0.0) {
+      aBuilder->adjustConstraint(aConstraint);
+      myStorage->addConstraint(myBaseConstraint, aConstraint);
+    }
+  }
+}