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
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   std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
126       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
127       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
128   std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
129       std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
130       myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
131
132   GCSPointPtr aStart = aStartWrapper->point();
133   GCSPointPtr aEnd   = aEndWrapper->point();
134
135   myDelta[0] = *(aEnd->x) - *(aStart->x);
136   myDelta[1] = *(aEnd->y) - *(aStart->y);
137
138   if (myIsFullValue && myNumberOfCopies > 0) {
139     myDelta[0] /= myNumberOfCopies;
140     myDelta[1] /= myNumberOfCopies;
141   }
142
143   SketchSolver_ConstraintMulti::adjustConstraint();
144 }
145
146 void SketchSolver_ConstraintMultiTranslation::getRelative(
147     double theAbsX, double theAbsY, double& theRelX, double& theRelY)
148 {
149   theRelX = theAbsX;
150   theRelY = theAbsY;
151 }
152
153 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
154     double theRelX, double theRelY, double& theAbsX, double& theAbsY)
155 {
156   theAbsX = theRelX;
157   theAbsY = theRelY;
158 }
159
160 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
161 {
162   // translate coordinates
163   theX += myDelta[0];
164   theY += myDelta[1];
165 }
166