Salome HOME
PAL16631 (SALOME crash after a mesh computation failed due to lack of memory)
authoreap <eap@opencascade.com>
Mon, 24 Sep 2007 13:01:13 +0000 (13:01 +0000)
committereap <eap@opencascade.com>
Mon, 24 Sep 2007 13:01:13 +0000 (13:01 +0000)
-  void Update(const Handle(SALOME_InteractiveObject)& theIO,
+  bool Update(const Handle(SALOME_InteractiveObject)& theIO,

src/SMESHGUI/SMESHGUI_VTKUtils.cxx
src/SMESHGUI/SMESHGUI_VTKUtils.h

index 4b8ec47be402f7255d1faa3ee221cacc5dc175be..3685b46d6bdc54eb5c352ce2c464a5dfefcf7fc3 100644 (file)
@@ -247,18 +247,31 @@ namespace SMESH {
     }
 
     if ( objModified ) {
-      // PAL16631. Mesurements showed that to show aVisualObj in shading mode,
+      // PAL16631. Mesurements showed that to show aVisualObj in SHADING(default) mode,
       // ~10 times more memory is used than it occupies.
       // Warn the user if there is less free memory than 30 sizes of a grid
+      // TODO: estimate memory usage in other modes and take current mode into account
       int freeMB = SMDS_Mesh::CheckMemory(true);
       int usedMB = aVisualObj->GetUnstructuredGrid()->GetActualMemorySize() / 1024;
       if ( freeMB > 0 && usedMB * 30 > freeMB ) {
-        int continu = SUIT_MessageBox::warn2
-          (SMESHGUI::desktop(),
-           QObject::tr("SMESH_WRN_WARNING"),
-           QObject::tr("SMESH_CONTINUE_MESH_VISUALIZATION"),
-           QObject::tr("SMESH_BUT_YES"),  QObject::tr("SMESH_BUT_NO"),
-           1, 0, 1);
+#ifdef _DEBUG_
+        cout << "SMESHGUI_VTKUtils::GetVisualObj(), freeMB=" << freeMB
+             << ", usedMB=" << usedMB<< endl;
+#endif
+        int continu = 0;
+        if ( usedMB * 10 > freeMB )
+          // even dont try to show
+          SUIT_MessageBox::warn1 (SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"),
+                                  QObject::tr("SMESH_NO_MESH_VISUALIZATION"),
+                                  QObject::tr("SMESH_BUT_OK"));
+        else
+          // there is a chance to succeed
+          continu = SUIT_MessageBox::warn2
+            (SMESHGUI::desktop(),
+             QObject::tr("SMESH_WRN_WARNING"),
+             QObject::tr("SMESH_CONTINUE_MESH_VISUALIZATION"),
+             QObject::tr("SMESH_BUT_YES"),  QObject::tr("SMESH_BUT_NO"),
+             1, 0, 1);
         if ( !continu ) {
           // remove the corresponding actors from all views
           RemoveVisualObjectWithActors( theEntry );
@@ -350,10 +363,10 @@ namespace SMESH {
         wnd->Repaint(false);
       }
       catch (...) {
-        OnVisuException();
 #ifdef _DEBUG_
         cout << "Exception in SMESHGUI_VTKUtils::RepaintCurrentView()" << endl;
 #endif
+        OnVisuException();
       }
     }
   }
@@ -368,10 +381,10 @@ namespace SMESH {
       theWindow->Repaint();
     }
     catch (...) {
-      OnVisuException();
 #ifdef _DEBUG_
         cout << "Exception in SMESHGUI_VTKUtils::RepaintViewWindow(SVTK_ViewWindow)" << endl;
 #endif
+      OnVisuException();
     }
   }
 
@@ -385,10 +398,10 @@ namespace SMESH {
       theWindow->Repaint();
     }
     catch (...) {
-      OnVisuException();
 #ifdef _DEBUG_
         cout << "Exception in SMESHGUI_VTKUtils::RenderViewWindow(SVTK_ViewWindow)" << endl;
 #endif
+      OnVisuException();
     }
   }
 
@@ -402,10 +415,10 @@ namespace SMESH {
         wnd->Repaint();
       }
       catch (...) {
-        OnVisuException();
 #ifdef _DEBUG_
         cout << "Exception in SMESHGUI_VTKUtils::FitAll()" << endl;
 #endif
+        OnVisuException();
       }
     }
   }
@@ -487,10 +500,10 @@ namespace SMESH {
         vtkWnd->Repaint();
       }
       catch (...) {
-        OnVisuException();
 #ifdef _DEBUG_
         cout << "Exception in SMESHGUI_VTKUtils::DisplayActor()" << endl;
 #endif
+        OnVisuException();
       }
     }
   }
@@ -588,14 +601,16 @@ namespace SMESH {
        while(vtkActor *anAct = aCollection->GetNextActor()){
          if(SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)){
            if(anActor->hasIO())
-             Update(anActor->getIO(),anActor->GetVisibility());
+             if (!Update(anActor->getIO(),anActor->GetVisibility()))
+                break; // avoid multiple warinings if visu failed
          }
        }
       }else{
        SALOME_ListIteratorOfListIO anIter( selected );
        for(; anIter.More(); anIter.Next()){
          Handle(SALOME_InteractiveObject) anIO = anIter.Value();
-         Update(anIO,true);
+         if ( !Update(anIO,true) )
+            break; // avoid multiple warinings if visu failed
        }
       }
       RepaintCurrentView();
@@ -603,17 +618,17 @@ namespace SMESH {
   }
 
 
-  void Update(const Handle(SALOME_InteractiveObject)& theIO,
+  bool Update(const Handle(SALOME_InteractiveObject)& theIO,
              bool theDisplay)
   {
     _PTR(Study) aStudy = GetActiveStudyDocument();
     CORBA::Long anId = aStudy->StudyId();
     if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId,theIO->getEntry())) {
-      // if( aVisualObj )
-      //    aVisualObj->Update(); -> PAL16631, already done in GetVisualObj()
       if ( theDisplay )
         UpdateView(SMESH::eDisplay,theIO->getEntry());
+      return true;
     }
+    return false;
   }
 
 
index e1ecbc89734233001d4c5316cb2d23b4844983d2..0e5f7dad74e4b3834a8a2e1684cb5b06d0af2394 100644 (file)
@@ -101,7 +101,7 @@ namespace SMESH {
 
   void UpdateView();
 
-  void Update(const Handle(SALOME_InteractiveObject)& theIO,
+  bool Update(const Handle(SALOME_InteractiveObject)& theIO,
              bool theDisplay);