]> SALOME platform Git repositories - modules/shaper.git/blob - src/SketchSolver/SketchSolver_Solver.cpp
Salome HOME
Strange conflicting constraints error (issue #936)
[modules/shaper.git] / src / SketchSolver / SketchSolver_Solver.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:    SketchSolver_Solver.cpp
4 // Created: 07 May 2014
5 // Author:  Artem ZHIDKOV
6
7 #include "SketchSolver_Solver.h"
8 #include <Events_LongOp.h>
9
10 SketchSolver_Solver::SketchSolver_Solver()
11 {
12   // Nullify all elements of the set of equations
13   myEquationsSystem.param = 0;
14   myEquationsSystem.params = 0;
15   myEquationsSystem.entity = 0;
16   myEquationsSystem.entities = 0;
17   myEquationsSystem.constraint = 0;
18   myEquationsSystem.constraints = 0;
19   myEquationsSystem.failed = 0;
20   myEquationsSystem.faileds = 0;
21
22   myEquationsSystem.dragged[0] = 0;
23   myEquationsSystem.dragged[1] = 0;
24   myEquationsSystem.dragged[2] = 0;
25   myEquationsSystem.dragged[3] = 0;
26
27   // If the set of constraints is inconsistent,
28   // the failed field will contain wrong constraints
29   myEquationsSystem.calculateFaileds = 1;
30 }
31
32 SketchSolver_Solver::~SketchSolver_Solver()
33 {
34   if (myEquationsSystem.constraint)
35     delete[] myEquationsSystem.constraint;
36   myEquationsSystem.constraint = 0;
37   if (myEquationsSystem.failed)
38     delete[] myEquationsSystem.failed;
39   myEquationsSystem.failed = 0;
40 }
41
42 void SketchSolver_Solver::setParameters(Slvs_Param* theParameters, int theSize)
43 {
44   myEquationsSystem.param = theParameters;
45   myEquationsSystem.params = theSize;
46 }
47
48
49 void SketchSolver_Solver::setDraggedParameters(const Slvs_hParam* theDragged)
50 {
51   for (unsigned int i = 0; i < 4; i++)
52     myEquationsSystem.dragged[i] = theDragged[i];
53 }
54
55 void SketchSolver_Solver::setEntities(Slvs_Entity* theEntities, int theSize)
56 {
57   myEquationsSystem.entity = theEntities;
58   myEquationsSystem.entities = theSize;
59 }
60
61 void SketchSolver_Solver::setConstraints(Slvs_Constraint* theConstraints, int theSize)
62 {
63   if (!myEquationsSystem.constraint) {
64     myEquationsSystem.constraint = new Slvs_Constraint[theSize];
65     myEquationsSystem.constraints = theSize;
66     myEquationsSystem.failed = new Slvs_hConstraint[theSize];
67   }
68   else if (myEquationsSystem.constraints != theSize) {
69     if (theSize > myEquationsSystem.constraints) {
70       delete[] myEquationsSystem.constraint;
71       myEquationsSystem.constraint = new Slvs_Constraint[theSize];
72       if (myEquationsSystem.failed)
73         delete[] myEquationsSystem.failed;
74       myEquationsSystem.failed = new Slvs_hConstraint[theSize];
75     }
76     myEquationsSystem.constraints = theSize;
77   }
78   memcpy(myEquationsSystem.constraint, theConstraints, theSize * sizeof(Slvs_Constraint));
79   memset(myEquationsSystem.failed, SLVS_C_UNKNOWN, theSize * sizeof(Slvs_hConstraint));
80 }
81
82
83 int SketchSolver_Solver::solve()
84 {
85   if (myEquationsSystem.constraints <= 0)
86     return SLVS_RESULT_EMPTY_SET;
87
88   Events_LongOp::start(this);
89   Slvs_Solve(&myEquationsSystem, myGroupID);
90   Events_LongOp::end(this);
91
92   return myEquationsSystem.result;
93 }
94
95 bool SketchSolver_Solver::getResult(std::vector<Slvs_Param>& theParameters)
96 {
97   if (myEquationsSystem.result != SLVS_RESULT_OKAY)
98     return false;
99
100   if (theParameters.size() != myEquationsSystem.params)
101     return false;  // number of parameters is not the same
102
103   std::vector<Slvs_Param>::iterator aParamIter = theParameters.begin();
104   for (int i = 0; i < myEquationsSystem.params; i++, aParamIter++) {
105     if (myEquationsSystem.param[i].h != aParamIter->h)
106       return false;  // sequence of parameters was changed
107     aParamIter->val = myEquationsSystem.param[i].val;
108   }
109
110   return true;
111 }