1 #include <SketchSolver_ConstraintMultiTranslation.h>
2 #include <SketchSolver_Error.h>
3 #include <SketchSolver_Manager.h>
5 #include <SketchPlugin_MultiTranslation.h>
7 #include <ModelAPI_AttributeString.h>
9 #include <GeomDataAPI_Point2D.h>
11 void SketchSolver_ConstraintMultiTranslation::getAttributes(
12 EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint,
13 bool& theFullValue, std::list<EntityWrapperPtr>& theEntities)
15 DataPtr aData = myBaseConstraint->data();
16 AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID());
17 AttributePtr aEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID());
18 if (!aStartPointAttr || !aStartPointAttr->isInitialized() ||
19 !aEndPointAttr || !aEndPointAttr->isInitialized()) {
20 myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
24 myType = CONSTRAINT_MULTI_TRANSLATION;
26 myStorage->update(aStartPointAttr);
27 theStartPoint = myStorage->entity(aStartPointAttr);
28 myStorage->update(aEndPointAttr);
29 theEndPoint = myStorage->entity(aEndPointAttr);
31 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
32 theFullValue = aMethodTypeAttr->value() != "SingleValue";
34 getEntities(theEntities);
37 void SketchSolver_ConstraintMultiTranslation::process()
40 if (!myBaseConstraint || !myStorage || myGroupID == GID_UNKNOWN) {
41 /// TODO: Put error message here
45 EntityWrapperPtr aStartPoint, aEndPoint;
47 std::list<EntityWrapperPtr> aBaseEntities;
48 getAttributes(aStartPoint, aEndPoint, aFullValue, aBaseEntities);
49 if (!myErrorMsg.empty())
52 AttributeStringPtr aMethodTypeAttr =
53 myBaseConstraint->data()->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
55 BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
56 std::list<ConstraintWrapperPtr> aTransConstraints;
58 std::list<EntityWrapperPtr>::iterator anEntIt = aBaseEntities.begin();
59 for (; anEntIt != aBaseEntities.end(); ++anEntIt) {
60 std::list<ConstraintWrapperPtr> aNewConstraints =
61 aBuilder->createConstraint(myBaseConstraint, myGroupID, mySketchID, myType,
62 0.0, aFullValue, aStartPoint, aEndPoint, std::list<EntityWrapperPtr>(1, *anEntIt));
63 aTransConstraints.insert(aTransConstraints.end(), aNewConstraints.begin(), aNewConstraints.end());
66 myStorage->addConstraint(myBaseConstraint, aTransConstraints);
72 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
74 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
77 void SketchSolver_ConstraintMultiTranslation::updateLocal()
79 DataPtr aData = myBaseConstraint->data();
80 AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
81 SketchPlugin_MultiTranslation::START_POINT_ID());
82 AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
83 SketchPlugin_MultiTranslation::END_POINT_ID());
84 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
85 bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
87 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
88 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
89 bool isMethodChanged = aFullValue != myIsFullValue;
91 if (aStartPointChanged)
92 myStartPointAttribute = aStartPointAttribute;
93 if (aStartPointChanged)
94 myEndPointAttribute = anEndPointAttribute;
96 myIsFullValue = aFullValue;
98 if (aStartPointChanged || anEndPointChanged || isMethodChanged) {
99 DataPtr aData = myBaseConstraint->data();
100 std::list<ConstraintWrapperPtr> aConstraints = myStorage->constraint(myBaseConstraint);
101 std::list<ConstraintWrapperPtr>::const_iterator anIt = aConstraints.begin(),
102 aLast = aConstraints.end();
103 std::list<EntityWrapperPtr> anEntities;
104 for (; anIt != aLast; anIt++) {
105 ConstraintWrapperPtr aConstraint = *anIt;
106 aConstraint->setIsFullValue(myIsFullValue);
109 const std::list<EntityWrapperPtr>& aConstraintEntities = aConstraint->entities();
110 std::list<EntityWrapperPtr>::const_iterator aSIt = aConstraintEntities.begin(),
111 aSLast = aConstraintEntities.end();
112 EntityWrapperPtr aStartEntity = *aSIt++;
113 if (aStartPointChanged) {
114 AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID());
115 myStorage->update(aStartPointAttr);
116 aStartEntity = myStorage->entity(aStartPointAttr);
118 anEntities.push_back(aStartEntity);
120 EntityWrapperPtr anEndEntity = *aSIt++;
121 if (anEndPointChanged) {
122 AttributePtr anEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID());
123 myStorage->update(anEndPointAttr);
124 anEndEntity = myStorage->entity(anEndPointAttr);
126 anEntities.push_back(anEndEntity);
128 for (; aSIt != aSLast; ++aSIt)
129 anEntities.push_back(*aSIt);
131 aConstraint->setEntities(anEntities);
133 myStorage->addConstraint(myBaseConstraint, aConstraints);
139 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
144 // Obtain delta between start and end points of translation
145 EntityWrapperPtr aStart = myStorage->entity(
146 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID()));
147 std::list<ParameterWrapperPtr> aStartParams = aStart->parameters();
148 EntityWrapperPtr aEnd = myStorage->entity(
149 myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID()));
150 std::list<ParameterWrapperPtr> aEndParams = aEnd->parameters();
151 myDelta[0] = aEndParams.front()->value() - aStartParams.front()->value();
152 myDelta[1] = aEndParams.back()->value() - aStartParams.back()->value();
154 SketchSolver_ConstraintMulti::adjustConstraint();
157 void SketchSolver_ConstraintMultiTranslation::getRelative(
158 double theAbsX, double theAbsY, double& theRelX, double& theRelY)
164 void SketchSolver_ConstraintMultiTranslation::getAbsolute(
165 double theRelX, double theRelY, double& theAbsX, double& theAbsY)
171 void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, double& theY)
173 // translate coordinates