]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
- Bathymethries are colored now by all colors (including red etc.)
authorrkv <rkv@opencascade.com>
Fri, 22 Nov 2013 08:26:55 +0000 (08:26 +0000)
committerrkv <rkv@opencascade.com>
Fri, 22 Nov 2013 08:26:55 +0000 (08:26 +0000)
- Hide/show is fixed for bathymetries with automatic viewer opening;
- Global automatically updated scalar bar is added in VTK viewer

src/HYDROGUI/HYDROGUI_Module.cxx
src/HYDROGUI/HYDROGUI_Module.h
src/HYDROGUI/HYDROGUI_ShowHideOp.cxx
src/HYDROGUI/HYDROGUI_VTKPrs.cxx
src/HYDROGUI/HYDROGUI_VTKPrs.h
src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx
src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.h
src/HYDROGUI/HYDROGUI_VTKPrsBathymetryDriver.cxx
src/HYDROGUI/HYDROGUI_VTKPrsBathymetryDriver.h
src/HYDROGUI/HYDROGUI_VTKPrsDisplayer.cxx
src/HYDROGUI/HYDROGUI_VTKPrsDisplayer.h

index 3b45b680811bfe71cc048aab341e2d488796b888..b5cf925c011b4daf93cee3c070a3bbb994699919 100644 (file)
@@ -743,6 +743,26 @@ void HYDROGUI_Module::setObjectVTKPrs( const int                       theViewId
   if( theObject.IsNull() )
     return;
 
+  // Compute the new global Z range from the added presentation and the old global Z range.
+  double* aGlobalRange = getVTKDisplayer()->GetZRange();
+  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( aGlobalRange );
+  //}
+
   ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ];
   aViewShapes.append( theShape );
 }
@@ -768,6 +788,10 @@ void HYDROGUI_Module::removeObjectVTKPrs( const int                       theVie
 
     ++i;
   }
+
+  // Invalidate global Z range
+  double anInvalidRange[2] = { HYDROGUI_VTKPrs::InvalidZValue(), HYDROGUI_VTKPrs::InvalidZValue() };
+  getVTKDisplayer()->SetZRange( anInvalidRange );
 }
 
 void HYDROGUI_Module::removeViewVTKPrs( const int theViewId )
@@ -785,6 +809,28 @@ void HYDROGUI_Module::removeViewVTKPrs( const int theViewId )
 
   myVTKPrsMap.remove( theViewId );
 }
+
+void HYDROGUI_Module::updateVTKZRange( double theRange[] )
+{
+  // For all VTK viewers ...
+  QList<int> aViewIdList = myVTKPrsMap.keys();
+  foreach( int aViewId, aViewIdList )
+  {
+    // ... update all VTK presentations ...
+    const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( aViewId );
+    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( theRange );
+}
 /////////////////// END OF VTKPrs PROCESSING
 
 CAM_DataModel* HYDROGUI_Module::createDataModel()
index 384e5e714de7933809ae3ad24234158b589c152f..808958f64ee96844d5074ec9f93c2bc05be68000 100644 (file)
@@ -143,6 +143,10 @@ public:
   void                            removeViewVTKPrs( const int                      theViewId );
   void                            removeObjectVTKPrs( const int                      theViewId,
                                                      const Handle(HYDROData_Entity)& theObject );
+  /**
+   * Update global imposed range of Z values for VTK viewer
+   */
+  void                            updateVTKZRange( double theRange[] );
 
   QStringList                     GetGeomObjectsToImport();
 
index 755e933a3cde31fb1e543d00fb7dfd76f864a876..d06c59f26ce4c267f84d89fd05db87ba0c3d6e84 100644 (file)
@@ -80,11 +80,14 @@ void HYDROGUI_ShowHideOp::startOperation()
     }
   }
 
+  int anUpdateFlags = 0;
+  SUIT_ViewManager* aVTKMgr = 0;
+
   // for selected objects
   if( myId == ShowId || myId == ShowOnlyId || myId == HideId )
   {
     HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( module() );
-
+  
     bool aVisibility = myId == ShowId || myId == ShowOnlyId;
     Handle( HYDROData_Entity ) anObject;
     for( Standard_Integer anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ )
@@ -109,17 +112,34 @@ void HYDROGUI_ShowHideOp::startOperation()
             }
           }
         }
