X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModel%2FModel_AttributeSelection.cpp;h=53c04b6863ad4cb7fd7eb1dea4ce00907a292e21;hb=694482299ca580d780c221cc6a3e7574e59fd2c3;hp=418cce2f2c9c616d0484a0c77e6ad3fe97bbe8cc;hpb=db0e21ea2f1117dd9af3320009ba8b50dc2e828b;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index 418cce2f2..53c04b686 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -192,7 +192,7 @@ bool Model_AttributeSelection::update() if (aContext->groupName() == ModelAPI_ResultBody::group()) { // body: just a named shape, use selection mechanism from OCCT TNaming_Selector aSelector(aSelLab); - bool aResult = true;//aSelector.Solve(scope()) == Standard_True; + bool aResult = aSelector.Solve(scope()) == Standard_True; owner()->data()->sendAttributeUpdated(this); return aResult; } else if (aContext->groupName() == ModelAPI_ResultConstruction::group()) { @@ -384,7 +384,8 @@ void Model_AttributeSelection::selectBody( return; } } - aSel.Select(aNewShape, aContext); + //BRepTools::Write(aNewShape, "Selection0.brep"); + aSel.Select(aNewShape, aContext); } /// registers the name of the shape in the label (theID == 0) of sub label (theID is a tag) @@ -599,16 +600,27 @@ bool isTrivial (const TopTools_ListOfShape& theAncestors, TopTools_IndexedMapOfS } std::string Model_AttributeSelection::namingName() { + std::string aName(""); + if(!this->isInitialized()) return aName; + Handle(TDataStd_Name) anAtt; + if(selectionLabel().FindAttribute(TDataStd_Name::GetID(), anAtt)) { + aName = TCollection_AsciiString(anAtt->Get()).ToCString(); + return aName; + } + std::shared_ptr aSubSh = value(); ResultPtr aCont = context(); - std::string aName; + aName = "Undefined name"; if(!aSubSh.get() || aSubSh->isNull() || !aCont.get() || aCont->shape()->isNull()) return aName; TopoDS_Shape aSubShape = aSubSh->impl(); + TopoDS_Shape aContext = aCont->shape()->impl(); #ifdef DEB_NAMING + if(aSubShape.ShapeType() == TopAbs_COMPOUND) { BRepTools::Write(aSubShape, "Selection.brep"); + BRepTools::Write(aContext, "Context.brep"); + } #endif - TopoDS_Shape aContext = aCont->shape()->impl(); std::shared_ptr aDoc = std::dynamic_pointer_cast(aCont->document()); @@ -623,21 +635,30 @@ std::string Model_AttributeSelection::namingName() case TopAbs_EDGE: { // name structure: F1 | F2 [| F3 | F4], where F1 & F2 the faces which gives the Edge in trivial case - // if it is not atrivial case we use localization by neighbours. F3 & F4 - neighbour faces - TopTools_IndexedMapOfShape aSMap; // map for ancestors of the sub-shape + // if it is not atrivial case we use localization by neighbours. F3 & F4 - neighbour faces + if (BRep_Tool::Degenerated(TopoDS::Edge(aSubShape))) { + aName = "Degenerated_Edge"; + break; + } TopTools_IndexedDataMapOfShapeListOfShape aMap; TopExp::MapShapesAndAncestors(aContext, TopAbs_EDGE, TopAbs_FACE, aMap); + TopTools_IndexedMapOfShape aSMap; // map for ancestors of the sub-shape bool isTrivialCase(true); - for (int i = 1; i <= aMap.Extent(); i++) { +/* for (int i = 1; i <= aMap.Extent(); i++) { const TopoDS_Shape& aKey = aMap.FindKey(i); - if (aKey.IsNotEqual(aSubShape)) continue; // find exactly the selected key - + //if (aKey.IsNotEqual(aSubShape)) continue; // find exactly the selected key + if (aKey.IsSame(aSubShape)) continue; const TopTools_ListOfShape& anAncestors = aMap.FindFromIndex(i); // check that it is not a trivial case (F1 & F2: aNumber = 1) isTrivialCase = isTrivial(anAncestors, aSMap); break; - } - + }*/ + if(aMap.Contains(aSubShape)) { + const TopTools_ListOfShape& anAncestors = aMap.FindFromKey(aSubShape); + // check that it is not a trivial case (F1 & F2: aNumber = 1) + isTrivialCase = isTrivial(anAncestors, aSMap); + } else + break; TopTools_ListOfShape aListOfNbs; if(!isTrivialCase) { // find Neighbors TNaming_Localizer aLocalizer; @@ -702,12 +723,24 @@ std::string Model_AttributeSelection::namingName() //n = aList.Extent(); #endif int n = aList.Extent(); - if(n < 3) { // open topology case => via edges + if(n < 3) { // open topology case or Compound case => via edges TopTools_IndexedDataMapOfShapeListOfShape aMap; TopExp::MapShapesAndAncestors(aContext, TopAbs_VERTEX, TopAbs_EDGE, aMap); - const TopTools_ListOfShape& aList2 = aMap.FindFromKey(aSubShape); - if(aList2.Extent() >= 2) { // regular solution - TopTools_ListIteratorOfListOfShape itl(aList2); + const TopTools_ListOfShape& aList22 = aMap.FindFromKey(aSubShape); + if(aList22.Extent() >= 2) { // regular solution +#ifdef FIX_BUG1 + + // bug! duplication; fix is below + aFMap.Clear(); + TopTools_ListOfShape aListE; + TopTools_ListIteratorOfListOfShape itl2(aList22); + for (int i = 1;itl2.More();itl2.Next(),i++) { + if(aFMap.Add(itl2.Value())) + aListE.Append(itl2.Value()); + } + n = aListE.Extent(); +#endif + TopTools_ListIteratorOfListOfShape itl(aListE); for (int i = 1;itl.More();itl.Next(),i++) { const TopoDS_Shape& anEdge = itl.Value(); std::string anEdgeName = GetShapeName(aDoc, anEdge, selectionLabel()); @@ -716,6 +749,9 @@ std::string Model_AttributeSelection::namingName() else aName += "|" + anEdgeName; } + }//reg + else { // dangle vertex: if(aList22.Extent() == 1) + //it should be already in DF } } else {