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< 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 getEntitiesAndCopies(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<std::list<EntityWrapperPtr> > anEntitiesAndCopies;
48 getAttributes(aStartPoint, aEndPoint, aFullValue, anEntitiesAndCopies);
49 if (!myErrorMsg.empty())
52 AttributeStringPtr aMethodTypeAttr =
53 myBaseConstraint->data()->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
54 myIsFullValue = aMethodTypeAttr->value() != "SingleValue";
57 BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
58 std::list<ConstraintWrapperPtr> aTransConstraints;
60 std::list< std::list<EntityWrapperPtr> >::iterator anEntIt = anEntitiesAndCopies.begin();
61 for (; anEntIt != anEntitiesAndCopies.end(); ++anEntIt) {
62 std::list<ConstraintWrapperPtr> aNewConstraints =
63 aBuilder->createConstraint(myBaseConstraint, myGroupID, mySketchID, myType,
64 0.0, aFullValue, aStartPoint, aEndPoint, *anEntIt);
65 aTransConstraints.insert(aTransConstraints.end(), aNewConstraints.begin(), aNewConstraints.end());
67 std::list<ConstraintWrapperPtr>::iterator aTCIt = aTransConstraints.begin();
68 for (; aTCIt != aTransConstraints.end(); ++ aTCIt)
69 (*aTCIt)->setIsFullValue(myIsFullValue);
71 myStorage->addConstraint(myBaseConstraint, aTransConstraints);
77 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
79 return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
82 void SketchSolver_ConstraintMultiTranslation::updateLocal()
84 DataPtr aData = myBaseConstraint->data();
85 AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
86 SketchPlugin_MultiTranslation::START_POINT_ID());
87 AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData,
88 SketchPlugin_MultiTranslation::END_POINT_ID());
89 AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
90 bool aFullValue = aMethodTypeAttr->value() != "SingleValue";
92 bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
93 bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
94 bool isMethodChanged = aFullValue != myIsFullValue;
96 if (aStartPointChanged)
97 myStartPointAttribute = aStartPointAttribute;
98 if (aStartPointChanged)
99 myEndPointAttribute = anEndPointAttribute;
101 myIsFullValue = aFullValue;
103 if (aStartPointChanged || anEndPointChanged || isMethodChanged) {
104 DataPtr aData = myBaseConstraint->data();
105 std::list<ConstraintWrapperPtr> aConstraints = myStorage->constraint(myBaseConstraint);
106 std::list<ConstraintWrapperPtr>::const_iterator anIt = aConstraints.begin(),
107 aLast = aConstraints.end();
108 std::list<EntityWrapperPtr> anEntities;
109 for (; anIt != aLast; anIt++) {
110 ConstraintWrapperPtr aConstraint = *anIt;
111 aConstraint->setIsFullValue(myIsFullValue);
114 const std::list<EntityWrapperPtr>& aConstraintEntities = aConstraint->entities();
115 std::list<EntityWrapperPtr>::const_iterator aSIt = aConstraintEntities.begin(),
116 aSLast = aConstraintEntities.end();
117 EntityWrapperPtr aStartEntity = *aSIt++;
118 if (aStartPointChanged) {
119 AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID());
120 myStorage->update(aStartPointAttr);
121 aStartEntity = myStorage->entity(aStartPointAttr);
123 anEntities.push_back(aStartEntity);
125 EntityWrapperPtr anEndEntity = *aSIt++;
126 if (anEndPointChanged) {
127 AttributePtr anEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID());
128 myStorage->update(anEndPointAttr);
129 anEndEntity = myStorage->entity(anEndPointAttr);
131 anEntities.push_back(anEndEntity);
133 for (; aSIt != aSLast; ++aSIt)
134 anEntities.push_back(*aSIt);
136 aConstraint->setEntities(anEntities);
138 myStorage->addConstraint(myBaseConstraint, aConstraints);