Salome HOME
Fix for the bug #130: bathymetry sign is wrong
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Module.cxx
index cb2cd1c7564d79ad315971940c7d5c00085f4b9e..2e32038f9b523cd00cde71c8f52e68f213105d05 100644 (file)
 #include "HYDROGUI_Tool.h"
 #include "HYDROGUI_UpdateFlags.h"
 #include "HYDROGUI_Shape.h"
+#include "HYDROGUI_VTKPrs.h"
+#include "HYDROGUI_VTKPrsDisplayer.h"
+#include "HYDROGUI_AbstractDisplayer.h"
+#include "HYDROGUI_PolylineOp.h"
 
 #include <HYDROData_Image.h>
 #include <HYDROData_Lambert93.h>
+#include <HYDROData_Tool.h>
 
-#include <HYDROOperations_Factory.h>
+#include <HYDROData_OperationsFactory.h>
 
 #include <GraphicsView_ViewFrame.h>
 #include <GraphicsView_ViewManager.h>
 
 #include <SALOME_Event.h>
 
+#include <SUIT_DataBrowser.h>
 #include <SUIT_Desktop.h>
 #include <SUIT_Study.h>
 #include <SUIT_ViewManager.h>
 
+#include <SVTK_ViewManager.h>
+#include <SVTK_ViewModel.h>
+#include <SVTK_Selector.h>
+
 #include <QAction>
 #include <QApplication>
 #include <QGraphicsSceneMouseEvent>
@@ -116,6 +126,7 @@ void HYDROGUI_Module::initialize( CAM_Application* theApp )
 
   myDisplayer = new HYDROGUI_Displayer( this );
   myOCCDisplayer = new HYDROGUI_OCCDisplayer( this );
+  myVTKDisplayer = new HYDROGUI_VTKPrsDisplayer( this );
 }
 
 bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy )
@@ -139,6 +150,9 @@ bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy )
 
   updateCommandsStatus();
 
+  connect( anApp, SIGNAL( operationFinished( const QString&, const QString&, const QStringList& ) ), 
+           this, SLOT( onExternalOperationFinished( const QString&, const QString&, const QStringList& ) ) );
+
   return aRes;
 }
 
@@ -161,6 +175,9 @@ bool HYDROGUI_Module::deactivateModule( SUIT_Study* theStudy )
 
   getApp()->setEditEnabled( true ); // show SalomeApp copy/paste actions
 
+  disconnect( getApp(), SIGNAL( operationFinished( const QString&, const QString&, const QStringList& ) ), 
+              this, SLOT( onExternalOperationFinished( const QString&, const QString&, const QStringList& ) ) );
+
   return LightApp_Module::deactivateModule( theStudy );
 }
 
