Salome HOME
dd4bbb0d8a9c4d71249081b28f8d2af3465c1c33
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintMultiTranslation.cpp
1 #include <SketchSolver_ConstraintMultiTranslation.h>
2 #include <SketchSolver_Error.h>
3 #include <SketchSolver_Manager.h>
4
5 #include <SketchPlugin_MultiTranslation.h>
6
7 #include <ModelAPI_AttributeString.h>
8
9 #include <GeomDataAPI_Point2D.h>
10
11 void SketchSolver_ConstraintMultiTranslation::getAttributes(
12     EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint,
13     std::list< std::list<EntityWrapperPtr> >& theEntities)
14 {
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();
21     return;
22   }
23
24   myType = CONSTRAINT_MULTI_TRANSLATION;
25
26   myStorage->update(aStartPointAttr);
27   theStartPoint = myStorage->entity(aStartPointAttr);
28   myStorage->update(aEndPointAttr);
29   theEndPoint = myStorage->entity(aEndPointAttr);
30
31   getEntitiesAndCopies(theEntities);
32
33 }
34
35 void SketchSolver_ConstraintMultiTranslation::process()
36 {
37   cleanErrorMsg();
38   if (!myBaseConstraint || !myStorage || myGroupID == GID_UNKNOWN) {
39     /// TODO: Put error message here
40     return;
41   }
42
43   EntityWrapperPtr aStartPoint, aEndPoint;
44   std::list<std::list<EntityWrapperPtr> > anEntitiesAndCopies;
45   getAttributes(aStartPoint, aEndPoint, anEntitiesAndCopies);
46   if (!myErrorMsg.empty())
47     return;
48
49   AttributeStringPtr aMethodTypeAttr =
50       myBaseConstraint->data()->string(SketchPlugin_MultiTranslation::VALUE_TYPE());
51   myIsFullValue = aMethodTypeAttr->value() != "SingleValue";
52
53
54   BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
55   std::list<ConstraintWrapperPtr> aTransConstraints;
56
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());
63   }
64   std::list<ConstraintWrapperPtr>::iterator aTCIt = aTransConstraints.begin();
65   for (; aTCIt != aTransConstraints.end(); ++ aTCIt)
66     (*aTCIt)->setIsFullValue(myIsFullValue);
67
68   myStorage->addConstraint(myBaseConstraint, aTransConstraints);
69
70   myAdjusted = false;
71   adjustConstraint();
72 }
73
74 const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects()
75 {
76   return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID();
77 }
78
79 void SketchSolver_ConstraintMultiTranslation::updateLocal()
80 {
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";
88
89   bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute;
90   bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute;
91   bool isMethodChanged = aFullValue != myIsFullValue;
92
93   if (aStartPointChanged)
94     myStartPointAttribute = aStartPointAttribute;
95   if (aStartPointChanged)
96     myEndPointAttribute = anEndPointAttribute;
97   if (isMethodChanged)
98     myIsFullValue = aFullValue;
99
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);
109       anEntities.clear();
110
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);
119       }
120       anEntities.push_back(aStartEntity);
121
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);
127       }
128       anEntities.push_back(anEndEntity);
129
130       for (; aSIt != aSLast; ++aSIt)
131         anEntities.push_back(*aSIt);
132
133       aConstraint->setEntities(anEntities);
134     }
135     myStorage->addConstraint(myBaseConstraint, aConstraints);
136
137     myAdjusted = false;
138   }
139 }
140