Salome HOME
Initial merge of branch 'BR_HYDRO_IMPS_2016' into BR_PORTING_OCCT_7
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_OCCDisplayer.cxx
index 40256a51b2e6b54640a4812ff8cd00e5e8df8d62..6f5081110ab3a624f5d3235d7536a798ce976768 100644 (file)
 
 #include "HYDROGUI_DataModel.h"
 #include "HYDROGUI_Module.h"
-#include "HYDROGUI_Tool.h"
+#include "HYDROGUI_Tool2.h"
 #include <HYDROGUI_ShapeImage.h>
 #include <HYDROGUI_ShapeBathymetry.h>
+#include <HYDROGUI_ShapeLandCoverMap.h>
 #include "HYDROGUI_Operation.h"
 #include "HYDROGUI_DataObject.h"
 #include "HYDROGUI_ZLayers.h"
+
 #include <HYDROData_Bathymetry.h>
+#include <HYDROData_Image.h>
+#include <HYDROData_LandCoverMap.h>
+#include <HYDROData_StricklerTable.h>
 
 #include <AIS_InteractiveContext.hxx>
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
 #include <AIS_ListOfInteractive.hxx>
-
-#include <Aspect_ColorScale.hxx>
+#include <AIS_ColorScale.hxx>
 
 #include <TColStd_SequenceOfInteger.hxx>
 
@@ -141,7 +145,9 @@ void HYDROGUI_OCCDisplayer::Erase( const HYDROData_SequenceOfObjects& theObjs,
     module()->removeObjectShape( (size_t)aViewer, anObj );
   }
   aViewer->update();
-  UpdateColorScale( aViewer );
+  if ( !module()->isLandCoversScalarMapModeOn( (size_t)aViewer ) ) {
+    UpdateColorScale( aViewer );
+  }
 }
 
 HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int                             theViewerId,
@@ -156,9 +162,13 @@ HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int
     return aResShape;
 
   if( theObject->IsKind( STANDARD_TYPE( HYDROData_Image ) ) )
-    aResShape = new HYDROGUI_ShapeImage( theContext, Handle_HYDROData_Image::DownCast( theObject ) );
+    aResShape = new HYDROGUI_ShapeImage( theContext, Handle(HYDROData_Image)::DownCast( theObject ) );
   else if( theObject->IsKind( STANDARD_TYPE( HYDROData_Bathymetry ) ) )
-    aResShape = new HYDROGUI_ShapeBathymetry( this, theContext, Handle_HYDROData_Bathymetry::DownCast( theObject ) );
+    aResShape = new HYDROGUI_ShapeBathymetry( this, theContext, Handle(HYDROData_Bathymetry)::DownCast( theObject ) );
+  else if( theObject->IsKind( STANDARD_TYPE( HYDROData_LandCoverMap ) ) ) {
+    bool isScalarMode = module()->isLandCoversScalarMapModeOn( theViewerId );
+    aResShape = new HYDROGUI_ShapeLandCoverMap( this, theContext, Handle(HYDROData_LandCoverMap)::DownCast( theObject ), -1, isScalarMode );
+  }
   else
     aResShape = new HYDROGUI_Shape( theContext, theObject );
 
