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 email : webmaster.salome@opencascade.com<mailto: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 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())));
131 GCSPointPtr aStart = aStartWrapper->point();
132 GCSPointPtr aEnd = aEndWrapper->point();
134 myDelta[0] = *(aEnd->x) - *(aStart->x);
135 myDelta[1] = *(aEnd->y) - *(aStart->y);
137 if (myIsFullValue && myNumberOfCopies > 0) {
138 myDelta[0] /= myNumberOfCopies;
139 myDelta[1] /= myNumberOfCopies;
142 SketchSolver_ConstraintMulti::adjustConstraint();
145 void SketchSolver_ConstraintMultiTranslation::getRelative(
146 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
152 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
153 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
159 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
161 // translate coordinates