Salome HOME
Merge branch 'BR_LCM_COMP' into HEAD
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Module.cxx
index 0403a311edc6133b8154e264d6202a5c9a4e9da7..f861ac792105ff447509003d9ee25772dd21dba8 100644 (file)
@@ -46,6 +46,7 @@
 #include <HYDROData_Profile.h>
 #include <HYDROData_Lambert93.h>
 #include <HYDROData_Polyline3D.h>
+#include <HYDROData_StricklerTable.h>
 
 #include <HYDROData_OperationsFactory.h>
 
@@ -337,6 +338,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
   bool anIsZone = false;
   bool anIsObstacle = false;
   bool anIsStricklerTable = false;
+  bool anIsLandCoverMap = false;
   bool anIsStream = false;
   bool anIsChannel = false;
   bool anIsDigue = false;
@@ -397,7 +399,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
       anIsVisibleInSelection |= aVisibility;
       anIsHiddenInSelection |= !aVisibility;
 
-      if ( anObject->CanBeUpdated() && anObject->IsMustBeUpdated() )
+      if ( anObject->CanBeUpdated() && anObject->IsMustBeUpdated( HYDROData_Entity::Geom_All ) )
       {
         anIsMustObjectBeUpdated = true;
       }
@@ -457,6 +459,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         anIsObstacle = true;
       else if( anObjectKind == KIND_STRICKLER_TABLE )
         anIsStricklerTable = true;
+      else if( anObjectKind == KIND_LAND_COVER_MAP )
+        anIsLandCoverMap = true;
       else if( anObjectKind == KIND_STREAM )
       {
         anIsStream = true;
@@ -476,7 +480,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
     }
 
     if ( !anIsObjectCanBeColored )
-      anIsObjectCanBeColored = HYDROGUI_SetColorOp::CanObjectBeColored( anObject );
+      anIsObjectCanBeColored = HYDROGUI_SetColorOp::CanObjectBeColored( anObject, this );
   }
 
   // Check if all selected objects are profiles
@@ -513,10 +517,15 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         case KIND_STRICKLER_TABLE:
           theMenu->addAction( action( ImportStricklerTableFromFileId ) );          
           break;
+        case KIND_LAND_COVER_MAP:
+          theMenu->addAction( action( CreateLandCoverMapId ) ); 
+          theMenu->addAction( action( ImportLandCoverMapId ) ); 
+          break;
         case KIND_CALCULATION:
           theMenu->addAction( action( CreateCalculationId ) );
           break;
         case KIND_POLYLINEXY:
+          theMenu->addAction( action( ImportPolylineId ) );
           theMenu->addAction( action( CreatePolylineId ) );
           break;
         case KIND_POLYLINE:
@@ -579,6 +588,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         theMenu->addAction( action( CutImagesId ) );
         theMenu->addAction( action( SplitImageId ) );
         theMenu->addSeparator();