@@ -185,10 +202,11 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
 {
   HYDROGUI_DataModel* aModel = getDataModel();
 
-  bool anIsObjectBrowser = theClient == "ObjectBrowser";
+  bool anIsObjectBrowser = theClient == getApp()->objectBrowser()->popupClientType();
   bool anIsGraphicsView = theClient == GraphicsView_Viewer::Type();
   bool anIsOCCView = theClient == OCCViewer_Viewer::Type();
-  if( !anIsObjectBrowser && !anIsGraphicsView && !anIsOCCView )
+  bool anIsVTKView = theClient == SVTK_Viewer::Type();
+  if( !anIsObjectBrowser && !anIsGraphicsView && !anIsOCCView && !anIsVTKView )
     return;
 
   size_t anActiveViewId = HYDROGUI_Tool::GetActiveViewId( this );
@@ -199,21 +217,32 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
 
   bool anIsImage = false;
   bool anIsImportedImage = false;
-  bool anIsCompositeImage = false;
+  bool anIsImageHasRefs = false;
   bool anIsFusedImage = false;
   bool anIsCutImage = false;
   bool anIsSplittedImage = false;
   bool anIsMustBeUpdatedImage = false;
   bool anIsPolyline = false;
+  bool anIsBathymetry = false;
   bool anIsCalculation = false;
-  bool anIsZone = false;
+  bool anIsImmersibleZone = false;
   bool anIsVisualState = false;
+  bool anIsRegion = false;
+  bool anIsZone = false;
+  bool anIsObstacle = false;
+  bool anIsGeomObject = false;
+
+  // check the selected GEOM objects
+  if ( !HYDROGUI_Tool::GetSelectedGeomObjects( this ).isEmpty() ) {
+    theMenu->addAction( action( ImportGeomObjectId ) );
+    theMenu->addSeparator();
+  }
 
   // check the selected data model objects
   HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( this );
   for( Standard_Integer anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ )
   {
-    Handle(HYDROData_Object) anObject = aSeq.Value( anIndex );
+    Handle(HYDROData_Entity) anObject = aSeq.Value( anIndex );
     if( !anObject.IsNull() )
     {
       anIsSelectedDataObjects = true;
@@ -228,9 +257,9 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         Handle(HYDROData_Image) anImage = Handle(HYDROData_Image)::DownCast( anObject );
         if( !anImage.IsNull() )
         {
-          anIsImportedImage = anImage->HasTrsfPoints() && !anImage->IsSelfSplitted();
-          anIsCompositeImage = anImage->NbReferences() > 0;
-          if( HYDROOperations_Factory* aFactory = HYDROOperations_Factory::Factory() )
+          anIsImportedImage = anImage->HasLocalPoints() && !anImage->IsSelfSplitted();
+          anIsImageHasRefs = anImage->HasReferences();
+          if( HYDROData_OperationsFactory* aFactory = HYDROData_OperationsFactory::Factory() )
           {
             if( ImageComposer_Operator* anOperator = aFactory->Operator( anImage ) )
             {
@@ -243,18 +272,31 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
                 anIsSplittedImage = true;
             }
           }
-          anIsMustBeUpdatedImage = anImage->MustBeUpdated();
+          if ( anImage->IsMustBeUpdated() )
+          {
+            anIsMustBeUpdatedImage = true;
+          }
         }
       }
       else if( anObject->GetKind() == KIND_POLYLINE )
         anIsPolyline = true;
       else if( anObject->GetKind() == KIND_CALCULATION )
         anIsCalculation = true;
-      else if( anObject->GetKind() == KIND_ZONE )
-        anIsZone = true;
+      else if( anObject->GetKind() == KIND_IMMERSIBLE_ZONE )
+        anIsImmersibleZone = true;
       else if( anObject->GetKind() == KIND_VISUAL_STATE )
         anIsVisualState = true;
+      else if( anObject->GetKind() == KIND_REGION )
+        anIsRegion = true;
+      else if( anObject->GetKind() == KIND_ZONE )
+        anIsZone = true;
+      else if( anObject->GetKind() == KIND_BATHYMETRY )
+        anIsBathymetry = true;
+      else if( anObject->GetKind() == KIND_OBSTACLE )
+        anIsObstacle = true;
     }
+
+    anIsGeomObject = HYDROData_Tool::IsGeometryObject( anObject );
   }
 
   // check the selected partitions
@@ -280,85 +322,112 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         case KIND_CALCULATION:
           theMenu->addAction( action( CreateCalculationId ) );
           break;
-        case KIND_ZONE:
-          theMenu->addAction( action( CreateZoneId ) );
+        case KIND_IMMERSIBLE_ZONE:
+          theMenu->addAction( action( CreateImmersibleZoneId ) );
+          break;
+        case KIND_OBSTACLE:
+          theMenu->addAction( action( ImportObstacleFromFileId ) );
+          theMenu->addAction( action( CreateBoxId ) );
+          theMenu->addAction( action( CreateCylinderId ) );
           break;
       }
       theMenu->addSeparator();
     }
   }
 
