1 // Copyright (C) 2014-2017 CEA/DEN, EDF R&D
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.
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.
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
17 // See http://www.salome-platform.org/ or
18 // email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
21 #include <SketchSolver_ConstraintMultiTranslation.h>
22 #include <SketchSolver_Error.h>
23 #include <SketchSolver_Manager.h>
25 #include <PlaneGCSSolver_PointWrapper.h>
27 #include <SketchPlugin_MultiTranslation.h>
29 #include <ModelAPI_AttributeString.h>
31 #include <GeomDataAPI_Point2D.h>
33 void SketchSolver_ConstraintMultiTranslation::getAttributes(
34 EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint,
35 bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
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();
48 myType = CONSTRAINT_MULTI_TRANSLATION;
50 myStorage->update(AttributePtr(aStartPointAttr));
51 theStartPoint = myStorage->entity(AttributePtr(aStartPointAttr));
52 myStorage->update(AttributePtr(aEndPointAttr));
53 theEndPoint = myStorage->entity(AttributePtr(aEndPointAttr));
55 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
56 theFullValue = aMethodTypeAttr->value() != "SingleValue";
58 getEntities(theEntities);
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());
63 myOriginalFeatures.insert(anOwner);
64 anOwner = ModelAPI_Feature::feature(aEndPointAttr->attr()->owner());
66 myOriginalFeatures.insert(anOwner);
69 void SketchSolver_ConstraintMultiTranslation::process()
72 if (!myBaseConstraint || !myStorage) {
73 // Not enough parameters are assigned
77 EntityWrapperPtr aStartPoint, aEndPoint;
78 std::list<EntityWrapperPtr> aBaseEntities;
79 getAttributes(aStartPoint, aEndPoint, myIsFullValue, aBaseEntities);
80 if (!myErrorMsg.empty())
86 myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
89 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
91 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
94 void SketchSolver_ConstraintMultiTranslation::updateLocal()
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";
104 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
105 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
106 bool isMethodChanged = aFullValue != myIsFullValue;
108 if (aStartPointChanged)
109 myStartPointAttribute = aStartPointAttribute;
110 if (aStartPointChanged)
111 myEndPointAttribute = anEndPointAttribute;
113 myIsFullValue = aFullValue;
115 if (aStartPointChanged || anEndPointChanged || isMethodChanged)
119 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
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())
129 double aCoords[2][2];
130 for (int i = 0; i < 2; ++i)
132 std::shared_ptr<PlaneGCSSolver_PointWrapper> aPointWrapper =
133 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(
134 myStorage->entity(AttributePtr(aStartEnd[i])));
137 GCSPointPtr aPnt = aPointWrapper->point();
138 aCoords[i][0] = *(aPnt->x);
139 aCoords[i][1] = *(aPnt->y);
143 AttributePoint2DPtr aPnt =
144 std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aStartEnd[i]->attr());
145 aCoords[i][0] = aPnt->x();
146 aCoords[i][1] = aPnt->y();
150 myDelta[0] = aCoords[1][0] - aCoords[0][0];
151 myDelta[1] = aCoords[1][1] - aCoords[0][1];
153 if (myIsFullValue && myNumberOfCopies > 0) {
154 myDelta[0] /= myNumberOfCopies;
155 myDelta[1] /= myNumberOfCopies;
158 SketchSolver_ConstraintMulti::adjustConstraint();
161 void SketchSolver_ConstraintMultiTranslation::getRelative(
162 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
168 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
169 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
175 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
177 // translate coordinates