1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
3 #include <SketchSolver_ConstraintMultiTranslation.h>
4 #include <SketchSolver_Error.h>
5 #include <SketchSolver_Manager.h>
7 #include <PlaneGCSSolver_PointWrapper.h>
9 #include <SketchPlugin_MultiTranslation.h>
11 #include <ModelAPI_AttributeString.h>
13 #include <GeomDataAPI_Point2D.h>
15 void SketchSolver_ConstraintMultiTranslation::getAttributes(
16 EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint,
17 bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
19 DataPtr aData = myBaseConstraint->data();
20 AttributeRefAttrPtr aStartPointAttr =
21 aData->refattr(SketchPlugin_MultiTranslation::START_POINT_ID());
22 AttributeRefAttrPtr aEndPointAttr =
23 aData->refattr(SketchPlugin_MultiTranslation::END_POINT_ID());
24 if (!aStartPointAttr || !aStartPointAttr->isInitialized() ||
25 !aEndPointAttr || !aEndPointAttr->isInitialized()) {
26 myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
30 myType = CONSTRAINT_MULTI_TRANSLATION;
32 myStorage->update(AttributePtr(aStartPointAttr));
33 theStartPoint = myStorage->entity(AttributePtr(aStartPointAttr));
34 myStorage->update(AttributePtr(aEndPointAttr));
35 theEndPoint = myStorage->entity(AttributePtr(aEndPointAttr));
37 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
38 theFullValue = aMethodTypeAttr->value() != "SingleValue";
40 getEntities(theEntities);
42 // add owner of start and end points of Multi-Translation to the list of monitored features
43 FeaturePtr anOwner = ModelAPI_Feature::feature(aStartPointAttr->attr()->owner());
45 myFeatures.insert(anOwner);
46 anOwner = ModelAPI_Feature::feature(aEndPointAttr->attr()->owner());
48 myFeatures.insert(anOwner);
51 void SketchSolver_ConstraintMultiTranslation::process()
54 if (!myBaseConstraint || !myStorage) {
55 // Not enough parameters are assigned
59 EntityWrapperPtr aStartPoint, aEndPoint;
61 std::list<EntityWrapperPtr> aBaseEntities;
62 getAttributes(aStartPoint, aEndPoint, aFullValue, aBaseEntities);
63 if (!myErrorMsg.empty())
69 myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
72 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
74 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
77 void SketchSolver_ConstraintMultiTranslation::updateLocal()
79 DataPtr aData = myBaseConstraint->data();
80 AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
81 SketchPlugin_MultiTranslation::START_POINT_ID());
82 AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
83 SketchPlugin_MultiTranslation::END_POINT_ID());
84 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
85 bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
87 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
88 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
89 bool isMethodChanged = aFullValue != myIsFullValue;
91 if (aStartPointChanged)
92 myStartPointAttribute = aStartPointAttribute;
93 if (aStartPointChanged)
94 myEndPointAttribute = anEndPointAttribute;
96 myIsFullValue = aFullValue;
98 if (aStartPointChanged || anEndPointChanged || isMethodChanged)
102 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
107 // Obtain delta between start and end points of translation
108 std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
109 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
110 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
111 std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
112 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
113 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
115 GCSPointPtr aStart = aStartWrapper->point();
116 GCSPointPtr aEnd = aEndWrapper->point();
118 myDelta[0] = *(aEnd->x) - *(aStart->x);
119 myDelta[1] = *(aEnd->y) - *(aStart->y);
121 if (myIsFullValue && myNumberOfCopies > 0) {
122 myDelta[0] /= myNumberOfCopies;
123 myDelta[1] /= myNumberOfCopies;
126 SketchSolver_ConstraintMulti::adjustConstraint();
129 void SketchSolver_ConstraintMultiTranslation::getRelative(
130 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
136 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
137 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
143 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
145 // translate coordinates