Salome HOME
Fix for the bug #130: bathymetry sign is wrong
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Module.cxx
index b36585e22f5de3e928030780271e0b060830d6c4..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 <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 );
@@ -205,9 +223,20 @@ 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() ) {
+    theMenu->addAction( action( ImportGeomObjectId ) );
+    theMenu->addSeparator();
+  }
 
   // check the selected data model objects
   HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( this );
@@ -243,7 +272,10 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
                 anIsSplittedImage = true;
             }
           }
-          anIsMustBeUpdatedImage = anImage->IsMustBeUpdated();
+          if ( anImage->IsMustBeUpdated() )
+          {
+            anIsMustBeUpdatedImage = true;
+          }
         }
       }
       else if( anObject->GetKind() == KIND_POLYLINE )
@@ -254,7 +286,17 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         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
@@ -283,88 +325,109 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         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( anIsImageHasRefs )
+      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();
 
-      if( anIsImageHasRefs )
+        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( RemoveImageRefsId ) );
+        theMenu->addAction( action( SaveVisualStateId ) );
+        theMenu->addAction( action( LoadVisualStateId ) );
         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( 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 || anIsImmersibleZone ) )
+  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 ) );
@@ -386,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() )
   {
@@ -407,8 +472,8 @@ void HYDROGUI_Module::update( const int flags )
   }
 
   // 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();
@@ -452,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 ) )
@@ -478,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 );
@@ -545,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
 {
@@ -617,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()
 {
@@ -713,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 );
   }
 }
@@ -787,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 )
@@ -863,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 );
   }