]> SALOME platform Git repositories - modules/shaper.git/blob - src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp
Salome HOME
Fix compilation errors on Linux
[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   bool aFullValue;
61   std::list<EntityWrapperPtr> aBaseEntities;
62   getAttributes(aStartPoint, aEndPoint, aFullValue, aBaseEntities);
63   if (!myErrorMsg.empty())
64     return;
65
66   myAdjusted = false;
67   adjustConstraint();
68
69   myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
70 }
71
72 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
73 {
74   return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
75 }
76
77 void SketchSolver_ConstraintMultiTranslation::updateLocal()
78 {
79   DataPtr aData = myBaseConstraint->data();
80   AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
81                                       SketchPlugin_MultiTranslation::START_POINT_ID());
82   AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
83                                       SketchPlugin_MultiTranslation::END_POINT_ID());
84   AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
85   bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
86
87   bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
88   bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
89   bool isMethodChanged = aFullValue != myIsFullValue;
90
91   if (aStartPointChanged)
92     myStartPointAttribute = aStartPointAttribute;
93   if (aStartPointChanged)
94     myEndPointAttribute = anEndPointAttribute;
95   if (isMethodChanged)
96     myIsFullValue = aFullValue;
97
98   if (aStartPointChanged || anEndPointChanged || isMethodChanged)
99     myAdjusted = false;
100 }
101
102 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
103 {
104   if (myAdjusted)
105     return;
106
107   // Obtain delta between start and end points of translation
108   std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
109       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
110       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
111   std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
112       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
113       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
114
115   GCSPointPtr aStart = aStartWrapper->point();
116   GCSPointPtr aEnd   = aEndWrapper->point();
117
118   myDelta[0] = *(aEnd->x) - *(aStart->x);
119   myDelta[1] = *(aEnd->y) - *(aStart->y);
120
121   if (myIsFullValue && myNumberOfCopies > 0) {
122     myDelta[0] /= myNumberOfCopies;
123     myDelta[1] /= myNumberOfCopies;
124   }
125
126   SketchSolver_ConstraintMulti::adjustConstraint();
127 }
128
129 void SketchSolver_ConstraintMultiTranslation::getRelative(
130     double theAbsX, double theAbsY, double& theRelX, double& theRelY)
131 {
132   theRelX = theAbsX;
133   theRelY = theAbsY;
134 }
135
136 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
137     double theRelX, double theRelY, double& theAbsX, double& theAbsY)
138 {
139   theAbsX = theRelX;
140   theAbsY = theRelY;
141 }
142
143 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
144 {
145   // translate coordinates
146   theX += myDelta[0];
147   theY += myDelta[1];
148 }
149