+        theMenu->addAction( action( RecognizeContoursId ) );
+        theMenu->addSeparator();
       }
       else if( anIsBathymetry )
       {
@@ -590,6 +601,9 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
       {
         theMenu->addAction( action( EditPolylineId ) );
         theMenu->addSeparator();
+        theMenu->addAction( action( SplitPolylinesId ) );
+        theMenu->addAction( action( MergePolylinesId ) );
+        theMenu->addSeparator();
       }
       else if( anIsPolyline3D )
       {
@@ -645,7 +659,30 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         theMenu->addAction( action( ExportStricklerTableFromFileId ) );
         theMenu->addAction( action( DuplicateStricklerTableId ) );
         theMenu->addSeparator();
+
+        Handle(HYDROData_StricklerTable) aTable = 
+          Handle(HYDROData_StricklerTable)::DownCast( aSeq.First() );
+        QString aCurrentTable = 
+          HYDROGUI_DataObject::dataObjectEntry( getLandCoverColoringTable( anActiveViewId ) );
+        bool isUsed = aCurrentTable == HYDROGUI_DataObject::dataObjectEntry( aTable );
+
+        if ( !isUsed && !getObjectShapes( anActiveViewId, KIND_LAND_COVER_MAP ).isEmpty() ) {
+          theMenu->addAction( action( LandCoverScalarMapModeOnId ) );
+          theMenu->addSeparator();
+        }
       }
+      else if( anIsLandCoverMap )
+      {
+        theMenu->addAction( action( AddLandCoverId ) );
+        theMenu->addAction( action( RemoveLandCoverId ) );
+        theMenu->addSeparator();
+        theMenu->addAction( action( SplitLandCoverId ) );
+        theMenu->addAction( action( MergeLandCoverId ) );
+        theMenu->addAction( action( ChangeLandCoverTypeId ) );
+        theMenu->addSeparator();
+        //
+        theMenu->addAction( action( ExportToShapeFileID ) );
+      }      
       else if( anIsVisualState && anIsObjectBrowser )
       {
         theMenu->addAction( action( SaveVisualStateId ) );
@@ -653,10 +690,18 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         theMenu->addSeparator();
       }
 
+      if ( anIsStream || anIsChannel || anIsDigue || anIsObstacle )
+      {
+        theMenu->addAction( action( PolylineExtractionId ) );
+        theMenu->addSeparator();
+      }
+
       // Add set color action for geometrical objects
       if ( anIsObjectCanBeColored )
       {
         theMenu->addAction( action( SetColorId ) );
+        if ( anIsLandCoverMap )
+          theMenu->addAction( action( SetTransparencyId ) );
         theMenu->addSeparator();
       }
     } else if ( anAllAreProfiles ) {
@@ -664,6 +709,10 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
       theMenu->addSeparator();
     }
 
+    bool anIsPoly = anIsPolyline || anIsPolyline3D;
+    if (anIsPoly && !anIsLandCoverMap)
+      theMenu->addAction( action( ExportToShapeFileID ) );
+
     // Add copy action
     QAction* aCopyAction = action( CopyId );
     if( aCopyAction && aCopyAction->isEnabled() ) {
@@ -681,7 +730,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         anIsImmersibleZone || anIsZone || anIsRegion ||
         anIsBathymetry || anIsObstacle || anIsStream ||
         anIsChannel || anIsDigue || anIsDummyObject3D ||
-        anIsValidProfile || anIsGroup )
+        anIsValidProfile || anIsGroup || anIsLandCoverMap )
     {
       if( anIsHiddenInSelection )
         theMenu->addAction( action( ShowId ) );
@@ -702,6 +751,11 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
     theMenu->addSeparator();
     theMenu->addAction( action( SetZLevelId ) );
     theMenu->addSeparator();
+
+    if ( isLandCoversScalarMapModeOn( anActiveViewId ) ) {
+      theMenu->addAction( action( LandCoverScalarMapModeOffId ) );
+      theMenu->addSeparator();
+    }
   }
 
   if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView || anIsVTKView )
@@ -765,13 +819,26 @@ void HYDROGUI_Module::createPreferences()
 
   int StricklerTableGroup = addPreference( tr( "PREF_GROUP_STRICKLER_TABLE" ), genTab );
   int defaultStricklerCoef = addPreference( tr( "PREF_DEFAULT_STRICKLER_COEFFICIENT" ), StricklerTableGroup,
-                                            LightApp_Preferences::DblSpin, "HYDRO", "default_strickler_coefficient" );
+                                            LightApp_Preferences::DblSpin, "preferences", "default_strickler_coefficient" );
   setPreferenceProperty( defaultStricklerCoef, "precision", 2 );
   setPreferenceProperty( defaultStricklerCoef, "min", 0.00 );
   setPreferenceProperty( defaultStricklerCoef, "max", 1000000.00 );
   setPreferenceProperty( defaultStricklerCoef, "step", 0.01 );
 }
 
