Salome HOME
Improve updating "Multi" constraints
[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   AttributeRefAttrPtr aStartPointAttr = aData->refattr(SketchPlugin_MultiTranslation::START_POINT_ID());
21   AttributeRefAttrPtr aEndPointAttr = aData->refattr(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   // add owner of start and end points of Multi-Translation to the list of monitored features
41   FeaturePtr anOwner = ModelAPI_Feature::feature(aStartPointAttr->attr()->owner());
42   if (anOwner)
43     myFeatures.insert(anOwner);
44   anOwner = ModelAPI_Feature::feature(aEndPointAttr->attr()->owner());
45   if (anOwner)
46     myFeatures.insert(anOwner);
47 }
48
49 void SketchSolver_ConstraintMultiTranslation::process()
50 {
51   cleanErrorMsg();
52   if (!myBaseConstraint || !myStorage) {
53     // Not enough parameters are assigned
54     return;
55   }
56
57   EntityWrapperPtr aStartPoint, aEndPoint;
58   bool aFullValue;
59   std::list<EntityWrapperPtr> aBaseEntities;
60   getAttributes(aStartPoint, aEndPoint, aFullValue, aBaseEntities);
61   if (!myErrorMsg.empty())
62     return;
63
64   myAdjusted = false;
65   adjustConstraint();
66
67   myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
68 }
69
70 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
71 {
72   return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
73 }
74
75 void SketchSolver_ConstraintMultiTranslation::updateLocal()
76 {
77   DataPtr aData = myBaseConstraint->data();
78   AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
79                                       SketchPlugin_MultiTranslation::START_POINT_ID());
80   AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
81                                       SketchPlugin_MultiTranslation::END_POINT_ID());
82   AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
83   bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
84
85   bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
86   bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
87   bool isMethodChanged = aFullValue != myIsFullValue;
88
89   if (aStartPointChanged)
90     myStartPointAttribute = aStartPointAttribute;
91   if (aStartPointChanged)
92     myEndPointAttribute = anEndPointAttribute;
93   if (isMethodChanged)
94     myIsFullValue = aFullValue;
95
96   if (aStartPointChanged || anEndPointChanged || isMethodChanged)
97     myAdjusted = false;
98 }
99
100 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
101 {
102   if (myAdjusted)
103     return;
104
105   // Obtain delta between start and end points of translation
106   std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
107       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
108       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
109   std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
110       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
111       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
112
113   GCSPointPtr aStart = aStartWrapper->point();
114   GCSPointPtr aEnd   = aEndWrapper->point();
115
116   myDelta[0] = *(aEnd->x) - *(aStart->x);
117   myDelta[1] = *(aEnd->y) - *(aStart->y);
118
119   if (myIsFullValue && myNumberOfCopies > 0) {
120     myDelta[0] /= myNumberOfCopies;
121     myDelta[1] /= myNumberOfCopies;
122   }
123
124   SketchSolver_ConstraintMulti::adjustConstraint();
125 }
126
127 void SketchSolver_ConstraintMultiTranslation::getRelative(
128     double theAbsX, double theAbsY, double& theRelX, double& theRelY)
129 {
130   theRelX = theAbsX;
131   theRelY = theAbsY;
132 }
133
134 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
135     double theRelX, double theRelY, double& theAbsX, double& theAbsY)
136 {
137   theAbsX = theRelX;
138   theAbsY = theRelY;
139 }
140
141 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
142 {
143   // translate coordinates
144   theX += myDelta[0];
145   theY += myDelta[1];
146 }
147