From 61a3fda42386d2bc70ead5fc8765a0e61844f856 Mon Sep 17 00:00:00 2001 From: nds Date: Tue, 29 Nov 2016 08:30:13 +0300 Subject: [PATCH] Issue #1763 Coincidence constraint lost after removing one of split lines --- .../SketchPlugin_ConstraintSplit.cpp | 47 +++++++++++++------ .../SketchPlugin_ConstraintSplit.h | 11 +++-- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp b/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp index 9ff84a542..0023cc47b 100755 --- a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp @@ -278,7 +278,7 @@ void SketchPlugin_ConstraintSplit::execute() // coincidence to feature updateCoincidenceConstraintsToFeature(aCoincidenceToFeature, aFurtherCoincidences, - aFeatureResults); + aFeatureResults, aSplitFeature); // tangency updateTangentConstraintsToFeature(aTangentFeatures, aFurtherCoincidences); @@ -392,16 +392,11 @@ std::shared_ptr SketchPlugin_ConstraintSplit::getPointOfRef return aPointAttribute; } -void SketchPlugin_ConstraintSplit::getFeaturePoints(AttributePoint2DPtr& theStartPointAttr, +void SketchPlugin_ConstraintSplit::getFeaturePoints(const FeaturePtr& theFeature, + AttributePoint2DPtr& theStartPointAttr, AttributePoint2DPtr& theEndPointAttr) { - AttributePoint2DPtr aPointAttribute; - - AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Constraint::VALUE())); - FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); - - std::string aFeatureKind = aBaseFeature->getKind(); + std::string aFeatureKind = theFeature->getKind(); std::string aStartAttributeName, anEndAttributeName; if (aFeatureKind == SketchPlugin_Line::ID()) { aStartAttributeName = SketchPlugin_Line::START_ID(); @@ -413,9 +408,9 @@ void SketchPlugin_ConstraintSplit::getFeaturePoints(AttributePoint2DPtr& theStar } if (!aStartAttributeName.empty() && !anEndAttributeName.empty()) { theStartPointAttr = std::dynamic_pointer_cast( - aBaseFeature->attribute(aStartAttributeName)); + theFeature->attribute(aStartAttributeName)); theEndPointAttr = std::dynamic_pointer_cast( - aBaseFeature->attribute(anEndAttributeName)); + theFeature->attribute(anEndAttributeName)); } } @@ -588,11 +583,21 @@ void SketchPlugin_ConstraintSplit::getRefAttributes(const FeaturePtr& theFeature void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature( const std::map, IdToPointPair>& theCoincidenceToFeature, const std::set >& theFurtherCoincidences, - const std::set& theFeatureResults) + const std::set& theFeatureResults, + const FeaturePtr& theSplitFeature) { if (theCoincidenceToFeature.empty()) return; + // we should build coincidence constraints to end of the split feature + std::set > aNewCoincidencesToSplitFeature; + AttributePoint2DPtr aStartPointAttr, anEndPointAttr; + getFeaturePoints(theSplitFeature, aStartPointAttr, anEndPointAttr); + if (theFurtherCoincidences.find(aStartPointAttr) == theFurtherCoincidences.end()) + aNewCoincidencesToSplitFeature.insert(aStartPointAttr); + if (theFurtherCoincidences.find(anEndPointAttr) == theFurtherCoincidences.end()) + aNewCoincidencesToSplitFeature.insert(anEndPointAttr); + std::map::const_iterator aCIt = theCoincidenceToFeature.begin(), aCLast = theCoincidenceToFeature.end(); #ifdef DEBUG_SPLIT @@ -615,6 +620,19 @@ void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature( if (aFeaturePointAttribute.get()) { aCoincFeature->refattr(anAttributeId)->setObject(ResultPtr()); aCoincFeature->refattr(anAttributeId)->setAttr(aFeaturePointAttribute); + // create new coincidences to split feature points + std::set::const_iterator aSFIt = aNewCoincidencesToSplitFeature.begin(), + aSFLast = aNewCoincidencesToSplitFeature.end(); + for (; aSFIt != aSFLast; aSFIt++) { + AttributePoint2DPtr aSFAttribute = *aSFIt; + if (aCoincPnt->isEqual(aSFAttribute->pnt())) { + std::string aSecondAttribute = SketchPlugin_Constraint::ENTITY_A(); + if (anAttributeId == SketchPlugin_Constraint::ENTITY_A()) + aSecondAttribute = SketchPlugin_Constraint::ENTITY_B(); + createConstraint(SketchPlugin_ConstraintCoincidence::ID(), + aSFAttribute, aCoincFeature->refattr(aSecondAttribute)->attr()); + } + } } else { /// find feature by shape intersected the point @@ -751,7 +769,8 @@ void SketchPlugin_ConstraintSplit::splitLine(FeaturePtr& theSplitFeature, AttributePoint2DPtr aSecondPointAttrOfSplit = getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B())); AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; - getFeaturePoints(aStartPointAttrOfBase, anEndPointAttrOfBase); + + getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) { setError("Error: Feature has no start and end points."); return; @@ -884,7 +903,7 @@ void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature, AttributePoint2DPtr aSecondPointAttrOfSplit = getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B())); AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; - getFeaturePoints(aStartPointAttrOfBase, anEndPointAttrOfBase); + getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) { setError("Error: Feature has no start and end points."); return; diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h b/src/SketchPlugin/SketchPlugin_ConstraintSplit.h index 95cb9a932..b6c13e3e1 100755 --- a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h +++ b/src/SketchPlugin/SketchPlugin_ConstraintSplit.h @@ -91,9 +91,11 @@ class SketchPlugin_ConstraintSplit : public SketchPlugin_ConstraintBase private: /// Returns geom point attribute of the feature bounds. It processes line or arc. /// For circle feature, the result attributes are null + /// \param theFeature a source feature /// \param theStartPointAttr an out attribute to start point /// \param theStartPointAttr an out attribute to end point - void getFeaturePoints(std::shared_ptr& theStartPointAttr, + void getFeaturePoints(const FeaturePtr& theFeature, + std::shared_ptr& theStartPointAttr, std::shared_ptr& theEndPointAttr); /// Returns cast of attribute to geometrical point if the attribute is a ref attr attribute @@ -128,11 +130,14 @@ private: /// Move coincidence constraint from feature to point if it is found /// \param theCoincidenceToFeature coincidence to feature to be connected to new feature /// \param theFurtherCoincidences a list of points where coincidences will be build - /// \paramv theFeatureResults created results after split where constaint might be connected + /// \param theFeatureResults created results after split where constaint might be connected + /// \param theSplitFeature feature created by split, new coincidences to points should be created + /// if theCoincidenceToFeature contains equal points void updateCoincidenceConstraintsToFeature( const std::map, IdToPointPair>& theCoincidenceToFeature, const std::set >& theFurtherCoincidences, - const std::set& theFeatureResults); + const std::set& theFeatureResults, + const FeaturePtr& theSplitFeature); /// Move tangency constraint to the nearest split feature that has a coincidence to the tangent /// \param theTangentFeatures tangencies to feature to be connected to nearest feature -- 2.39.2