]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Solver.cpp
Salome HOME
Merge branch 'Pre_2.8.0_development'
[modules/shaper.git] / src / SketchSolver / PlaneGCSSolver / PlaneGCSSolver_Solver.cpp
index 38b60f7fef31009e8b4725e8c251fb53af5c7466..9c4cad57d2a7488cc3fba558c3f5ab04b63cbd6a 100644 (file)
@@ -27,7 +27,8 @@ PlaneGCSSolver_Solver::PlaneGCSSolver_Solver()
     myDiagnoseBeforeSolve(false),
     myInitilized(false),
     myConfCollected(false),
-    myDOF(0)
+    myDOF(0),
+    myFictiveConstraint(0)
 {
 }
 
@@ -43,6 +44,8 @@ void PlaneGCSSolver_Solver::clear()
   myConstraints.clear();
   myConflictingIDs.clear();
   myDOF = 0;
+
+  removeFictiveConstraint();
 }
 
 void PlaneGCSSolver_Solver::addConstraint(GCSConstraintPtr theConstraint)
@@ -109,6 +112,7 @@ void PlaneGCSSolver_Solver::removeParameters(const GCS::SET_pD& theParams)
 void PlaneGCSSolver_Solver::initialize()
 {
   Events_LongOp::start(this);
+  addFictiveConstraintIfNecessary();
   if (myDiagnoseBeforeSolve)
     diagnose();
   myEquationSystem->declareUnknowns(myParameters);
@@ -134,6 +138,8 @@ PlaneGCSSolver_Solver::SolveStatus PlaneGCSSolver_Solver::solve()
   if (myInitilized) {
     aResult = (GCS::SolveStatus)myEquationSystem->solve();
   } else {
+    addFictiveConstraintIfNecessary();
+
     if (myDiagnoseBeforeSolve)
       diagnose();
     aResult = (GCS::SolveStatus)myEquationSystem->solve(myParameters);
@@ -157,6 +163,7 @@ PlaneGCSSolver_Solver::SolveStatus PlaneGCSSolver_Solver::solve()
     aStatus = STATUS_OK;
   }
 
+  removeFictiveConstraint();
   myInitilized = false;
   return aStatus;
 }
@@ -198,3 +205,34 @@ void PlaneGCSSolver_Solver::diagnose()
   myDOF = myEquationSystem->diagnose();
   myDiagnoseBeforeSolve = false;
 }
+
+void PlaneGCSSolver_Solver::addFictiveConstraintIfNecessary()
+{
+  if (!myConstraints.empty() &&
+      myConstraints.find(CID_MOVEMENT) == myConstraints.end())
+    return;
+
+  if (myFictiveConstraint)
+    return; // no need several fictive constraints
+
+  double* aParam = createParameter();
+  double* aFictiveParameter = new double(0.0);
+
+  myFictiveConstraint = new GCS::ConstraintEqual(aFictiveParameter, aParam);
+  myFictiveConstraint->setTag(CID_FICTIVE);
+  myEquationSystem->addConstraint(myFictiveConstraint);
+}
+
+void PlaneGCSSolver_Solver::removeFictiveConstraint()
+{
+  if (myFictiveConstraint) {
+    myEquationSystem->removeConstraint(myFictiveConstraint);
+    myParameters.pop_back();
+
+    GCS::VEC_pD aParams = myFictiveConstraint->params();
+    for (GCS::VEC_pD::iterator anIt = aParams.begin(); anIt != aParams.end(); ++ anIt)
+      delete *anIt;
+    delete myFictiveConstraint;
+    myFictiveConstraint = 0;
+  }
+}