Salome HOME
Merge remote-tracking branch 'remotes/origin/master' into azv/SketchSolver_Refactoring
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintMiddle.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 #include <SketchSolver_ConstraintMiddle.h>
4 #include <PlaneGCSSolver_ConstraintWrapper.h>
5 #include <PlaneGCSSolver_UpdateCoincidence.h>
6
7 void SketchSolver_ConstraintMiddle::getAttributes(
8     EntityWrapperPtr& theValue,
9     std::vector<EntityWrapperPtr>& theAttributes)
10 {
11   SketchSolver_Constraint::getAttributes(theValue, theAttributes);
12 }
13
14 void SketchSolver_ConstraintMiddle::notify(const FeaturePtr&      theFeature,
15                                            PlaneGCSSolver_Update* theUpdater)
16 {
17   PlaneGCSSolver_UpdateCoincidence* anUpdater =
18       static_cast<PlaneGCSSolver_UpdateCoincidence*>(theUpdater);
19   bool isAccepted = anUpdater->checkCoincidence(myAttributes.front(), myAttributes.back());
20   if (isAccepted) {
21     if (!myInSolver) {
22       myInSolver = true;
23
24       if (myMiddle) {
25         // remove previously adde constraint
26         myStorage->removeConstraint(myBaseConstraint);
27         // merge divided constraints into single object
28         std::list<GCSConstraintPtr> aGCSConstraints;
29         std::shared_ptr<PlaneGCSSolver_ConstraintWrapper> aConstraint =
30             std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(myMiddle);
31         aGCSConstraints.push_back(aConstraint->constraints().front());
32         aConstraint =
33             std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(mySolverConstraint);
34         aGCSConstraints.push_back(aConstraint->constraints().front());
35
36         myMiddle = ConstraintWrapperPtr();
37         mySolverConstraint = ConstraintWrapperPtr(
38             new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints, CONSTRAINT_MIDDLE_POINT));
39       }
40
41       myStorage->addConstraint(myBaseConstraint, mySolverConstraint);
42     }
43   } else {
44     if (myInSolver) {
45       myInSolver = false;
46       myStorage->removeConstraint(myBaseConstraint);
47     }
48
49     if (!myMiddle) {
50       // divide solver constraints to the middle point and point-line coincidence
51       std::shared_ptr<PlaneGCSSolver_ConstraintWrapper> aConstraint =
52           std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(mySolverConstraint);
53       std::list<GCSConstraintPtr> aGCSConstraints = aConstraint->constraints();
54
55       myMiddle = ConstraintWrapperPtr(
56           new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints.front(), CONSTRAINT_MIDDLE_POINT));
57       mySolverConstraint = ConstraintWrapperPtr(
58           new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints.back(), CONSTRAINT_MIDDLE_POINT));
59
60       // send middle constraint only
61       myStorage->addConstraint(myBaseConstraint, myMiddle);
62     }
63   }
64 }