+        else if ( anObject->GetKind() == KIND_BATHYMETRY && aVisibility )
+        {
+          // Activate VTK viewer if show a bathymetry
+          aVTKMgr = module()->getApp()->viewManager( SVTK_Viewer::Type() );
+          if ( !aVTKMgr )
+          {
+            aVTKMgr = module()->getApp()->createViewManager( SVTK_Viewer::Type() );
+          }
+          if ( aVTKMgr )
+          {
+            module()->setObjectVisible( (size_t)aVTKMgr->getViewModel(), anObject, aVisibility );
+          }
+        }
       }
     }
   }
 
-  int anUpdateFlags = 0;
-
   if ( myId == ShowOnlyId || myId == ShowId || myId == ShowAllId )
   {
-    anUpdateFlags = UF_FitAll;
+    anUpdateFlags |= UF_FitAll;
   }
 
+  // Set VTK viewer active if show a bathymetry
+  if ( aVTKMgr )
+  {
+    anUpdateFlags |= UF_VTKViewer;
+    aVTKMgr->setShown( true );
+  }
   SUIT_ViewManager* aViewMgr = module()->getApp()->activeViewManager();
   if ( aViewMgr )
   {
index ad2fd3928f879166815b5332f1b7af0de3b2260d..671a2cdccf4192d7892f912035c246aafc4762e6 100644 (file)
@@ -23,6 +23,8 @@
 #include "HYDROGUI_VTKPrs.h"
 
 #include "HYDROGUI_DataObject.h"
+#include <HYDROData_IAltitudeObject.h>
+#include <vtkMapper.h>
 
 //=======================================================================
 // name    : HYDROGUI_VTKPrs
@@ -36,6 +38,8 @@ HYDROGUI_VTKPrs::HYDROGUI_VTKPrs( const Handle(HYDROData_Entity)& theObject )
   QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject );
   myIO = new SALOME_InteractiveObject(
     anEntry.toAscii(), QString::number( theObject->GetKind() ).toAscii(), theObject->GetName().toAscii() );
+  myZRange[0] = HYDROData_IAltitudeObject::GetInvalidAltitude();
+  myZRange[1] = HYDROData_IAltitudeObject::GetInvalidAltitude();
 }
 
 //=======================================================================
@@ -53,3 +57,18 @@ HYDROGUI_VTKPrs::~HYDROGUI_VTKPrs()
 void HYDROGUI_VTKPrs::compute()
 {
 }
+
+//=======================================================================
+// name    : setZRange
+// Purpose : Compute the presentation
+//=======================================================================
+void HYDROGUI_VTKPrs::setZRange( double theRange[] )
+{
+  myZRange[0] = theRange[0];
+  myZRange[1] = theRange[1];
+  vtkMapper* aMapper = mapper();
+  if ( aMapper )
+  {
+    mapper()->SetScalarRange( myZRange );
+  }
+}
index d679856a466197351ac1fd6aab13d177cd73fbe9..d6a8b206e7cd585a9ef3ee5bcb1cd3f20ea10d65 100644 (file)
 #define HYDROGUI_VTKPrs_H
 
 #include <HYDROData_Entity.h>
+#include <HYDROData_AltitudeObject.h>
 
 #include <SALOME_InteractiveObject.hxx>
 #include <SVTK_Prs.h>
 
