Salome HOME
Issue #604 Creation of an unexpected line in the Sketcher
[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   if (myEquationsSystem.failed)
37     delete[] myEquationsSystem.failed;
38 }
39
40 void SketchSolver_Solver::setParameters(Slvs_Param* theParameters, int theSize)
41 {
42   myEquationsSystem.param = theParameters;
43   myEquationsSystem.params = theSize;
44 }
45
46
47 void SketchSolver_Solver::setDraggedParameters(const Slvs_hParam* theDragged)
48 {
49   for (unsigned int i = 0; i < 4; i++)
50     myEquationsSystem.dragged[i] = theDragged[i];
51 }
52
53 void SketchSolver_Solver::setEntities(Slvs_Entity* theEntities, int theSize)
54 {
55   myEquationsSystem.entity = theEntities;
56   myEquationsSystem.entities = theSize;
57 }
58
59 void SketchSolver_Solver::setConstraints(Slvs_Constraint* theConstraints, int theSize)
60 {
61   if (!myEquationsSystem.constraint) {
62     myEquationsSystem.constraint = new Slvs_Constraint[theSize];
63     myEquationsSystem.constraints = theSize;
64   }
65   else if (myEquationsSystem.constraints != theSize) {
66     if (theSize > myEquationsSystem.constraints) {
67       delete[] myEquationsSystem.constraint;
68       myEquationsSystem.constraint = new Slvs_Constraint[theSize];
69     }
70     myEquationsSystem.constraints = theSize;
71   }
72   memcpy(myEquationsSystem.constraint, theConstraints, theSize * sizeof(Slvs_Constraint));
73 }
74
75
76 int SketchSolver_Solver::solve()
77 {
78   if (myEquationsSystem.constraints <= 0)
79     return SLVS_RESULT_EMPTY_SET;
80
81   Events_LongOp::start(this);
82   Slvs_Solve(&myEquationsSystem, myGroupID);
83   Events_LongOp::end(this);
84
85   return myEquationsSystem.result;
86 }
87
88 bool SketchSolver_Solver::getResult(std::vector<Slvs_Param>& theParameters)
89 {
90   if (myEquationsSystem.result != SLVS_RESULT_OKAY)
91     return false;
92
93   if (theParameters.size() != myEquationsSystem.params)
94     return false;  // number of parameters is not the same
95
96   std::vector<Slvs_Param>::iterator aParamIter = theParameters.begin();
97   for (int i = 0; i < myEquationsSystem.params; i++, aParamIter++) {
98     if (myEquationsSystem.param[i].h != aParamIter->h)
99       return false;  // sequence of parameters was changed
100     aParamIter->val = myEquationsSystem.param[i].val;
101   }
102
103   return true;
104 }