mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-26 09:20:34 +05:00
Fix regression of smesh/bugs_13/N3 (Body Fitting) and SIGSEGV at killSalome.py
This commit is contained in:
parent
90741df834
commit
13b3c4bbb9
@ -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
|
||||||
|
@ -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 )
|
||||||
|
Loading…
Reference in New Issue
Block a user