Salome HOME
Issue #604 Creation of an unexpected line in the Sketcher
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintDistance.cpp
index 51f0d73592bfeb8c433a5e9267e119296b3ea613..d7313a49dfc9609d7fb5dad62dfa5b9b0469cce5 100644 (file)
@@ -4,6 +4,8 @@
 
 #include <GeomAPI_XY.h>
 
+#include <math.h>
+
 
 void SketchSolver_ConstraintDistance::process()
 {
@@ -53,18 +55,29 @@ void SketchSolver_ConstraintDistance::process()
       getType(), myGroup->getWorkplaneId(), aValue, aPoint[0], aPoint[1], aLine, SLVS_E_UNKNOWN);
   aConstraint.h = myStorage->addConstraint(aConstraint);
   mySlvsConstraints.push_back(aConstraint.h);
+
+  myPrevValue = 0.0;
   adjustConstraint();
 }
 
 void SketchSolver_ConstraintDistance::adjustConstraint()
 {
+  // Adjust point-line distance
   if (getType() != SLVS_C_PT_LINE_DISTANCE)
     return;
 
+  // Check the sign of distance is changed
+  Slvs_Constraint aConstraint = myStorage->getConstraint(mySlvsConstraints.front());
+  if (fabs(myPrevValue) == fabs(aConstraint.valA)) {
+    aConstraint.valA = myPrevValue;
+    myStorage->updateConstraint(aConstraint);
+    return;
+  }
+
   // Get constraint parameters and check the sign of constraint value
   std::vector<Slvs_hConstraint>::iterator aCIter = mySlvsConstraints.begin();
   for (; aCIter != mySlvsConstraints.end(); aCIter++) {
-    Slvs_Constraint aConstraint = myStorage->getConstraint(*aCIter);
+    aConstraint = myStorage->getConstraint(*aCIter);
     Slvs_Entity aLine = myStorage->getEntity(aConstraint.entityA);
     // Obtain point and line coordinates
     Slvs_hEntity aPointID[3] = {aConstraint.ptA, aLine.point[0], aLine.point[1]};
@@ -85,3 +98,9 @@ void SketchSolver_ConstraintDistance::adjustConstraint()
   }
 }
 
+void SketchSolver_ConstraintDistance::update(ConstraintPtr theConstraint)
+{
+  Slvs_Constraint aConstraint = myStorage->getConstraint(mySlvsConstraints.front());
+  myPrevValue = aConstraint.valA;
+  SketchSolver_Constraint::update(theConstraint);
+}