Salome HOME
Issue #2148: Moving an arc displays a circle
[modules/shaper.git] / src / SketchSolver / SketchSolver_Group.cpp
index 4f40f1d9c6376e551c8e7af1b18fad4f9120c1e0..a0a7d362408d8fa2d5b6df058fcbc7d3b1511d0a 100644 (file)
@@ -125,13 +125,19 @@ bool SketchSolver_Group::moveFeature(FeaturePtr theFeature)
   }
 
   // Create temporary Fixed constraint
-  SolverConstraintPtr aConstraint = PlaneGCSSolver_Tools::createMovementConstraint(theFeature);
+  std::shared_ptr<SketchSolver_ConstraintFixed> aConstraint =
+      PlaneGCSSolver_Tools::createMovementConstraint(theFeature);
   if (!aConstraint)
     return false;
-  aConstraint->process(myStorage, myIsEventsBlocked);
-  if (aConstraint->error().empty())
+  SolverConstraintPtr(aConstraint)->process(myStorage, myIsEventsBlocked);
+  if (aConstraint->error().empty()) {
     setTemporary(aConstraint);
-  else
+    if (!myStorage->isEmpty())
+      myStorage->setNeedToResolve(true);
+
+    mySketchSolver->initialize();
+    aConstraint->moveFeature();
+  } else
     myStorage->notify(theFeature);
 
   return true;
@@ -144,8 +150,10 @@ bool SketchSolver_Group::moveFeature(FeaturePtr theFeature)
 // ============================================================================
 bool SketchSolver_Group::resolveConstraints()
 {
+  static const int MAX_STACK_SIZE = 5;
   // check the "Multi" constraints do not drop sketch into infinite loop
-  if (myMultiConstraintUpdateStack > 1) {
+  if (myMultiConstraintUpdateStack > MAX_STACK_SIZE) {
+    myMultiConstraintUpdateStack = 0;
     myPrevResult = PlaneGCSSolver_Solver::STATUS_FAILED;
     // generate error message due to loop update of the sketch
     getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR())
@@ -162,8 +170,14 @@ bool SketchSolver_Group::resolveConstraints()
 
     PlaneGCSSolver_Solver::SolveStatus aResult = PlaneGCSSolver_Solver::STATUS_OK;
     try {
-      if (!isGroupEmpty && myMultiConstraintUpdateStack <= 1)
+      if (!isGroupEmpty)
+        aResult = mySketchSolver->solve();
+      if (aResult == PlaneGCSSolver_Solver::STATUS_FAILED &&
+          !myTempConstraints.empty()) {
+        mySketchSolver->undo();
+        removeTemporaryConstraints();
         aResult = mySketchSolver->solve();
+      }
     } catch (...) {
       getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR())
         ->setValue(SketchSolver_Error::SOLVESPACE_CRASH());
@@ -185,7 +199,6 @@ bool SketchSolver_Group::resolveConstraints()
       // additional check that copied entities used in Mirror and other "Multi" constraints
       // is not connected with their originals by constraints.
       myMultiConstraintUpdateStack += 1;
-      updateMultiConstraints();
       aResolved = true;
       if (myStorage->isNeedToResolve())
         aResolved = resolveConstraints();
@@ -251,6 +264,8 @@ void SketchSolver_Group::computeDoF()
 {
   std::ostringstream aDoFMsg;
   int aDoF = mySketchSolver->dof();
+  /// "DoF = 0" content of string value is used in PartSet by Sketch edit
+  /// If it is changed, it should be corrected also there
   if (aDoF == 0)
     aDoFMsg << "Sketch is fully fixed (DoF = 0)";
   else
@@ -366,22 +381,6 @@ void SketchSolver_Group::blockEvents(bool isBlocked)
   myIsEventsBlocked = isBlocked;
 }
 
-// ============================================================================
-//  Function: updateMultiConstraints
-//  Class:    SketchSolver_Group
-//  Purpose:  update multi constraints
-// ============================================================================
-void SketchSolver_Group::updateMultiConstraints()
-{
-  ConstraintConstraintMap::iterator anIt = myConstraints.begin();
-  for (; anIt != myConstraints.end(); ++anIt) {
-    if (anIt->first->getKind() == SketchPlugin_ConstraintMirror::ID() ||
-        anIt->first->getKind() == SketchPlugin_MultiRotation::ID() ||
-        anIt->first->getKind() == SketchPlugin_MultiTranslation::ID())
-      anIt->second->update();
-  }
-}
-
 bool SketchSolver_Group::areConstraintsValid() const
 {
   // Check the constraints are valid