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 std::list< 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 getEntitiesAndCopies(theEntities);
35 void SketchSolver_ConstraintMultiTranslation::process()
38 if (!myBaseConstraint || !myStorage || myGroupID == GID_UNKNOWN) {
39 /// TODO: Put error message here
43 EntityWrapperPtr aStartPoint, aEndPoint;
44 std::list<std::list<EntityWrapperPtr> > anEntitiesAndCopies;
45 getAttributes(aStartPoint, aEndPoint, anEntitiesAndCopies);
46 if (!myErrorMsg.empty())
49 AttributeStringPtr aMethodTypeAttr =
50 myBaseConstraint->data()->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
51 myIsFullValue = aMethodTypeAttr->value() != "SingleValue";
54 BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
55 std::list<ConstraintWrapperPtr> aTransConstraints;
57 std::list< std::list<EntityWrapperPtr> >::iterator anEntIt = anEntitiesAndCopies.begin();
58 for (; anEntIt != anEntitiesAndCopies.end(); ++anEntIt) {
59 std::list<ConstraintWrapperPtr> aNewConstraints =
60 aBuilder->createConstraint(myBaseConstraint, myGroupID, mySketchID, myType,
61 0.0, aStartPoint, aEndPoint, *anEntIt);
62 aTransConstraints.insert(aTransConstraints.end(), aNewConstraints.begin(), aNewConstraints.end());
64 std::list<ConstraintWrapperPtr>::iterator aTCIt = aTransConstraints.begin();
65 for (; aTCIt != aTransConstraints.end(); ++ aTCIt)
66 (*aTCIt)->setIsFullValue(myIsFullValue);
68 myStorage->addConstraint(myBaseConstraint, aTransConstraints);
74 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
76 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
79 void SketchSolver_ConstraintMultiTranslation::updateLocal()
81 DataPtr aData = myBaseConstraint->data();
82 AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
83 SketchPlugin_MultiTranslation::START_POINT_ID());
84 AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
85 SketchPlugin_MultiTranslation::END_POINT_ID());
86 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
87 bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
89 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
90 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
91 bool isMethodChanged = aFullValue != myIsFullValue;
93 if (aStartPointChanged)
94 myStartPointAttribute = aStartPointAttribute;
95 if (aStartPointChanged)
96 myEndPointAttribute = anEndPointAttribute;
98 myIsFullValue = aFullValue;
100 if (aStartPointChanged || anEndPointChanged || isMethodChanged) {
101 DataPtr aData = myBaseConstraint->data();
102 std::list<ConstraintWrapperPtr> aConstraints = myStorage->constraint(myBaseConstraint);
103 std::list<ConstraintWrapperPtr>::const_iterator anIt = aConstraints.begin(),
104 aLast = aConstraints.end();
105 std::list<EntityWrapperPtr> anEntities;
106 for (; anIt != aLast; anIt++) {
107 ConstraintWrapperPtr aConstraint = *anIt;
108 aConstraint->setIsFullValue(myIsFullValue);
111 const std::list<EntityWrapperPtr>& aConstraintEntities = aConstraint->entities();
112 std::list<EntityWrapperPtr>::const_iterator aSIt = aConstraintEntities.begin(),
113 aSLast = aConstraintEntities.end();
114 EntityWrapperPtr aStartEntity = *aSIt++;
115 if (aStartPointChanged) {
116 AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID());
117 myStorage->update(aStartPointAttr);
118 aStartEntity = myStorage->entity(aStartPointAttr);
120 anEntities.push_back(aStartEntity);
122 EntityWrapperPtr anEndEntity = *aSIt++;
123 if (anEndPointChanged) {
124 AttributePtr anEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID());
125 myStorage->update(anEndPointAttr);
126 anEndEntity = myStorage->entity(anEndPointAttr);
128 anEntities.push_back(anEndEntity);
130 for (; aSIt != aSLast; ++aSIt)
131 anEntities.push_back(*aSIt);
133 aConstraint->setEntities(anEntities);
135 myStorage->addConstraint(myBaseConstraint, aConstraints);