#include "SMESH_subMesh_i.hxx"#include "SMESH_Gen_i.hxx"#include "SMESH_Mesh_i.hxx"#include "Utils_CorbaException.hxx"#include "utilities.h"#include "OpUtil.hxx"#include "Utils_ExceptHandlers.hxx"#include <TopoDS_Iterator.hxx>#include <TopExp_Explorer.hxx>
Go to the source code of this file.
Typedefs | |
| typedef list< SMESHDS_SubMesh * > | TListOfSubMeshes |
Functions | |
| bool | getSubMeshes (::SMESH_subMesh *theSubMesh, TListOfSubMeshes &theSubMeshList) |
| typedef list<SMESHDS_SubMesh*> TListOfSubMeshes |
Definition at line 92 of file SMESH_subMesh_i.cxx.
| bool getSubMeshes | ( | ::SMESH_subMesh * | theSubMesh, |
| TListOfSubMeshes & | theSubMeshList | ||
| ) |
Definition at line 94 of file SMESH_subMesh_i.cxx.
References SMESH_fixation.aShape, SMESHDS_Mesh.MeshElements(), and ex21_lamp.size.
Referenced by SMESH_subMesh_i.GetElementsByType(), SMESH_subMesh_i.GetElementsId(), SMESH_subMesh_i.GetMeshInfo(), SMESH_subMesh_i.GetNumberOfElements(), and SMESH_subMesh_i.GetNumberOfNodes().
{
int size = theSubMeshList.size();
SMESH_Mesh* aMesh = theSubMesh->GetFather();
SMESHDS_Mesh* aMeshDS = aMesh->GetMeshDS();
SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS();
// nodes can be bound to either vertex, edge, face or solid_or_shell
TopoDS_Shape aShape = theSubMesh->GetSubShape();
switch ( aShape.ShapeType() )
{
case TopAbs_SOLID: {
// add submesh of solid itself
aSubMeshDS = aMeshDS->MeshElements( aShape );
if ( aSubMeshDS )
theSubMeshList.push_back( aSubMeshDS );
// and of the first shell
TopExp_Explorer exp( aShape, TopAbs_SHELL );
if ( exp.More() ) {
aSubMeshDS = aMeshDS->MeshElements( exp.Current() );
if ( aSubMeshDS )
theSubMeshList.push_back( aSubMeshDS );
}
break;
}
case TopAbs_WIRE:
case TopAbs_COMPOUND:
case TopAbs_COMPSOLID: {
// call getSubMeshes() for sub-shapes
list<TopoDS_Shape> shapeList;
shapeList.push_back( aShape );
list<TopoDS_Shape>::iterator sh = shapeList.begin();
for ( ; sh != shapeList.end(); ++sh ) {
for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) {
if ( ::SMESH_subMesh* aSubMesh = aMesh->GetSubMeshContaining( it.Value() ))
getSubMeshes( aSubMesh, theSubMeshList ); // add found submesh or explore deeper
else
// no submesh for a compound inside compound
shapeList.push_back( it.Value() );
}
}
// return only unique submeshes
set<SMESHDS_SubMesh*> smSet;
TListOfSubMeshes::iterator sm = theSubMeshList.begin();
while ( sm != theSubMeshList.end() ) {
if ( !smSet.insert( *sm ).second )
sm = theSubMeshList.erase( sm );
else
++sm;
}
break;
}
default:
if ( aSubMeshDS )
theSubMeshList.push_back( aSubMeshDS );
}
return size < theSubMeshList.size();
}