Salome HOME
Issue #2273: Error when reading HDF and Python dump
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintMultiTranslation.cpp
1 // Copyright (C) 2014-2017  CEA/DEN, EDF R&D
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
18 // email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
19 //
20
21 #include <SketchSolver_ConstraintMultiTranslation.h>
22 #include <SketchSolver_Error.h>
23 #include <SketchSolver_Manager.h>
24
25 #include <PlaneGCSSolver_PointWrapper.h>
26
27 #include <SketchPlugin_MultiTranslation.h>
28
29 #include <ModelAPI_AttributeString.h>
30
31 #include <GeomDataAPI_Point2D.h>
32
33 void SketchSolver_ConstraintMultiTranslation::getAttributes(
34     EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint,
35     bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
36 {
37   DataPtr aData = myBaseConstraint->data();
38   AttributeRefAttrPtr aStartPointAttr =
39       aData->refattr(SketchPlugin_MultiTranslation::START_POINT_ID());
40   AttributeRefAttrPtr aEndPointAttr =
41       aData->refattr(SketchPlugin_MultiTranslation::END_POINT_ID());
42   if (!aStartPointAttr || !aStartPointAttr->isInitialized() ||
43       !aEndPointAttr || !aEndPointAttr->isInitialized()) {
44     myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
45     return;
46   }
47
48   myType = CONSTRAINT_MULTI_TRANSLATION;
49
50   myStorage->update(AttributePtr(aStartPointAttr));
51   theStartPoint = myStorage->entity(AttributePtr(aStartPointAttr));
52   myStorage->update(AttributePtr(aEndPointAttr));
53   theEndPoint = myStorage->entity(AttributePtr(aEndPointAttr));
54
55   AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
56   theFullValue = aMethodTypeAttr->value() != "SingleValue";
57
58   getEntities(theEntities);
59
60   // add owner of start and end points of Multi-Translation to the list of monitored features
61   FeaturePtr anOwner = ModelAPI_Feature::feature(aStartPointAttr->attr()->owner());
62   if (anOwner)
63     myOriginalFeatures.insert(anOwner);
64   anOwner = ModelAPI_Feature::feature(aEndPointAttr->attr()->owner());
65   if (anOwner)
66     myOriginalFeatures.insert(anOwner);
67 }
68
69 void SketchSolver_ConstraintMultiTranslation::process()
70 {
71   cleanErrorMsg();
72   if (!myBaseConstraint || !myStorage) {
73     // Not enough parameters are assigned
74     return;
75   }
76
77   EntityWrapperPtr aStartPoint, aEndPoint;
78   std::list<EntityWrapperPtr> aBaseEntities;
79   getAttributes(aStartPoint, aEndPoint, myIsFullValue, aBaseEntities);
80   if (!myErrorMsg.empty())
81     return;
82
83   myAdjusted = false;
84   adjustConstraint();
85
86   myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
87 }
88
89 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
90 {
91   return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
92 }
93
94 void SketchSolver_ConstraintMultiTranslation::updateLocal()
95 {
96   DataPtr aData = myBaseConstraint->data();
97   AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
98                                       SketchPlugin_MultiTranslation::START_POINT_ID());
99   AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
100                                       SketchPlugin_MultiTranslation::END_POINT_ID());
101   AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
102   bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
103
104   bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
105   bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
106   bool isMethodChanged = aFullValue != myIsFullValue;
107
108   if (aStartPointChanged)
109     myStartPointAttribute = aStartPointAttribute;
110   if (aStartPointChanged)
111     myEndPointAttribute = anEndPointAttribute;
112   if (isMethodChanged)
113     myIsFullValue = aFullValue;
114
115   if (aStartPointChanged || anEndPointChanged || isMethodChanged)
116     myAdjusted = false;
117 }
118
119 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
120 {
121   if (myAdjusted)
122     return;
123
124   // Obtain delta between start and end points of translation
125   AttributeRefAttrPtr aStartEnd[2] = {
126       myBaseConstraint->refattr(SketchPlugin_MultiTranslation::START_POINT_ID()),
127       myBaseConstraint->refattr(SketchPlugin_MultiTranslation::END_POINT_ID())
128   };
129   double aCoords[2][2];
130   for (int i = 0; i < 2; ++i)
131   {
132     std::shared_ptr<PlaneGCSSolver_PointWrapper> aPointWrapper =
133         std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(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