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 if (theFeature == myBaseConstraint)
18 return; // the constraint is already being updated
20 PlaneGCSSolver_UpdateCoincidence* anUpdater =
21 static_cast<PlaneGCSSolver_UpdateCoincidence*>(theUpdater);
22 bool isAccepted = anUpdater->addCoincidence(myAttributes.front(), myAttributes.back());
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());
36 std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(mySolverConstraint);
37 aGCSConstraints.push_back(aConstraint->constraints().front());
39 myMiddle = ConstraintWrapperPtr();
40 mySolverConstraint = ConstraintWrapperPtr(
41 new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints, CONSTRAINT_MIDDLE_POINT));
44 myStorage->addConstraint(myBaseConstraint, mySolverConstraint);
49 myStorage->removeConstraint(myBaseConstraint);
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();
58 myMiddle = ConstraintWrapperPtr(
59 new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints.front(), CONSTRAINT_MIDDLE_POINT));
60 mySolverConstraint = ConstraintWrapperPtr(
61 new PlaneGCSSolver_ConstraintWrapper(aGCSConstraints.back(), CONSTRAINT_MIDDLE_POINT));
63 // send middle constraint only
64 myStorage->addConstraint(myBaseConstraint, myMiddle);