-  if( anIsSelectedDataObjects && anIsMustBeUpdatedImage )
+  if( anIsSelectedDataObjects )
   {
-    theMenu->addAction( action( UpdateImageId ) );
-    theMenu->addSeparator();
-  }
+    if ( anIsMustBeUpdatedImage )
+    {
+      theMenu->addAction( action( UpdateImageId ) );
+      theMenu->addSeparator();
+    }
 
-  if( anIsSelectedDataObjects && aSeq.Length() == 1 )
-  {
-    if( anIsImage )
+    if( aSeq.Length() == 1 )
     {
-      if( anIsImportedImage )
-        theMenu->addAction( action( EditImportedImageId ) );
-      else if( anIsCompositeImage )
+      if( anIsImage )
       {
-        if( anIsFusedImage )
-          theMenu->addAction( action( EditFusedImageId ) );
-        else if( anIsCutImage )
-          theMenu->addAction( action( EditCutImageId ) );
-        else if( anIsSplittedImage )
-          theMenu->addAction( action( EditSplittedImageId ) );
-      }
+        if( anIsImportedImage )
+          theMenu->addAction( action( EditImportedImageId ) );
+        else if( anIsImageHasRefs )
+        {
+          if( anIsFusedImage )
+            theMenu->addAction( action( EditFusedImageId ) );
+          else if( anIsCutImage )
+            theMenu->addAction( action( EditCutImageId ) );
+          else if( anIsSplittedImage )
+            theMenu->addAction( action( EditSplittedImageId ) );
+        }
 
-      theMenu->addAction( action( ObserveImageId ) );
-      theMenu->addAction( action( ExportImageId ) );
-      theMenu->addSeparator();
+        theMenu->addAction( action( ObserveImageId ) );
+        theMenu->addAction( action( ExportImageId ) );
+        theMenu->addSeparator();
 
-      theMenu->addAction( action( FuseImagesId ) );
-      theMenu->addAction( action( CutImagesId ) );
-      theMenu->addAction( action( SplitImageId ) );
-      theMenu->addSeparator();
-    }
-    else if( anIsPolyline )
-    {
-      theMenu->addAction( action( EditPolylineId ) );
-      theMenu->addSeparator();
-    }
-    else if( anIsCalculation )
-    {
-      theMenu->addAction( action( EditCalculationId ) );
-      theMenu->addSeparator();
-    }
-    else if( anIsZone )
-    {
-      theMenu->addAction( action( EditZoneId ) );
-      theMenu->addSeparator();
-    }
-    else if( anIsVisualState && anIsObjectBrowser )
-    {
-      theMenu->addAction( action( SaveVisualStateId ) );
-      theMenu->addAction( action( LoadVisualStateId ) );
-      theMenu->addSeparator();
+        if( anIsImageHasRefs )
+        {
+          theMenu->addAction( action( RemoveImageRefsId ) );
+          theMenu->addSeparator();
+        }
+
+        theMenu->addAction( action( FuseImagesId ) );
+        theMenu->addAction( action( CutImagesId ) );
+        theMenu->addAction( action( SplitImageId ) );
+        theMenu->addSeparator();
+      }
+      else if( anIsPolyline )
+      {
+        theMenu->addAction( action( EditPolylineId ) );
+        theMenu->addSeparator();
+      }
+      else if( anIsCalculation )
+      {
+        theMenu->addAction( action( EditCalculationId ) );
+        theMenu->addAction( action( ExportCalculationId ) );
+        theMenu->addSeparator();
+      }
+      else if( anIsImmersibleZone )
+      {
+        theMenu->addAction( action( EditImmersibleZoneId ) );
+        theMenu->addSeparator();
+      }
+      else if( anIsVisualState && anIsObjectBrowser )
+      {
+        theMenu->addAction( action( SaveVisualStateId ) );
+        theMenu->addAction( action( LoadVisualStateId ) );
+        theMenu->addSeparator();
+      }
+
+      // Add set color action for geometrical objects
+      if ( anIsGeomObject )
+      {
+        theMenu->addAction( action( SetColorId ) );
+        theMenu->addSeparator();
+      }
     }