+void HYDROGUI_Module::preferencesChanged( const QString& theSection, const QString& thePref )
+{
+    if ( theSection == "preferences" && thePref == "default_strickler_coefficient" )
+    {
+        SUIT_ResourceMgr* resMgr = application()->resourceMgr();
+        Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( application()->activeStudy()->id() );
+        if ( resMgr && !aDoc.IsNull() )
+            aDoc->SetDefaultStricklerCoefficient( resMgr->doubleValue( theSection, thePref, 0 ) );
+    }
+    else
+        LightApp_Module::preferencesChanged( theSection, thePref );
+}
+
 QCursor HYDROGUI_Module::getPrefEditCursor() const
 {
   int aCursorType = SUIT_Session::session()->resourceMgr()->integerValue("preferences", "type_of_cursor", (int)CT_CrossCursor );
@@ -1020,6 +1087,12 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId,
         if ( visState != Qtx::UnpresentableState )
             treeModel->setVisibilityState( id, theState ? Qtx::ShownState : Qtx::HiddenState );
     }
+
+    if ( theObject->GetKind() == KIND_BATHYMETRY && theState ) {
+      setLandCoversScalarMapModeOff( theViewId );
+    } else if ( theObject->GetKind() == KIND_LAND_COVER_MAP && theState ) {
+      getOCCDisplayer()->SetToUpdateColorScale();
+    }
   }
 }
 
@@ -1302,6 +1375,11 @@ void HYDROGUI_Module::updateVTKZRange( const int theViewId, double theRange[] )
 }
 /////////////////// END OF VTKPrs PROCESSING
 
+void HYDROGUI_Module::clearCache()
+{
+    myObjectStateMap.clear();
+}
+
 CAM_DataModel* HYDROGUI_Module::createDataModel()
 {
   return new HYDROGUI_DataModel( this );
@@ -1423,8 +1501,11 @@ void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager )
     if ( anOCCViewManager )
     {
       OCCViewer_Viewer* anOCCViewer = anOCCViewManager->getOCCViewer();
-      if ( anOCCViewer )
-        removeViewShapes( (size_t)anOCCViewer );
+      if ( anOCCViewer ) {
+        int aViewerId = (size_t)anOCCViewer;
+        removeViewShapes( aViewerId );
+        setLandCoversScalarMapModeOff( aViewerId );
+      }
     }
 
     if ( getVTKDisplayer()->IsApplicable( theViewManager ) )
@@ -1732,3 +1813,52 @@ void HYDROGUI_Module::onObjectClicked( SUIT_DataObject* theObject, int theColumn
 
   update( UF_OCCViewer | ( visState == Qtx::ShownState ? UF_FitAll : 0 ) );
 }
+
+Handle(HYDROData_StricklerTable) HYDROGUI_Module::getLandCoverColoringTable( const int theViewId ) const
+{
+  Handle(HYDROData_StricklerTable) aTable;
+
+  if ( myLandCoverColoringMap.contains( theViewId ) ) {
+    aTable = myLandCoverColoringMap.value( theViewId );
+  }
+
+  return aTable;
+}
+
+void HYDROGUI_Module::setLandCoverColoringTable( const int theViewId,
+                                                 const Handle(HYDROData_StricklerTable)& theTable )
+{
+  if ( !theTable.IsNull() ) {
+    myLandCoverColoringMap.insert( theViewId, theTable );
+  }
+}
+
+void HYDROGUI_Module::setLandCoversScalarMapModeOff( const int theViewId )
+{
+  myLandCoverColoringMap.remove( theViewId );
+}
+
+bool HYDROGUI_Module::isLandCoversScalarMapModeOn( const int theViewId ) const
+{
+  return myLandCoverColoringMap.contains( theViewId );
+}
+
+void HYDROGUI_Module::setObjectRemoved( const Handle(HYDROData_Entity)& theObject )
+{
+  if ( theObject.IsNull() || !theObject->IsRemoved() ) {
+    return;
+  }
+
+  if ( theObject->GetKind() == KIND_STRICKLER_TABLE ) {
+    Handle(HYDROData_StricklerTable) aTable = 
+      Handle(HYDROData_StricklerTable)::DownCast( theObject );
+    QList<int> aViewIds;
+    QMutableMapIterator<int, Handle(HYDROData_StricklerTable)> anIter( myLandCoverColoringMap );
+    while ( anIter.hasNext() ) {
+      if ( HYDROGUI_DataObject::dataObjectEntry( anIter.next().value() ) == 
+           HYDROGUI_DataObject::dataObjectEntry( aTable ) ) {
+        anIter.remove();
+      }
+    }
+  }
+}