From 7c26163aa1b2f3384ed0b3bd3fb12188478f6189 Mon Sep 17 00:00:00 2001 From: nds Date: Wed, 31 Aug 2016 12:32:55 +0300 Subject: [PATCH] Issue #1664 In the Sketcher, add the function Split a segment - correction of constraints built to the point attributes of the split object --- .../SketchPlugin_ConstraintSplit.cpp | 64 ++++++++++++++++++- .../SketchPlugin_ConstraintSplit.h | 3 + src/SketchPlugin/Test/TestSplit.py | 48 ++++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp b/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp index 8bbdb36e8..2647f986b 100755 --- a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp @@ -35,7 +35,7 @@ #include #include -//#define DEBUG_SPLIT +#define DEBUG_SPLIT #ifdef DEBUG_SPLIT #include #endif @@ -87,6 +87,11 @@ void SketchPlugin_ConstraintSplit::execute() std::map aCoincidenceToPoint; getConstraints(aFeaturesToDelete, aTangentFeatures, aCoincidenceToFeature, aCoincidenceToPoint); + std::map > aBaseRefAttributes; + getRefAttributes(aBaseFeature, aBaseRefAttributes); + + std::map aBasePointModifiedAttributes; + #ifdef DEBUG_SPLIT std::cout << std::endl; std::cout << "SketchPlugin_ConstraintSplit::execute()" << std::endl; @@ -149,6 +154,27 @@ void SketchPlugin_ConstraintSplit::execute() std::cout << " -Point attribute:" << ModelGeomAlgo_Point2D::getPointAttributeInfo(aPointAttr) << std::endl; } } + std::map >::const_iterator aRefIt = aBaseRefAttributes.begin(), + aRefLast = aBaseRefAttributes.end(); + std::cout << "References to bound point of feature [" << aBaseRefAttributes.size() << "]" <first; + std::list aRefAttributes = aRefIt->second; + std::string aRefsInfo; + std::list::const_iterator aRefAttrIt = aRefAttributes.begin(), + aRefAttrLast = aRefAttributes.end(); + for (; aRefAttrIt != aRefAttrLast; aRefAttrIt++) { + AttributePtr aRAttr = *aRefAttrIt; + aRefsInfo.append(aRAttr->id()); + FeaturePtr aRFeature = ModelAPI_Feature::feature(aRAttr->owner()); + aRefsInfo.append("(" + aRFeature->name() + ") "); + } + + std::shared_ptr aPointAttr = std::dynamic_pointer_cast(aBaseAttr); + std::cout << " -Point attribute:" << aPointAttr->id().c_str() + << "[" << aRefAttributes.size() << "]" << aRefsInfo << std::endl; + } + std::cout << std::endl; std::cout << "---- SPLIT ----" << std::endl; std::cout << std::endl; @@ -392,6 +418,42 @@ void SketchPlugin_ConstraintSplit::getConstraints(std::set& theFeatu } } +void SketchPlugin_ConstraintSplit::getRefAttributes(const FeaturePtr& theFeature, + std::map >& theRefs) +{ + theRefs.clear(); + + std::list aPointAttributes = theFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); + std::set aPointAttributesSet; + + std::list::const_iterator aPIt = aPointAttributes.begin(), aPLast = aPointAttributes.end(); + for (; aPIt != aPLast; aPIt++) + aPointAttributesSet.insert(*aPIt); + + const std::set& aRefsAttributes = theFeature->data()->refsToMe(); + std::set::const_iterator aIt; + for (aIt = aRefsAttributes.cbegin(); aIt != aRefsAttributes.cend(); ++aIt) { + AttributePtr anAttr = (*aIt); + FeaturePtr anAttrFeature = ModelAPI_Feature::feature(anAttr->owner()); + if (anAttrFeature.get() != this && + anAttr.get() && anAttr->attributeType() == ModelAPI_AttributeRefAttr::typeId()) { + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(anAttr); + if (!aRefAttr->isObject()) { + AttributePtr anAttrInRef = aRefAttr->attr(); + if (anAttrInRef.get() && aPointAttributesSet.find(anAttrInRef) != aPointAttributesSet.end()) { + if (theRefs.find(anAttrInRef) != theRefs.end()) + theRefs[anAttrInRef].push_back(aRefAttr); + else { + std::list anAttrList; + anAttrList.push_back(aRefAttr); + theRefs[anAttrInRef] = anAttrList; + } + } + } + } + } +} + void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature( const std::map, IdToPointPair>& theCoincidenceToFeature, const std::set >& theFurtherCoincidences, diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h b/src/SketchPlugin/SketchPlugin_ConstraintSplit.h index 4c1e2bfea..bd602854c 100755 --- a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h +++ b/src/SketchPlugin/SketchPlugin_ConstraintSplit.h @@ -109,6 +109,9 @@ private: std::map, IdToPointPair>& theCoincidenceToFeature, std::map, IdToPointPair>& theCoincidenceToPoint); + void getRefAttributes(const FeaturePtr& theFeature, + std::map >& theRefs); + /// 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 diff --git a/src/SketchPlugin/Test/TestSplit.py b/src/SketchPlugin/Test/TestSplit.py index 08e10b534..aa140610c 100644 --- a/src/SketchPlugin/Test/TestSplit.py +++ b/src/SketchPlugin/Test/TestSplit.py @@ -75,6 +75,54 @@ assert(idList.count(SketchConstraintCoincidenceId) == 2) assert(idList.count(SketchConstraintTangentId) == 1) # Test end +# Test split on arc with one point +Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY")) +SketchArc_1 = Sketch_1.addArc(50, 50, 0, 50, 100, 50, True) +Sketch_1.setFixed(SketchArc_1.startPoint()) +Sketch_1.setFixed(SketchArc_1.endPoint()) +Sketch_1.setRadius(SketchArc_1, 50) +SketchPoint_1 = Sketch_1.addPoint(50, 100) +SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchPoint_1.coordinates(), SketchArc_1.result()[0]) +Sketch_1.addSplit(SketchArc_1, SketchPoint_1.coordinates(), SketchArc_1.endPoint()) +model.do() + +Sketch_1_feature = featureToCompositeFeature(Sketch_1.feature()) +idList = [] +for index in range(Sketch_1_feature.numberOfSubs()): + idList.append(Sketch_1_feature.subFeature(index).getKind()) + +assert(idList.count(SketchArcId) == 2) +assert(idList.count(SketchPointId) == 1) +assert(idList.count(SketchConstraintCoincidenceId) == 2) +assert(idList.count(SketchConstraintEqualId) == 1) +assert(idList.count(SketchConstraintTangentId) == 1) +# Test end + +# Test split on arc with two points +Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY")) +SketchArc_1 = Sketch_1.addArc(50, 50, 0, 50, 100, 50, True) +Sketch_1.setFixed(SketchArc_1.startPoint()) +Sketch_1.setFixed(SketchArc_1.endPoint()) +Sketch_1.setRadius(SketchArc_1, 50) +SketchPoint_1 = Sketch_1.addPoint(25, 93.301270189222) +SketchPoint_2 = Sketch_1.addPoint(75, 93.301270189222) +SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchPoint_1.coordinates(), SketchArc_1.result()[0]) +SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchPoint_2.coordinates(), SketchArc_1.result()[0]) +Sketch_1.addSplit(SketchArc_1, SketchPoint_1.coordinates(), SketchPoint_2.coordinates()) +model.do() + +Sketch_1_feature = featureToCompositeFeature(Sketch_1.feature()) +idList = [] +for index in range(Sketch_1_feature.numberOfSubs()): + idList.append(Sketch_1_feature.subFeature(index).getKind()) + +assert(idList.count(SketchArcId) == 3) +assert(idList.count(SketchPointId) == 2) +assert(idList.count(SketchConstraintCoincidenceId) == 4) +assert(idList.count(SketchConstraintEqualId) == 2) +assert(idList.count(SketchConstraintTangentId) == 2) +# Test end + model.end() assert(model.checkPythonDump()) -- 2.39.2