1 #include <SketchSolver_ConstraintParametric.h>
2 #include <SketchSolver_Error.h>
3 #include <SketchSolver_Group.h>
5 #include <GeomDataAPI_Point2D.h>
7 SketchSolver_ConstraintParametric::SketchSolver_ConstraintParametric(AttributePtr theAttribute)
8 : SketchSolver_ConstraintRigid(ConstraintPtr()),
9 myBaseAttribute(theAttribute)
14 void SketchSolver_ConstraintParametric::process()
17 if (!myBaseAttribute || !myStorage || myGroup == 0) {
18 /// TODO: Put error message here
21 if (!mySlvsConstraints.empty()) // some data is changed, update constraint
22 update(myBaseConstraint);
24 Slvs_hEntity anAttrID;
25 getAttributes(anAttrID);
26 if (!myErrorMsg.empty() || (myFeatureMap.empty() && myAttributeMap.empty()))
29 myHorizLineID = SLVS_E_UNKNOWN;
30 myVertLineID = SLVS_E_UNKNOWN;
32 std::shared_ptr<GeomDataAPI_Point2D> aPoint =
33 std::dynamic_pointer_cast<GeomDataAPI_Point2D>(myBaseAttribute);
36 if (!aPoint->textX().empty()) {
37 // Create vertical line with fixed boundary point
38 Slvs_Entity aLine = createLine(aPoint->x(), -100.0, aPoint->x(), 100.0);
39 fixPoint(aLine.point[0]);
40 Slvs_Constraint aVertConstr = Slvs_MakeConstraint(SLVS_C_UNKNOWN, myGroup->getId(),
41 SLVS_C_VERTICAL, myGroup->getWorkplaneId(), 0.0, SLVS_E_UNKNOWN, SLVS_E_UNKNOWN,
42 aLine.h, SLVS_E_UNKNOWN);
43 myStorage->addConstraint(aVertConstr);
44 // Place point on line
45 Slvs_Constraint aConstraint = Slvs_MakeConstraint(SLVS_C_UNKNOWN, myGroup->getId(),
46 SLVS_C_PT_ON_LINE, myGroup->getWorkplaneId(), 0.0, anAttrID, SLVS_E_UNKNOWN,
47 aLine.h, SLVS_E_UNKNOWN);
48 aConstraint.h = myStorage->addConstraint(aConstraint);
49 mySlvsConstraints.push_back(aConstraint.h);
50 myVertLineID = aLine.h;
53 if (!aPoint->textY().empty()) {
54 // Create horizontal line with fixed boundary points
55 Slvs_Entity aLine = createLine(-100.0, aPoint->y(), 100.0, aPoint->y());
56 fixPoint(aLine.point[0]);
57 Slvs_Constraint aHorizConstr = Slvs_MakeConstraint(SLVS_C_UNKNOWN, myGroup->getId(),
58 SLVS_C_HORIZONTAL, myGroup->getWorkplaneId(), 0.0, SLVS_E_UNKNOWN, SLVS_E_UNKNOWN,
59 aLine.h, SLVS_E_UNKNOWN);
60 myStorage->addConstraint(aHorizConstr);
61 // Place point on line
62 Slvs_Constraint aConstraint = Slvs_MakeConstraint(SLVS_C_UNKNOWN, myGroup->getId(),
63 SLVS_C_PT_ON_LINE, myGroup->getWorkplaneId(), 0.0, anAttrID, SLVS_E_UNKNOWN,
64 aLine.h, SLVS_E_UNKNOWN);
65 aConstraint.h = myStorage->addConstraint(aConstraint);
66 mySlvsConstraints.push_back(aConstraint.h);
67 myHorizLineID = aLine.h;
73 void SketchSolver_ConstraintParametric::getAttributes(Slvs_hEntity& theAttributeID)
75 int aType = SLVS_E_UNKNOWN; // type of created entity
76 theAttributeID = SLVS_E_UNKNOWN;
77 theAttributeID = myGroup->getAttributeId(myBaseAttribute);
78 if (theAttributeID == SLVS_E_UNKNOWN) {
79 theAttributeID = changeEntity(myBaseAttribute, aType);
80 if (theAttributeID == SLVS_E_UNKNOWN) {
81 myErrorMsg = SketchSolver_Error::NOT_INITIALIZED();
86 myAttributeMap[myBaseAttribute] = theAttributeID;
90 void SketchSolver_ConstraintParametric::update(ConstraintPtr theConstraint)
93 if (!theConstraint || theConstraint == myBaseConstraint) {
94 std::shared_ptr<GeomDataAPI_Point2D> aPoint =
95 std::dynamic_pointer_cast<GeomDataAPI_Point2D>(myBaseAttribute);
96 if (aPoint && ((!aPoint->textX().empty() && myVertLineID != SLVS_E_UNKNOWN) ||
97 (!aPoint->textY().empty() && myHorizLineID != SLVS_E_UNKNOWN))) {
106 void SketchSolver_ConstraintParametric::refresh()
108 Slvs_hEntity aBasePointID = myAttributeMap[myBaseAttribute];
109 const Slvs_Entity& aBasePoint = myStorage->getEntity(aBasePointID);
111 aXY[0] = myVertLineID != SLVS_E_UNKNOWN ? myX : myStorage->getParameter(aBasePoint.param[0]).val;
112 aXY[1] = myHorizLineID != SLVS_E_UNKNOWN ? myY : myStorage->getParameter(aBasePoint.param[1]).val;
114 std::list<Slvs_Constraint> aCoincidence = myStorage->getConstraintsByType(SLVS_C_POINTS_COINCIDENT);
115 std::list<Slvs_Constraint>::const_iterator aCIt = aCoincidence.begin();
116 for (; aCIt != aCoincidence.end(); ++aCIt) {
117 if (aCIt->ptA != aBasePointID && aCIt->ptB != aBasePointID)
119 Slvs_hEntity anOtherPointID = aCIt->ptA == aBasePointID ? aCIt->ptB : aCIt->ptA;
120 const Slvs_Entity& aPoint = myStorage->getEntity(anOtherPointID);
121 for (int i = 0; i < 2; i++) {
122 Slvs_Param aParam = myStorage->getParameter(aPoint.param[i]);
124 myStorage->updateParameter(aParam);
129 void SketchSolver_ConstraintParametric::adjustConstraint()
131 std::shared_ptr<GeomDataAPI_Point2D> aPoint =
132 std::dynamic_pointer_cast<GeomDataAPI_Point2D>(myBaseAttribute);
136 if (!aPoint->textX().empty()) {
137 const Slvs_Entity& aLine = myStorage->getEntity(myVertLineID);
138 const Slvs_Entity& aStartPoint = myStorage->getEntity(aLine.point[0]);
139 Slvs_Param aParX = myStorage->getParameter(aStartPoint.param[0]);
140 aParX.val = aPoint->x();
141 myStorage->updateParameter(aParX);
144 if (!aPoint->textY().empty()) {
145 const Slvs_Entity& aLine = myStorage->getEntity(myHorizLineID);
146 const Slvs_Entity& aStartPoint = myStorage->getEntity(aLine.point[0]);
147 Slvs_Param aParY = myStorage->getParameter(aStartPoint.param[1]);
148 aParY.val = aPoint->y();
149 myStorage->updateParameter(aParY);
155 Slvs_Entity SketchSolver_ConstraintParametric::createLine(
156 double theStartX, double theStartY, double theEndX, double theEndY)
159 Slvs_Param aParX = Slvs_MakeParam(SLVS_E_UNKNOWN, myGroup->getId(), theStartX);
160 Slvs_Param aParY = Slvs_MakeParam(SLVS_E_UNKNOWN, myGroup->getId(), theStartY);
161 aParX.h = myStorage->addParameter(aParX);
162 aParY.h = myStorage->addParameter(aParY);
163 Slvs_Entity aStartPoint = Slvs_MakePoint2d(SLVS_E_UNKNOWN, myGroup->getId(),
164 myGroup->getWorkplaneId(), aParX.h, aParY.h);
165 aStartPoint.h = myStorage->addEntity(aStartPoint);
168 aParX = Slvs_MakeParam(SLVS_E_UNKNOWN, myGroup->getId(), theEndX);
169 aParY = Slvs_MakeParam(SLVS_E_UNKNOWN, myGroup->getId(), theEndY);
170 aParX.h = myStorage->addParameter(aParX);
171 aParY.h = myStorage->addParameter(aParY);
172 Slvs_Entity aEndPoint = Slvs_MakePoint2d(SLVS_E_UNKNOWN, myGroup->getId(),
173 myGroup->getWorkplaneId(), aParX.h, aParY.h);
174 aEndPoint.h = myStorage->addEntity(aEndPoint);
177 Slvs_Entity aLine = Slvs_MakeLineSegment(SLVS_E_UNKNOWN, myGroup->getId(),
178 myGroup->getWorkplaneId(), aStartPoint.h, aEndPoint.h);
179 aLine.h = myStorage->addEntity(aLine);