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 = aData->refattr(SketchPlugin_MultiTranslation::START_POINT_ID());
21 AttributeRefAttrPtr aEndPointAttr = aData->refattr(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);
40 // add owner of start and end points of Multi-Translation to the list of monitored features
41 FeaturePtr anOwner = ModelAPI_Feature::feature(aStartPointAttr->attr()->owner());
43 myFeatures.insert(anOwner);
44 anOwner = ModelAPI_Feature::feature(aEndPointAttr->attr()->owner());
46 myFeatures.insert(anOwner);
49 void SketchSolver_ConstraintMultiTranslation::process()
52 if (!myBaseConstraint || !myStorage) {
53 // Not enough parameters are assigned
57 EntityWrapperPtr aStartPoint, aEndPoint;
59 std::list<EntityWrapperPtr> aBaseEntities;
60 getAttributes(aStartPoint, aEndPoint, aFullValue, aBaseEntities);
61 if (!myErrorMsg.empty())
67 myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
70 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
72 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
75 void SketchSolver_ConstraintMultiTranslation::updateLocal()
77 DataPtr aData = myBaseConstraint->data();
78 AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
79 SketchPlugin_MultiTranslation::START_POINT_ID());
80 AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
81 SketchPlugin_MultiTranslation::END_POINT_ID());
82 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
83 bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
85 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
86 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
87 bool isMethodChanged = aFullValue != myIsFullValue;
89 if (aStartPointChanged)
90 myStartPointAttribute = aStartPointAttribute;
91 if (aStartPointChanged)
92 myEndPointAttribute = anEndPointAttribute;
94 myIsFullValue = aFullValue;
96 if (aStartPointChanged || anEndPointChanged || isMethodChanged)
100 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
105 // Obtain delta between start and end points of translation
106 std::shared_ptr<PlaneGCSSolver_PointWrapper> aStartWrapper =
107 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
108 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())));
109 std::shared_ptr<PlaneGCSSolver_PointWrapper> aEndWrapper =
110 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
111 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())));
113 GCSPointPtr aStart = aStartWrapper->point();
114 GCSPointPtr aEnd = aEndWrapper->point();
116 myDelta[0] = *(aEnd->x) - *(aStart->x);
117 myDelta[1] = *(aEnd->y) - *(aStart->y);
119 if (myIsFullValue && myNumberOfCopies > 0) {
120 myDelta[0] /= myNumberOfCopies;
121 myDelta[1] /= myNumberOfCopies;
124 SketchSolver_ConstraintMulti::adjustConstraint();
127 void SketchSolver_ConstraintMultiTranslation::getRelative(
128 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
134 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
135 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
141 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
143 // translate coordinates