Salome HOME
Fix for the bug #130: bathymetry sign is wrong
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Module.cxx
index 0733dcdc5917ab3dd56e088c349e1bb65578c9fa..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 <HYDROData_OperationsFactory.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>
@@ -117,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 )
@@ -195,7 +205,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
   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 );
@@ -212,12 +223,14 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
   bool anIsSplittedImage = false;
   bool anIsMustBeUpdatedImage = false;
   bool anIsPolyline = false;
+  bool anIsBathymetry = false;
   bool anIsCalculation = 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() ) {
@@ -277,9 +290,13 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         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
@@ -379,12 +396,19 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         theMenu->addAction( action( LoadVisualStateId ) );
         theMenu->addSeparator();
       }
+
+      // Add set color action for geometrical objects
+      if ( anIsGeomObject )
+      {
+        theMenu->addAction( action( SetColorId ) );
+        theMenu->addSeparator();
+      }
     }
 
     theMenu->addAction( action( DeleteId ) );
     theMenu->addSeparator();
 
-    if( anIsImage || anIsPolyline || anIsImmersibleZone || anIsZone || anIsRegion || anIsObstacle )
+    if( anIsImage || anIsPolyline || anIsImmersibleZone || anIsZone || anIsRegion || anIsBathymetry || anIsObstacle )
     {
       if( anIsHiddenInSelection )
         theMenu->addAction( action( ShowId ) );
@@ -395,7 +419,15 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
     }
   }
 
-  if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView )
+  if ( anIsOCCView )
+  {
+    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 || anIsVTKView )
   {
     theMenu->addAction( action( ShowAllId ) );
     theMenu->addAction( action( HideAllId ) );
@@ -417,15 +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,
-              flags & UF_FitAll );
+    updateViewer( getDisplayer(), flags & UF_GV_Init, flags & UF_GV_Forced, aDoFitAll ); 
 
   if( ( flags & UF_OCCViewer ) )
-    updateOCCViewer( flags & UF_OCC_Init,
-                     flags & UF_OCC_Forced,
-                     flags & UF_FitAll );
+    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() )
   {
@@ -485,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 ) )
@@ -511,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 );
@@ -578,6 +637,7 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId,
   }
 }
 
+/////////////////// OCC SHAPES PROCESSING
 HYDROGUI_Shape* HYDROGUI_Module::getObjectShape( const int                       theViewId,
                                                  const Handle(HYDROData_Entity)& theObject ) const
 {
@@ -650,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()
 {
@@ -746,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 );
   }
 }
@@ -820,59 +1010,31 @@ void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent )
   */
 }
 
-void HYDROGUI_Module::updateGV( const bool theIsInit,
-                                const bool theIsForced,
-                                const bool theDoFitAll )
+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, theDoFitAll );
-}
-
-void HYDROGUI_Module::updateOCCViewer( const bool theIsInit,
-                                       const bool theIsForced,
-                                       const bool theDoFitAll )
-{
-  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, theDoFitAll );
 }
 
 void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager )
@@ -898,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 );
   }