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 AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID());
21 AttributePtr aEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID());
22 if (!aStartPointAttr || !aStartPointAttr->isInitialized() ||
23 !aEndPointAttr || !aEndPointAttr->isInitialized()) {
24 myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
28 myType = CONSTRAINT_MULTI_TRANSLATION;
30 myStorage->update(aStartPointAttr);
31 theStartPoint = myStorage->entity(aStartPointAttr);
32 myStorage->update(aEndPointAttr);
33 theEndPoint = myStorage->entity(aEndPointAttr);
35 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
36 theFullValue = aMethodTypeAttr->value() != "SingleValue";
38 getEntities(theEntities);
41 void SketchSolver_ConstraintMultiTranslation::process()
44 if (!myBaseConstraint || !myStorage) {
45 // Not enough parameters are assigned
49 EntityWrapperPtr aStartPoint, aEndPoint;
51 std::list<EntityWrapperPtr> aBaseEntities;
52 getAttributes(aStartPoint, aEndPoint, aFullValue, aBaseEntities);
53 if (!myErrorMsg.empty())
59 myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
62 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
64 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
67 void SketchSolver_ConstraintMultiTranslation::updateLocal()
69 DataPtr aData = myBaseConstraint->data();
70 AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
71 SketchPlugin_MultiTranslation::START_POINT_ID());
72 AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
73 SketchPlugin_MultiTranslation::END_POINT_ID());
74 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
75 bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
77 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
78 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
79 bool isMethodChanged = aFullValue != myIsFullValue;
81 if (aStartPointChanged)
82 myStartPointAttribute = aStartPointAttribute;
83 if (aStartPointChanged)
84 myEndPointAttribute = anEndPointAttribute;
86 myIsFullValue = aFullValue;
88 if (aStartPointChanged || anEndPointChanged || isMethodChanged)
92 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
97 // Obtain delta between start and end points of translation
98 std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
99 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
100 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
101 std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
102 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
103 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
105 GCSPointPtr aStart = aStartWrapper->point();
106 GCSPointPtr aEnd = aEndWrapper->point();
108 myDelta[0] = *(aEnd->x) - *(aStart->x);
109 myDelta[1] = *(aEnd->y) - *(aStart->y);
111 if (myIsFullValue && myNumberOfCopies > 0) {
112 myDelta[0] /= myNumberOfCopies;
113 myDelta[1] /= myNumberOfCopies;
116 SketchSolver_ConstraintMulti::adjustConstraint();
119 void SketchSolver_ConstraintMultiTranslation::getRelative(
120 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
126 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
127 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
133 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
135 // translate coordinates