-  }
 
-  if( anIsSelectedDataObjects )
-  {
     theMenu->addAction( action( DeleteId ) );
     theMenu->addSeparator();
+
+    if( anIsImage || anIsPolyline || anIsImmersibleZone || anIsZone || anIsRegion || anIsBathymetry || anIsObstacle )
+    {
+      if( anIsHiddenInSelection )
+        theMenu->addAction( action( ShowId ) );
+      theMenu->addAction( action( ShowOnlyId ) );
+      if( anIsVisibleInSelection )
+        theMenu->addAction( action( HideId ) );
+      theMenu->addSeparator();
+    }
   }
 
-  if( anIsSelectedDataObjects && ( anIsImage || anIsPolyline || anIsZone ) )
+  if ( anIsOCCView )
   {
-    if( anIsHiddenInSelection )
-      theMenu->addAction( action( ShowId ) );
-    theMenu->addAction( action( ShowOnlyId ) );
-    if( anIsVisibleInSelection )
-      theMenu->addAction( action( HideId ) );
-    theMenu->addSeparator();
+    SUIT_Operation* anOp = application()->activeStudy()->activeOperation();
+    HYDROGUI_PolylineOp* aPolylineOp = dynamic_cast<HYDROGUI_PolylineOp*>( anOp );
+    if ( aPolylineOp && aPolylineOp->deleteEnabled() )
+      theMenu->addAction( action( DeleteId ) );
   }
 
-  if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView )
+  if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView || anIsVTKView )
   {
     theMenu->addAction( action( ShowAllId ) );
     theMenu->addAction( action( HideAllId ) );
@@ -380,13 +449,15 @@ void HYDROGUI_Module::update( const int flags )
   // store selected objects
   QStringList aSelectedEntries = storeSelection();
 
+  bool aDoFitAll = flags & UF_FitAll;
   if( ( flags & UF_Viewer ) )
-    updateGV( flags & UF_GV_Init,
-              flags & UF_GV_Forced );
+    updateViewer( getDisplayer(), flags & UF_GV_Init, flags & UF_GV_Forced, aDoFitAll ); 
 
   if( ( flags & UF_OCCViewer ) )
-    updateOCCViewer( flags & UF_OCC_Init,
-                     flags & UF_OCC_Forced );
+    updateViewer( getOCCDisplayer(), flags & UF_OCC_Init, flags & UF_OCC_Forced, aDoFitAll ); 
+
+  if( ( flags & UF_VTKViewer ) )
+    updateViewer( getVTKDisplayer(), flags & UF_VTK_Init, flags & UF_VTK_Forced, aDoFitAll ); 
 
   if( ( flags & UF_Model ) && getDataModel() && getApp() )
   {
@@ -396,13 +467,13 @@ void HYDROGUI_Module::update( const int flags )
     // the selection in the object browser.
     // Note: processEvents() should be called after updateGV(),
     // otherwise the application crashes from time to time.
-    qApp->processEvents(); 
+    //RKV: qApp->processEvents(); 
     getApp()->updateObjectBrowser( true );
   }
 
   // Object browser is currently updated by using UF_Model flag
-  //if( ( flags & UF_ObjBrowser ) && getApp() )
-  //  getApp()->updateObjectBrowser( true );
+  if( ( flags & UF_ObjBrowser ) && ((flags & UF_Model) == 0) && getApp() )
+    getApp()->updateObjectBrowser( true );
 
   if( ( flags & UF_Controls ) && getApp() )
     getApp()->updateActions();
@@ -446,6 +517,20 @@ HYDROGUI_OCCDisplayer* HYDROGUI_Module::getOCCDisplayer() const
   return myOCCDisplayer;
 }
 
