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;
60 std::list<EntityWrapperPtr> aBaseEntities;
61 getAttributes(aStartPoint, aEndPoint, myIsFullValue, aBaseEntities);
62 if (!myErrorMsg.empty())
68 myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
71 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
73 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
76 void SketchSolver_ConstraintMultiTranslation::updateLocal()
78 DataPtr aData = myBaseConstraint->data();
79 AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
80 SketchPlugin_MultiTranslation::START_POINT_ID());
81 AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
82 SketchPlugin_MultiTranslation::END_POINT_ID());
83 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
84 bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
86 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
87 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
88 bool isMethodChanged = aFullValue != myIsFullValue;
90 if (aStartPointChanged)
91 myStartPointAttribute = aStartPointAttribute;
92 if (aStartPointChanged)
93 myEndPointAttribute = anEndPointAttribute;
95 myIsFullValue = aFullValue;
97 if (aStartPointChanged || anEndPointChanged || isMethodChanged)
101 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
106 // Obtain delta between start and end points of translation
107 std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
108 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
109 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
110 std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
111 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
112 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
114 GCSPointPtr aStart = aStartWrapper->point();
115 GCSPointPtr aEnd = aEndWrapper->point();
117 myDelta[0] = *(aEnd->x) - *(aStart->x);
118 myDelta[1] = *(aEnd->y) - *(aStart->y);
120 if (myIsFullValue && myNumberOfCopies > 0) {
121 myDelta[0] /= myNumberOfCopies;
122 myDelta[1] /= myNumberOfCopies;
125 SketchSolver_ConstraintMulti::adjustConstraint();
128 void SketchSolver_ConstraintMultiTranslation::getRelative(
129 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
135 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
136 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
142 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
144 // translate coordinates