Salome HOME
Sketcher: Remove obsolete interfaces. Code cleanup.
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintMultiTranslation.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 #include <SketchSolver_ConstraintMultiTranslation.h>
4 #include <SketchSolver_Error.h>
5 #include <SketchSolver_Manager.h>
6
7 #include <PlaneGCSSolver_PointWrapper.h>
8
9 #include <SketchPlugin_MultiTranslation.h>
10
11 #include <ModelAPI_AttributeString.h>
12
13 #include <GeomDataAPI_Point2D.h>
14
15 void SketchSolver_ConstraintMultiTranslation::getAttributes(
16     EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint,
17     bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
18 {
19   DataPtr aData = myBaseConstraint->data();
20   AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID());
21   AttributePtr aEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID());
22   if (!aStartPointAttr || !aStartPointAttr->isInitialized() ||
23       !aEndPointAttr || !aEndPointAttr->isInitialized()) {
24     myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
25     return;
26   }
27
28   myType = CONSTRAINT_MULTI_TRANSLATION;
29
30   myStorage->update(aStartPointAttr);
31   theStartPoint = myStorage->entity(aStartPointAttr);
32   myStorage->update(aEndPointAttr);
33   theEndPoint = myStorage->entity(aEndPointAttr);
34
35   AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
36   theFullValue = aMethodTypeAttr->value() != "SingleValue";
37
38   getEntities(theEntities);
39 }
40
41 void SketchSolver_ConstraintMultiTranslation::process()
42 {
43   cleanErrorMsg();
44   if (!myBaseConstraint || !myStorage) {
45     // Not enough parameters are assigned
46     return;
47   }
48
49   EntityWrapperPtr aStartPoint, aEndPoint;
50   bool aFullValue;
51   std::list<EntityWrapperPtr> aBaseEntities;
52   getAttributes(aStartPoint, aEndPoint, aFullValue, aBaseEntities);
53   if (!myErrorMsg.empty())
54     return;
55
56   myAdjusted = false;
57   adjustConstraint();
58
59   myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
60 }
61
62 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
63 {
64   return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
65 }
66
67 void SketchSolver_ConstraintMultiTranslation::updateLocal()
68 {
69   DataPtr aData = myBaseConstraint->data();
70   AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
71                                       SketchPlugin_MultiTranslation::START_POINT_ID());
72   AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
73                                       SketchPlugin_MultiTranslation::END_POINT_ID());
74   AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
75   bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
76
77   bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
78   bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
79   bool isMethodChanged = aFullValue != myIsFullValue;
80
81   if (aStartPointChanged)
82     myStartPointAttribute = aStartPointAttribute;
83   if (aStartPointChanged)
84     myEndPointAttribute = anEndPointAttribute;
85   if (isMethodChanged)
86     myIsFullValue = aFullValue;
87
88   if (aStartPointChanged || anEndPointChanged || isMethodChanged)
89     myAdjusted = false;
90 }
91
92 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
93 {
94   if (myAdjusted)
95     return;
96
97   // Obtain delta between start and end points of translation
98   std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
99       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
100       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
101   std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
102       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
103       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
104
105   GCSPointPtr aStart = aStartWrapper->point();
106   GCSPointPtr aEnd   = aEndWrapper->point();
107
108   myDelta[0] = *(aEnd->x) - *(aStart->x);
109   myDelta[1] = *(aEnd->y) - *(aStart->y);
110
111   if (myIsFullValue && myNumberOfCopies > 0) {
112     myDelta[0] /= myNumberOfCopies;
113     myDelta[1] /= myNumberOfCopies;
114   }
115
116   SketchSolver_ConstraintMulti::adjustConstraint();
117 }
118
119 void SketchSolver_ConstraintMultiTranslation::getRelative(
120     double theAbsX, double theAbsY, double& theRelX, double& theRelY)
121 {
122   theRelX = theAbsX;
123   theRelY = theAbsY;
124 }
125
126 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
127     double theRelX, double theRelY, double& theAbsX, double& theAbsY)
128 {
129   theAbsX = theRelX;
130   theAbsY = theRelY;
131 }
132
133 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
134 {
135   // translate coordinates
136   theX += myDelta[0];
137   theY += myDelta[1];
138 }
139