]> SALOME platform Git repositories - modules/shaper.git/blob - src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Solver.h
Salome HOME
Issue #2133: Edge with middle node constraint can be moved
[modules/shaper.git] / src / SketchSolver / PlaneGCSSolver / PlaneGCSSolver_Solver.h
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:    PlaneGCSSolver_Solver.h
4 // Created: 14 Dec 2014
5 // Author:  Artem ZHIDKOV
6
7 #ifndef PlaneGCSSolver_Solver_H_
8 #define PlaneGCSSolver_Solver_H_
9
10 #include <PlaneGCSSolver_Defs.h>
11 #include <PlaneGCSSolver_ConstraintWrapper.h>
12
13 #include <GCS.h>
14
15 /// \brief The main class that performs the high-level operations for connection to the PlaneGCS.
16 class PlaneGCSSolver_Solver
17 {
18 public:
19   /// The result of constraints solution
20   enum SolveStatus {
21     STATUS_OK,
22     STATUS_INCONSISTENT,
23     STATUS_EMPTYSET,
24     STATUS_FAILED, // set if no one other status is applicable
25     STATUS_UNKNOWN // set for newly created groups
26   };
27
28   PlaneGCSSolver_Solver();
29   ~PlaneGCSSolver_Solver();
30
31   /// \brief Clear system of equations
32   void clear();
33
34   /// \brief Add constraint to the system of equations
35   void addConstraint(GCSConstraintPtr theConstraint);
36
37   /// \brief Remove constraint from the system of equations
38   void removeConstraint(ConstraintID theID);
39
40   /// \brief Initialize memory for new solver's parameter
41   double* createParameter();
42   /// \brief Release memory occupied by parameters
43   void removeParameters(const GCS::SET_pD& theParams);
44
45   /// \brief Preliminary initialization of solver (useful for moving a feature).
46   ///        When called, the solve() method does not reinitialize a set of constraints.
47   void initialize();
48
49   /// \brief Solve the set of equations
50   /// \return identifier whether solution succeeded
51   SolveStatus solve();
52
53   /// \brief Revert solution to initial values
54   void undo();
55
56   /// \brief Check the constraint is conflicted with others
57   bool isConflicting(const ConstraintID& theConstraint) const;
58
59   /// \brief Check conflicting/redundant constraints and DoF
60   void diagnose();
61
62   /// \brief Degrees of freedom
63   int dof();
64
65 private:
66   void collectConflicting();
67
68 private:
69   typedef std::map<ConstraintID, std::set<GCSConstraintPtr> > ConstraintMap;
70
71   GCS::VEC_pD                  myParameters;     ///< list of unknowns
72   ConstraintMap                myConstraints;    ///< list of constraints
73
74   std::shared_ptr<GCS::System> myEquationSystem; ///< set of equations for solving in FreeGCS
75   bool                         myDiagnoseBeforeSolve; ///< is the diagnostic necessary
76   bool                         myInitilized;     ///< is the system already initialized
77
78   GCS::SET_I                   myConflictingIDs; ///< list of IDs of conflicting constraints
79   /// specifies the conflicting constraints are already collected
80   bool                         myConfCollected;
81
82   int                          myDOF;            ///< degrees of freedom
83 };
84
85 typedef std::shared_ptr<PlaneGCSSolver_Solver> SolverPtr;
86
87 #endif