]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Solver.cpp
Salome HOME
Set the orientation of the Distance constraint
[modules/shaper.git] / src / SketchSolver / PlaneGCSSolver / PlaneGCSSolver_Solver.cpp
index 9c4cad57d2a7488cc3fba558c3f5ab04b63cbd6a..75919af5f55a50f941f15f9e7d1ad41bf7253261 100644 (file)
@@ -152,6 +152,30 @@ PlaneGCSSolver_Solver::SolveStatus PlaneGCSSolver_Solver::solve()
   collectConflicting();
   if (!myConflictingIDs.empty())
     aResult = GCS::Failed;
+  else if (aResult == GCS::Failed) {
+    // DogLeg solver failed without conflicting constraints, try to use Levenberg-Marquardt solver
+    // if there are point-line distance constraints
+    ConstraintMap::iterator aCIt = myConstraints.begin();
+    for (; aCIt != myConstraints.end(); ++aCIt) {
+      if (aCIt->second.size() <= 1)
+        continue;
+      std::set<GCSConstraintPtr>::const_iterator anIt = aCIt->second.begin();
+      for (; anIt != aCIt->second.end(); ++anIt)
+        if ((*anIt)->getTypeId() == GCS::P2LDistance)
+          break;
+      if (anIt != aCIt->second.end())
+        break;
+    }
+
+    if (aCIt != myConstraints.end()) {
+      aResult = (GCS::SolveStatus)myEquationSystem->solve(
+          myParameters, true, GCS::LevenbergMarquardt);
+      myConfCollected = false;
+      collectConflicting();
+      if (!myConflictingIDs.empty())
+        aResult = GCS::Failed;
+    }
+  }
 
   SolveStatus aStatus;
   if (aResult == GCS::Failed)