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)
17 PlaneGCSSolver_Solver::~PlaneGCSSolver_Solver()
22 void PlaneGCSSolver_Solver::clear()
24 myEquationSystem->clear();
26 myEqualConstraints.clear();
27 myEqualParameters.clear();
30 void PlaneGCSSolver_Solver::addConstraint(GCSConstraintPtr theConstraint)
32 myEquationSystem->addConstraint(theConstraint.get());
35 void PlaneGCSSolver_Solver::removeConstraint(ConstraintID theID)
37 myEquationSystem->clearByTag(theID);
40 SketchSolver_SolveStatus PlaneGCSSolver_Solver::solve()
42 // clear list of conflicting constraints
43 if (myConfCollected) {
44 myConflictingIDs.clear();
45 myConfCollected = false;
48 if (myParameters.empty())
49 return STATUS_INCONSISTENT;
51 Events_LongOp::start(this);
53 GCS::SolveStatus aResult = (GCS::SolveStatus)myEquationSystem->solve(myParameters);
54 Events_LongOp::end(this);
56 SketchSolver_SolveStatus aStatus;
57 if (aResult == GCS::Success) {
58 myEquationSystem->applySolution();
61 aStatus = STATUS_FAILED;
66 void PlaneGCSSolver_Solver::undo()
68 myEquationSystem->undoSolution();
71 bool PlaneGCSSolver_Solver::isConflicting(const ConstraintID& theConstraint) const
74 const_cast<PlaneGCSSolver_Solver*>(this)->collectConflicting();
75 return myConflictingIDs.find((int)theConstraint) != myConflictingIDs.end();
78 void PlaneGCSSolver_Solver::collectConflicting()
81 myEquationSystem->getConflicting(aConflict);
82 myConflictingIDs.insert(aConflict.begin(), aConflict.end());
84 myEquationSystem->getRedundant(aConflict);
85 myConflictingIDs.insert(aConflict.begin(), aConflict.end());
87 myConfCollected = true;
90 int PlaneGCSSolver_Solver::dof() const
92 return const_cast<PlaneGCSSolver_Solver*>(this)->myEquationSystem->dofsNumber();