+class vtkMapper;
+
 /*
   Class       : HYDROGUI_VTKPrs
   Description : Base class for all HYDRO presentation in VTK viewer
@@ -40,17 +43,37 @@ public:
 
   virtual void                     compute();
 
+  static double InvalidZValue() { return HYDROData_AltitudeObject::GetInvalidAltitude(); }
+
 public:
   Handle(HYDROData_Entity)         getObject() const { return myObject; }
   Handle(SALOME_InteractiveObject) getIO() const { return myIO; }
 
   bool                             getIsToUpdate() const { return myIsToUpdate; }
   void                             setIsToUpdate( bool theState ) { myIsToUpdate = theState; }
+  /**
+   * \brief Set the range of Z values for the color mapping.
+   */
+  virtual void                     setZRange( double theRange[] );
+  /**
+   * \brief Get the range of Z values for the color mapping.
+   */
+  virtual double*                 getZRange() { return myZRange; }
+  /**
+   * \brief Get an actual Z values range of the presented object.
+   */
+  virtual double*                 getInternalZRange() { return myInternalZRange; }
+
+protected:
+  virtual vtkMapper*               mapper() { return 0; }
+
+  double                           myInternalZRange[2]; //!< Actual Z values range of the presented object
 
 private:
   Handle(HYDROData_Entity)         myObject;
   Handle(SALOME_InteractiveObject) myIO;
   bool                             myIsToUpdate;
+  double                           myZRange[2];         //!< Imposed Z values range for colors mapping
 };
 
 #endif
index 769879de2be344ac39acb438daf4f61eab2c1dbe..381923d88e483bd101664345e9bf874b6d2e7c53 100644 (file)
 #include <vtkPointData.h>
 #include <vtkPolyDataMapper.h>
 #include <vtkVertex.h>
-#include <vtkLookupTable.h>
+#include <vtkScalarBarActor.h>
 
 #include <QString>
 
-#define NB_COLORS 32
-#define Z_MIN -100
+/*! \def Z_MAX
+    \brief Maximum Z value used in bathymetry presentation.
+
+    This value is used instead of invalid values.
+*/
 #define Z_MAX 1
-#define HUE_START 0.69 
-#define HUE_END   0.41
-#define SATURATION_START 1.0 
-#define SATURATION_END   0.4
 
 //=======================================================================
 // name    : HYDROGUI_VTKPrsBathymetry
@@ -89,7 +88,7 @@ void HYDROGUI_VTKPrsBathymetry::compute()
       vtkVertex* aVertex = vtkVertex::New();
 
       int aZ;
-      int anInvalidZ = aBathymetry->GetInvalidAltitude();
+      int anInvalidZ = InvalidZValue();
       for (int i = 0; i < aNbPoints; i++ )
       {
         anAltPnt = anAltPoints.at( i );
@@ -113,24 +112,51 @@ void HYDROGUI_VTKPrsBathymetry::compute()
       aVertexGrid->SetPoints( aPoints );
       aVertexGrid->GetPointData()->SetScalars( aZValues );
       
-      vtkLookupTable* aLut = vtkLookupTable::New();
-      aLut->SetHueRange( HUE_START, HUE_END );
-      aLut->SetSaturationRange( SATURATION_START, SATURATION_END );
-      aLut->SetTableRange( Z_MIN, Z_MAX );
-      aLut->SetValueRange( 1.0, 1.0 );
-      aLut->SetAlphaRange( 1.0, 1.0 );
-      aLut->SetNumberOfColors( NB_COLORS );
-      aLut->Build();
-
-      vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New();
-      aMapper->SetScalarRange( Z_MIN, Z_MAX );
-      aMapper->ScalarVisibilityOn();
-      aMapper->SetScalarModeToUsePointData();
-      aMapper->SetLookupTable( aLut );
-      aMapper->SetInputData( aVertexGrid );
+      //vtkLookupTable* aLut = vtkLookupTable::New();
+      //aLut->SetHueRange( HUE_START, HUE_END );
+      //aLut->SetSaturationRange( SATURATION_START, SATURATION_END );
+      //aLut->SetTableRange( Z_MIN, Z_MAX );
+      //aLut->SetValueRange( 1.0, 1.0 );
+      //aLut->SetAlphaRange( 1.0, 1.0 );
+      //aLut->SetNumberOfColors( NB_COLORS );
+      //aLut->Build();
+      
+      // Update the lookup table range if this bathymetry is out of it
+      if ( myLookupTable )
+      {
+        aZValues->GetRange( myInternalZRange );
+
+        double* aGlobalRange = myLookupTable->GetRange();
+        // If the global range is not yet initialized or the current one is out of scope then update the global
+        bool anIsUpdated;
+        if (  ValuesEquals( aGlobalRange[0], anInvalidZ ) || ( aGlobalRange[0] > myInternalZRange[0] ) )
+        {
+          aGlobalRange[0] = myInternalZRange[0];
+          anIsUpdated = true;
+        }
+
+        if (  ValuesEquals( aGlobalRange[1], anInvalidZ ) || ( aGlobalRange[1] < myInternalZRange[1] ) )
+        {
+          aGlobalRange[1] = myInternalZRange[1];
+          anIsUpdated = true;
+        }
+
+        if ( anIsUpdated )
+        {
+          myLookupTable->SetRange( aGlobalRange );
+          myLookupTable->Build();
+        }
+
+        myMapper->SetScalarRange( aGlobalRange );
+        myMapper->ScalarVisibilityOn();
+        myMapper->SetScalarModeToUsePointData();
+        myMapper->SetLookupTable( myLookupTable );
+      }
+
+      myMapper->SetInputData( aVertexGrid );
       
       SALOME_Actor* anActor = SALOME_Actor::New();
-      anActor->SetMapper( aMapper );
+      anActor->SetMapper( myMapper.GetPointer() );
       anActor->setIO( getIO() );
       AddObject( anActor );
     }
