From: azv Date: Tue, 23 May 2017 12:00:44 +0000 (+0300) Subject: Issue #2171: Avoid error message appears for tangency constraint X-Git-Tag: V_2.7.1.1~29 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=ee67e86b7fd96c6e640b07c46dbd586065ef12ae;p=modules%2Fshaper.git Issue #2171: Avoid error message appears for tangency constraint --- diff --git a/src/SketchSolver/SketchSolver_ConstraintTangent.cpp b/src/SketchSolver/SketchSolver_ConstraintTangent.cpp index 8fa16bc68..7b01e15e4 100644 --- a/src/SketchSolver/SketchSolver_ConstraintTangent.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintTangent.cpp @@ -27,8 +27,8 @@ static std::set collectCoincidences(FeaturePtr theFeature1, FeatureP /// \brief Check whether the entities has only one shared point or less. /// Return list of coincident points. -static std::list coincidentBoundaryPoints(FeaturePtr theFeature1, - FeaturePtr theFeature2); +static std::set coincidentBoundaryPoints(FeaturePtr theFeature1, + FeaturePtr theFeature2); /// \brief Check if two connected arcs have centers /// in same direction relatively to connection point @@ -111,15 +111,15 @@ void SketchSolver_ConstraintTangent::rebuild() getTangentFeatures(myBaseConstraint, aFeature1, aFeature2); // check number of coincident points - std::list aCoincidentPoints = coincidentBoundaryPoints(aFeature1, aFeature2); - if (myType == CONSTRAINT_TANGENT_CIRCLE_LINE && aCoincidentPoints.size() > 1) { + std::set aCoincidentPoints = coincidentBoundaryPoints(aFeature1, aFeature2); + if (myType == CONSTRAINT_TANGENT_CIRCLE_LINE && aCoincidentPoints.size() > 2) { myErrorMsg = SketchSolver_Error::TANGENCY_FAILED(); return; } EntityWrapperPtr aSharedPointEntity; if (!aCoincidentPoints.empty()) { - mySharedPoint = aCoincidentPoints.front(); + mySharedPoint = *aCoincidentPoints.begin(); aSharedPointEntity = myStorage->entity(mySharedPoint); } @@ -190,9 +190,9 @@ void SketchSolver_ConstraintTangent::notify(const FeaturePtr& theFeature, if (mySharedPoint && !isRebuild) { // The features are tangent in the shared point, but the coincidence has been removed/updated. // Check if the coincidence is the same. - std::list aCoincidentPoints = coincidentBoundaryPoints(aTgFeat1, aTgFeat2); + std::set aCoincidentPoints = coincidentBoundaryPoints(aTgFeat1, aTgFeat2); isRebuild = true; - std::list::iterator anIt = aCoincidentPoints.begin(); + std::set::iterator anIt = aCoincidentPoints.begin(); for (; anIt != aCoincidentPoints.end() && isRebuild; ++anIt) if (*anIt == mySharedPoint) isRebuild = false; // the coincidence is still exists => nothing to change @@ -242,24 +242,27 @@ std::set collectCoincidences(FeaturePtr theFeature1, FeaturePtr theF return aCoincidencesBetweenFeatures; } -std::list coincidentBoundaryPoints(FeaturePtr theFeature1, FeaturePtr theFeature2) +std::set coincidentBoundaryPoints(FeaturePtr theFeature1, FeaturePtr theFeature2) { std::set aCoincidences = collectCoincidences(theFeature1, theFeature2); // collect points only - std::list aCoincidentPoints; + std::set aCoincidentPoints; std::set::const_iterator aCIt = aCoincidences.begin(); for (; aCIt != aCoincidences.end(); ++ aCIt) { - for (int i = 0; i < CONSTRAINT_ATTR_SIZE; ++i) { - AttributeRefAttrPtr aRefAttr = (*aCIt)->refattr(SketchPlugin_Constraint::ENTITY_A()); - if (!aRefAttr || aRefAttr->isObject()) - continue; - - AttributePtr anAttr = aRefAttr->attr(); - if (anAttr->id() != SketchPlugin_Arc::CENTER_ID() && - anAttr->id() != SketchPlugin_Circle::CENTER_ID()) { - aCoincidentPoints.push_back(aRefAttr->attr()); - break; - } + AttributeRefAttrPtr aRefAttrA = (*aCIt)->refattr(SketchPlugin_Constraint::ENTITY_A()); + AttributeRefAttrPtr aRefAttrB = (*aCIt)->refattr(SketchPlugin_Constraint::ENTITY_B()); + if (!aRefAttrA || aRefAttrA->isObject() || + !aRefAttrB || aRefAttrB->isObject()) + continue; + + AttributePtr anAttrA = aRefAttrA->attr(); + AttributePtr anAttrB = aRefAttrB->attr(); + if (anAttrA->id() != SketchPlugin_Arc::CENTER_ID() && + anAttrA->id() != SketchPlugin_Circle::CENTER_ID() && + anAttrB->id() != SketchPlugin_Arc::CENTER_ID() && + anAttrB->id() != SketchPlugin_Circle::CENTER_ID()) { + aCoincidentPoints.insert(anAttrA); + aCoincidentPoints.insert(anAttrB); } } return aCoincidentPoints;