1 // Copyright (C) 2014-2019 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 email : webmaster.salome@opencascade.com
20 #include <SketchSolver_ConstraintMultiTranslation.h>
21 #include <SketchSolver_Error.h>
22 #include <SketchSolver_Manager.h>
24 #include <PlaneGCSSolver_PointWrapper.h>
26 #include <SketchPlugin_MultiTranslation.h>
28 #include <ModelAPI_AttributeString.h>
30 #include <GeomDataAPI_Point2D.h>
32 void SketchSolver_ConstraintMultiTranslation::getAttributes(
33 EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint,
34 bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
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();
47 myType = CONSTRAINT_MULTI_TRANSLATION;
49 myStorage->update(AttributePtr(aStartPointAttr));
50 theStartPoint = myStorage->entity(AttributePtr(aStartPointAttr));
51 myStorage->update(AttributePtr(aEndPointAttr));
52 theEndPoint = myStorage->entity(AttributePtr(aEndPointAttr));
54 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
55 theFullValue = aMethodTypeAttr->value() != "SingleValue";
57 getEntities(theEntities);
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());
62 myOriginalFeatures.insert(anOwner);
63 anOwner = ModelAPI_Feature::feature(aEndPointAttr->attr()->owner());
65 myOriginalFeatures.insert(anOwner);
68 void SketchSolver_ConstraintMultiTranslation::process()
71 if (!myBaseConstraint || !myStorage) {
72 // Not enough parameters are assigned
76 EntityWrapperPtr aStartPoint, aEndPoint;
77 std::list<EntityWrapperPtr> aBaseEntities;
78 getAttributes(aStartPoint, aEndPoint, myIsFullValue, aBaseEntities);
79 if (!myErrorMsg.empty())
85 myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
88 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
90 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
93 void SketchSolver_ConstraintMultiTranslation::updateLocal()
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";
103 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
104 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
105 bool isMethodChanged = aFullValue != myIsFullValue;
107 if (aStartPointChanged)
108 myStartPointAttribute = aStartPointAttribute;
109 if (aStartPointChanged)
110 myEndPointAttribute = anEndPointAttribute;
112 myIsFullValue = aFullValue;
114 if (aStartPointChanged || anEndPointChanged || isMethodChanged)
118 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
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())
128 double aCoords[2][2];
129 for (int i = 0; i < 2; ++i)
131 std::shared_ptr<PlaneGCSSolver_PointWrapper> aPointWrapper =
132 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(
133 myStorage->entity(AttributePtr(aStartEnd[i])));
136 GCSPointPtr aPnt = aPointWrapper->point();
137 aCoords[i][0] = *(aPnt->x);
138 aCoords[i][1] = *(aPnt->y);
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();
149 myDelta[0] = aCoords[1][0] - aCoords[0][0];
150 myDelta[1] = aCoords[1][1] - aCoords[0][1];
152 if (myIsFullValue && myNumberOfCopies > 0) {
153 myDelta[0] /= myNumberOfCopies;
154 myDelta[1] /= myNumberOfCopies;
157 SketchSolver_ConstraintMulti::adjustConstraint();
160 void SketchSolver_ConstraintMultiTranslation::getRelative(
161 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
167 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
168 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
174 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
176 // translate coordinates