1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
3 // File: PlaneGCSSolver_Solver.cpp
4 // Created: 14 Dec 2014
5 // Author: Artem ZHIDKOV
7 #include "PlaneGCSSolver_Solver.h"
8 #include <Events_LongOp.h>
11 PlaneGCSSolver_Solver::PlaneGCSSolver_Solver()
12 : myEquationSystem(new GCS::System),
13 myConfCollected(false),
18 PlaneGCSSolver_Solver::~PlaneGCSSolver_Solver()
23 void PlaneGCSSolver_Solver::clear()
25 myEquationSystem->clear();
27 myConstraints.clear();
28 myConflictingIDs.clear();
32 void PlaneGCSSolver_Solver::addConstraint(GCSConstraintPtr theConstraint)
34 myEquationSystem->addConstraint(theConstraint.get());
35 myConstraints[theConstraint->getTag()].insert(theConstraint);
39 void PlaneGCSSolver_Solver::removeConstraint(ConstraintID theID)
41 myConstraints.erase(theID);
42 if (myConstraints.empty()) {
43 myEquationSystem->clear();
44 myDOF = (int)myParameters.size();
46 myEquationSystem->clearByTag(theID);
51 double* PlaneGCSSolver_Solver::createParameter()
53 double* aResult = new double(0);
54 myParameters.push_back(aResult);
60 void PlaneGCSSolver_Solver::removeParameters(const GCS::SET_pD& theParams)
62 for (int i = (int)myParameters.size() - 1; i >= 0; --i)
63 if (theParams.find(myParameters[i]) != theParams.end()) {
64 myParameters.erase(myParameters.begin() + i);
69 SketchSolver_SolveStatus PlaneGCSSolver_Solver::solve()
71 // clear list of conflicting constraints
72 if (myConfCollected) {
73 myConflictingIDs.clear();
74 myConfCollected = false;
77 if (myParameters.empty())
78 return STATUS_INCONSISTENT;
80 Events_LongOp::start(this);
82 GCS::SolveStatus aResult = (GCS::SolveStatus)myEquationSystem->solve(myParameters);
83 Events_LongOp::end(this);
85 SketchSolver_SolveStatus aStatus;
86 if (aResult == GCS::Success) {
87 myEquationSystem->applySolution();
89 myDOF = myEquationSystem->dofsNumber();
92 aStatus = STATUS_FAILED;
97 void PlaneGCSSolver_Solver::undo()
99 myEquationSystem->undoSolution();
102 bool PlaneGCSSolver_Solver::isConflicting(const ConstraintID& theConstraint) const
104 if (!myConfCollected)
105 const_cast<PlaneGCSSolver_Solver*>(this)->collectConflicting();
106 return myConflictingIDs.find((int)theConstraint) != myConflictingIDs.end();
109 void PlaneGCSSolver_Solver::collectConflicting()
111 GCS::VEC_I aConflict;
112 myEquationSystem->getConflicting(aConflict);
113 myConflictingIDs.insert(aConflict.begin(), aConflict.end());
115 myEquationSystem->getRedundant(aConflict);
116 myConflictingIDs.insert(aConflict.begin(), aConflict.end());
118 myConfCollected = true;
121 int PlaneGCSSolver_Solver::dof()
123 if (myDOF < 0 && !myConstraints.empty())