+ 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 Remove/update actors while module activation
+ * \param [in] wnd - window
+ *
+ * At module activation, groups and sub-meshes can be removed on engine side due
+ * to modification of meshed geometry, while their actors can remain.
+ * Here we remove/update SMESH_Actor's of changed objects. State (emptiness) of objects
+ * is defined by their icons in the Object Browser
+ */
+ //================================================================================
+
+ void UpdateActorsAfterUpdateStudy( SUIT_ViewWindow* theWindow )
+ {
+ const char* emptyIcon = "ICON_SMESH_TREE_MESH_WARN";
+ _PTR(Study) aStudy = SMESH::getStudy();
+
+ if ( SVTK_ViewWindow* aViewWindow = GetVtkViewWindow( theWindow ))
+ {
+ vtkRenderer *aRenderer = aViewWindow->getRenderer();
+ VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
+ vtkActorCollection *aCollection = aCopy.GetActors();
+ aCollection->InitTraversal();
+ while ( vtkActor *actor = aCollection->GetNextActor() ) {
+ if ( SMESH_Actor *smeshActor = dynamic_cast<SMESH_Actor*>( actor ))
+ {
+ if ( !smeshActor->hasIO() )
+ continue;
+ Handle(SALOME_InteractiveObject) io = smeshActor->getIO();
+ if ( !io->hasEntry() )
+ continue;
+ _PTR(SObject) so = aStudy->FindObjectID( io->getEntry() );
+ if ( !so )
+ continue; // seems impossible
+
+ CORBA::Object_var obj = SMESH::SObjectToObject( so );
+ if ( CORBA::is_nil( obj )) // removed object
+ {
+ RemoveActor( theWindow, smeshActor );
+ continue;
+ }
+
+ bool toShow = smeshActor->GetVisibility();
+ _PTR(GenericAttribute) attr;
+ if ( toShow && so->FindAttribute( attr, "AttributePixMap" )) // check emptiness
+ {
+ _PTR(AttributePixMap) pixMap = attr;
+ toShow = ( pixMap->GetPixMap() != emptyIcon );
+ }
+ //smeshActor->Update();
+ UpdateView( theWindow, toShow ? eDisplay : eErase, io->getEntry() );
+ }
+ }
+ }
+ return;
+ }
+
+ //================================================================================
+ /*!
+ * \brief Remove/update actors while module activation
+ *
+ * At module activation, groups and sub-meshes can be removed on engine side due
+ * to modification of meshed geometry, while their actors can remain.
+ * Here we remove/update SMESH_Actor's of changed objects. State (emptiness) of objects
+ * is defined by their icons in the Object Browser
+ */
+ //================================================================================
+
+ void UpdateActorsAfterUpdateStudy()
+ {
+ SUIT_Study* study = SMESH::GetActiveStudy();
+ if ( SUIT_Desktop* desk = study->application()->desktop() )
+ {
+ QList<SUIT_ViewWindow*> wndList = desk->windows();
+ SUIT_ViewWindow* wnd;
+ foreach ( wnd, wndList )
+ SMESH::UpdateActorsAfterUpdateStudy(wnd);
+ }
+ }
+
+ //================================================================================
+ /*!
+ * \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
+ */
+ //================================================================================