]> SALOME platform Git repositories - modules/shaper.git/blob - src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Solver.cpp
Salome HOME
SketchSolver Refactoring: Eliminate SolveSpace as a sketch solver.
[modules/shaper.git] / src / SketchSolver / PlaneGCSSolver / PlaneGCSSolver_Solver.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:    PlaneGCSSolver_Solver.cpp
4 // Created: 14 Dec 2014
5 // Author:  Artem ZHIDKOV
6
7 #include "PlaneGCSSolver_Solver.h"
8 #include <Events_LongOp.h>
9
10
11 PlaneGCSSolver_Solver::PlaneGCSSolver_Solver()
12   : myEquationSystem(new GCS::System),
13     myConfCollected(false)
14 {
15 }
16
17 PlaneGCSSolver_Solver::~PlaneGCSSolver_Solver()
18 {
19   clear();
20 }
21
22 void PlaneGCSSolver_Solver::clear()
23 {
24   myEquationSystem->clear();
25   myParameters.clear();
26   myEqualConstraints.clear();
27   myEqualParameters.clear();
28 }
29
30 void PlaneGCSSolver_Solver::addConstraint(GCSConstraintPtr theConstraint)
31 {
32   myEquationSystem->addConstraint(theConstraint.get());
33 }
34
35 void PlaneGCSSolver_Solver::removeConstraint(ConstraintID theID)
36 {
37   myEquationSystem->clearByTag(theID);
38 }
39
40 SketchSolver_SolveStatus PlaneGCSSolver_Solver::solve()
41 {
42   // clear list of conflicting constraints
43   if (myConfCollected) {
44     myConflictingIDs.clear();
45     myConfCollected = false;
46   }
47
48   if (myParameters.empty())
49     return STATUS_INCONSISTENT;
50
51   Events_LongOp::start(this);
52   // solve equations
53   GCS::SolveStatus aResult = (GCS::SolveStatus)myEquationSystem->solve(myParameters);
54   Events_LongOp::end(this);
55
56   SketchSolver_SolveStatus aStatus;
57   if (aResult == GCS::Success) {
58     myEquationSystem->applySolution();
59     aStatus = STATUS_OK;
60   } else
61     aStatus = STATUS_FAILED;
62
63   return aStatus;
64 }
65
66 void PlaneGCSSolver_Solver::undo()
67 {
68   myEquationSystem->undoSolution();
69 }
70
71 bool PlaneGCSSolver_Solver::isConflicting(const ConstraintID& theConstraint) const
72 {
73   if (!myConfCollected)
74     const_cast<PlaneGCSSolver_Solver*>(this)->collectConflicting();
75   return myConflictingIDs.find((int)theConstraint) != myConflictingIDs.end();
76 }
77
78 void PlaneGCSSolver_Solver::collectConflicting()
79 {
80   GCS::VEC_I aConflict;
81   myEquationSystem->getConflicting(aConflict);
82   myConflictingIDs.insert(aConflict.begin(), aConflict.end());
83
84   myEquationSystem->getRedundant(aConflict);
85   myConflictingIDs.insert(aConflict.begin(), aConflict.end());
86
87   myConfCollected = true;
88 }
89
90 int PlaneGCSSolver_Solver::dof() const
91 {
92   return const_cast<PlaneGCSSolver_Solver*>(this)->myEquationSystem->dofsNumber();
93 }