X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultBody.cpp;h=2bdea7f5f30bdf54fbd2db814dccdc2b16615f1e;hb=e3c21b331e4ec138aec5efcb51e19d6afee46193;hp=ce342c2e99a07a647388c2d6099a8079b6a75edb;hpb=db3da60baa0e8cb3dec62db38063d3b9a951a4cd;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultBody.cpp b/src/Model/Model_ResultBody.cpp index ce342c2e9..2bdea7f5f 100644 --- a/src/Model/Model_ResultBody.cpp +++ b/src/Model/Model_ResultBody.cpp @@ -1,28 +1,65 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: Model_ResultBody.cpp // Created: 08 Jul 2014 // Author: Mikhail PONIKAROV #include #include +#include +#include #include #include +#include +#include #include +#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include +#include // DEB //#include //#include +//#define DEB_IMPORT 1 + Model_ResultBody::Model_ResultBody() { setIsConcealed(false); } -void Model_ResultBody::store(const boost::shared_ptr& theShape) +void Model_ResultBody::initAttributes() { - boost::shared_ptr aData = boost::dynamic_pointer_cast(data()); + // append the color attribute. It is empty, the attribute will be filled by a request + DataPtr aData = data(); + aData->addAttribute(COLOR_ID(), ModelAPI_AttributeIntArray::type()); +} + +void Model_ResultBody::colorConfigInfo(std::string& theSection, std::string& theName, + std::string& theDefault) +{ + theSection = "Visualization"; + theName = "result_body_color"; + theDefault = DEFAULT_COLOR(); +} + +void Model_ResultBody::store(const std::shared_ptr& theShape) +{ + std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData) { TDF_Label& aShapeLab = aData->shapeLab(); // clean builders @@ -35,14 +72,25 @@ void Model_ResultBody::store(const boost::shared_ptr& theShape) if (aShape.IsNull()) return; // null shape inside - aBuilder.Generated(aShape); + 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()) { + std::shared_ptr aDoc = std::dynamic_pointer_cast(document()); + aDoc->addNamingName(aBuilder.NamedShape()->Label(), aName); + } + } + } } } -void Model_ResultBody::storeGenerated(const boost::shared_ptr& theFromShape, - const boost::shared_ptr& theToShape) +void Model_ResultBody::storeGenerated(const std::shared_ptr& theFromShape, + const std::shared_ptr& theToShape) { - boost::shared_ptr aData = boost::dynamic_pointer_cast(data()); + std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData) { TDF_Label& aShapeLab = aData->shapeLab(); // clean builders @@ -54,17 +102,28 @@ void Model_ResultBody::storeGenerated(const boost::shared_ptr& th TopoDS_Shape aShapeBasis = theFromShape->impl(); if (aShapeBasis.IsNull()) return; // null shape inside - TopoDS_Shape aShapeNew = theToShape->impl(); + TopoDS_Shape aShapeNew = theToShape->impl(); 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()) { + std::shared_ptr aDoc = std::dynamic_pointer_cast(document()); + aDoc->addNamingName(aBuilder.NamedShape()->Label(), aName); + } + } + } } } -void Model_ResultBody::storeModified(const boost::shared_ptr& theOldShape, - const boost::shared_ptr& theNewShape) +void Model_ResultBody::storeModified(const std::shared_ptr& theOldShape, + const std::shared_ptr& theNewShape) { - boost::shared_ptr aData = boost::dynamic_pointer_cast(data()); + std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData) { TDF_Label& aShapeLab = aData->shapeLab(); // clean builders @@ -76,34 +135,29 @@ void Model_ResultBody::storeModified(const boost::shared_ptr& the TopoDS_Shape aShapeOld = theOldShape->impl(); if (aShapeOld.IsNull()) return; // null shape inside - TopoDS_Shape aShapeNew = theNewShape->impl(); + TopoDS_Shape aShapeNew = theNewShape->impl(); if (aShapeNew.IsNull()) return; // null shape inside - aBuilder.Generated(aShapeOld, aShapeNew); + aBuilder.Modify(aShapeOld, aShapeNew); } } -boost::shared_ptr Model_ResultBody::shape() +std::shared_ptr Model_ResultBody::shape() { - boost::shared_ptr aData = boost::dynamic_pointer_cast(data()); + std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData) { TDF_Label& aShapeLab = aData->shapeLab(); Handle(TNaming_NamedShape) aName; if (aShapeLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { TopoDS_Shape aShape = aName->Get(); if (!aShape.IsNull()) { - boost::shared_ptr aRes(new GeomAPI_Shape); + std::shared_ptr aRes(new GeomAPI_Shape); aRes->setImpl(new TopoDS_Shape(aShape)); return aRes; } } } - return boost::shared_ptr(); -} - -boost::shared_ptr Model_ResultBody::owner() -{ - return myOwner; + return std::shared_ptr(); } void Model_ResultBody::clean() @@ -111,6 +165,7 @@ void Model_ResultBody::clean() std::vector::iterator aBuilder = myBuilders.begin(); for(; aBuilder != myBuilders.end(); aBuilder++) delete *aBuilder; + myBuilders.clear(); } Model_ResultBody::~Model_ResultBody() @@ -124,50 +179,63 @@ TNaming_Builder* Model_ResultBody::builder(const int theTag) myBuilders.insert(myBuilders.end(), theTag - myBuilders.size() + 1, NULL); } if (!myBuilders[theTag]) { - boost::shared_ptr aData = boost::dynamic_pointer_cast(data()); + std::shared_ptr aData = std::dynamic_pointer_cast(data()); myBuilders[theTag] = new TNaming_Builder(aData->shapeLab().FindChild(theTag)); - //TCollection_AsciiString entry;// - //TDF_Tool::Entry(aData->shapeLab().FindChild(theTag), entry); - //cout << "Label = " <shapeLab().FindChild(theTag), entry); + //cout << "Label = " <name() + "/" + theName; + std::shared_ptr aDoc = std::dynamic_pointer_cast(document()); + aDoc->addNamingName(builder(theTag)->NamedShape()->Label(), aName); + TDataStd_Name::Set(builder(theTag)->NamedShape()->Label(),aName.c_str()); +} void Model_ResultBody::generated( - const boost::shared_ptr& theNewShape, const int theTag) + const std::shared_ptr& theNewShape, const std::string& theName, const int theTag) { TopoDS_Shape aShape = theNewShape->impl(); builder(theTag)->Generated(aShape); + if(!theName.empty()) + buildName(theTag, theName); } -void Model_ResultBody::generated(const boost::shared_ptr& theOldShape, - const boost::shared_ptr& theNewShape, const int theTag) +void Model_ResultBody::generated(const std::shared_ptr& theOldShape, + const std::shared_ptr& theNewShape, const std::string& theName, const int theTag) { TopoDS_Shape anOldShape = theOldShape->impl(); TopoDS_Shape aNewShape = theNewShape->impl(); builder(theTag)->Generated(anOldShape, aNewShape); + if(!theName.empty()) + buildName(theTag, theName); } -void Model_ResultBody::modified(const boost::shared_ptr& theOldShape, - const boost::shared_ptr& theNewShape, const int theTag) +void Model_ResultBody::modified(const std::shared_ptr& theOldShape, + const std::shared_ptr& theNewShape, const std::string& theName, const int theTag) { TopoDS_Shape anOldShape = theOldShape->impl(); TopoDS_Shape aNewShape = theNewShape->impl(); builder(theTag)->Modify(anOldShape, aNewShape); + if(!theName.empty()) + buildName(theTag, theName); } -void Model_ResultBody::deleted(const boost::shared_ptr& theOldShape, - const int theTag) +void Model_ResultBody::deleted(const std::shared_ptr& theOldShape, + const int theTag) { TopoDS_Shape aShape = theOldShape->impl(); builder(theTag)->Delete(aShape); } void Model_ResultBody::loadDeletedShapes (GeomAlgoAPI_MakeShape* theMS, - boost::shared_ptr theShapeIn, - const int theKindOfShape, - const int theTag) + std::shared_ptr theShapeIn, + const int theKindOfShape, + const int theTag) { TopoDS_Shape aShapeIn = theShapeIn->impl(); TopTools_MapOfShape aView; @@ -175,70 +243,430 @@ void Model_ResultBody::loadDeletedShapes (GeomAlgoAPI_MakeShape* theMS, for (; ShapeExplorer.More(); ShapeExplorer.Next ()) { const TopoDS_Shape& aRoot = ShapeExplorer.Current (); if (!aView.Add(aRoot)) continue; - boost::shared_ptr aRShape(new GeomAPI_Shape()); - aRShape->setImpl((new TopoDS_Shape(aRoot))); + std::shared_ptr aRShape(new GeomAPI_Shape()); + aRShape->setImpl((new TopoDS_Shape(aRoot))); if (theMS->isDeleted (aRShape)) { - builder(theTag)->Delete(aRoot); + builder(theTag)->Delete(aRoot); } } } void Model_ResultBody::loadAndOrientModifiedShapes ( - GeomAlgoAPI_MakeShape* theMS, - boost::shared_ptr theShapeIn, - const int theKindOfShape, - const int theTag, - GeomAPI_DataMapOfShapeShape& theSubShapes) + GeomAlgoAPI_MakeShape* theMS, + std::shared_ptr theShapeIn, + const int theKindOfShape, + const int theTag, + const std::string& theName, + GeomAPI_DataMapOfShapeShape& theSubShapes) { TopoDS_Shape aShapeIn = theShapeIn->impl(); TopTools_MapOfShape aView; + bool isBuilt = theName.empty(); TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape); for (; aShapeExplorer.More(); aShapeExplorer.Next ()) { const TopoDS_Shape& aRoot = aShapeExplorer.Current (); if (!aView.Add(aRoot)) continue; - ListOfShape aList; - boost::shared_ptr aRShape(new GeomAPI_Shape()); - aRShape->setImpl((new TopoDS_Shape(aRoot))); - theMS->generated(aRShape, aList); - std::list >::const_iterator anIt = aList.begin(), aLast = aList.end(); + ListOfShape aList; + std::shared_ptr aRShape(new GeomAPI_Shape()); + aRShape->setImpl((new TopoDS_Shape(aRoot))); + theMS->modified(aRShape, aList); + std::list >::const_iterator anIt = aList.begin(), aLast = aList.end(); for (; anIt != aLast; anIt++) { TopoDS_Shape aNewShape = (*anIt)->impl(); - if (theSubShapes.isBound(*anIt)) { - boost::shared_ptr aMapShape(theSubShapes.find(*anIt)); - aNewShape.Orientation(aMapShape->impl().Orientation()); + if (theSubShapes.isBound(*anIt)) { + std::shared_ptr aMapShape(theSubShapes.find(*anIt)); + aNewShape.Orientation(aMapShape->impl().Orientation()); } - if (!aRoot.IsSame (aNewShape)) - builder(theTag)->Modify(aRoot,aNewShape); + if (!aRoot.IsSame (aNewShape)) { + builder(theTag)->Modify(aRoot,aNewShape); + if(!isBuilt) + buildName(theTag, theName); + } } } } void Model_ResultBody::loadAndOrientGeneratedShapes ( - GeomAlgoAPI_MakeShape* theMS, - boost::shared_ptr theShapeIn, - const int theKindOfShape, - const int theTag, - GeomAPI_DataMapOfShapeShape& theSubShapes) + GeomAlgoAPI_MakeShape* theMS, + std::shared_ptr theShapeIn, + const int theKindOfShape, + const int theTag, + const std::string& theName, + GeomAPI_DataMapOfShapeShape& theSubShapes) { TopoDS_Shape aShapeIn = theShapeIn->impl(); TopTools_MapOfShape aView; + bool isBuilt = theName.empty(); TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape); for (; aShapeExplorer.More(); aShapeExplorer.Next ()) { const TopoDS_Shape& aRoot = aShapeExplorer.Current (); if (!aView.Add(aRoot)) continue; - ListOfShape aList; - boost::shared_ptr aRShape(new GeomAPI_Shape()); - aRShape->setImpl((new TopoDS_Shape(aRoot))); - theMS->generated(aRShape, aList); - std::list >::const_iterator anIt = aList.begin(), aLast = aList.end(); + ListOfShape aList; + std::shared_ptr aRShape(new GeomAPI_Shape()); + aRShape->setImpl((new TopoDS_Shape(aRoot))); + theMS->generated(aRShape, aList); + std::list >::const_iterator anIt = aList.begin(), aLast = aList.end(); for (; anIt != aLast; anIt++) { TopoDS_Shape aNewShape = (*anIt)->impl(); - if (theSubShapes.isBound(*anIt)) { - boost::shared_ptr aMapShape(theSubShapes.find(*anIt)); - aNewShape.Orientation(aMapShape->impl().Orientation()); + if (theSubShapes.isBound(*anIt)) { + std::shared_ptr aMapShape(theSubShapes.find(*anIt)); + aNewShape.Orientation(aMapShape->impl().Orientation()); + } + if (!aRoot.IsSame (aNewShape)) { + builder(theTag)->Generated(aRoot,aNewShape); + if(!isBuilt) + buildName(theTag, theName); + } + } + } +} + +//======================================================================= +int getDangleShapes(const TopoDS_Shape& theShapeIn, + const TopAbs_ShapeEnum theGeneratedFrom, + TopTools_DataMapOfShapeShape& theDangles) +{ + theDangles.Clear(); + TopTools_IndexedDataMapOfShapeListOfShape subShapeAndAncestors; + TopAbs_ShapeEnum GeneratedTo; + if (theGeneratedFrom == TopAbs_FACE) GeneratedTo = TopAbs_EDGE; + else if (theGeneratedFrom == TopAbs_EDGE) GeneratedTo = TopAbs_VERTEX; + else return Standard_False; + TopExp::MapShapesAndAncestors(theShapeIn, GeneratedTo, theGeneratedFrom, subShapeAndAncestors); + for (Standard_Integer i = 1; i <= subShapeAndAncestors.Extent(); i++) { + const TopoDS_Shape& mayBeDangle = subShapeAndAncestors.FindKey(i); + const TopTools_ListOfShape& ancestors = subShapeAndAncestors.FindFromIndex(i); + if (ancestors.Extent() == 1) theDangles.Bind(ancestors.First(), mayBeDangle); + } + return theDangles.Extent(); +} + +//======================================================================= +void loadGeneratedDangleShapes( + 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()); +} + +//======================================================================= +void Model_ResultBody::loadNextLevels(std::shared_ptr theShape, + const std::string& theName, int& theTag) +{ + if(theShape->isNull()) return; + TopoDS_Shape aShape = theShape->impl(); + std::string aName; + 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++; + } + } + else if (aShape.ShapeType() == TopAbs_SHELL || aShape.ShapeType() == TopAbs_FACE) { + // load faces and all the free edges + TopTools_IndexedMapOfShape Faces; + TopExp::MapShapes(aShape, TopAbs_FACE, Faces); + 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++; + } + } + 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)))) + continue; + 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++; + } + } + } + } else if (aShape.ShapeType() == TopAbs_WIRE) { + TopTools_IndexedMapOfShape Edges; + BRepTools::Map3DEdges(aShape, Edges); + if (Edges.Extent() == 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 { + 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++; + } + // and load generated vertices. + TopTools_DataMapOfShapeShape generated; + if (getDangleShapes(aShape, TopAbs_EDGE, generated)) + { + 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++; + } + } +} + +//======================================================================= +int findAmbiguities(const TopoDS_Shape& theShapeIn, + TopTools_ListOfShape& theList) +{ + int aNumEdges(0); + theList.Clear(); + TopTools_IndexedDataMapOfShapeListOfShape subShapeAndAncestors; + TopAbs_ShapeEnum aTS(TopAbs_EDGE); + TopAbs_ShapeEnum aTA(TopAbs_FACE); + TopTools_MapOfShape aMap1, aMap2; // map1 - for edge ancestors; map2 - for keys => edges + TopTools_ListOfShape aKeyList; + TopExp::MapShapesAndAncestors(theShapeIn, aTS, aTA, subShapeAndAncestors); + 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(); + 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; + 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 + } + aNumEdges = aKeyList.Extent(); + if(aNumEdges) + theList.Assign(aKeyList); + return aNumEdges; +} + +//======================================================================= +void Model_ResultBody::loadFirstLevel( + std::shared_ptr theShape, const std::string& theName, int& theTag) +{ + if(theShape->isNull()) return; + TopoDS_Shape aShape = theShape->impl(); + std::string aName; + 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); + if (itr.Value().ShapeType() == TopAbs_COMPOUND || + itr.Value().ShapeType() == TopAbs_COMPSOLID) + { + std::shared_ptr itrShape(new GeomAPI_Shape()); + itrShape->setImpl(new TopoDS_Shape(itr.Value())); + loadFirstLevel(itrShape, theName, theTag); + } else { + std::shared_ptr itrShape(new GeomAPI_Shape()); + itrShape->setImpl(new TopoDS_Shape(itr.Value())); + loadNextLevels(itrShape, theName, theTag); + } + } + } else { + std::shared_ptr itrShape(new GeomAPI_Shape()); + itrShape->setImpl(new TopoDS_Shape(aShape)); + loadNextLevels(itrShape, theName, theTag); + } + TopTools_ListOfShape aList; + if(findAmbiguities(aShape, 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); + } + } +} + +//======================================================================= +void Model_ResultBody::loadDisconnectedEdges( + std::shared_ptr theShape, const std::string& theName, int& theTag) +{ + if(theShape->isNull()) return; + TopoDS_Shape aShape = theShape->impl(); + TopTools_DataMapOfShapeListOfShape edgeNaborFaces; + TopTools_ListOfShape empty; + TopExp_Explorer explF(aShape, TopAbs_FACE); + for (; explF.More(); explF.Next()) { + const TopoDS_Shape& aFace = explF.Current(); + TopExp_Explorer explV(aFace, TopAbs_EDGE); + for (; explV.More(); explV.Next()) { + const TopoDS_Shape& anEdge = explV.Current(); + if (!edgeNaborFaces.IsBound(anEdge)) edgeNaborFaces.Bind(anEdge, empty); + 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 (faceIsNew) + edgeNaborFaces.ChangeFind(anEdge).Append(aFace); + } + } + +/* 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++; + } +*/ + TopTools_MapOfShape anEdgesToDelete; + TopExp_Explorer anEx(aShape,TopAbs_EDGE); + std::string aName; + for(;anEx.More();anEx.Next()) { + Standard_Boolean aC0 = Standard_False; + TopoDS_Shape anEdge1 = anEx.Current(); + if (edgeNaborFaces.IsBound(anEdge1)) { + const TopTools_ListOfShape& aList1 = edgeNaborFaces.Find(anEdge1); + 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++; + } + } + } + TopTools_MapIteratorOfMapOfShape itDelete(anEdgesToDelete); + for(;itDelete.More();itDelete.Next()) + 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++; + } + } +} + +void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr theShape, const std::string& theName, int& theTag) +{ + if(theShape->isNull()) return; + TopoDS_Shape aShape = theShape->impl(); + TopTools_DataMapOfShapeListOfShape vertexNaborEdges; + TopTools_ListOfShape empty; + TopExp_Explorer explF(aShape, TopAbs_EDGE); + for (; explF.More(); explF.Next()) { + const TopoDS_Shape& anEdge = explF.Current(); + TopExp_Explorer explV(anEdge, TopAbs_VERTEX); + for (; explV.More(); explV.Next()) { + const TopoDS_Shape& aVertex = explV.Current(); + if (!vertexNaborEdges.IsBound(aVertex)) vertexNaborEdges.Bind(aVertex, empty); + Standard_Boolean faceIsNew = Standard_True; + TopTools_ListIteratorOfListOfShape itrF(vertexNaborEdges.Find(aVertex)); + for (; itrF.More(); itrF.Next()) { + if (itrF.Value().IsSame(anEdge)) { + faceIsNew = Standard_False; + break; + } + } + if (faceIsNew) { + vertexNaborEdges.ChangeFind(aVertex).Append(anEdge); } - if (!aRoot.IsSame (aNewShape)) - builder(theTag)->Generated(aRoot,aNewShape); } } -} \ No newline at end of file + std::string aName; + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itr(vertexNaborEdges); + 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++; + } + } +}