+HYDROGUI_VTKPrsDisplayer* HYDROGUI_Module::getVTKDisplayer() const
+{
+  return myVTKDisplayer;
+}
+
+SUIT_ViewManager* HYDROGUI_Module::getViewManager( const int theId ) const
+{
+  if( myViewManagerMap.contains( theId ) )
+  {
+    return myViewManagerMap[ theId ].first;
+  }
+  return NULL;
+}
+
 GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const
 {
   if( myViewManagerMap.contains( theId ) )
@@ -472,6 +557,19 @@ OCCViewer_Viewer* HYDROGUI_Module::getOCCViewer( const int theId ) const
   return NULL;
 }
 
+SVTK_Viewer* HYDROGUI_Module::getVTKViewer( const int theId ) const
+{
+  if( myViewManagerMap.contains( theId ) )
+  {
+    ViewManagerInfo anInfo = myViewManagerMap[ theId ];
+    SVTK_ViewManager* aViewManager =
+      ::qobject_cast<SVTK_ViewManager*>( anInfo.first );
+    if( aViewManager )
+      return dynamic_cast<SVTK_Viewer*>( aViewManager->getViewModel() );
+  }
+  return NULL;
+}
+
 int HYDROGUI_Module::getViewManagerId( SUIT_ViewManager* theViewManager )
 {
   ViewManagerMapIterator anIter( myViewManagerMap );
@@ -508,7 +606,7 @@ void HYDROGUI_Module::setViewManagerRole( SUIT_ViewManager* theViewManager,
 }
 
 bool HYDROGUI_Module::isObjectVisible( const int theViewId,
-                                       const Handle(HYDROData_Object)& theObject ) const
+                                       const Handle(HYDROData_Entity)& theObject ) const
 {
   if( theObject.IsNull() )
     return false;
@@ -528,7 +626,7 @@ bool HYDROGUI_Module::isObjectVisible( const int theViewId,
 }
 
 void HYDROGUI_Module::setObjectVisible( const int theViewId,
-                                        const Handle(HYDROData_Object)& theObject,
+                                        const Handle(HYDROData_Entity)& theObject,
                                         const bool theState )
 {
   if( !theObject.IsNull() )
@@ -539,8 +637,9 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId,
   }
 }
 
