From 6e738044581ebf966267dc0b563baeb3993a1441 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 7 Nov 2007 10:14:24 +0000 Subject: [PATCH] PAL16774 (Crash after display of many groups) + void RemoveVisuData(int studyID); - void UpdateView (SUIT_ViewWindow*, + bool UpdateView (SUIT_ViewWindow*, --- src/SMESHGUI/SMESHGUI_VTKUtils.cxx | 175 ++++++++++++++++++++++++----- src/SMESHGUI/SMESHGUI_VTKUtils.h | 6 +- 2 files changed, 148 insertions(+), 33 deletions(-) diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index 4ab9313db..03cc70661 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -74,6 +74,23 @@ namespace SMESH { typedef map TVisualObjCont; static TVisualObjCont VISUAL_OBJ_CONT; + //============================================================================= + /*! + * \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 + void Free() { if (myBuf) { delete [] myBuf; myBuf = 0; }} + ~MemoryReserve() { Free(); } + }; + static MemoryReserve* theVISU_MemoryReserve = new MemoryReserve; + //================================================================================ /*! * \brief Remove VisualObj and its actor from all views @@ -95,8 +112,7 @@ namespace SMESH { actor->Delete(); } } - SalomeApp_Study* aStudy = dynamic_cast( aViewManager->study() ); - int aStudyId = aStudy->id(); + int aStudyId = aViewManager->study()->id(); TVisualObjCont::key_type aKey(aStudyId,theEntry); TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey); if(anIter != VISUAL_OBJ_CONT.end()) { @@ -117,32 +133,82 @@ namespace SMESH { { SalomeApp_Application* app = dynamic_cast ( SUIT_Session::session()->activeApplication() ); - SUIT_ViewManager* aViewManager = - app ? app->getViewManager(SVTK_Viewer::Type(), true) : 0; - if ( aViewManager ) { - QPtrVector views = aViewManager->getViews(); - for ( int iV = 0; iV < views.count(); ++iV ) { - if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) { - vtkRenderer *aRenderer = vtkWnd->getRenderer(); - vtkActorCollection *aCollection = aRenderer->GetActors(); - aCollection->InitTraversal(); - while(vtkActor *anAct = aCollection->GetNextActor()){ - if(SMESH_Actor *actor = dynamic_cast(anAct)){ - vtkWnd->RemoveActor(actor); - actor->Delete(); + if (!app) return; + ViewManagerList viewMgrs = app->viewManagers(); + for ( int iM = 0; iM < viewMgrs.count(); ++iM ) { + SUIT_ViewManager* aViewManager = viewMgrs.at( iM ); + if ( aViewManager && aViewManager->getType() == SVTK_Viewer::Type()) { + QPtrVector views = aViewManager->getViews(); + for ( int iV = 0; iV < views.count(); ++iV ) { + if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) { + vtkRenderer *aRenderer = vtkWnd->getRenderer(); + vtkActorCollection *actors = aRenderer->GetActors(); + for (int i = 0; i < actors->GetNumberOfItems(); ++i ) { + // size of actors changes inside the loop + while (SMESH_Actor *actor = dynamic_cast(actors->GetItemAsObject(i))) + { + vtkWnd->RemoveActor(actor); + actor->Delete(); + } + } + } + } + } + } + TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.begin(); + for ( ; anIter != VISUAL_OBJ_CONT.end(); ++anIter ) { + // for unknown reason, object destructor is not called, so clear object manually + anIter->second->GetUnstructuredGrid()->SetCells(0,0,0); + anIter->second->GetUnstructuredGrid()->SetPoints(0); + } + VISUAL_OBJ_CONT.clear(); + } + + //================================================================================ + /*! + * \brief Remove all VisualObjs of a study + */ + //================================================================================ + + void RemoveVisuData(int studyID) + { + SalomeApp_Application* app = dynamic_cast + ( SUIT_Session::session()->activeApplication() ); + if (!app) return; + ViewManagerList viewMgrs = app->viewManagers(); + for ( int iM = 0; iM < viewMgrs.count(); ++iM ) { + SUIT_ViewManager* aViewManager = viewMgrs.at( iM ); + if ( aViewManager && aViewManager->getType() == SVTK_Viewer::Type() && + aViewManager->study()->id() == studyID ) { + QPtrVector views = aViewManager->getViews(); + for ( int iV = 0; iV < views.count(); ++iV ) { + if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) { + vtkRenderer *aRenderer = vtkWnd->getRenderer(); + vtkActorCollection *actors = aRenderer->GetActors(); + for (int i = 0; i < actors->GetNumberOfItems(); ++i ) { + // size of actors changes inside the loop + while(SMESH_Actor *actor = dynamic_cast(actors->GetItemAsObject(i))) + { + vtkWnd->RemoveActor(actor); + actor->Delete(); + } } } } } - TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.begin(); - for ( ; anIter != VISUAL_OBJ_CONT.end(); ++anIter ) { + } + TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.begin(); + for ( ; anIter != VISUAL_OBJ_CONT.end(); ++anIter ) { + int curId = anIter->first.first; + if ( curId == studyID ) { // for unknown reason, object destructor is not called, so clear object manually anIter->second->GetUnstructuredGrid()->SetCells(0,0,0); anIter->second->GetUnstructuredGrid()->SetPoints(0); + VISUAL_OBJ_CONT.erase( anIter-- ); // dercement occures before erase() } - VISUAL_OBJ_CONT.clear(); } } + //================================================================================ /*! * \brief Notify the user on problems during visualization @@ -151,9 +217,31 @@ namespace SMESH { void OnVisuException() { - SUIT_MessageBox::warn1 (SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_VISU_PROBLEM"), - QObject::tr("SMESH_BUT_OK")); + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + // PAL16774 (Crash after display of many groups). Salome sometimes crashes just + // after or at showing this message, so we do an additional check of available memory +// char* buf = new char[100*1024]; +// delete [] buf; + SUIT_MessageBox::warn1 (SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("SMESH_VISU_PROBLEM"), + QObject::tr("SMESH_BUT_OK")); + } catch (...) { + // no more memory at all: last resort + cout<< "SMESHGUI_VTKUtils::OnVisuException(), exception even at showing a message!!!" <getRenderer(); + vtkActorCollection *aCollection = aRenderer->GetActors(); + aCollection->InitTraversal(); + while(vtkActor *anAct = aCollection->GetNextActor()) + if(SMESH_Actor *anActor = dynamic_cast(anAct)) + return false; + } + return true; + } + + bool UpdateView(SUIT_ViewWindow *theWnd, EDisplaing theAction, const char* theEntry) { - if(SVTK_ViewWindow* aViewWnd = GetVtkViewWindow(theWnd)){ + bool OK = false; + if(SVTK_ViewWindow* aViewWnd = GetVtkViewWindow(theWnd)) { + OK = true; vtkRenderer *aRenderer = aViewWnd->getRenderer(); vtkActorCollection *aCollection = aRenderer->GetActors(); aCollection->InitTraversal(); - switch(theAction){ + switch(theAction) { case eDisplayAll: { while(vtkActor *anAct = aCollection->GetNextActor()){ if(SMESH_Actor *anActor = dynamic_cast(anAct)){ @@ -568,7 +677,7 @@ namespace SMESH { } } default: { - if(SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)){ + if(SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) { switch(theAction) { case eDisplay: case eDisplayOnly: @@ -586,9 +695,13 @@ namespace SMESH { SalomeApp_Study* aStudy = dynamic_cast( theWnd->getViewManager()->study() ); _PTR(Study) aDocument = aStudy->studyDS(); if((anActor = CreateActor(aDocument,theEntry,true))) { + bool needFitAll = noSmeshActors(theWnd); // fit for the first object only DisplayActor(theWnd,anActor); // FitAll(); - PAL16770(Display of a group performs an automatic fit all) - } + if ( needFitAll ) FitAll(); + } else { + OK = false; + } break; } } @@ -596,14 +709,15 @@ namespace SMESH { } } } + return OK; } - void UpdateView(EDisplaing theAction, const char* theEntry){ + bool UpdateView(EDisplaing theAction, const char* theEntry){ SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( GetActiveStudy() ); SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( aStudy->application() ); SUIT_ViewWindow *aWnd = app->activeViewManager()->getActiveView(); - UpdateView(aWnd,theAction,theEntry); + return UpdateView(aWnd,theAction,theEntry); } void UpdateView(){ @@ -635,8 +749,7 @@ namespace SMESH { } - bool Update(const Handle(SALOME_InteractiveObject)& theIO, - bool theDisplay) + bool Update(const Handle(SALOME_InteractiveObject)& theIO, bool theDisplay) { _PTR(Study) aStudy = GetActiveStudyDocument(); CORBA::Long anId = aStudy->StudyId(); diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.h b/src/SMESHGUI/SMESHGUI_VTKUtils.h index 7b74cd244..dc1ed57a9 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.h +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.h @@ -105,15 +105,17 @@ SMESHGUI_EXPORT void DisplayActor (SUIT_ViewWindow*, SMESH_Actor* theActor); SMESHGUI_EXPORT void RemoveActor (SUIT_ViewWindow*, SMESH_Actor* theActor); +SMESHGUI_EXPORT + void RemoveVisuData(int studyID); //---------------------------------------------------------------------------- enum EDisplaing {eDisplayAll, eDisplay, eDisplayOnly, eErase, eEraseAll}; SMESHGUI_EXPORT - void UpdateView (SUIT_ViewWindow*, + bool UpdateView (SUIT_ViewWindow*, EDisplaing theAction, const char* theEntry = "" ); SMESHGUI_EXPORT - void UpdateView (EDisplaing theAction, + bool UpdateView (EDisplaing theAction, const char* theEntry = ""); SMESHGUI_EXPORT -- 2.39.2