1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
3 #include <SketchSolver_ConstraintMiddle.h>
4 #include <PlaneGCSSolver_ConstraintWrapper.h>
5 #include <PlaneGCSSolver_UpdateCoincidence.h>
7 void SketchSolver_ConstraintMiddle::getAttributes(
8 EntityWrapperPtr& theValue,
9 std::vector<EntityWrapperPtr>& theAttributes)
11 SketchSolver_Constraint::getAttributes(theValue, theAttributes);
14 void SketchSolver_ConstraintMiddle::notify(const FeaturePtr& theFeature,
15 PlaneGCSSolver_Update* theUpdater)
17 PlaneGCSSolver_UpdateCoincidence* anUpdater =
18 static_cast<PlaneGCSSolver_UpdateCoincidence*>(theUpdater);
19 bool isAccepted = anUpdater->addCoincidence(myAttributes.front(), myAttributes.back());
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());
33 std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(mySolverConstraint);
34 aGCSConstraints.push_back(aConstraint->constraints().front());
36 myMiddle = ConstraintWrapperPtr();
37 mySolverConstraint = ConstraintWrapperPtr(
38 new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints, CONSTRAINT_MIDDLE_POINT));
41 myStorage->addConstraint(myBaseConstraint, mySolverConstraint);
46 myStorage->removeConstraint(myBaseConstraint);
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();
55 myMiddle = ConstraintWrapperPtr(
56 new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints.front(), CONSTRAINT_MIDDLE_POINT));
57 mySolverConstraint = ConstraintWrapperPtr(
58 new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints.back(), CONSTRAINT_MIDDLE_POINT));
60 // send middle constraint only
61 myStorage->addConstraint(myBaseConstraint, myMiddle);