Salome HOME
Using test for testing number of sub-shapes.
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintDistance.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 #include <SketchSolver_ConstraintDistance.h>
4 #include <SketchSolver_Error.h>
5 #include <SketchSolver_Manager.h>
6
7 #include <GeomAPI_Dir2d.h>
8 #include <GeomAPI_Lin2d.h>
9 #include <GeomAPI_Pnt2d.h>
10 #include <GeomAPI_XY.h>
11
12 #include <math.h>
13
14
15 void SketchSolver_ConstraintDistance::getAttributes(
16     double& theValue,
17     std::vector<EntityWrapperPtr>& theAttributes)
18 {
19   SketchSolver_Constraint::getAttributes(theValue, theAttributes);
20   if (!myErrorMsg.empty() || !theAttributes[0]) {
21     theAttributes.clear();
22     return;
23   }
24
25   if (theAttributes[1])
26     myType = CONSTRAINT_PT_PT_DISTANCE;
27   else if (theAttributes[2] && theAttributes[2]->type() == ENTITY_LINE)
28     myType = CONSTRAINT_PT_LINE_DISTANCE;
29   else
30     theAttributes.clear();
31
32   myPrevValue = 0.0;
33 }
34
35 void SketchSolver_ConstraintDistance::adjustConstraint()
36 {
37   ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front();
38
39   // Adjust point-point distance if the points are equal
40   if (getType() == CONSTRAINT_PT_PT_DISTANCE) {
41     const std::list<EntityWrapperPtr>& aSubs = aConstraint->entities();
42     if (aSubs.front()->isEqual(aSubs.back())) {
43       // Change X coordinate of second point to eliminate coincidence
44       ParameterWrapperPtr aX = aSubs.back()->parameters().front();
45       aX->setValue(aX->value() + 1.0);
46       myStorage->update(aX);
47     }
48     return;
49   }
50
51   // Adjust point-line distance
52   if (fabs(myPrevValue) == fabs(aConstraint->value())) {
53     // sign of distance is not changed
54     aConstraint->setValue(myPrevValue);
55     myStorage->addConstraint(myBaseConstraint, aConstraint);
56     return;
57   }
58
59   // Adjust the sign of constraint value
60   BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
61   aBuilder->adjustConstraint(aConstraint);
62   myStorage->addConstraint(myBaseConstraint, aConstraint);
63 }
64
65 void SketchSolver_ConstraintDistance::update()
66 {
67   ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front();
68   myPrevValue = aConstraint->value();
69
70   SketchSolver_Constraint::update();
71 }