From d5f8c39955a2ef0d57238a360a746268994e549a Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 8 Nov 2005 13:04:03 +0000 Subject: [PATCH 1/1] Fix bug 10390. fix getting submesh for a shell --- src/SMESH/SMESH_Pattern.cxx | 35 +++++++++++++++++++++++++++++++---- src/SMESH/SMESH_Pattern.hxx | 5 +++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/SMESH/SMESH_Pattern.cxx b/src/SMESH/SMESH_Pattern.cxx index 4809aa7e6..493799d35 100644 --- a/src/SMESH/SMESH_Pattern.cxx +++ b/src/SMESH/SMESH_Pattern.cxx @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -2839,7 +2840,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, MESSAGE(" ::Load(volume) " ); Clear(); myIs2D = false; - SMESHDS_Mesh * aMeshDS = theMesh->GetMeshDS(); + SMESHDS_SubMesh * aSubMesh; // load shapes in myShapeIDMap SMESH_Block block; @@ -2852,7 +2853,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, for ( shapeID = 1; shapeID <= myShapeIDMap.Extent(); shapeID++ ) { const TopoDS_Shape& S = myShapeIDMap( shapeID ); - SMESHDS_SubMesh * aSubMesh = aMeshDS->MeshElements( S ); + aSubMesh = getSubmeshWithElements( theMesh, S ); if ( aSubMesh ) nbNodes += aSubMesh->NbNodes(); } @@ -2865,7 +2866,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, { const TopoDS_Shape& S = myShapeIDMap( shapeID ); list< TPoint* > & shapePoints = getShapePoints( shapeID ); - SMESHDS_SubMesh * aSubMesh = aMeshDS->MeshElements( S ); + aSubMesh = getSubmeshWithElements( theMesh, S ); if ( ! aSubMesh ) continue; SMDS_NodeIteratorPtr nIt = aSubMesh->GetNodes(); if ( !nIt->more() ) continue; @@ -2929,7 +2930,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, // load elements - SMESHDS_SubMesh * aSubMesh = aMeshDS->MeshElements( theBlock ); + aSubMesh = getSubmeshWithElements( theMesh, theBlock ); if ( aSubMesh ) { SMDS_ElemIteratorPtr elemIt = aSubMesh->GetElements(); @@ -2947,6 +2948,32 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh, return setErrorCode( ERR_OK ); } +//======================================================================= +//function : getSubmeshWithElements +//purpose : return submesh containing elements bound to theBlock in theMesh +//======================================================================= + +SMESHDS_SubMesh * SMESH_Pattern::getSubmeshWithElements(SMESH_Mesh* theMesh, + const TopoDS_Shape& theShape) +{ + SMESHDS_SubMesh * aSubMesh = theMesh->GetMeshDS()->MeshElements( theShape ); + if ( aSubMesh && ( aSubMesh->GetElements()->more() || aSubMesh->GetNodes()->more() )) + return aSubMesh; + + if ( theShape.ShapeType() == TopAbs_SHELL ) + { + // look for submesh of VOLUME + TopTools_ListIteratorOfListOfShape it( theMesh->GetAncestors( theShape )); + for (; it.More(); it.Next()) { + aSubMesh = theMesh->GetMeshDS()->MeshElements( it.Value() ); + if ( aSubMesh && ( aSubMesh->GetElements()->more() || aSubMesh->GetNodes()->more() )) + return aSubMesh; + } + } + return 0; +} + + //======================================================================= //function : Apply //purpose : Compute nodes coordinates applying diff --git a/src/SMESH/SMESH_Pattern.hxx b/src/SMESH/SMESH_Pattern.hxx index cc0bd159a..e49b498ec 100644 --- a/src/SMESH/SMESH_Pattern.hxx +++ b/src/SMESH/SMESH_Pattern.hxx @@ -41,6 +41,7 @@ class SMDS_MeshFace; class SMDS_MeshVolume; class SMDS_MeshNode; class SMESH_Mesh; +class SMESHDS_SubMesh; class TopoDS_Shell; class TopoDS_Vertex; class TopoDS_Face; @@ -305,6 +306,10 @@ class SMESH_Pattern { void clearMesh(SMESH_Mesh* theMesh) const; // clear mesh elements existing on myShape in theMesh + static SMESHDS_SubMesh * getSubmeshWithElements(SMESH_Mesh* theMesh, + const TopoDS_Shape& theShape); + // return submesh containing elements bound to theShape in theMesh + private: // fields -- 2.30.2