+/////////////////// OCC SHAPES PROCESSING
 HYDROGUI_Shape* HYDROGUI_Module::getObjectShape( const int                       theViewId,
-                                                 const Handle(HYDROData_Object)& theObject ) const
+                                                 const Handle(HYDROData_Entity)& theObject ) const
 {
   HYDROGUI_Shape* aResShape = NULL;
   if( theObject.IsNull() )
@@ -563,7 +662,7 @@ HYDROGUI_Shape* HYDROGUI_Module::getObjectShape( const int
 }
 
 void HYDROGUI_Module::setObjectShape( const int                       theViewId,
-                                      const Handle(HYDROData_Object)& theObject,
+                                      const Handle(HYDROData_Entity)& theObject,
                                       HYDROGUI_Shape*                 theShape )
 {
   if( theObject.IsNull() )
@@ -574,16 +673,18 @@ void HYDROGUI_Module::setObjectShape( const int                       theViewId,
 }
 
 void HYDROGUI_Module::removeObjectShape( const int                       theViewId,
-                                         const Handle(HYDROData_Object)& theObject )
+                                         const Handle(HYDROData_Entity)& theObject )
 {
   if ( !myShapesMap.contains( theViewId ) )
     return;
 
   ListOfShapes& aViewShapes = myShapesMap[ theViewId ];
+  Handle(HYDROData_Entity) anObject;
   for ( int i = 0; i < aViewShapes.length(); )
   {
     HYDROGUI_Shape* aShape = aViewShapes.at( i );
-    if ( aShape && IsEqual( aShape->getObject(), theObject ) )
+    anObject = aShape->getObject();
+    if ( aShape && (!anObject.IsNull()) && IsEqual( anObject, theObject ) )
     {
       delete aShape;
       aViewShapes.removeAt( i );
@@ -609,6 +710,126 @@ void HYDROGUI_Module::removeViewShapes( const int theViewId )
 
   myShapesMap.remove( theViewId );
 }
+/////////////////// END OF OCC SHAPES PROCESSING
+
+/////////////////// VTKPrs PROCESSING
+HYDROGUI_VTKPrs* HYDROGUI_Module::getObjectVTKPrs( const int                       theViewId,
+                                                 const Handle(HYDROData_Entity)& theObject ) const
+{
+  HYDROGUI_VTKPrs* aResShape = NULL;
+  if( theObject.IsNull() )
+    return aResShape;
+
+  if ( myVTKPrsMap.contains( theViewId ) )
+  {
+    const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId );
+    foreach ( HYDROGUI_VTKPrs* aShape, aViewShapes )
+    {
+      if ( !aShape || !IsEqual( aShape->getObject(), theObject ) )
+        continue;
+
+      aResShape = aShape;
+      break;
+    }
+  }
+
+  return aResShape;
+}
+
+void HYDROGUI_Module::setObjectVTKPrs( const int                       theViewId,
+                                       const Handle(HYDROData_Entity)& theObject,
+                                       HYDROGUI_VTKPrs*                 theShape )
+{
+  if( theObject.IsNull() )
+    return;
+
+  // Compute the new global Z range from the added presentation and the old global Z range.
+  double* aGlobalRange = getVTKDisplayer()->GetZRange( theViewId );
+  double* aRange = theShape->getInternalZRange();
+  bool anIsUpdate = false;
+  if ( aRange[0] < aGlobalRange[0] )
+  {
+    aGlobalRange[0] = aRange[0];
+    anIsUpdate = true;
+  }
+  if ( aRange[1] > aGlobalRange[1] )
+  {
+    aGlobalRange[1] = aRange[1];
+    anIsUpdate = true;
+  }
+
+  //if ( anIsUpdate )
+  //{
+    updateVTKZRange( theViewId, aGlobalRange );
+  //}
+
+  ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ];
+  aViewShapes.append( theShape );
+}
+
+void HYDROGUI_Module::removeObjectVTKPrs( const int                       theViewId,
+                                          const Handle(HYDROData_Entity)& theObject )
+{
+  if ( !myVTKPrsMap.contains( theViewId ) )
+    return;
+
+  ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ];
+  Handle(HYDROData_Entity) anObject;
+  for ( int i = 0; i < aViewShapes.length(); )
+  {
+    HYDROGUI_VTKPrs* aShape = aViewShapes.at( i );
+    anObject = aShape->getObject();
+    if ( aShape && (!anObject.IsNull()) && IsEqual( anObject, theObject ) )
+    {
+      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::removeViewVTKPrs( const int theViewId )
+{
+  if ( !myVTKPrsMap.contains( theViewId ) )
+    return;
+
+  const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId );
+  for ( int i = 0, n = aViewShapes.length(); i < n; ++i )
+  {
+    HYDROGUI_VTKPrs* aShape = aViewShapes.at( i );
+    if ( aShape )
+      delete aShape;
+  }
+
+  myVTKPrsMap.remove( theViewId );
+}
+
+void HYDROGUI_Module::updateVTKZRange( const int theViewId, double theRange[] )
+{
+  if ( myVTKPrsMap.contains( theViewId ) )
+  {
+    // For the given viewer id update all VTK presentations ...
+    const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId );
+    HYDROGUI_VTKPrs* aShape;
+    for ( int i = 0, n = aViewShapes.length(); i < n; ++i )
+    {
+      aShape = aViewShapes.at( i );
+      if ( aShape )
+      {
+        aShape->setZRange( theRange );
+      }
+    }
+  }
+  // ... and update the global color legend scalar bar.
+  getVTKDisplayer()->SetZRange( theViewId, theRange );
+}
+/////////////////// END OF VTKPrs PROCESSING
 
 CAM_DataModel* HYDROGUI_Module::createDataModel()
 {
@@ -641,7 +862,7 @@ void HYDROGUI_Module::customEvent( QEvent* e )
           //aViewPort->setViewLabelPosition( GraphicsView_ViewPort::VLP_BottomLeft, true );
         }
 
-        if( aRole != VMR_TransformImage )
+        if( aRole != VMR_TransformImage && aRole != VMR_ReferenceImage )
           update( UF_Viewer );
 
         aViewer->activateTransform( GraphicsView_Viewer::FitAll );
@@ -705,6 +926,16 @@ void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager )
         removeViewShapes( (size_t)anOCCViewer );
     }
 
