X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Object.cxx;h=0dbbc68af10926730bfcc7f6b483210b6a08ac36;hb=e848f45eaaeafaf91c9a77c7379cb357dac13f0c;hp=e7637a2f80903253f9b2bbe21cb72e89914a34ac;hpb=abbf577ef8f9761e05b222283168555ee3013498;p=modules%2Fsmesh.git diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index e7637a2f8..0dbbc68af 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -199,8 +199,10 @@ void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) //================================================================================= void SMESH_VisualObjDef::buildPrs() { - try - { + // PAL16631(crash after a mesh computation that failed because of lack of memory): + // Catch exceptions upper by stack +// try +// { mySMDS2VTKNodes.clear(); myVTK2SMDSNodes.clear(); mySMDS2VTKElems.clear(); @@ -210,15 +212,15 @@ void SMESH_VisualObjDef::buildPrs() buildNodePrs(); else buildElemPrs(); - } - catch( const std::exception& exc ) - { - INFOS("Follow exception was cought:\n\t"<GetNumberOfCells() = "<GetNumberOfCells() ); if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" ); @@ -230,8 +232,12 @@ void SMESH_VisualObjDef::buildPrs() //================================================================================= void SMESH_VisualObjDef::buildNodePrs() { + // PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead, + // so check remaining memory size for safety + SMDS_Mesh::CheckMemory(); // PAL16631 vtkPoints* aPoints = vtkPoints::New(); createPoints( aPoints ); + SMDS_Mesh::CheckMemory(); myGrid->SetPoints( aPoints ); aPoints->Delete(); @@ -291,6 +297,10 @@ void SMESH_VisualObjDef::buildElemPrs() for ( int i = 0; i <= 2; i++ ) nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] ); + // PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead, + // so check remaining memory size for safety + SMDS_Mesh::CheckMemory(); // PAL16631 + vtkIdType aCellsSize = 3 * nbEnts[ SMDSAbs_Edge ]; for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes @@ -314,16 +324,22 @@ void SMESH_VisualObjDef::buildElemPrs() vtkCellArray* aConnectivity = vtkCellArray::New(); aConnectivity->Allocate( aCellsSize, 0 ); + SMDS_Mesh::CheckMemory(); // PAL16631 + vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); aCellTypesArray->SetNumberOfComponents( 1 ); aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); + SMDS_Mesh::CheckMemory(); // PAL16631 + vtkIdList *anIdList = vtkIdList::New(); vtkIdType iElem = 0; TConnect aConnect; aConnect.reserve(VTK_CELL_SIZE); + SMDS_Mesh::CheckMemory(); // PAL16631 + for ( int i = 0; i <= 2; i++ ) // iterate through edges, faces and volumes { if( nbEnts[ aTypes[ i ] ] > 0 ) @@ -346,6 +362,7 @@ void SMESH_VisualObjDef::buildElemPrs() SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); switch(aType){ case SMDSAbs_Volume:{ + aConnect.clear(); std::vector aConnectivities; // Convertions connectivities from SMDS to VTK if (anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE @@ -423,6 +440,7 @@ void SMESH_VisualObjDef::buildElemPrs() iElem++; } } + SMDS_Mesh::CheckMemory(); // PAL16631 } // Insert cells in grid @@ -431,6 +449,8 @@ void SMESH_VisualObjDef::buildElemPrs() aCellLocationsArray->SetNumberOfComponents( 1 ); aCellLocationsArray->SetNumberOfTuples( aNbCells ); + SMDS_Mesh::CheckMemory(); // PAL16631 + aConnectivity->InitTraversal(); for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); @@ -441,6 +461,8 @@ void SMESH_VisualObjDef::buildElemPrs() aCellTypesArray->Delete(); aConnectivity->Delete(); anIdList->Delete(); + + SMDS_Mesh::CheckMemory(); // PAL16631 } //================================================================================= @@ -515,11 +537,14 @@ SMESH_MeshObj::~SMESH_MeshObj() // function : Update // purpose : Update mesh and fill grid with new values if necessary //================================================================================= -void SMESH_MeshObj::Update( int theIsClear ) +bool SMESH_MeshObj::Update( int theIsClear ) { // Update SMDS_Mesh on client part - if ( myClient.Update(theIsClear) ) + if ( myClient.Update(theIsClear) || GetUnstructuredGrid()->GetNumberOfPoints()==0) { buildPrs(); // Fill unstructured grid + return true; + } + return false; } //================================================================================= @@ -674,10 +699,11 @@ void SMESH_SubMeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunc // function : Update // purpose : Update mesh object and fill grid with new values //================================================================================= -void SMESH_SubMeshObj::Update( int theIsClear ) +bool SMESH_SubMeshObj::Update( int theIsClear ) { - myMeshObj->Update( theIsClear ); + bool changed = myMeshObj->Update( theIsClear ); buildPrs(); + return changed; }