From: eap Date: Wed, 7 Nov 2007 09:53:46 +0000 (+0000) Subject: PAL16774 (Crash after display of many groups) X-Git-Tag: V3_2_9rc1~27 X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=commitdiff_plain;h=a40ee3d1dedd8e1a29aae95e0ab9ac5ed2660869 PAL16774 (Crash after display of many groups) prepare to mesh deletion at closing a study --- diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 480493c06..522732e50 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -1282,12 +1282,33 @@ SMESH_Gen_i::FindGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, ::SMESH_Mesh & mesh = meshServant->GetImpl(); SMESHDS_Mesh* meshDS = mesh.GetMeshDS(); // find the element in mesh - if ( const SMDS_MeshElement * elem = meshDS->FindElement( theElementID ) ) + if ( const SMDS_MeshElement * elem = meshDS->FindElement( theElementID ) ) { // find a shape id by the element if ( int shapeID = ::SMESH_MeshEditor( &mesh ).FindShape( elem )) { // get a geom object by the shape id GEOM::GEOM_Object_var geom = ShapeToGeomObject( meshDS->IndexToShape( shapeID )); if ( geom->_is_nil() ) { + // try to find a published sub-shape + SALOMEDS::SObject_var mainSO = ObjectToSObject( myCurrentStudy, mainShape ); + SALOMEDS::ChildIterator_var it; + if ( !mainSO->_is_nil() ) + it = myCurrentStudy->NewChildIterator( mainSO ); + if ( !it->_is_nil() ) { + for ( it->InitEx(true); it->More(); it->Next() ) { + GEOM::GEOM_Object_var subGeom = + GEOM::GEOM_Object::_narrow( SObjectToObject( it->Value() )); + if ( !subGeom->_is_nil() ) { + GEOM::ListOfLong_var subList = subGeom->GetSubShapeIndices(); + if ( subList->length() == 1 && shapeID == subList[0] ) { + geom = subGeom; + break; + } + } + } + } + } + if ( geom->_is_nil() ) { + // explode GEOM::GEOM_IShapesOperations_var op = geomGen->GetIShapesOperations( GetCurrentStudyID() ); if ( !op->_is_nil() ) @@ -1298,6 +1319,7 @@ SMESH_Gen_i::FindGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, return geom._retn(); } } + } } return GEOM::GEOM_Object::_nil(); } @@ -3342,6 +3364,19 @@ void SMESH_Gen_i::Close( SALOMEDS::SComponent_ptr theComponent ) delete myStudyContextMap[ studyId ]; myStudyContextMap.erase( studyId ); } + + // delete SMESH_Mesh's + StudyContextStruct* context = myGen.GetStudyContext( studyId ); + map< int, SMESH_Mesh* >::iterator i_mesh = context->mapMesh.begin(); + for ( ; i_mesh != context->mapMesh.end(); ++i_mesh ) + delete i_mesh->second; + // delete SMESHDS_Mesh's + // it's too long on big meshes +// if ( context->myDocument ) { +// delete context->myDocument; +// context->myDocument = 0; +// } + return; }