From 38432368f323819764fdb8db03178306a34d917a Mon Sep 17 00:00:00 2001 From: szy Date: Thu, 6 Nov 2014 18:02:39 +0300 Subject: [PATCH] 6.11.2014. Addition for Import feature. --- src/Model/Model_ResultBody.cpp | 136 ++++++++++++++++++++++++++++++++- src/Model/Model_ResultBody.h | 10 ++- 2 files changed, 141 insertions(+), 5 deletions(-) diff --git a/src/Model/Model_ResultBody.cpp b/src/Model/Model_ResultBody.cpp index 7e5049531..3b9fb24ab 100644 --- a/src/Model/Model_ResultBody.cpp +++ b/src/Model/Model_ResultBody.cpp @@ -6,7 +6,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -14,7 +16,13 @@ #include #include #include +#include #include +#include +#include +#include +#include +#include #include #include // DEB @@ -244,12 +252,136 @@ void Model_ResultBody::loadAndOrientGeneratedShapes ( } } -void Model_ResultBody::loadFirstLevel(boost::shared_ptr theShape, int& theTag) +//======================================================================= +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(boost::shared_ptr theShape, + int& theTag) +{ + if(theShape->isNull()) return; + TopoDS_Shape aShape = theShape->impl(); + if (aShape.ShapeType() == TopAbs_SOLID) { + TopExp_Explorer expl(aShape, TopAbs_FACE); + for (; expl.More(); expl.Next()) + builder(++theTag)->Generated(expl.Current()); + } + 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()); + } + 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) { + builder(++theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i)); + } 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)); + } + } + } + } 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()); + } + } else { + TopExp_Explorer expl(aShape, TopAbs_EDGE); + for (; expl.More(); expl.Next()) { + builder(++theTag)->Generated(expl.Current()); + } + // 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()); + } + } +} +//======================================================================= +void Model_ResultBody::loadFirstLevel( + boost::shared_ptr theShape, int& theTag) +{ + if(theShape->isNull()) return; + TopoDS_Shape aShape = theShape->impl(); + if (aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_COMPSOLID) { + TopoDS_Iterator itr(aShape); + for (; itr.More(); itr.Next()) { + builder(++theTag)->Generated(itr.Value()); + if (itr.Value().ShapeType() == TopAbs_COMPOUND || + itr.Value().ShapeType() == TopAbs_COMPSOLID) + { + boost::shared_ptr itrShape(new GeomAPI_Shape()); + itrShape->setImpl(new TopoDS_Shape(itr.Value())); + loadFirstLevel(itrShape, theTag); + } else { + boost::shared_ptr itrShape(new GeomAPI_Shape()); + itrShape->setImpl(new TopoDS_Shape(itr.Value())); + loadNextLevels(itrShape, theTag); + } + } + } else { + boost::shared_ptr itrShape(new GeomAPI_Shape()); + itrShape->setImpl(new TopoDS_Shape(aShape)); + loadNextLevels(itrShape, theTag); + } } -void Model_ResultBody::loadDisconnectedEdges(boost::shared_ptr theShape, int& theTag) +//======================================================================= +void Model_ResultBody::loadDisconnectedEdges( + boost::shared_ptr theShape, int& theTag) { if(theShape->isNull()) return; TopoDS_Shape aShape = theShape->impl(); diff --git a/src/Model/Model_ResultBody.h b/src/Model/Model_ResultBody.h index 6526b9d55..45330a31e 100644 --- a/src/Model/Model_ResultBody.h +++ b/src/Model/Model_ResultBody.h @@ -83,13 +83,13 @@ public: const int theTag, GeomAPI_DataMapOfShapeShape& theSubShapes); - /// load shapes of the first level (to be used during shape import) + /// Loads shapes of the first level (to be used during shape import) MODEL_EXPORT virtual void loadFirstLevel(boost::shared_ptr theShape, int& theTag); - /// load disconnected edges + /// Loads disconnected edges MODEL_EXPORT virtual void loadDisconnectedEdges(boost::shared_ptr theShape, int& theTag); - /// load disconnected vetexes + /// Loads disconnected vetexes MODEL_EXPORT virtual void loadDisconnectedVertexes(boost::shared_ptr theShape, int& theTag); /// Removes the stored builders @@ -105,6 +105,10 @@ protected: /// Returns (creates if necessary) the builder created on the needed tag of sub-label TNaming_Builder* builder(const int theTag); +private: + /// Loads shapes of the next level (to be used during shape import) + void loadNextLevels(boost::shared_ptr theShape, int& theTag); + friend class Model_Document; }; -- 2.39.2