Salome HOME
b86ff5d8f48c7d0dc3e075c25224dc847d4d2020
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintMultiTranslation.cpp
1 // Copyright (C) 2014-2023  CEA, EDF
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include <SketchSolver_ConstraintMultiTranslation.h>
21 #include <SketchSolver_Error.h>
22 #include <SketchSolver_Manager.h>
23
24 #include <PlaneGCSSolver_PointWrapper.h>
25
26 #include <SketchPlugin_MultiTranslation.h>
27
28 #include <ModelAPI_AttributeString.h>
29
30 #include <GeomDataAPI_Point2D.h>
31
32 void SketchSolver_ConstraintMultiTranslation::getAttributes(
33     EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint,
34     bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
35 {
36   DataPtr aData = myBaseConstraint->data();
37   AttributeRefAttrPtr aStartPointAttr =
38       aData->refattr(SketchPlugin_MultiTranslation::START_POINT_ID());
39   AttributeRefAttrPtr aEndPointAttr =
40       aData->refattr(SketchPlugin_MultiTranslation::END_POINT_ID());
41   if (!aStartPointAttr || !aStartPointAttr->isInitialized() ||
42       !aEndPointAttr || !aEndPointAttr->isInitialized()) {
43     myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
44     return;
45   }
46
47   myType = CONSTRAINT_MULTI_TRANSLATION;
48
49   myStorage->update(AttributePtr(aStartPointAttr));
50   theStartPoint = myStorage->entity(AttributePtr(aStartPointAttr));
51   myStorage->update(AttributePtr(aEndPointAttr));
52   theEndPoint = myStorage->entity(AttributePtr(aEndPointAttr));
53
54   AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
55   theFullValue = aMethodTypeAttr->value() != "SingleValue";
56
57   getEntities(theEntities);
58
59   // add owner of start and end points of Multi-Translation to the list of monitored features
60   FeaturePtr anOwner = ModelAPI_Feature::feature(aStartPointAttr->attr()->owner());
61   if (anOwner)
62     myOriginalFeatures.insert(anOwner);
63   anOwner = ModelAPI_Feature::feature(aEndPointAttr->attr()->owner());
64   if (anOwner)
65     myOriginalFeatures.insert(anOwner);
66 }
67
68 void SketchSolver_ConstraintMultiTranslation::process()
69 {
70   cleanErrorMsg();
71   if (!myBaseConstraint || !myStorage) {
72     // Not enough parameters are assigned
73     return;
74   }
75
76   EntityWrapperPtr aStartPoint, aEndPoint;
77   std::list<EntityWrapperPtr> aBaseEntities;
78   getAttributes(aStartPoint, aEndPoint, myIsFullValue, aBaseEntities);
79   if (!myErrorMsg.empty())
80     return;
81
82   myAdjusted = false;
83   adjustConstraint();
84
85   myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
86 }
87
88 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
89 {
90   return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
91 }
92
93 void SketchSolver_ConstraintMultiTranslation::updateLocal()
94 {
95   DataPtr aData = myBaseConstraint->data();
96   AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
97                                       SketchPlugin_MultiTranslation::START_POINT_ID());
98   AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
99                                       SketchPlugin_MultiTranslation::END_POINT_ID());
100   AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
101   bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
102
103   bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
104   bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
105   bool isMethodChanged = aFullValue != myIsFullValue;
106
107   if (aStartPointChanged)
108     myStartPointAttribute = aStartPointAttribute;
109   if (aStartPointChanged)
110     myEndPointAttribute = anEndPointAttribute;
111   if (isMethodChanged)
112     myIsFullValue = aFullValue;
113
114   if (aStartPointChanged || anEndPointChanged || isMethodChanged)
115     myAdjusted = false;
116 }
117
118 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
119 {
120   if (myAdjusted)
121     return;
122
123   // Obtain delta between start and end points of translation
124   AttributeRefAttrPtr aStartEnd[2] = {
125       myBaseConstraint->refattr(SketchPlugin_MultiTranslation::START_POINT_ID()),
126       myBaseConstraint->refattr(SketchPlugin_MultiTranslation::END_POINT_ID())
127   };
128   double aCoords[2][2];
129   for (int i = 0; i < 2; ++i)
130   {
131     std::shared_ptr<PlaneGCSSolver_PointWrapper> aPointWrapper =
132         std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(
133         myStorage->entity(AttributePtr(aStartEnd[i])));
134     if (aPointWrapper)
135     {
136       GCSPointPtr aPnt = aPointWrapper->point();
137       aCoords[i][0] = *(aPnt->x);
138       aCoords[i][1] = *(aPnt->y);
139     }
140     else
141     {
142       AttributePoint2DPtr aPnt =
143           std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aStartEnd[i]->attr());
144       aCoords[i][0] = aPnt->x();
145       aCoords[i][1] = aPnt->y();
146     }
147   }
148
149   myDelta[0] = aCoords[1][0] - aCoords[0][0];
150   myDelta[1] = aCoords[1][1] - aCoords[0][1];
151
152   if (myIsFullValue && myNumberOfCopies > 0) {
153     myDelta[0] /= myNumberOfCopies;
154     myDelta[1] /= myNumberOfCopies;
155   }
156
157   SketchSolver_ConstraintMulti::adjustConstraint();
158 }
159
160 void SketchSolver_ConstraintMultiTranslation::getRelative(
161     double theAbsX, double theAbsY, double& theRelX, double& theRelY)
162 {
163   theRelX = theAbsX;
164   theRelY = theAbsY;
165 }
166
167 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
168     double theRelX, double theRelY, double& theAbsX, double& theAbsY)
169 {
170   theAbsX = theRelX;
171   theAbsY = theRelY;
172 }
173
174 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
175 {
176   // translate coordinates
177   theX += myDelta[0];
178   theY += myDelta[1];
179 }
180