X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultBody.cpp;h=f7492cc9534cfb7d71a92083b6e66dfefe547a3e;hb=refs%2Ftags%2FV_1.2.1;hp=1351c260e9febc2b81081eafeb6d0ed91b308ecc;hpb=9df5d8add277259cb517730430d4d85b4d642db4;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultBody.cpp b/src/Model/Model_ResultBody.cpp index 1351c260e..f7492cc95 100644 --- a/src/Model/Model_ResultBody.cpp +++ b/src/Model/Model_ResultBody.cpp @@ -7,11 +7,13 @@ #include #include #include +#include #include #include +#include #include +#include #include -#include #include #include #include @@ -30,6 +32,7 @@ #include #include #include +#include // DEB //#include //#include @@ -37,9 +40,89 @@ Model_ResultBody::Model_ResultBody() { + myIsDisabled = true; // by default it is not initialized and false to be after created setIsConcealed(false); } +void Model_ResultBody::initAttributes() +{ + // append the color attribute. It is empty, the attribute will be filled by a request + DataPtr aData = data(); + aData->addAttribute(COLOR_ID(), ModelAPI_AttributeIntArray::typeId()); +} + +void Model_ResultBody::colorConfigInfo(std::string& theSection, std::string& theName, + std::string& theDefault) +{ + theSection = "Visualization"; + theName = "result_body_color"; + theDefault = DEFAULT_COLOR(); +} + +// Converts evolution of naming shape to selection evelution and back to avoid +// naming support on the disabled results. Deeply in the labels tree, recursively. +static void EvolutionToSelection(TDF_Label theLab, const bool theFlag) { + std::list > aShapePairs; // to store old and new shapes + Handle(TNaming_NamedShape) aName; + int anEvolution = -1; + if (theLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { + TNaming_Evolution aNSEvol = aName->Evolution(); + if ((aNSEvol == TNaming_SELECTED && theFlag) || + (aNSEvol != TNaming_SELECTED && !theFlag)) { // nothing to do, it is already correct + return; + } + anEvolution = (int)(aNSEvol); + if (!theFlag) { + Handle(TDataStd_Integer) anAttrEvol; + if (theLab.FindAttribute(TDataStd_Integer::GetID(), anAttrEvol)) { + anEvolution = anAttrEvol->Get(); + } + } else { + TDataStd_Integer::Set(theLab, anEvolution); + } + + for(TNaming_Iterator anIter(aName); anIter.More(); anIter.Next()) { + aShapePairs.push_back(std::pair + (anIter.OldShape(), anIter.NewShape())); + } + } + // create new + TNaming_Builder aBuilder(theLab); + TNaming_Evolution anEvol = (TNaming_Evolution)(anEvolution); + std::list >::iterator aPairsIter = aShapePairs.begin(); + for(; aPairsIter != aShapePairs.end(); aPairsIter++) { + if (theFlag) { // disabled => make selection + aBuilder.Select(aPairsIter->first, aPairsIter->second); + } else if (anEvol == TNaming_GENERATED) { + aBuilder.Generated(aPairsIter->first, aPairsIter->second); + } else if (anEvol == TNaming_MODIFY) { + aBuilder.Modify(aPairsIter->first, aPairsIter->second); + } else if (anEvol == TNaming_DELETE) { + aBuilder.Delete(aPairsIter->first); + } else if (anEvol == TNaming_PRIMITIVE) { + aBuilder.Generated(aPairsIter->second); + } + } + // recursive call for all sub-labels + TDF_ChildIterator anIter(theLab, Standard_False); + for(; anIter.More(); anIter.Next()) { + EvolutionToSelection(anIter.Value(), theFlag); + } +} + +bool Model_ResultBody::setDisabled(std::shared_ptr theThis, const bool theFlag) +{ + bool aChanged = ModelAPI_ResultBody::setDisabled(theThis, theFlag); + if (aChanged) { // state is changed, so modifications are needed + std::shared_ptr aData = std::dynamic_pointer_cast(data()); + if (!aData) // unknown case + return aChanged; + TDF_Label& aShapeLab = aData->shapeLab(); + EvolutionToSelection(aShapeLab, theFlag); + } + return aChanged; +} + void Model_ResultBody::store(const std::shared_ptr& theShape) { std::shared_ptr aData = std::dynamic_pointer_cast(data()); @@ -56,17 +139,17 @@ void Model_ResultBody::store(const std::shared_ptr& theShape) return; // null shape inside aBuilder.Generated(aShape); - // register name - if(!aBuilder.NamedShape()->IsEmpty()) { - Handle(TDataStd_Name) anAttr; - if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) { - std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString()); - if(!aName.empty()) { + // register name + if(!aBuilder.NamedShape()->IsEmpty()) { + Handle(TDataStd_Name) anAttr; + if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) { + std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString()); + if(!aName.empty()) { std::shared_ptr aDoc = std::dynamic_pointer_cast(document()); aDoc->addNamingName(aBuilder.NamedShape()->Label(), aName); - } - } - } + } + } + } } } @@ -89,17 +172,17 @@ void Model_ResultBody::storeGenerated(const std::shared_ptr& theF if (aShapeNew.IsNull()) return; // null shape inside aBuilder.Generated(aShapeBasis, aShapeNew); - // register name - if(!aBuilder.NamedShape()->IsEmpty()) { - Handle(TDataStd_Name) anAttr; - if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) { - std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString()); - if(!aName.empty()) { + // register name + if(!aBuilder.NamedShape()->IsEmpty()) { + Handle(TDataStd_Name) anAttr; + if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) { + std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString()); + if(!aName.empty()) { std::shared_ptr aDoc = std::dynamic_pointer_cast(document()); aDoc->addNamingName(aBuilder.NamedShape()->Label(), aName); - } - } - } + } + } + } } } @@ -121,7 +204,7 @@ void Model_ResultBody::storeModified(const std::shared_ptr& theOl TopoDS_Shape aShapeNew = theNewShape->impl(); if (aShapeNew.IsNull()) return; // null shape inside - aBuilder.Modify(aShapeOld, aShapeNew); + aBuilder.Modify(aShapeOld, aShapeNew); } } @@ -252,7 +335,7 @@ void Model_ResultBody::loadAndOrientModifiedShapes ( ListOfShape aList; std::shared_ptr aRShape(new GeomAPI_Shape()); aRShape->setImpl((new TopoDS_Shape(aRoot))); - theMS->modified(aRShape, aList); + theMS->modified(aRShape, aList); std::list >::const_iterator anIt = aList.begin(), aLast = aList.end(); for (; anIt != aLast; anIt++) { TopoDS_Shape aNewShape = (*anIt)->impl(); @@ -262,9 +345,9 @@ void Model_ResultBody::loadAndOrientModifiedShapes ( } if (!aRoot.IsSame (aNewShape)) { builder(theTag)->Modify(aRoot,aNewShape); - if(!isBuilt) - buildName(theTag, theName); - } + if(!isBuilt) + buildName(theTag, theName); + } } } } @@ -297,17 +380,17 @@ void Model_ResultBody::loadAndOrientGeneratedShapes ( } if (!aRoot.IsSame (aNewShape)) { builder(theTag)->Generated(aRoot,aNewShape); - if(!isBuilt) - buildName(theTag, theName); - } + if(!isBuilt) + buildName(theTag, theName); + } } } } //======================================================================= int getDangleShapes(const TopoDS_Shape& theShapeIn, - const TopAbs_ShapeEnum theGeneratedFrom, - TopTools_DataMapOfShapeShape& theDangles) + const TopAbs_ShapeEnum theGeneratedFrom, + TopTools_DataMapOfShapeShape& theDangles) { theDangles.Clear(); TopTools_IndexedDataMapOfShapeListOfShape subShapeAndAncestors; @@ -326,20 +409,20 @@ int getDangleShapes(const TopoDS_Shape& theShapeIn, //======================================================================= void loadGeneratedDangleShapes( - const TopoDS_Shape& theShapeIn, - const TopAbs_ShapeEnum theGeneratedFrom, - TNaming_Builder * theBuilder) + const TopoDS_Shape& theShapeIn, + const TopAbs_ShapeEnum theGeneratedFrom, + TNaming_Builder * theBuilder) { TopTools_DataMapOfShapeShape dangles; if (!getDangleShapes(theShapeIn, theGeneratedFrom, dangles)) return; TopTools_DataMapIteratorOfDataMapOfShapeShape itr(dangles); for (; itr.More(); itr.Next()) - theBuilder->Generated(itr.Key(), itr.Value()); + theBuilder->Generated(itr.Key(), itr.Value()); } //======================================================================= void Model_ResultBody::loadNextLevels(std::shared_ptr theShape, - const std::string& theName, int& theTag) + const std::string& theName, int& theTag) { if(theShape->isNull()) return; TopoDS_Shape aShape = theShape->impl(); @@ -347,12 +430,12 @@ void Model_ResultBody::loadNextLevels(std::shared_ptr theShape, if (aShape.ShapeType() == TopAbs_SOLID) { TopExp_Explorer expl(aShape, TopAbs_FACE); for (; expl.More(); expl.Next()) { - builder(theTag)->Generated(expl.Current()); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } + builder(theTag)->Generated(expl.Current()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } } else if (aShape.ShapeType() == TopAbs_SHELL || aShape.ShapeType() == TopAbs_FACE) { // load faces and all the free edges @@ -361,84 +444,84 @@ void Model_ResultBody::loadNextLevels(std::shared_ptr theShape, if (Faces.Extent() > 1 || (aShape.ShapeType() == TopAbs_SHELL && Faces.Extent() == 1)) { TopExp_Explorer expl(aShape, TopAbs_FACE); for (; expl.More(); expl.Next()) { - builder(theTag)->Generated(expl.Current()); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } - } + builder(theTag)->Generated(expl.Current()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } + } TopTools_IndexedDataMapOfShapeListOfShape anEdgeAndNeighbourFaces; TopExp::MapShapesAndAncestors(aShape, TopAbs_EDGE, TopAbs_FACE, anEdgeAndNeighbourFaces); for (Standard_Integer i = 1; i <= anEdgeAndNeighbourFaces.Extent(); i++) - { + { const TopTools_ListOfShape& aLL = anEdgeAndNeighbourFaces.FindFromIndex(i); if (aLL.Extent() < 2) { - if (BRep_Tool::Degenerated(TopoDS::Edge(anEdgeAndNeighbourFaces.FindKey(i)))) + if (BRep_Tool::Degenerated(TopoDS::Edge(anEdgeAndNeighbourFaces.FindKey(i)))) continue; - builder(theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i)); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; + builder(theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i)); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; } else { - TopTools_ListIteratorOfListOfShape anIter(aLL); - const TopoDS_Face& aFace = TopoDS::Face(anIter.Value()); - anIter.Next(); - if(aFace.IsEqual(anIter.Value())) { - builder(theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i)); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } - } - } + TopTools_ListIteratorOfListOfShape anIter(aLL); + const TopoDS_Face& aFace = TopoDS::Face(anIter.Value()); + anIter.Next(); + if(aFace.IsEqual(anIter.Value())) { + builder(theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i)); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } + } + } } else if (aShape.ShapeType() == TopAbs_WIRE) { TopTools_IndexedMapOfShape Edges; BRepTools::Map3DEdges(aShape, Edges); if (Edges.Extent() == 1) { - builder(++theTag)->Generated(Edges.FindKey(1)); + builder(++theTag)->Generated(Edges.FindKey(1)); TopExp_Explorer expl(aShape, TopAbs_VERTEX); for (; expl.More(); expl.Next()) { - builder(theTag)->Generated(expl.Current()); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } - } else { + builder(theTag)->Generated(expl.Current()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } + } else { TopExp_Explorer expl(aShape, TopAbs_EDGE); for (; expl.More(); expl.Next()) { - builder(theTag)->Generated(expl.Current()); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } + builder(theTag)->Generated(expl.Current()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } // and load generated vertices. TopTools_DataMapOfShapeShape generated; if (getDangleShapes(aShape, TopAbs_EDGE, generated)) - { - TNaming_Builder* pBuilder = builder(theTag++); - loadGeneratedDangleShapes(aShape, TopAbs_EDGE, pBuilder); - } - } + { + TNaming_Builder* pBuilder = builder(theTag++); + loadGeneratedDangleShapes(aShape, TopAbs_EDGE, pBuilder); + } + } } else if (aShape.ShapeType() == TopAbs_EDGE) { TopExp_Explorer expl(aShape, TopAbs_VERTEX); for (; expl.More(); expl.Next()) { - builder(theTag)->Generated(expl.Current()); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } + builder(theTag)->Generated(expl.Current()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } } } //======================================================================= int findAmbiguities(const TopoDS_Shape& theShapeIn, - TopTools_ListOfShape& theList) + TopTools_ListOfShape& theList) { int aNumEdges(0); theList.Clear(); @@ -451,36 +534,36 @@ int findAmbiguities(const TopoDS_Shape& theShapeIn, for (Standard_Integer i = 1; i <= subShapeAndAncestors.Extent(); i++) { const TopoDS_Shape& aKeyEdge1 = subShapeAndAncestors.FindKey(i); const TopTools_ListOfShape& ancestors1 = subShapeAndAncestors.FindFromIndex(i); - aMap1.Clear(); + aMap1.Clear(); TopTools_ListIteratorOfListOfShape it(ancestors1); - for(;it.More();it.Next()) aMap1.Add(it.Value()); // fill map with key ancestors => aKey1 - for (Standard_Integer j = 1; j <= subShapeAndAncestors.Extent(); j++) { - if (i == j) continue; + for(;it.More();it.Next()) aMap1.Add(it.Value()); // fill map with key ancestors => aKey1 + for (Standard_Integer j = 1; j <= subShapeAndAncestors.Extent(); j++) { + if (i == j) continue; const TopoDS_Shape& aKeyEdge2 = subShapeAndAncestors.FindKey(j); const TopTools_ListOfShape& ancestors2 = subShapeAndAncestors.FindFromIndex(j); - if(ancestors1.Extent() == ancestors2.Extent() && ancestors1.Extent() > 1) { - int aNum (ancestors2.Extent()); - TopTools_ListIteratorOfListOfShape it(ancestors2); - for(;it.More();it.Next()) - if(aMap1.Contains(it.Value())) aNum--; - if(aNum == 0) { - if(aMap2.Add(aKeyEdge1)) - aKeyList.Append(aKeyEdge1); - if(aMap2.Add(aKeyEdge2)) - aKeyList.Append(aKeyEdge2); - } - } - } // at the end ==> List of edges to be named in addition + if(ancestors1.Extent() == ancestors2.Extent() && ancestors1.Extent() > 1) { + int aNum (ancestors2.Extent()); + TopTools_ListIteratorOfListOfShape it(ancestors2); + for(;it.More();it.Next()) + if(aMap1.Contains(it.Value())) aNum--; + if(aNum == 0) { + if(aMap2.Add(aKeyEdge1)) + aKeyList.Append(aKeyEdge1); + if(aMap2.Add(aKeyEdge2)) + aKeyList.Append(aKeyEdge2); + } + } + } // at the end ==> List of edges to be named in addition } aNumEdges = aKeyList.Extent(); if(aNumEdges) - theList.Assign(aKeyList); + theList.Assign(aKeyList); return aNumEdges; } //======================================================================= void Model_ResultBody::loadFirstLevel( - std::shared_ptr theShape, const std::string& theName, int& theTag) + std::shared_ptr theShape, const std::string& theName, int& theTag) { if(theShape->isNull()) return; TopoDS_Shape aShape = theShape->impl(); @@ -488,43 +571,43 @@ void Model_ResultBody::loadFirstLevel( if (aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_COMPSOLID) { TopoDS_Iterator itr(aShape); for (; itr.More(); itr.Next(),theTag++) { - builder(theTag)->Generated(itr.Value()); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - if(!theName.empty()) buildName(theTag, aName); + builder(theTag)->Generated(itr.Value()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + if(!theName.empty()) buildName(theTag, aName); if (itr.Value().ShapeType() == TopAbs_COMPOUND || - itr.Value().ShapeType() == TopAbs_COMPSOLID) - { - std::shared_ptr itrShape(new GeomAPI_Shape()); + itr.Value().ShapeType() == TopAbs_COMPSOLID) + { + std::shared_ptr itrShape(new GeomAPI_Shape()); itrShape->setImpl(new TopoDS_Shape(itr.Value())); - loadFirstLevel(itrShape, theName, theTag); + loadFirstLevel(itrShape, theName, theTag); } else { - std::shared_ptr itrShape(new GeomAPI_Shape()); + std::shared_ptr itrShape(new GeomAPI_Shape()); itrShape->setImpl(new TopoDS_Shape(itr.Value())); - loadNextLevels(itrShape, theName, theTag); - } + loadNextLevels(itrShape, theName, theTag); + } } } else { std::shared_ptr itrShape(new GeomAPI_Shape()); itrShape->setImpl(new TopoDS_Shape(aShape)); - loadNextLevels(itrShape, theName, theTag); + loadNextLevels(itrShape, theName, theTag); } TopTools_ListOfShape aList; if(findAmbiguities(aShape, aList)) { - TopTools_ListIteratorOfListOfShape it(aList); + TopTools_ListIteratorOfListOfShape it(aList); for (; it.More(); it.Next(),theTag++) { - builder(theTag)->Generated(it.Value()); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - } + builder(theTag)->Generated(it.Value()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + } } } //======================================================================= void Model_ResultBody::loadDisconnectedEdges( - std::shared_ptr theShape, const std::string& theName, int& theTag) + std::shared_ptr theShape, const std::string& theName, int& theTag) { if(theShape->isNull()) return; TopoDS_Shape aShape = theShape->impl(); @@ -540,33 +623,33 @@ void Model_ResultBody::loadDisconnectedEdges( Standard_Boolean faceIsNew = Standard_True; TopTools_ListIteratorOfListOfShape itrF(edgeNaborFaces.Find(anEdge)); for (; itrF.More(); itrF.Next()) { - if (itrF.Value().IsSame(aFace)) { - faceIsNew = Standard_False; - break; - } - } + if (itrF.Value().IsSame(aFace)) { + faceIsNew = Standard_False; + break; + } + } if (faceIsNew) - edgeNaborFaces.ChangeFind(anEdge).Append(aFace); - } + edgeNaborFaces.ChangeFind(anEdge).Append(aFace); + } } -/* TopTools_IndexedDataMapOfShapeListOfShape aDM; + /* TopTools_IndexedDataMapOfShapeListOfShape aDM; TopExp::MapShapesAndAncestors(aShape, TopAbs_EDGE, TopAbs_FACE, aDM); for(int i=1; i <= aDM.Extent(); i++) { - if(aDM.FindFromIndex(i).Extent() > 1) continue; - if (BRep_Tool::Degenerated(TopoDS::Edge(aDM.FindKey(i)))) - continue; - builder(theTag)->Generated(aDM.FindKey(i)); - TCollection_AsciiString aStr(theTag); - std::string aName = theName + aStr.ToCString(); - buildName(theTag, aName); -#ifdef DEB_IMPORT - aName += + ".brep"; - BRepTools::Write(aDM.FindKey(i), aName.c_str()); -#endif - theTag++; + if(aDM.FindFromIndex(i).Extent() > 1) continue; + if (BRep_Tool::Degenerated(TopoDS::Edge(aDM.FindKey(i)))) + continue; + builder(theTag)->Generated(aDM.FindKey(i)); + TCollection_AsciiString aStr(theTag); + std::string aName = theName + aStr.ToCString(); + buildName(theTag, aName); + #ifdef DEB_IMPORT + aName += + ".brep"; + BRepTools::Write(aDM.FindKey(i), aName.c_str()); + #endif + theTag++; } -*/ + */ TopTools_MapOfShape anEdgesToDelete; TopExp_Explorer anEx(aShape,TopAbs_EDGE); std::string aName; @@ -578,39 +661,39 @@ void Model_ResultBody::loadDisconnectedEdges( if (aList1.Extent()<2) continue; TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itr(edgeNaborFaces); for (; itr.More(); itr.Next()) { - TopoDS_Shape anEdge2 = itr.Key(); - if(anEdgesToDelete.Contains(anEdge2)) continue; - if (anEdge1.IsSame(anEdge2)) continue; - const TopTools_ListOfShape& aList2 = itr.Value(); - // compare lists of the neighbour faces of edge1 and edge2 - if (aList1.Extent() == aList2.Extent()) { - Standard_Integer aMatches = 0; - for(TopTools_ListIteratorOfListOfShape aLIter1(aList1);aLIter1.More();aLIter1.Next()) - for(TopTools_ListIteratorOfListOfShape aLIter2(aList2);aLIter2.More();aLIter2.Next()) - if (aLIter1.Value().IsSame(aLIter2.Value())) aMatches++; - if (aMatches == aList1.Extent()) { - aC0=Standard_True; - builder(theTag)->Generated(anEdge2); - anEdgesToDelete.Add(anEdge2); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } - } - } + TopoDS_Shape anEdge2 = itr.Key(); + if(anEdgesToDelete.Contains(anEdge2)) continue; + if (anEdge1.IsSame(anEdge2)) continue; + const TopTools_ListOfShape& aList2 = itr.Value(); + // compare lists of the neighbour faces of edge1 and edge2 + if (aList1.Extent() == aList2.Extent()) { + Standard_Integer aMatches = 0; + for(TopTools_ListIteratorOfListOfShape aLIter1(aList1);aLIter1.More();aLIter1.Next()) + for(TopTools_ListIteratorOfListOfShape aLIter2(aList2);aLIter2.More();aLIter2.Next()) + if (aLIter1.Value().IsSame(aLIter2.Value())) aMatches++; + if (aMatches == aList1.Extent()) { + aC0=Standard_True; + builder(theTag)->Generated(anEdge2); + anEdgesToDelete.Add(anEdge2); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } + } + } TopTools_MapIteratorOfMapOfShape itDelete(anEdgesToDelete); for(;itDelete.More();itDelete.Next()) - edgeNaborFaces.UnBind(itDelete.Key()); + edgeNaborFaces.UnBind(itDelete.Key()); edgeNaborFaces.UnBind(anEdge1); - } + } if (aC0) { - builder(theTag)->Generated(anEdge1); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } + builder(theTag)->Generated(anEdge1); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } } } @@ -645,11 +728,11 @@ void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr t for (; itr.More(); itr.Next()) { const TopTools_ListOfShape& naborEdges = itr.Value(); if (naborEdges.Extent() < 2) { - builder(theTag)->Generated(itr.Key()); - TCollection_AsciiString aStr(theTag); - aName = theName + aStr.ToCString(); - buildName(theTag, aName); - theTag++; - } + builder(theTag)->Generated(itr.Key()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + theTag++; + } } -} \ No newline at end of file +}