X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSelector%2FSelector_FilterByNeighbors.cpp;h=7a741402beb6b2b70b206a0ab832eeba5fd61c95;hb=b6cb9a5e9ecc1c5dae69d686fa73a8afec92d04f;hp=e98899b66678469c81d5532384f44ee6bb1172ec;hpb=9b61e5ee5eafe9d6948d9a78667efa2abec132c3;p=modules%2Fshaper.git diff --git a/src/Selector/Selector_FilterByNeighbors.cpp b/src/Selector/Selector_FilterByNeighbors.cpp index e98899b66..7a741402b 100644 --- a/src/Selector/Selector_FilterByNeighbors.cpp +++ b/src/Selector/Selector_FilterByNeighbors.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include @@ -42,19 +41,32 @@ static void findNeighbors(const TopoDS_Shape theContext, const TopoDS_Shape theV const int theLevel, TopTools_MapOfShape& theResult) { TopAbs_ShapeEnum aConnectorType = TopAbs_VERTEX; // type of the connector sub-shapes - if (theValue.ShapeType() == TopAbs_FACE) + TopAbs_ShapeEnum aValueType = theValue.ShapeType(); + if (aValueType == TopAbs_FACE) aConnectorType = TopAbs_EDGE; + else if (aValueType == TopAbs_COMPOUND) { // for geometrical naming: compound of faces + TopExp_Explorer anExp(theValue, TopAbs_FACE); + if (anExp.More()) { + aConnectorType = TopAbs_EDGE; + aValueType = TopAbs_FACE; + } else { + aValueType = TopAbs_EDGE; + } + } TopTools_MapOfShape aNBConnectors; // connector shapes that already belong to neighbors - for(TopExp_Explorer aValExp(theValue, aConnectorType); aValExp.More(); aValExp.Next()) { + for(TopExp_Explorer aValExp(theValue, aConnectorType); aValExp.More(); aValExp.Next()) aNBConnectors.Add(aValExp.Current()); - } TopTools_MapOfShape alreadyProcessed; - alreadyProcessed.Add(theValue); + if (aValueType == theValue.ShapeType()) + alreadyProcessed.Add(theValue); + else + for(TopExp_Explorer aValExp(theValue, aValueType); aValExp.More(); aValExp.Next()) + alreadyProcessed.Add(aValExp.Current()); for(int aLevel = 1; aLevel <= theLevel; aLevel++) { TopoDS_ListOfShape aGoodCandidates; - TopExp_Explorer aCandidate(theContext, theValue.ShapeType()); + TopExp_Explorer aCandidate(theContext, aValueType); for(; aCandidate.More(); aCandidate.Next()) { if (alreadyProcessed.Contains(aCandidate.Current())) continue; @@ -102,18 +114,16 @@ static const TopoDS_Shape findNeighbor(const TopoDS_Shape theContext, if (aNBIter->second == aMinLevel) { TopTools_MapOfShape aThisNBs; findNeighbors(theContext, aNBIter->first, aMinLevel, aThisNBs); - // aMatches must contain common part of all NBs lists - for(TopTools_MapOfShape::Iterator aThisNB(aThisNBs); aThisNB.More(); aThisNB.Next()) { - if (aFirst) { + if (aFirst) { // aMatches must contain common part of all NBs lists + for(TopTools_MapOfShape::Iterator aThisNB(aThisNBs); aThisNB.More(); aThisNB.Next()) { aMatches.Append(aThisNB.Value()); - } else { - // remove all in aMatches which are not in this NBs - for(TopoDS_ListOfShape::Iterator aMatch(aMatches); aMatch.More(); ) { - if (aThisNBs.Contains(aMatch.Value())) { - aMatch.Next(); - } else { - aMatches.Remove(aMatch); - } + } + } else { // remove all in aMatches which are not in this NBs + for(TopoDS_ListOfShape::Iterator aMatch(aMatches); aMatch.More(); ) { + if (aThisNBs.Contains(aMatch.Value())) { + aMatch.Next(); + } else { + aMatches.Remove(aMatch); } } } @@ -155,6 +165,7 @@ static const TopoDS_Shape findNeighbor(const TopoDS_Shape theContext, } else return TopoDS_Shape(); } + break; // no more NBs with higher levels } if (!aLevelNBs.IsEmpty()) { TopTools_MapOfShape aNBsOfCandidate;