Salome HOME
Fix regressions found by unit tests
[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   if (theFeature == myBaseConstraint && myInSolver)
18     return; // the constraint is already being updated
19
20   PlaneGCSSolver_UpdateCoincidence* anUpdater =
21       static_cast<PlaneGCSSolver_UpdateCoincidence*>(theUpdater);
22   bool isAccepted = anUpdater->addCoincidence(myAttributes.front(), myAttributes.back());
23   if (isAccepted) {
24     if (!myInSolver) {
25       myInSolver = true;
26
27       if (myMiddle) {
28         // remove previously adde constraint
29         myStorage->removeConstraint(myBaseConstraint);
30         // merge divided constraints into single object
31         std::list<GCSConstraintPtr> aGCSConstraints;
32         std::shared_ptr<PlaneGCSSolver_ConstraintWrapper> aConstraint =
33             std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(myMiddle);
34         aGCSConstraints.push_back(aConstraint->constraints().front());
35         aConstraint =
36             std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(mySolverConstraint);
37         aGCSConstraints.push_back(aConstraint->constraints().front());
38
39         myMiddle = ConstraintWrapperPtr();
40         mySolverConstraint = ConstraintWrapperPtr(
41             new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints, CONSTRAINT_MIDDLE_POINT));
42       }
43
44       myStorage->addConstraint(myBaseConstraint, mySolverConstraint);
45     }
46   } else {
47     if (myInSolver) {
48       myStorage->removeConstraint(myBaseConstraint);
49       myInSolver = false;
50     }
51
52     if (!myMiddle) {
53       // divide solver constraints to the middle point and point-line coincidence
54       std::shared_ptr<PlaneGCSSolver_ConstraintWrapper> aConstraint =
55           std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(mySolverConstraint);
56       std::list<GCSConstraintPtr> aGCSConstraints = aConstraint->constraints();
57
58       myMiddle = ConstraintWrapperPtr(
59           new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints.front(), CONSTRAINT_MIDDLE_POINT));
60       mySolverConstraint = ConstraintWrapperPtr(
61           new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints.back(), CONSTRAINT_MIDDLE_POINT));
62
63       // send middle constraint only
64       myStorage->addConstraint(myBaseConstraint, myMiddle);
65     }
66   }
67 }