+ //=============================================================================
+ /*!
+ * \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 )
+ {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+ ( SUIT_Session::session()->activeApplication() );
+ SUIT_ViewManager* aViewManager =
+ app ? app->getViewManager(SVTK_Viewer::Type(), true) : 0;
+ if ( aViewManager ) {
+ 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);
+ actor->Delete();
+ }
+ }
+ 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()) {
+ // 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(aKey);
+ }
+ }
+ //================================================================================
+ /*!
+ * \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);
+ anIter->second->GetUnstructuredGrid()->SetPoints(0);
+ }
+ VISUAL_OBJ_CONT.clear();
+ }