@@ -400,16 +410,19 @@ void HYDROGUI_OCCDisplayer::SetToUpdateColorScale()
 
 void HYDROGUI_OCCDisplayer::UpdateColorScale( const OCCViewer_Viewer* theViewer )
 {
-  if( !myToUpdateColorScale )
+  if( !myToUpdateColorScale || !theViewer )
     return;
-
+  
   OCCViewer_ViewWindow* aWnd = dynamic_cast<OCCViewer_ViewWindow*>( theViewer->getViewManager()->getActiveView() );
   Handle(V3d_View) aView = aWnd->getViewPort()->getView();
-
+      
   int aViewerId = (size_t)theViewer;//TODO: check if viewer id is correct
-  QList<HYDROGUI_Shape*> aShapes = module()->getObjectShapes( aViewerId, KIND_BATHYMETRY );
+  bool isLandCoverColoringOn = module()->isLandCoversScalarMapModeOn( aViewerId );
+    
+  QList<HYDROGUI_Shape*> aLandCoverMapShapes = module()->getObjectShapes( aViewerId, KIND_LAND_COVER_MAP );
+  QList<HYDROGUI_Shape*> aBathShapes = module()->getObjectShapes( aViewerId, KIND_BATHYMETRY );
 
-  bool isDisplayColorScale = !aShapes.empty();
+  bool isDisplayColorScale = !aBathShapes.empty() || isLandCoverColoringOn;
   Standard_Real anXPos = 0.05; //TODO
   Standard_Real anYPos = 0.1; //TODO
   Standard_Real aWidth = 0.2; //TODO
@@ -418,27 +431,43 @@ void HYDROGUI_OCCDisplayer::UpdateColorScale( const OCCViewer_Viewer* theViewer
   Standard_Integer aNbIntervals = 20; //TODO
   TCollection_ExtendedString aColorScaleTitle = "";//TODO
 
-  Standard_Real aColorScaleMin = 0, aColorScaleMax = 1, aMin, aMax;
-  bool isFirst = true;
-  foreach( HYDROGUI_Shape* aShape, aShapes )
-  {
-    HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast<HYDROGUI_ShapeBathymetry*>( aShape );
-    if( !aBathShape || !aBathShape->isVisible() )
-      continue;
+  Standard_Real aColorScaleMin = 0, aColorScaleMax = 1;
+
+  // Get range
+  Handle(HYDROData_StricklerTable) aTable;
+  QStringList aTableTypes;
+  if ( isLandCoverColoringOn ) {
+    aTable = module()->getLandCoverColoringTable( aViewerId );
+    if ( !aTable.IsNull() ) {
+      // TODO: non-empty title leads to buggy behaviour
+      // aColorScaleTitle = TCollection_ExtendedString( aTable->GetName().toLatin1().constData() );
+      aTable->GetCoefficientRange( aColorScaleMin, aColorScaleMax );
+      aTableTypes = aTable->GetTypes();
+    }
+  } else {
+    Standard_Real aMin, aMax;
+    bool isFirst = true;
+    foreach( HYDROGUI_Shape* aShape, aBathShapes )
+    {
+      HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast<HYDROGUI_ShapeBathymetry*>( aShape );
+      if( !aBathShape || !aBathShape->isVisible() )
+        continue;
 
-    aBathShape->GetRange( aMin, aMax );
+      aBathShape->GetRange( aMin, aMax );
 
-    if( isFirst || aMin < aColorScaleMin )
-      aColorScaleMin = aMin;
-    if( isFirst || aMax > aColorScaleMax )
-      aColorScaleMax = aMax;
+      if( isFirst || aMin < aColorScaleMin )
+        aColorScaleMin = aMin;
+      if( isFirst || aMax > aColorScaleMax )
+        aColorScaleMax = aMax;
 
-    isFirst = false;
+      isFirst = false;
+    }
   }
 
+  Handle(AIS_ColorScale) aColorScale = GetColorScale( aViewerId );
+  Handle(AIS_InteractiveContext) aCtx = theViewer->getAISContext();
   if( isDisplayColorScale )
   {
-    Handle(Aspect_ColorScale) aColorScale = aView->ColorScale();
     if( !aColorScale.IsNull() )
     {
       aColorScale->SetXPosition( anXPos );
@@ -451,24 +480,66 @@ void HYDROGUI_OCCDisplayer::UpdateColorScale( const OCCViewer_Viewer* theViewer
 
       aColorScale->SetTitle( aColorScaleTitle );
       aColorScale->SetRange( aColorScaleMin, aColorScaleMax );
+      
+      aColorScale->SetToUpdate();
 
-      foreach( HYDROGUI_Shape* aShape, aShapes )
-      {
-        HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast<HYDROGUI_ShapeBathymetry*>( aShape );
-        if( !aBathShape || !aBathShape->isVisible() )
-          continue;
+      if ( !isLandCoverColoringOn ) {
+        foreach( HYDROGUI_Shape* aShape, aBathShapes ) {
+          HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast<HYDROGUI_ShapeBathymetry*>( aShape );
+          if( !aBathShape || !aBathShape->isVisible() )
+            continue;
 
-        aBathShape->UpdateWithColorScale( aColorScale );
+          aBathShape->UpdateWithColorScale( aColorScale );
+        }
+      }
+      
+      if ( !aCtx.IsNull() && !aCtx->IsDisplayed( aColorScale ) ) {
+        aCtx->Display( aColorScale );
       }
     }
-    if( !aView->ColorScaleIsDisplayed() )
-      aView->ColorScaleDisplay();
   }
   else
   {
-    if( aView->ColorScaleIsDisplayed() )
-      aView->ColorScaleErase();
+    if ( !aCtx.IsNull() && aCtx->IsDisplayed( aColorScale ) ) {
+      aCtx->Erase( aColorScale );
+    }
   }
 
+  foreach( HYDROGUI_Shape* aShape, aLandCoverMapShapes ) {
+    HYDROGUI_ShapeLandCoverMap* aLandCoverMapShape = 
+      dynamic_cast<HYDROGUI_ShapeLandCoverMap*>( aShape );
+
+    if ( !aLandCoverMapShape || !aLandCoverMapShape->isVisible() ) {
+      continue;
+    }
+    
+    Handle(HYDROData_LandCoverMap) aLandCoverMap = 
+      Handle(HYDROData_LandCoverMap)::DownCast( aLandCoverMapShape->getObject() );
+
+    if ( aLandCoverMap.IsNull() ) {
+      continue;
+    }
+    
+    bool isScalarMode = aLandCoverMapShape->isScalarMapModeEnabled();
+    if( isScalarMode != isLandCoverColoringOn )
+    {
+      aLandCoverMapShape->setScalarMapModeEnabled( isLandCoverColoringOn );
+      theViewer->getAISContext()->Redisplay( aLandCoverMapShape->getAISObject() );
+    }
+  }
+  
   myToUpdateColorScale = false;
 }
+
+Handle(AIS_ColorScale) HYDROGUI_OCCDisplayer::GetColorScale( const int theViewerId )
+{
+  Handle(AIS_ColorScale) aColorScale;
+
+  aColorScale = myColorScales.value( theViewerId, aColorScale );
+  if ( aColorScale.IsNull() ) {
+    aColorScale = new AIS_ColorScale();
+    myColorScales.insert( theViewerId, aColorScale );
+  }
+
+  return aColorScale;
+}