X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ComputeDlg.cxx;h=cc8506198ad3a1e4eac1ead40fff0aa06d885293;hb=337a0ab4c5f91c3c1bbee7e8114fe5dc6a17cc69;hp=5ce9868764a3ea9944b89d288f0f4c1a2e98eee2;hpb=a4c5cc32c6aa1b7c81c54716dea8c040e747fe45;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx index 5ce986876..cc8506198 100644 --- a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx @@ -35,6 +35,7 @@ #include "SMESHGUI_HypothesesUtils.h" #include "SMDS_SetIterator.hxx" +#include #include "GEOMBase.h" #include "GEOM_Actor.h" @@ -67,6 +68,8 @@ #include #include +#include + // QT Includes #include #include @@ -77,6 +80,7 @@ #include #include #include +#include #include @@ -109,6 +113,21 @@ using namespace SMESH; namespace SMESH { + //============================================================================= + /*! + * \brief Allocate some memory at construction and release it at destruction. + * Is used to be able to continue working after mesh generation or visualization + * break due to lack of memory + */ + //============================================================================= + + struct MemoryReserve + { + char* myBuf; + MemoryReserve(): myBuf( new char[1024*1024*1] ){} // 1M + ~MemoryReserve() { delete [] myBuf; } + }; + // ========================================================================================= /*! * \brief Class showing shapes without publishing @@ -573,7 +592,7 @@ void SMESHGUI_MeshInfosBox::SetInfoByMesh(SMESH::SMESH_Mesh_var mesh) // faces nbTot = mesh->NbFaces(), nbLin = mesh->NbFacesOfOrder(lin); myNbFace ->setText( QString("%1").arg( nbTot )); - myNbLinFace ->setText( QString("%1").arg( nbLin )); + myNbLinFace ->setText( QString("%1").arg( nbLin )); myNbQuadFace ->setText( QString("%1").arg( nbTot - nbLin )); // volumes @@ -706,12 +725,22 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent) grpLayout->addWidget ( myPublishBtn, 1, 1 ); grpLayout->setRowStretch( 2, 1 ); + // Memory Lack Label + + myMemoryLackGroup = new QVGroupBox(tr("ERRORS"), aFrame, "memlackGrBox"); + QLabel* memLackLabel = new QLabel(tr("MEMORY_LACK"), myMemoryLackGroup); + QFont bold = memLackLabel->font(); bold.setBold(true); + memLackLabel->setFont( bold ); + memLackLabel->setMinimumWidth(300); + + // add all widgets to aFrame QVBoxLayout* aLay = new QVBoxLayout(aFrame); aLay->addWidget( aPixGrp ); aLay->addWidget( nameBox ); aLay->addWidget( myBriefInfo ); aLay->addWidget( myFullInfo ); aLay->addWidget( myErrorGroup ); + aLay->addWidget( myMemoryLackGroup ); aLay->setStretchFactor( myErrorGroup, 1 ); return aFrame; @@ -751,7 +780,7 @@ void SMESHGUI_ComputeOp::startOperation() // COMPUTE MESH - bool computeFailed = true; + bool computeFailed = true, memoryLack = false; int nbNodes = 0, nbEdges = 0, nbFaces = 0, nbVolums = 0; LightApp_SelectionMgr *Sel = selectionMgr(); @@ -769,9 +798,14 @@ void SMESHGUI_ComputeOp::startOperation() Handle(SALOME_InteractiveObject) IObject = selected.First(); aMesh = SMESH::GetMeshByIO(IObject); - if (!aMesh->_is_nil()) { + if (!aMesh->_is_nil()) + { + MemoryReserve aMemoryReserve; + _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh); myMainShape = aMesh->GetShapeToMesh(); - if ( !myMainShape->_is_nil() ) { + if ( !myMainShape->_is_nil() && aMeshSObj ) + { + myDlg->myMeshName->setText( aMeshSObj->GetName() ); SMESH::SMESH_Gen_var gen = getSMESHGUI()->GetSMESHGen(); SMESH::algo_error_array_var errors = gen->GetAlgoState(aMesh,myMainShape); if ( errors->length() > 0 ) { @@ -783,49 +817,63 @@ void SMESHGUI_ComputeOp::startOperation() } SUIT_OverrideCursor aWaitCursor; try { - if (gen->Compute(aMesh, myMainShape)) { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (gen->Compute(aMesh, myMainShape)) computeFailed = false; - } - else { - anErrors = gen->GetComputeErrors( aMesh, myMainShape ); -// if ( anErrors->length() == 0 ) { -// SUIT_MessageBox::warn1(desktop(), -// tr("SMESH_WRN_WARNING"), -// tr("SMESH_WRN_COMPUTE_FAILED"), -// tr("SMESH_BUT_OK")); -// onCancel(); -// return; -// } - } } catch(const SALOME::SALOME_Exception & S_ex){ - SalomeApp_Tools::QtCatchCorbaException(S_ex); + memoryLack = true; + //SalomeApp_Tools::QtCatchCorbaException(S_ex); } - if ( _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh)) { - myDlg->myMeshName->setText( aMeshSObj->GetName() ); - SMESH::ModifiedMesh(aMeshSObj, !computeFailed, aMesh->NbNodes() == 0); + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + anErrors = gen->GetComputeErrors( aMesh, myMainShape ); + // if ( anErrors->length() == 0 ) { + // SUIT_MessageBox::warn1(desktop(), + // tr("SMESH_WRN_WARNING"), + // tr("SMESH_WRN_COMPUTE_FAILED"), + // tr("SMESH_BUT_OK")); + // onCancel(); + // return; + // } + // check if there are memory problems + for ( int i = 0; i < anErrors->length() && !memoryLack; ++i ) + memoryLack = ( anErrors[ i ].code == SMESH::COMPERR_MEMORY_PB ); } - update( UF_ObjBrowser | UF_Model ); - - // SHOW MESH - - if ( getSMESHGUI()->automaticUpdate() ) { - SVTK_ViewWindow* aVTKView = SMESH::GetViewWindow(getSMESHGUI(), true); - if (aVTKView) { - int anId = study()->id(); - TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId, IObject->getEntry()); - if (aVisualObj) { - aVisualObj->Update(); - SMESH_Actor* anActor = SMESH::FindActorByEntry(IObject->getEntry()); - if (!anActor) { - anActor = SMESH::CreateActor(studyDS(), IObject->getEntry()); - if (anActor) { - SMESH::DisplayActor(aVTKView, anActor); //apo - SMESH::FitAll(); - } + catch(const SALOME::SALOME_Exception & S_ex){ + memoryLack = true; + } + + // NPAL16631: if ( !memoryLack ) + { + SMESH::ModifiedMesh(aMeshSObj, !computeFailed, aMesh->NbNodes() == 0); + update( UF_ObjBrowser | UF_Model ); + Sel->setSelectedObjects( selected ); + + // SHOW MESH + // NPAL16631: if ( getSMESHGUI()->automaticUpdate() ) + if ( !memoryLack && getSMESHGUI()->automaticUpdate() ) + { + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + SMESH::UpdateView(eDisplay, IObject->getEntry()); + } + catch (...) { +#ifdef _DEBUG_ + cout << "Exception thrown during mesh visualization" << endl; +#endif + if ( SMDS_Mesh::CheckMemory(true) ) { // has memory to show warning? + SMESH::OnVisuException(); + } + else { + memoryLack = true; } - SMESH::RepaintCurrentView(); - Sel->setSelectedObjects( selected ); } } } @@ -839,18 +887,23 @@ void SMESHGUI_ComputeOp::startOperation() onCancel(); return; } - myDlg->setCaption(tr( computeFailed ? "SMESH_WRN_COMPUTE_FAILED" : "SMESH_COMPUTE_SUCCEED")); + myDlg->myMemoryLackGroup->hide(); // SHOW ERRORS bool noError = ( !anErrors.operator->() || anErrors->length() == 0 ); - QTable* tbl = myDlg->myTable; - - if ( noError ) + if ( memoryLack ) { - //tbl->setNumRows(0); + myDlg->myMemoryLackGroup->show(); + myDlg->myFullInfo->hide(); + myDlg->myBriefInfo->hide(); + myDlg->myErrorGroup->hide(); + } + else if ( noError ) + { + SUIT_OverrideCursor aWaitCursor; myDlg->myFullInfo->SetInfoByMesh( aMesh ); myDlg->myFullInfo->show(); myDlg->myBriefInfo->hide(); @@ -858,6 +911,7 @@ void SMESHGUI_ComputeOp::startOperation() } else { + QTable* tbl = myDlg->myTable; myDlg->myBriefInfo->SetInfoByMesh( aMesh ); myDlg->myBriefInfo->show(); myDlg->myFullInfo->hide(); @@ -892,7 +946,6 @@ void SMESHGUI_ComputeOp::startOperation() tbl->setCurrentCell(0,0); currentCellChanged(); // to update buttons } - myDlg->show(); }