X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_ConstraintTangent.cpp;h=690587ae238e72030798244b7912f75e8331932d;hb=4f565b2204d3fba046aa8c851abada2a5a17bf6c;hp=0bd02bf0b5d2b7b77254ff7f514888bdcd851dd3;hpb=af68f1a45db8f50e0786190d56b8c71ab732eac4;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_ConstraintTangent.cpp b/src/SketchSolver/SketchSolver_ConstraintTangent.cpp index 0bd02bf0b..690587ae2 100644 --- a/src/SketchSolver/SketchSolver_ConstraintTangent.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintTangent.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + #include #include #include @@ -38,6 +40,14 @@ static bool hasSingleCoincidence(EntityWrapperPtr theEntity1, EntityWrapperPtr t return aNbCoinc == 1; } +/// \brief Check if two connected arcs have centers +/// in same direction relatively to connection point +static bool isInternalTangency(EntityWrapperPtr theEntity1, EntityWrapperPtr theEntity2) +{ + BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder(); + return aBuilder->isArcArcTangencyInternal(theEntity1, theEntity2); +} + void SketchSolver_ConstraintTangent::getAttributes( double& theValue, @@ -78,16 +88,18 @@ void SketchSolver_ConstraintTangent::getAttributes( else if (aNbCircles == 1) myType = CONSTRAINT_TANGENT_CIRCLE_LINE; } - else if (aNbArcs == 2) + else if (aNbArcs == 2) { myType = CONSTRAINT_TANGENT_ARC_ARC; + isArcArcInternal = isInternalTangency(theAttributes[2], theAttributes[3]); + } else { myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); return; } - if (myType != CONSTRAINT_TANGENT_CIRCLE_LINE && + if (myType == CONSTRAINT_TANGENT_ARC_LINE && !hasSingleCoincidence(theAttributes[2], theAttributes[3])) - myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); + myErrorMsg = SketchSolver_Error::TANGENCY_FAILED(); if (isSwap) { EntityWrapperPtr aTemp = theAttributes[2]; @@ -98,24 +110,32 @@ void SketchSolver_ConstraintTangent::getAttributes( void SketchSolver_ConstraintTangent::adjustConstraint() { - if (myType != CONSTRAINT_TANGENT_CIRCLE_LINE) - return; - - ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front(); - AttributePtr aCircleCenter = aConstraint->entities().front()->baseAttribute(); - if (!aCircleCenter) - return; - FeaturePtr aCircle = ModelAPI_Feature::feature(aCircleCenter->owner()); - AttributeDoublePtr aRadius = std::dynamic_pointer_cast( - aCircle->attribute(SketchPlugin_Circle::RADIUS_ID())); - - if (fabs(aRadius->value()) == fabs(aConstraint->value())) - return; - - aConstraint->setValue(aRadius->value()); - - // Adjust the sign of constraint value - BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder(); - aBuilder->adjustConstraint(aConstraint); - myStorage->addConstraint(myBaseConstraint, aConstraint); + if (myType == CONSTRAINT_TANGENT_CIRCLE_LINE) { + ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front(); + AttributePtr aCircleCenter = aConstraint->entities().front()->baseAttribute(); + if (!aCircleCenter) + return; + FeaturePtr aCircle = ModelAPI_Feature::feature(aCircleCenter->owner()); + AttributeDoublePtr aRadius = std::dynamic_pointer_cast( + aCircle->attribute(SketchPlugin_Circle::RADIUS_ID())); + + if (fabs(aRadius->value()) == fabs(aConstraint->value())) + return; + + aConstraint->setValue(aRadius->value()); + + // Adjust the sign of constraint value + BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder(); + aBuilder->adjustConstraint(aConstraint); + myStorage->addConstraint(myBaseConstraint, aConstraint); + } + else if (myType == CONSTRAINT_TANGENT_ARC_ARC) { + ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front(); + if (isArcArcInternal != isInternalTangency( + aConstraint->entities().front(), aConstraint->entities().back())) { + // fully rebuld constraint, because it is unable to access attributes of PlaneGCS constraint + remove(); + process(); + } + } }