+ //=============================================================================
+ /*!
+ * \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
+ */
+ //================================================================================
+
+ void RemoveVisualObjectWithActors( const char* theEntry, bool fromAllViews )
+ {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
+ if(!app)
+ return;
+ SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
+ if(!aStudy)
+ return;
+ ViewManagerList aList;
+
+ if(fromAllViews) {
+ app->viewManagers(SVTK_Viewer::Type() , aList);
+ } else {
+ SUIT_ViewManager* aVM = app->getViewManager(SVTK_Viewer::Type(), true);
+ if(aVM)
+ aList.append(aVM);
+ }
+ bool actorRemoved = false;
+ ViewManagerList::ConstIterator it = aList.begin();
+ SUIT_ViewManager* aViewManager = 0;
+ for( ; it!=aList.end();it++) {
+ aViewManager = *it;
+ QVector<SUIT_ViewWindow*> views = aViewManager->getViews();
+ for ( int iV = 0; iV < views.count(); ++iV ) {
+ if ( SMESH_Actor* actor = FindActorByEntry( views[iV], theEntry)) {
+ if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) {
+ vtkWnd->RemoveActor(actor);
+ actorRemoved = true;
+ }
+ actor->Delete();
+ }
+ }
+ }
+
+ TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(theEntry);
+ if(anIter != VISUAL_OBJ_CONT.end()) {
+ // for unknown reason, object destructor is not called, so clear object manually
+ anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0);
+ anIter->second->GetUnstructuredGrid()->SetPoints(0);
+ }
+ VISUAL_OBJ_CONT.erase(theEntry);
+
+ if(actorRemoved)
+ aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
+ }
+ //================================================================================
+ /*!
+ * \brief Remove all VisualObjs and their actors from all views
+ */
+ //================================================================================
+
+ void RemoveAllObjectsWithActors()
+ {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+ ( 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()) {
+ QVector<SUIT_ViewWindow*> views = aViewManager->getViews();
+ for ( int iV = 0; iV < views.count(); ++iV ) {
+ if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) {
+ vtkRenderer *aRenderer = vtkWnd->getRenderer();
+ VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
+ vtkActorCollection *actors = aCopy.GetActors();
+ for (int i = 0; i < actors->GetNumberOfItems(); ++i ) {
+ // size of actors changes inside the loop
+ if (SMESH_Actor *actor = dynamic_cast<SMESH_Actor*>(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,0,0);
+ anIter->second->GetUnstructuredGrid()->SetPoints(0);
+ }
+ VISUAL_OBJ_CONT.clear();
+ }
+
+ //================================================================================
+ /*!
+ * \brief Remove all VisualObjs of a study
+ */
+ //================================================================================
+
+ void RemoveVisuData()
+ {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+ ( 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() ) {
+ QVector<SUIT_ViewWindow*> views = aViewManager->getViews();
+ for ( int iV = 0; iV < views.count(); ++iV ) {
+ if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) {
+ vtkRenderer *aRenderer = vtkWnd->getRenderer();
+ VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
+ vtkActorCollection *actors = aCopy.GetActors();
+ for (int i = 0; i < actors->GetNumberOfItems(); ++i ) {
+ // size of actors changes inside the loop
+ if(SMESH_Actor *actor = dynamic_cast<SMESH_Actor*>(actors->GetItemAsObject(i)))
+ {
+ vtkWnd->RemoveActor(actor);
+ actor->Delete();
+ }
+ }
+ }
+ }
+ }
+ }
+ TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.begin();
+ for ( ; anIter != VISUAL_OBJ_CONT.end(); ) {
+ // for unknown reason, object destructor is not called, so clear object manually
+ anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0);
+ anIter->second->GetUnstructuredGrid()->SetPoints(0);
+ VISUAL_OBJ_CONT.erase( anIter++ ); // anIter++ returns a copy of self before incrementing
+ }
+ }
+
+ //================================================================================
+ /*!
+ * \brief Notify the user on problems during visualization
+ */
+ //================================================================================
+
+ void OnVisuException()
+ {
+ try {
+ OCC_CATCH_SIGNALS;
+ // 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::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"),
+ QObject::tr("SMESH_VISU_PROBLEM"));
+ } catch (...) {
+ // no more memory at all: last resort
+ MESSAGE_BEGIN ( "SMESHGUI_VTKUtils::OnVisuException(), exception even at showing a message!!!" <<
+ std::endl << "Try to remove all visual data..." );
+ if (theVISU_MemoryReserve) {
+ delete theVISU_MemoryReserve;
+ theVISU_MemoryReserve = 0;
+ }
+ RemoveAllObjectsWithActors();
+ SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"),
+ QObject::tr("SMESH_VISU_PROBLEM_CLEAR"));
+ MESSAGE_END ( "...done" );
+ }
+ }
+ //================================================================================
+ /*!
+ * \brief Returns an updated visual object
+ */
+ //================================================================================
+
+ TVisualObjPtr GetVisualObj(const char* theEntry, bool nulData){