index 3a4098c718cb11fa05b455999ee4ef5c2cf75ab2..25e357d53737a283a15b57f60184fa8436d718d1 100644 (file)
 
 #include <HYDROData_Bathymetry.h>
 
+#include <vtkScalarsToColors.h>
+#include <vtkWeakPointer.h>
+#include <vtkNew.h>
+#include <vtkPolyDataMapper.h>
+
 /*
   Class       : HYDROGUI_VTKPrsBathymetry
   Description : Presentation for Bathymetry object
@@ -38,6 +43,16 @@ public:
   virtual ~HYDROGUI_VTKPrsBathymetry();
 
   virtual void compute();
+
+  //! Get the range of colored 
+  void setLookupTable( vtkScalarsToColors* theTable ) { myLookupTable = theTable; }
+
+protected:
+  virtual vtkMapper*               mapper() { return myMapper.GetPointer(); }
+
+private:
+  vtkWeakPointer< vtkScalarsToColors > myLookupTable;
+  vtkNew< vtkPolyDataMapper >          myMapper;
 };
 
 #endif
index a00cc17a4dddf56227c45737a3bd95eedc181769..a0731472eae6e3176be9f00cdb10573c19fc10e6 100644 (file)
@@ -26,8 +26,9 @@
 
 #include <HYDROData_Bathymetry.h>
 
-HYDROGUI_VTKPrsBathymetryDriver::HYDROGUI_VTKPrsBathymetryDriver()
+HYDROGUI_VTKPrsBathymetryDriver::HYDROGUI_VTKPrsBathymetryDriver( vtkScalarBarActor* theScalarBar )
 {
+  myScalarBar = theScalarBar;
 }
 
 HYDROGUI_VTKPrsBathymetryDriver::~HYDROGUI_VTKPrsBathymetryDriver()
@@ -50,10 +51,8 @@ bool HYDROGUI_VTKPrsBathymetryDriver::Update( const Handle(HYDROData_Entity)& th
     thePrs = new HYDROGUI_VTKPrsBathymetry( aBathymetry );
 
   HYDROGUI_VTKPrsBathymetry* aPrsBathymetry = (HYDROGUI_VTKPrsBathymetry*)thePrs;
-
-  //aPrsBathymetry->setName( aBathymetry->GetName() );
-  //aPrsBathymetry->setPath( aBathymetry->GetPainterPath() );
-
+  // Update global colors table during compute if necessary
+  aPrsBathymetry->setLookupTable( myScalarBar->GetLookupTable() );
   aPrsBathymetry->compute();
 
   return true;
index 37bee6935a312dde0aae7185a814399e6e1b25b1..a5b23b3aaa638e0e577094015c6680589f1a7c4c 100644 (file)
@@ -23,7 +23,9 @@
 #ifndef HYDROGUI_VTKPrsBathymetryDRIVER_H
 #define HYDROGUI_VTKPrsBathymetryDRIVER_H
 
-#include <HYDROGUI_VTKPrsDriver.h>
+#include "HYDROGUI_VTKPrsDriver.h"
+
+#include <vtkScalarBarActor.h>
 
 /**
  * \class HYDROGUI_VTKPrsBathymetryDriver
@@ -35,7 +37,7 @@ public:
   /**
    * \brief Constructor.
    */
