{
if(MYDEBUG) MESSAGE("SMESH_Mesh::~SMESH_Mesh");
- // avoid usual removal of elements while processing RemoveHypothesis( algo ) event
- SMESHDS_SubMeshIteratorPtr smIt = _myMeshDS->SubMeshes();
- while ( smIt->more() )
- const_cast<SMESHDS_SubMesh*>( smIt->next() )->Clear();
+ if ( _myDocument ) // avoid destructing _myMeshDS from ~SMESH_Gen()
+ _myDocument->RemoveMesh( _id );
+ _myDocument = 0;
+
+ // remove self from studyContext
+ if ( _gen )
+ {
+ StudyContextStruct * studyContext = _gen->GetStudyContext();
+ studyContext->mapMesh.erase( _id );
+ }
+
+ _myMeshDS->ClearMesh();
// issue 0020340: EDF 1022 SMESH : Crash with FindNodeClosestTo in a second new study
// Notify event listeners at least that something happens
if ( _callUp) delete _callUp;
_callUp = 0;
- // remove self from studyContext
- if ( _gen )
- {
- StudyContextStruct * studyContext = _gen->GetStudyContext();
- studyContext->mapMesh.erase( _id );
- }
- if ( _myDocument )
- _myDocument->RemoveMesh( _id );
- _myDocument = 0;
-
if ( _myMeshDS ) {
// delete _myMeshDS, in a thread in order not to block closing a study with large meshes
#ifndef WIN32
bool _toUseThresholdForInternalFaces;
double _sizeThreshold;
+ vector< TGeomID > _shapeIDs; // returned by Hexahedron::getSolids()
SMESH_MesherHelper* _helper;
size_t CellIndex( size_t i, size_t j, size_t k ) const
void init( size_t i );
void setIJK( size_t i );
bool compute( const Solid* solid, const IsInternalFlag intFlag );
- vector< TGeomID > getSolids();
+ const vector< TGeomID >& getSolids();
bool isCutByInternalFace( IsInternalFlag & maxFlag );
void addEdges(SMESH_MesherHelper& helper,
vector< Hexahedron* >& intersectedHex,
/*!
* \brief Return IDs of SOLIDs interfering with this Hexahedron
*/
- vector< TGeomID > Hexahedron::getSolids()
+ const vector< TGeomID >& Hexahedron::getSolids()
{
+ _grid->_shapeIDs.clear();
+ if ( _grid->_geometry.IsOneSolid() )
+ {
+ _grid->_shapeIDs.push_back( _grid->GetSolid()->ID() );
+ return _grid->_shapeIDs;
+ }
// count intersection points belonging to each SOLID
TID2Nb id2NbPoints;
id2NbPoints.reserve( 3 );
insertAndIncrement( solidIDs[i], id2NbPoints );
}
- vector< TGeomID > solids; solids.reserve( id2NbPoints.size() );
+ _grid->_shapeIDs.reserve( id2NbPoints.size() );
for ( TID2Nb::iterator id2nb = id2NbPoints.begin(); id2nb != id2NbPoints.end(); ++id2nb )
if ( id2nb->second >= 3 )
- solids.push_back( id2nb->first );
+ _grid->_shapeIDs.push_back( id2nb->first );
- return solids;
+ return _grid->_shapeIDs;
}
//================================================================================
solid = _grid->GetSolid();
if ( !_grid->_geometry.IsOneSolid() )
{
- vector< TGeomID > solidIDs = getSolids();
+ const vector< TGeomID >& solidIDs = getSolids();
if ( solidIDs.size() > 1 )
{
for ( size_t i = 0; i < solidIDs.size(); ++i )