]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Fix for the bug #316: deleted bathymetry is shown in VTK viewer.
authorrkv <rkv@opencascade.com>
Thu, 9 Jan 2014 06:59:15 +0000 (06:59 +0000)
committerrkv <rkv@opencascade.com>
Thu, 9 Jan 2014 06:59:15 +0000 (06:59 +0000)
src/HYDROGUI/HYDROGUI_Module.cxx
src/HYDROGUI/HYDROGUI_Module.h
src/HYDROGUI/HYDROGUI_VTKPrsDisplayer.cxx

index ae7dad74097e96dc76ce2a207e81a399cdc7283a..c409cdbe5a2738bdd14e235df7d22d7e9d5219ee 100644 (file)
@@ -1049,6 +1049,35 @@ void HYDROGUI_Module::setObjectVTKPrs( const int                       theViewId
   aViewShapes.append( theShape );
 }
 
+void HYDROGUI_Module::removeObjectVTKPrs( const int      theViewId,
+                                          const QString& theEntry )
+{
+  if ( !myVTKPrsMap.contains( theViewId ) )
+    return;
+
+  ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ];
+  Handle(HYDROData_Entity) anObject;
+  QString anEntryRef;
+  for ( int i = 0; i < aViewShapes.length(); )
+  {
+    HYDROGUI_VTKPrs* aShape = aViewShapes.at( i );
+    anObject = aShape->getObject();
+    anEntryRef = HYDROGUI_DataObject::dataObjectEntry( anObject );
+    if ( aShape && (!anObject.IsNull()) && ( anEntryRef == theEntry ) )
+    {
+      delete aShape;
+      aViewShapes.removeAt( i );
+      continue;
+    }
+
+    ++i;
+  }
+
+  // Invalidate global Z range
+  double anInvalidRange[2] = { HYDROGUI_VTKPrs::InvalidZValue(), HYDROGUI_VTKPrs::InvalidZValue() };
+  getVTKDisplayer()->SetZRange( theViewId, anInvalidRange );
+}
+
 void HYDROGUI_Module::removeObjectVTKPrs( const int                       theViewId,
                                           const Handle(HYDROData_Entity)& theObject )
 {
index f4a87f481908b5427dc8f1ab715f6eda28f5abf4..3ffc711301123f84777553c97fc2a4be31e804a2 100644 (file)
@@ -151,6 +151,9 @@ public:
   void                            removeObjectVTKPrs( const int                      theViewId,
                                                      const Handle(HYDROData_Entity)& theObject );
 
+  void                            removeObjectVTKPrs( const int      theViewId,
+                                                      const QString& theEntry );
+
   /**
    * Update global imposed range of Z values for the given VTK viewer id
    */
index d4317fcd46887b389b71c6fd9b411d4635e2820e..b096a067269bf316943b42c05495e80ab8ce7197 100644 (file)
@@ -279,12 +279,14 @@ void HYDROGUI_VTKPrsDisplayer::Display( const HYDROData_SequenceOfObjects& theOb
 
 void HYDROGUI_VTKPrsDisplayer::purgeObjects( const int theViewerId )
 {
+  bool doEraseScalarBar = false;
+
   SVTK_Viewer* aViewer = module()->getVTKViewer( theViewerId );
   if( aViewer )
   {
     SALOME_ListIO aListIO;
     aViewer->GetVisible( aListIO );
-
+    
     HYDROGUI_VTKPrs* aPrs;
     SALOME_ListIteratorOfListIO anIter( aListIO );
     for( ; anIter.More(); anIter.Next() )
@@ -294,17 +296,47 @@ void HYDROGUI_VTKPrsDisplayer::purgeObjects( const int theViewerId )
       {
         Handle(HYDROData_Entity) anOwnerObj = 
           module()->getDataModel()->objectByEntry( aPrsObj->getEntry() );
-        if ( !anOwnerObj.IsNull() && anOwnerObj->IsRemoved() )
+        if ( anOwnerObj.IsNull() )
+        {
+          // We found an unknown IO presented in the viewer. 
+          // Remove such an orphan presentation from all the views of the viewer.
+          SUIT_ViewManager* aViewMgr = dynamic_cast<SUIT_ViewManager*>( aViewer->getViewManager() );
+          if ( aViewMgr && aViewMgr->getViewsCount() > 0 )
+          {
+            QVector<SUIT_ViewWindow*> aViews = aViewMgr->getViews();
+            foreach ( SUIT_ViewWindow* aView, aViews )
+            {
+              SVTK_ViewWindow* aVTKView = dynamic_cast<SVTK_ViewWindow*>( aView );
+              if ( aVTKView )
+              {
+                aVTKView->Erase( aPrsObj, false );
+              }
+            }
+          }
+          // Remove the object presentation from the module's cache
+          module()->removeObjectVTKPrs( (size_t)aViewer, aPrsObj->getEntry() );
+          doEraseScalarBar = true;
+        }
+        else if ( anOwnerObj->IsRemoved() )
         {
           aPrs = module()->getObjectVTKPrs( (size_t)aViewer, anOwnerObj );
           if ( aPrs )
           {
             aViewer->Erase( aPrs );
           }
+          else
+          {
+          }
           module()->removeObjectVTKPrs( (size_t)aViewer, anOwnerObj );
+          doEraseScalarBar = true;
         }
       }
     }
+
+    if ( doEraseScalarBar )
+    {
+      EraseScalarBar( theViewerId );
+    }
   }
 }