-  HYDROGUI_VTKPrsBathymetryDriver();
+  HYDROGUI_VTKPrsBathymetryDriver( vtkScalarBarActor* theScalarBar );
 
   /**
    * \brief Destructor.
@@ -51,6 +53,9 @@ public:
    */
   virtual bool Update( const Handle(HYDROData_Entity)& theObj,
                        HYDROGUI_VTKPrs*& thePrs );
+
+private:
+  vtkScalarBarActor* myScalarBar;
 };
 
 #endif
index 6839219f59c5a1f03f63ed65a08d9079ec4eec83..afa82b5204d94016f1f54ba50693df821f65e27e 100644 (file)
@@ -28,6 +28,7 @@
 #include "HYDROGUI_VTKPrsBathymetryDriver.h"
 #include "HYDROGUI_Tool.h"
 
+#include "HYDROData_Tool.h"
 #include <SVTK_ViewModel.h>
 #include <SVTK_ViewWindow.h>
 #include <SALOME_ListIO.hxx>
 #include <SUIT_ViewManager.h>
 #include <SUIT_Accel.h>
 
+#include <vtkLookupTable.h>
+#include <vtkRenderer.h>
+#include <vtkWindow.h>
+#include <vtkActor2DCollection.h>
+
 #include <QVector>
 
+#define NB_COLORS 32
+
+// Saturation of blue
+//#define HUE_START 0.69 
+//#define HUE_END   0.41
+//#define SATURATION_START 1.0 
+//#define SATURATION_END   0.4
+
+#define HUE_START 1.0 
+#define HUE_END   0.0
+#define SATURATION_START 1.0 
+#define SATURATION_END   1.0
+
 HYDROGUI_VTKPrsDisplayer::HYDROGUI_VTKPrsDisplayer( HYDROGUI_Module* theModule )
 : HYDROGUI_AbstractDisplayer( theModule ), myDriver( NULL )
 {
+  // The invalid value is used to identify the case when the table range is not initialized yet.
+  double anInvalidValue = HYDROGUI_VTKPrs::InvalidZValue();
+  vtkLookupTable* aTable = vtkLookupTable::New();
+  aTable->SetHueRange( HUE_START, HUE_END );
+  aTable->SetSaturationRange( SATURATION_START, SATURATION_END );
+  aTable->SetTableRange( anInvalidValue, anInvalidValue );
+  aTable->SetValueRange( 1.0, 1.0 );
+  aTable->SetAlphaRange( 1.0, 1.0 );
+  aTable->SetNumberOfColors( NB_COLORS );
+  myScalarBar->SetLookupTable( aTable );
 }
 
 HYDROGUI_VTKPrsDisplayer::~HYDROGUI_VTKPrsDisplayer()
