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