X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_ConstraintDistance.cpp;h=5bbcd791977b6d9736ec7ee7d50cfec2a4d7d8c4;hb=801131b41013eeb97fe917311b47bff78fb86d86;hp=d256a25ed2848881b5e70aa4af1000ef00294065;hpb=acaa4d04df93d44ed6c093584aa7de2f7f86b5e3;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_ConstraintDistance.cpp b/src/SketchSolver/SketchSolver_ConstraintDistance.cpp index d256a25ed..5bbcd7919 100644 --- a/src/SketchSolver/SketchSolver_ConstraintDistance.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintDistance.cpp @@ -1,83 +1,69 @@ #include -#include #include +#include +#include +#include +#include #include +#include -void SketchSolver_ConstraintDistance::process() + +void SketchSolver_ConstraintDistance::getAttributes( + double& theValue, + std::vector& theAttributes) { - cleanErrorMsg(); - if (!myBaseConstraint || !myStorage || myGroup == 0) { - /// TODO: Put error message here + SketchSolver_Constraint::getAttributes(theValue, theAttributes); + if (!myErrorMsg.empty() || !theAttributes[0]) { + theAttributes.clear(); return; } - if (!mySlvsConstraints.empty()) // some data is changed, update constraint - update(myBaseConstraint); - double aValue; - std::vector anEntities; - getAttributes(aValue, anEntities); - if (!myErrorMsg.empty()) - return; + if (theAttributes[1]) + myType = CONSTRAINT_PT_PT_DISTANCE; + else if (theAttributes[2] && theAttributes[2]->type() == ENTITY_LINE) + myType = CONSTRAINT_PT_LINE_DISTANCE; + else + theAttributes.clear(); - // Obtain entities to identify the type of distance - static const int aNbPoints = 2; - Slvs_hEntity aPoint[aNbPoints] = {SLVS_E_UNKNOWN, SLVS_E_UNKNOWN}; - Slvs_hEntity aLine = SLVS_E_UNKNOWN; - myType = SLVS_C_PT_PT_DISTANCE; - int aPtPos = 0; - std::vector::iterator anEntIter = anEntities.begin(); - for (; anEntIter != anEntities.end(); anEntIter++) { - if (*anEntIter == SLVS_E_UNKNOWN) - continue; - Slvs_Entity anEnt = myStorage->getEntity(*anEntIter); - if (anEnt.type == SLVS_E_POINT_IN_2D || anEnt.type == SLVS_E_POINT_IN_3D) { - if (aPtPos >= aNbPoints) { - myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); - return; - } - aPoint[aPtPos++] = *anEntIter; - } - else if (anEnt.type == SLVS_E_LINE_SEGMENT) { - if (myType == SLVS_C_PT_LINE_DISTANCE) { - myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); - return; - } - aLine = *anEntIter; - myType = SLVS_C_PT_LINE_DISTANCE; + myPrevValue = 0.0; +} + +void SketchSolver_ConstraintDistance::adjustConstraint() +{ + ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front(); + + // Adjust point-point distance if the points are equal + if (getType() == CONSTRAINT_PT_PT_DISTANCE) { + const std::list& aSubs = aConstraint->entities(); + if (aSubs.front()->isEqual(aSubs.back())) { + // Change X coordinate of second point to eliminate coincidence + ParameterWrapperPtr aX = aSubs.back()->parameters().front(); + aX->setValue(aX->value() + 1.0); + myStorage->update(aX); } + return; } - Slvs_Constraint aConstraint = Slvs_MakeConstraint(SLVS_C_UNKNOWN, myGroup->getId(), - getType(), myGroup->getWorkplaneId(), aValue, aPoint[0], aPoint[1], aLine, SLVS_E_UNKNOWN); - aConstraint.h = myStorage->addConstraint(aConstraint); - mySlvsConstraints.push_back(aConstraint.h); - // Adjust point-line distance - if (getType() != SLVS_C_PT_LINE_DISTANCE) + if (fabs(myPrevValue) == fabs(aConstraint->value())) { + // sign of distance is not changed + aConstraint->setValue(myPrevValue); + myStorage->addConstraint(myBaseConstraint, aConstraint); return; - - // Get constraint parameters and check the sign of constraint value - std::vector::iterator aCIter = mySlvsConstraints.begin(); - for (; aCIter != mySlvsConstraints.end(); aCIter++) { - Slvs_Constraint aConstraint = myStorage->getConstraint(*aCIter); - Slvs_Entity aLine = myStorage->getEntity(aConstraint.entityA); - // Obtain point and line coordinates - Slvs_hEntity aPointID[3] = {aConstraint.ptA, aLine.point[0], aLine.point[1]}; - std::shared_ptr aPoints[3]; - for (int i = 0; i < 3; i++) { - Slvs_Entity aPoint = myStorage->getEntity(aPointID[i]); - Slvs_Param aParams[2] = { - myStorage->getParameter(aPoint.param[0]), - myStorage->getParameter(aPoint.param[1])}; - aPoints[i] = std::shared_ptr(new GeomAPI_XY(aParams[0].val, aParams[1].val)); - } - std::shared_ptr aLineVec = aPoints[2]->decreased(aPoints[1]); - std::shared_ptr aPtLineVec = aPoints[0]->decreased(aPoints[1]); - if (aPtLineVec->cross(aLineVec) * aConstraint.valA < 0.0) { - aConstraint.valA *= -1.0; - myStorage->updateConstraint(aConstraint); - } } + + // Adjust the sign of constraint value + BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder(); + aBuilder->adjustConstraint(aConstraint); + myStorage->addConstraint(myBaseConstraint, aConstraint); +} + +void SketchSolver_ConstraintDistance::update() +{ + ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front(); + myPrevValue = aConstraint->value(); + + SketchSolver_Constraint::update(); }