]> SALOME platform Git repositories - modules/shaper.git/blob - src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp
Salome HOME
Add copyright header according to request of CEA from 06.06.2017
[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 email : webmaster.salome@opencascade.com<mailto: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   std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
125       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
126       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
127   std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
128       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
129       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
130
131   GCSPointPtr aStart = aStartWrapper->point();
132   GCSPointPtr aEnd   = aEndWrapper->point();
133
134   myDelta[0] = *(aEnd->x) - *(aStart->x);
135   myDelta[1] = *(aEnd->y) - *(aStart->y);
136
137   if (myIsFullValue && myNumberOfCopies > 0) {
138     myDelta[0] /= myNumberOfCopies;
139     myDelta[1] /= myNumberOfCopies;
140   }
141
142   SketchSolver_ConstraintMulti::adjustConstraint();
143 }
144
145 void SketchSolver_ConstraintMultiTranslation::getRelative(
146     double theAbsX, double theAbsY, double& theRelX, double& theRelY)
147 {
148   theRelX = theAbsX;
149   theRelY = theAbsY;
150 }
151
152 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
153     double theRelX, double theRelY, double& theAbsX, double& theAbsY)
154 {
155   theAbsX = theRelX;
156   theAbsY = theRelY;
157 }
158
159 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
160 {
161   // translate coordinates
162   theX += myDelta[0];
163   theY += myDelta[1];
164 }
165