1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
3 #include <SketchSolver_ConstraintMultiRotation.h>
4 #include <SketchSolver_Error.h>
5 #include <SketchSolver_Manager.h>
7 #include <PlaneGCSSolver_AttributeBuilder.h>
8 #include <PlaneGCSSolver_PointWrapper.h>
9 #include <PlaneGCSSolver_ScalarWrapper.h>
10 #include <PlaneGCSSolver_UpdateFeature.h>
12 #include <SketchPlugin_MultiRotation.h>
14 #include <ModelAPI_AttributeString.h>
18 void SketchSolver_ConstraintMultiRotation::getAttributes(
19 EntityWrapperPtr& theCenter, EntityWrapperPtr& theAngle,
20 bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
22 AttributePtr anAngleAttr = myBaseConstraint->attribute(SketchPlugin_MultiRotation::ANGLE_ID());
23 PlaneGCSSolver_AttributeBuilder aValueBuilder;
24 theAngle = aValueBuilder.createAttribute(anAngleAttr);
25 myStorage->addEntity(anAngleAttr, theAngle);
27 AttributePtr aCenterAttr = myBaseConstraint->attribute(SketchPlugin_MultiRotation::CENTER_ID());
28 if (!aCenterAttr || !aCenterAttr->isInitialized()) {
29 myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
33 myType = CONSTRAINT_MULTI_ROTATION;
35 myStorage->update(aCenterAttr);
36 theCenter = myStorage->entity(aCenterAttr);
38 AttributeStringPtr aMethodTypeAttr =
39 myBaseConstraint->string(SketchPlugin_MultiRotation::ANGLE_TYPE());
40 theFullValue = aMethodTypeAttr->value() != "SingleAngle";
42 getEntities(theEntities);
45 void SketchSolver_ConstraintMultiRotation::process()
48 if (!myBaseConstraint || !myStorage) {
49 // Not enough parameters are assigned
53 EntityWrapperPtr anAngle;
54 EntityWrapperPtr aRotationCenter;
56 std::list<EntityWrapperPtr> aBaseEntities;
57 getAttributes(aRotationCenter, anAngle, isFullValue, aBaseEntities);
58 if (!myErrorMsg.empty())
61 ScalarWrapperPtr anAngleVal = std::dynamic_pointer_cast<PlaneGCSSolver_ScalarWrapper>(anAngle);
62 myAngle = anAngleVal->value();
66 myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP());
69 void SketchSolver_ConstraintMultiRotation::updateLocal()
71 double aValue = myBaseConstraint->real(SketchPlugin_MultiRotation::ANGLE_ID())->value();
72 if (fabs(myAngle - aValue) > tolerance)
78 DataPtr aData = myBaseConstraint->data();
79 AttributePoint2DPtr aCenterPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
80 SketchPlugin_MultiRotation::CENTER_ID());
81 bool aCenterPointChanged = aCenterPointAttribute != myCenterPointAttribute;
82 if (aCenterPointChanged)
83 myCenterPointAttribute = aCenterPointAttribute;
85 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiRotation::ANGLE_TYPE());
86 bool aFullValue = aMethodTypeAttr->value() != "SingleAngle";
87 bool isMethodChanged = aFullValue != myIsFullValue;
89 myIsFullValue = aFullValue;
91 if (aCenterPointChanged || isMethodChanged)
95 void SketchSolver_ConstraintMultiRotation::adjustConstraint()
100 if (fabs(myAngle) < tolerance) {
101 myStorage->setNeedToResolve(false);
105 // Obtain coordinates of rotation center
106 std::shared_ptr<PlaneGCSSolver_PointWrapper> aRotCenter =
107 std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(myStorage->entity(
108 myBaseConstraint->attribute(SketchPlugin_MultiRotation::CENTER_ID())));
109 GCSPointPtr aCenterPoint = aRotCenter->point();
110 myCenterCoord[0] = *(aCenterPoint->x);
111 myCenterCoord[1] = *(aCenterPoint->y);
113 double anAngleValue = myAngle;
114 if (myIsFullValue && myNumberOfCopies > 0)
115 anAngleValue /= myNumberOfCopies;
117 myRotationVal[0] = sin(anAngleValue * PI / 180.0);
118 myRotationVal[1] = cos(anAngleValue * PI / 180.0);
120 SketchSolver_ConstraintMulti::adjustConstraint();
123 void SketchSolver_ConstraintMultiRotation::getRelative(
124 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
126 theRelX = theAbsX - myCenterCoord[0];
127 theRelY = theAbsY - myCenterCoord[1];
130 void SketchSolver_ConstraintMultiRotation::getAbsolute(
131 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
133 theAbsX = theRelX + myCenterCoord[0];
134 theAbsY = theRelY + myCenterCoord[1];
137 void SketchSolver_ConstraintMultiRotation::transformRelative(double& theX, double& theY)
140 // myRotationVal[0] = sinA, myRotationVal[1] = cosA
141 double aTemp = theX * myRotationVal[1] - theY * myRotationVal[0];
142 theY = theX * myRotationVal[0] + theY * myRotationVal[1];
146 const std::string& SketchSolver_ConstraintMultiRotation::nameNbObjects()
148 return SketchPlugin_MultiRotation::NUMBER_OF_OBJECTS_ID();