Fix regression of smesh/bugs_13/N3 (Body Fitting) and SIGSEGV at killSalome.py

This commit is contained in:
eap 2020-02-21 13:47:31 +03:00
parent 90741df834
commit 13b3c4bbb9
2 changed files with 25 additions and 20 deletions

View File

@ -176,10 +176,18 @@ SMESH_Mesh::~SMESH_Mesh()
{ {
if(MYDEBUG) MESSAGE("SMESH_Mesh::~SMESH_Mesh"); if(MYDEBUG) MESSAGE("SMESH_Mesh::~SMESH_Mesh");
// avoid usual removal of elements while processing RemoveHypothesis( algo ) event if ( _myDocument ) // avoid destructing _myMeshDS from ~SMESH_Gen()
SMESHDS_SubMeshIteratorPtr smIt = _myMeshDS->SubMeshes(); _myDocument->RemoveMesh( _id );
while ( smIt->more() ) _myDocument = 0;
const_cast<SMESHDS_SubMesh*>( smIt->next() )->Clear();
// 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 // issue 0020340: EDF 1022 SMESH : Crash with FindNodeClosestTo in a second new study
// Notify event listeners at least that something happens // Notify event listeners at least that something happens
@ -200,16 +208,6 @@ SMESH_Mesh::~SMESH_Mesh()
if ( _callUp) delete _callUp; if ( _callUp) delete _callUp;
_callUp = 0; _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 ) { if ( _myMeshDS ) {
// delete _myMeshDS, in a thread in order not to block closing a study with large meshes // delete _myMeshDS, in a thread in order not to block closing a study with large meshes
#ifndef WIN32 #ifndef WIN32

View File

@ -375,6 +375,7 @@ namespace
bool _toUseThresholdForInternalFaces; bool _toUseThresholdForInternalFaces;
double _sizeThreshold; double _sizeThreshold;
vector< TGeomID > _shapeIDs; // returned by Hexahedron::getSolids()
SMESH_MesherHelper* _helper; SMESH_MesherHelper* _helper;
size_t CellIndex( size_t i, size_t j, size_t k ) const size_t CellIndex( size_t i, size_t j, size_t k ) const
@ -866,7 +867,7 @@ namespace
void init( size_t i ); void init( size_t i );
void setIJK( size_t i ); void setIJK( size_t i );
bool compute( const Solid* solid, const IsInternalFlag intFlag ); bool compute( const Solid* solid, const IsInternalFlag intFlag );
vector< TGeomID > getSolids(); const vector< TGeomID >& getSolids();
bool isCutByInternalFace( IsInternalFlag & maxFlag ); bool isCutByInternalFace( IsInternalFlag & maxFlag );
void addEdges(SMESH_MesherHelper& helper, void addEdges(SMESH_MesherHelper& helper,
vector< Hexahedron* >& intersectedHex, vector< Hexahedron* >& intersectedHex,
@ -2174,8 +2175,14 @@ namespace
/*! /*!
* \brief Return IDs of SOLIDs interfering with this Hexahedron * \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 // count intersection points belonging to each SOLID
TID2Nb id2NbPoints; TID2Nb id2NbPoints;
id2NbPoints.reserve( 3 ); id2NbPoints.reserve( 3 );
@ -2224,12 +2231,12 @@ namespace
insertAndIncrement( solidIDs[i], id2NbPoints ); 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 ) for ( TID2Nb::iterator id2nb = id2NbPoints.begin(); id2nb != id2NbPoints.end(); ++id2nb )
if ( id2nb->second >= 3 ) if ( id2nb->second >= 3 )
solids.push_back( id2nb->first ); _grid->_shapeIDs.push_back( id2nb->first );
return solids; return _grid->_shapeIDs;
} }
//================================================================================ //================================================================================
@ -2571,7 +2578,7 @@ namespace
solid = _grid->GetSolid(); solid = _grid->GetSolid();
if ( !_grid->_geometry.IsOneSolid() ) if ( !_grid->_geometry.IsOneSolid() )
{ {
vector< TGeomID > solidIDs = getSolids(); const vector< TGeomID >& solidIDs = getSolids();
if ( solidIDs.size() > 1 ) if ( solidIDs.size() > 1 )
{ {
for ( size_t i = 0; i < solidIDs.size(); ++i ) for ( size_t i = 0; i < solidIDs.size(); ++i )