+    if ( getVTKDisplayer()->IsApplicable( theViewManager ) )
+    {
+      SVTK_Viewer* aVTKViewer = getVTKViewer( anId );
+      if ( aVTKViewer )
+      {
+        getVTKDisplayer()->DeleteScalarBar( anId );
+        removeViewShapes( (size_t)aVTKViewer );
+      }
+    }
+
     myViewManagerMap.remove( anId );
   }
 }
@@ -779,57 +1010,31 @@ void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent )
   */
 }
 
-void HYDROGUI_Module::updateGV( const bool theIsInit,
-                                const bool theIsForced )
+void HYDROGUI_Module::updateViewer( HYDROGUI_AbstractDisplayer* theDisplayer, 
+                                    const bool theIsInit, 
+                                    const bool theIsForced, 
+                                    const bool theDoFitAll )
 {
-  if( !getDisplayer() )
-    return;
-
   QList<int> aViewManagerIdList;
 
   // currently, all views are updated
   ViewManagerMapIterator anIter( myViewManagerMap );
   while( anIter.hasNext() )
   { 
-    GraphicsView_ViewManager* aViewManager =
-      dynamic_cast<GraphicsView_ViewManager*>( anIter.next().value().first );
-    if ( !aViewManager )
-      continue;
+    SUIT_ViewManager* aViewManager = anIter.next().value().first;
 
-    int anId = anIter.key();
-    aViewManagerIdList.append( anId );
+    if ( theDisplayer->IsApplicable( aViewManager ) )
+    {
+      int anId = anIter.key();
+      aViewManagerIdList.append( anId );
+    }
   }
 
   QListIterator<int> anIdIter( aViewManagerIdList );
   while( anIdIter.hasNext() )
-    getDisplayer()->UpdateAll( anIdIter.next(), theIsInit, theIsForced );
-}
-
-void HYDROGUI_Module::updateOCCViewer( const bool theIsInit,
-                                       const bool theIsForced )
-{
-  HYDROGUI_OCCDisplayer* anOCCDisplayer = getOCCDisplayer();
-  if( !anOCCDisplayer )
-    return;
-
-  QList<int> aViewManagerIdList;
-
-  // currently, all views are updated
-  ViewManagerMapIterator anIter( myViewManagerMap );
-  while( anIter.hasNext() )
-  { 
-    OCCViewer_ViewManager* aViewManager =
-      ::qobject_cast<OCCViewer_ViewManager*>( anIter.next().value().first );
-    if ( !aViewManager )
-      continue;
-
-    int anId = anIter.key();
-    aViewManagerIdList.append( anId );
+  {
+    theDisplayer->UpdateAll( anIdIter.next(), theIsInit, theIsForced, theDoFitAll );
   }
-
-  QListIterator<int> anIdIter( aViewManagerIdList );
-  while( anIdIter.hasNext() )
-    anOCCDisplayer->UpdateAll( anIdIter.next(), theIsInit, theIsForced );
 }
 
 void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager )
@@ -855,6 +1060,7 @@ void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager )
   {
     SUIT_Selector* aSelector = *anIter;
     if( aSelector && ( !dynamic_cast<HYDROGUI_GVSelector*>( aSelector ) &&
+                       !dynamic_cast<SVTK_Selector*>( aSelector ) &&
                        !dynamic_cast<HYDROGUI_OCCSelector*>( aSelector ) ) )
       aSelector->setEnabled( false );
   }