X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultBody.cpp;h=59c65ac9e470b92a2f184ee0258e8921952c62da;hb=9e869ede4d8c56262bb20534543c2bf56cd6a91b;hp=7e504953170efd29fb1f71ab9f57a2937acd8a44;hpb=88325c9a4c1fa70b51121c309b67c2c7d1b8be1e;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultBody.cpp b/src/Model/Model_ResultBody.cpp index 7e5049531..59c65ac9e 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 @@ -25,9 +33,9 @@ Model_ResultBody::Model_ResultBody() setIsConcealed(false); } -void Model_ResultBody::store(const boost::shared_ptr& theShape) +void Model_ResultBody::store(const std::shared_ptr& theShape) { - 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 @@ -44,10 +52,10 @@ void Model_ResultBody::store(const boost::shared_ptr& theShape) } } -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 @@ -66,10 +74,10 @@ void Model_ResultBody::storeGenerated(const boost::shared_ptr& th } } -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 @@ -88,22 +96,22 @@ void Model_ResultBody::storeModified(const boost::shared_ptr& the } } -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(); + return std::shared_ptr(); } void Model_ResultBody::clean() @@ -125,7 +133,7 @@ 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); @@ -135,14 +143,14 @@ TNaming_Builder* Model_ResultBody::builder(const int theTag) } void Model_ResultBody::generated( - const boost::shared_ptr& theNewShape, const int theTag) + const std::shared_ptr& theNewShape, const int theTag) { TopoDS_Shape aShape = theNewShape->impl(); builder(theTag)->Generated(aShape); } -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 int theTag) { TopoDS_Shape anOldShape = theOldShape->impl(); TopoDS_Shape aNewShape = theNewShape->impl(); @@ -150,15 +158,15 @@ void Model_ResultBody::generated(const boost::shared_ptr& theOldS } -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 int theTag) { TopoDS_Shape anOldShape = theOldShape->impl(); TopoDS_Shape aNewShape = theNewShape->impl(); builder(theTag)->Modify(anOldShape, aNewShape); } -void Model_ResultBody::deleted(const boost::shared_ptr& theOldShape, +void Model_ResultBody::deleted(const std::shared_ptr& theOldShape, const int theTag) { TopoDS_Shape aShape = theOldShape->impl(); @@ -166,7 +174,7 @@ void Model_ResultBody::deleted(const boost::shared_ptr& theOldSha } void Model_ResultBody::loadDeletedShapes (GeomAlgoAPI_MakeShape* theMS, - boost::shared_ptr theShapeIn, + std::shared_ptr theShapeIn, const int theKindOfShape, const int theTag) { @@ -176,7 +184,7 @@ 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()); + std::shared_ptr aRShape(new GeomAPI_Shape()); aRShape->setImpl((new TopoDS_Shape(aRoot))); if (theMS->isDeleted (aRShape)) { builder(theTag)->Delete(aRoot); @@ -186,7 +194,7 @@ void Model_ResultBody::loadDeletedShapes (GeomAlgoAPI_MakeShape* theMS, void Model_ResultBody::loadAndOrientModifiedShapes ( GeomAlgoAPI_MakeShape* theMS, - boost::shared_ptr theShapeIn, + std::shared_ptr theShapeIn, const int theKindOfShape, const int theTag, GeomAPI_DataMapOfShapeShape& theSubShapes) @@ -198,14 +206,14 @@ void Model_ResultBody::loadAndOrientModifiedShapes ( const TopoDS_Shape& aRoot = aShapeExplorer.Current (); if (!aView.Add(aRoot)) continue; ListOfShape aList; - boost::shared_ptr aRShape(new GeomAPI_Shape()); + 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(); + 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)); + std::shared_ptr aMapShape(theSubShapes.find(*anIt)); aNewShape.Orientation(aMapShape->impl().Orientation()); } if (!aRoot.IsSame (aNewShape)) @@ -216,7 +224,7 @@ void Model_ResultBody::loadAndOrientModifiedShapes ( void Model_ResultBody::loadAndOrientGeneratedShapes ( GeomAlgoAPI_MakeShape* theMS, - boost::shared_ptr theShapeIn, + std::shared_ptr theShapeIn, const int theKindOfShape, const int theTag, GeomAPI_DataMapOfShapeShape& theSubShapes) @@ -228,14 +236,14 @@ void Model_ResultBody::loadAndOrientGeneratedShapes ( const TopoDS_Shape& aRoot = aShapeExplorer.Current (); if (!aView.Add(aRoot)) continue; ListOfShape aList; - boost::shared_ptr aRShape(new GeomAPI_Shape()); + 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(); + 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)); + std::shared_ptr aMapShape(theSubShapes.find(*anIt)); aNewShape.Orientation(aMapShape->impl().Orientation()); } if (!aRoot.IsSame (aNewShape)) @@ -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(std::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( + std::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) + { + std::shared_ptr itrShape(new GeomAPI_Shape()); + itrShape->setImpl(new TopoDS_Shape(itr.Value())); + loadFirstLevel(itrShape, theTag); + } else { + std::shared_ptr itrShape(new GeomAPI_Shape()); + itrShape->setImpl(new TopoDS_Shape(itr.Value())); + loadNextLevels(itrShape, theTag); + } + } + } else { + std::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( + std::shared_ptr theShape, int& theTag) { if(theShape->isNull()) return; TopoDS_Shape aShape = theShape->impl(); @@ -312,7 +444,7 @@ void Model_ResultBody::loadDisconnectedEdges(boost::shared_ptr th } } -void Model_ResultBody::loadDisconnectedVertexes(boost::shared_ptr theShape, int& theTag) +void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr theShape, int& theTag) { if(theShape->isNull()) return; TopoDS_Shape aShape = theShape->impl();