1 #include <SketchSolver_ConstraintMultiRotation.h>
2 #include <SketchSolver_Error.h>
3 #include <SketchSolver_Manager.h>
5 #include <SketchPlugin_MultiRotation.h>
7 #include <ModelAPI_AttributeString.h>
11 void SketchSolver_ConstraintMultiRotation::getAttributes(
12 EntityWrapperPtr& theCenter, double& theAngle,
13 bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
15 DataPtr aData = myBaseConstraint->data();
16 theAngle = std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(
17 aData->attribute(SketchPlugin_MultiRotation::ANGLE_ID()))->value();
19 AttributePtr aCenterAttr = aData->attribute(SketchPlugin_MultiRotation::CENTER_ID());
20 if (!aCenterAttr || !aCenterAttr->isInitialized()) {
21 myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
25 myType = CONSTRAINT_MULTI_ROTATION;
27 myStorage->update(aCenterAttr);
28 theCenter = myStorage->entity(aCenterAttr);
30 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiRotation::ANGLE_TYPE());
31 theFullValue = aMethodTypeAttr->value() != "SingleAngle";
33 getEntities(theEntities);
36 void SketchSolver_ConstraintMultiRotation::process()
39 if (!myBaseConstraint || !myStorage || myGroupID == GID_UNKNOWN) {
40 /// TODO: Put error message here
44 EntityWrapperPtr aRotationCenter;
46 std::list<EntityWrapperPtr> aBaseEntities;
47 getAttributes(aRotationCenter, myAngle, isFullValue, aBaseEntities);
48 if (!myErrorMsg.empty())
51 BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
52 std::list<ConstraintWrapperPtr> aRotConstraints;
54 std::list<EntityWrapperPtr>::iterator anEntIt = aBaseEntities.begin();
55 for (; anEntIt != aBaseEntities.end(); ++anEntIt) {
56 std::list<ConstraintWrapperPtr> aNewConstraints =
57 aBuilder->createConstraint(myBaseConstraint, myGroupID, mySketchID, myType,
58 myAngle, isFullValue, aRotationCenter, EntityWrapperPtr(), std::list<EntityWrapperPtr>(1, *anEntIt));
59 aRotConstraints.insert(aRotConstraints.end(), aNewConstraints.begin(), aNewConstraints.end());
61 myStorage->addConstraint(myBaseConstraint, aRotConstraints);
67 void SketchSolver_ConstraintMultiRotation::updateLocal()
69 double aValue = std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(
70 myBaseConstraint->attribute(SketchPlugin_MultiRotation::ANGLE_ID()))->value();
71 if (fabs(myAngle - aValue) > tolerance)
77 DataPtr aData = myBaseConstraint->data();
78 AttributePoint2DPtr aCenterPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
79 SketchPlugin_MultiRotation::CENTER_ID());
80 bool aCenterPointChanged = aCenterPointAttribute != myCenterPointAttribute;
81 if (aCenterPointChanged)
82 myCenterPointAttribute = aCenterPointAttribute;
84 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiRotation::ANGLE_TYPE());
85 bool aFullValue = aMethodTypeAttr->value() != "SingleAngle";
86 bool isMethodChanged = aFullValue != myIsFullValue;
88 myIsFullValue = aFullValue;
90 if (aCenterPointChanged || isMethodChanged) {
91 DataPtr aData = myBaseConstraint->data();
92 std::list<ConstraintWrapperPtr> aConstraints = myStorage->constraint(myBaseConstraint);
93 std::list<ConstraintWrapperPtr>::const_iterator anIt = aConstraints.begin(),
94 aLast = aConstraints.end();
95 std::list<EntityWrapperPtr> anEntities;
96 for (; anIt != aLast; anIt++) {
97 ConstraintWrapperPtr aConstraint = *anIt;
98 aConstraint->setIsFullValue(myIsFullValue);
99 if (aCenterPointChanged) {
101 const std::list<EntityWrapperPtr>& aConstraintEntities = aConstraint->entities();
102 std::list<EntityWrapperPtr>::const_iterator aSIt = aConstraintEntities.begin(),
103 aSLast = aConstraintEntities.end();
104 EntityWrapperPtr aCenterPointEntity = *aSIt++;
105 if (aCenterPointChanged) {
106 AttributePtr aCenterPointAttr = aData->attribute(SketchPlugin_MultiRotation::CENTER_ID());
107 myStorage->update(aCenterPointAttr);
108 aCenterPointEntity = myStorage->entity(aCenterPointAttr);
110 anEntities.push_back(aCenterPointEntity);
112 for (; aSIt != aSLast; ++aSIt)
113 anEntities.push_back(*aSIt);
115 aConstraint->setEntities(anEntities);
118 myStorage->addConstraint(myBaseConstraint, aConstraints);
124 void SketchSolver_ConstraintMultiRotation::adjustConstraint()
129 if (fabs(myAngle) < tolerance) {
130 myStorage->setNeedToResolve(false);
134 const std::list<ConstraintWrapperPtr>& aConstraints = myStorage->constraint(myBaseConstraint);
135 std::list<ConstraintWrapperPtr>::const_iterator aCIt = aConstraints.begin();
136 for (; aCIt != aConstraints.end(); ++aCIt)
137 (*aCIt)->setValue(myAngle);
139 // Obtain coordinates of rotation center
140 EntityWrapperPtr aRotCenter = myStorage->entity(
141 myBaseConstraint->attribute(SketchPlugin_MultiRotation::CENTER_ID()));
142 std::list<ParameterWrapperPtr> aParams = aRotCenter->parameters();
143 myCenterCoord[0] = aParams.front()->value();
144 myCenterCoord[1] = aParams.back()->value();
146 double anAngleValue = myAngle;
147 if (myIsFullValue && myNumberOfCopies > 0)
148 anAngleValue /= myNumberOfCopies;
150 myRotationVal[0] = sin(anAngleValue * PI / 180.0);
151 myRotationVal[1] = cos(anAngleValue * PI / 180.0);
153 SketchSolver_ConstraintMulti::adjustConstraint();
156 void SketchSolver_ConstraintMultiRotation::getRelative(
157 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
159 theRelX = theAbsX - myCenterCoord[0];
160 theRelY = theAbsY - myCenterCoord[1];
163 void SketchSolver_ConstraintMultiRotation::getAbsolute(
164 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
166 theAbsX = theRelX + myCenterCoord[0];
167 theAbsY = theRelY + myCenterCoord[1];
170 void SketchSolver_ConstraintMultiRotation::transformRelative(double& theX, double& theY)
173 // myRotationVal[0] = sinA, myRotationVal[1] = cosA
174 double aTemp = theX * myRotationVal[1] - theY * myRotationVal[0];
175 theY = theX * myRotationVal[0] + theY * myRotationVal[1];
179 const std::string& SketchSolver_ConstraintMultiRotation::nameNbObjects()
181 return SketchPlugin_MultiRotation::NUMBER_OF_OBJECTS_ID();