@@ -113,6 +142,22 @@ void HYDROGUI_VTKPrsDisplayer::Display( const HYDROData_SequenceOfObjects& theOb
   SVTK_Viewer* aViewer = module()->getVTKViewer( theViewerId );
   if( aViewer )
   {
+    // Invalidate global Z range
+    double anInvalidRange[2] = { HYDROGUI_VTKPrs::InvalidZValue(), HYDROGUI_VTKPrs::InvalidZValue() };
+    SetZRange( anInvalidRange );
+    // Hide colors legend bar
+    SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(
+      aViewer->getViewManager()->getActiveView() );
+    if ( aView )
+    {
+      if ( aView->getRenderer()->HasViewProp( myScalarBar.GetPointer() ) )
+      {
+        aView->getRenderer()->RemoveActor2D( myScalarBar.GetPointer() );
+      }
+    }
+
+
+    int anInvalidZ = HYDROGUI_VTKPrs::InvalidZValue();
     bool isChanged = false;
     HYDROGUI_VTKPrs* aPrs;
     for ( int i = 1, n = theObjs.Length(); i <= n; i++ )
@@ -139,7 +184,29 @@ void HYDROGUI_VTKPrsDisplayer::Display( const HYDROData_SequenceOfObjects& theOb
         {
           if ( anIsVisible )
           {
+
+            // Extend the global Z range if necessary
+            double* aGlobalRange = GetZRange();
+            double* aRange = aPrs->getInternalZRange();
+            bool anIsUpdate = false;
+            if ( aRange[0] < aGlobalRange[0] || ValuesEquals( aGlobalRange[0], anInvalidZ ) )
+            {
+              aGlobalRange[0] = aRange[0];
+              anIsUpdate = true;
+            }
+            if ( aRange[1] > aGlobalRange[1] || ValuesEquals( aGlobalRange[1], anInvalidZ ) )
+            {
+              aGlobalRange[1] = aRange[1];
+              anIsUpdate = true;
+            }
+
+            if ( anIsUpdate )
+            {
+              module()->updateVTKZRange( aGlobalRange );
+            }
+
             aViewer->Display( aPrs );
+
           }
           else
           {
@@ -150,6 +217,15 @@ void HYDROGUI_VTKPrsDisplayer::Display( const HYDROData_SequenceOfObjects& theOb
       }
     }
 
+    if ( isChanged )
+    {
+      // Show colors legend bar
+      if ( aView )
+      {
+        aView->getRenderer()->AddActor2D( myScalarBar.GetPointer() );
+      }
+    }
+
     if ( theDoFitAll )
     {
       // Repaint is done inside OnFitAll()
@@ -201,7 +277,7 @@ HYDROGUI_VTKPrsDriver* HYDROGUI_VTKPrsDisplayer::getDriver( const Handle(HYDRODa
   {
     if ( !myDriver )
     {
-      myDriver = new HYDROGUI_VTKPrsBathymetryDriver();
+      myDriver = new HYDROGUI_VTKPrsBathymetryDriver( myScalarBar.GetPointer() );
     }
     aDriver = myDriver;
   }
@@ -213,3 +289,13 @@ QString HYDROGUI_VTKPrsDisplayer::GetType() const
 {
   return SVTK_Viewer::Type();
 }
+
+void HYDROGUI_VTKPrsDisplayer::SetZRange( double theRange[] )
+{
+  myScalarBar->GetLookupTable()->SetRange( theRange );
+}
+
+double* HYDROGUI_VTKPrsDisplayer::GetZRange() const
+{
+  return myScalarBar->GetLookupTable()->GetRange();
+}
\ No newline at end of file
index 6e53647aa20fb0c15dcf311e4edcdf95c8defd23..2be387c1d1f0b0d679f0ebfd64ae86b18ed2dd85 100644 (file)
@@ -24,6 +24,8 @@
 #define HYDROGUI_VTKPRSDISPLAYER_H
 
 #include "HYDROGUI_AbstractDisplayer.h"
+#include <vtkNew.h>
+#include <vtkScalarBarActor.h>
 
 class HYDROGUI_VTKPrsDriver;
 
@@ -45,7 +47,6 @@ public:
    */
   virtual ~HYDROGUI_VTKPrsDisplayer();
 
-public:
   /**
    * \brief Force the specified objects to be updated.
    * \param theObjs sequence of objects to update
@@ -59,6 +60,16 @@ public:
    */
   virtual QString  GetType() const;
 
+  /**
+   * \brief Set the range of Z values for the color legend bar.
+   */
+  void             SetZRange( double theRange[] );
+
+  /**
+   * \brief Get the range of Z values for the color legend bar.
+   */
+  double*          GetZRange() const;
+
 protected:
   /**
    * \brief Erase all viewer objects.
@@ -100,7 +111,9 @@ private:
    */
   HYDROGUI_VTKPrsDriver* getDriver( const Handle(HYDROData_Entity)& theObj );
 
-  HYDROGUI_VTKPrsDriver* myDriver;
+  HYDROGUI_VTKPrsDriver*      myDriver;
+
+  vtkNew< vtkScalarBarActor > myScalarBar; //!< The colors legend presentation
 };
 
 #endif