Salome HOME
Merge remote-tracking branch 'origin/BR_LAND_COVER' into BR_v14_rc
[modules/hydro.git] / src / HYDROData / HYDROData_CalculationCase.cxx
index 56f5259ac9eb0f9b9e817026cd5804f27af0b224..5ab5b3093d38276baaeb547b4f72d018c2645984 100644 (file)
@@ -25,6 +25,8 @@
 #include "HYDROData_Iterator.h"
 #include "HYDROData_NaturalObject.h"
 #include "HYDROData_PolylineXY.h"
+#include "HYDROData_StricklerTable.h"
+#include "HYDROData_LandCover.h"
 #include "HYDROData_SplittedShapesGroup.h"
 #include "HYDROData_Region.h"
 #include "HYDROData_Tool.h"
@@ -346,7 +348,7 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume
   QMap<QString, Handle(HYDROData_Region)> aRegionsMap; //object name to region
   QMap<QString, QString> aRegionNameToObjNameMap;
   QString aZonesPref = CALCULATION_ZONES_PREF;
-  HYDROData_PriorityQueue aPr( this );
+  HYDROData_PriorityQueue aPr( this, DataTag_CustomRules );
 
   // 1. First we create a default region for each object included into the calculation case
   HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
@@ -369,7 +371,8 @@ void HYDROData_CalculationCase::CreateRegionsAuto( const Handle(HYDROData_Docume
   {
     const HYDROData_SplitToZonesTool::SplitData& aSplitData = anIter.next();
     HYDROData_Zone::MergeAltitudesType aMergeType;
-    Handle(HYDROData_Object) aRegObj = aPr.GetMostPriorityObject( aSplitData.ObjectNames, aMergeType );
+    Handle(HYDROData_Object) aRegObj =
+      Handle(HYDROData_Object)::DownCast( aPr.GetMostPriorityObject( aSplitData.ObjectNames, aMergeType ) );
     if( aRegObj.IsNull() )
       continue;
     Handle(HYDROData_Region) aRegion = aRegionsMap[aRegObj->GetName()];
@@ -560,6 +563,69 @@ void HYDROData_CalculationCase::RemoveBoundaryPolyline()
   SetToUpdate( !aPrevPolyline.IsNull() || IsMustBeUpdated() );
 }
 
+void HYDROData_CalculationCase::SetStricklerTable( const Handle(HYDROData_StricklerTable)& theStricklerTable )
+{
+  Handle(HYDROData_StricklerTable) aPrevStricklerTable = GetStricklerTable();
+
+  SetReferenceObject( theStricklerTable, DataTag_StricklerTable );
+
+  // Indicate model of the need to update land covers partition
+  SetToUpdate( !IsEqual( aPrevStricklerTable, theStricklerTable ) || IsMustBeUpdated() );
+}
+
+Handle(HYDROData_StricklerTable) HYDROData_CalculationCase::GetStricklerTable() const
+{
+  return Handle(HYDROData_StricklerTable)::DownCast( 
+           GetReferenceObject( DataTag_StricklerTable ) );
+}
+
+void HYDROData_CalculationCase::RemoveStricklerTable()
+{
+  Handle(HYDROData_StricklerTable) aPrevStricklerTable = GetStricklerTable();
+
+  ClearReferenceObjects( DataTag_StricklerTable );
+
+  // Indicate model of the need to update land covers partition
+  SetToUpdate( !aPrevStricklerTable.IsNull() || IsMustBeUpdated() );
+}
+
+bool HYDROData_CalculationCase::AddLandCover( const Handle(HYDROData_LandCover)& theLandCover )
+{
+  if ( HasReference( theLandCover, DataTag_LandCover ) )
+    return false; // Land cover is already in reference list
+
+  AddReferenceObject( theLandCover, DataTag_LandCover );
+  
+  // Indicate model of the need to update land covers partition
+  SetToUpdate( true );
+
+  return true;
+}
+
+HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetLandCovers() const
+{
+  return GetReferenceObjects( DataTag_LandCover );
+}
+
+void HYDROData_CalculationCase::RemoveLandCover( const Handle(HYDROData_LandCover)& theLandCover )
+{
+  if ( theLandCover.IsNull() )
+    return;
+
+  RemoveReferenceObject( theLandCover->Label(), DataTag_LandCover );
+
+  // Indicate model of the need to update land cover partition
+  SetToUpdate( true );
+}
+
+void HYDROData_CalculationCase::RemoveLandCovers()
+{
+  ClearReferenceObjects( DataTag_LandCover );
+
+  // Indicate model of the need to update land cover partition
+  SetToUpdate( true );
+}
+
 Handle(HYDROData_Region) HYDROData_CalculationCase::AddNewRegion( const Handle(HYDROData_Zone)& theZone )
 {
   Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
@@ -1126,9 +1192,10 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var
   return true;
 }
 
-void HYDROData_CalculationCase::ClearRules( const bool theIsSetToUpdate )
+void HYDROData_CalculationCase::ClearRules( HYDROData_CalculationCase::DataTag theDataTag,
+                                            const bool theIsSetToUpdate )
 {
-  TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules );
+  TDF_Label aRulesLab = myLab.FindChild( theDataTag );
   HYDROData_PriorityQueue::ClearRules( aRulesLab );
 
   // Indicate model of the need to update splitting
@@ -1137,12 +1204,13 @@ void HYDROData_CalculationCase::ClearRules( const bool theIsSetToUpdate )
   }
 }
 
-void HYDROData_CalculationCase::AddRule( const Handle(HYDROData_Object)&    theObject1,
+void HYDROData_CalculationCase::AddRule( const Handle(HYDROData_Entity)&    theObject1,
                                          HYDROData_PriorityType             thePriority,
-                                         const Handle(HYDROData_Object)&    theObject2,
-                                         HYDROData_Zone::MergeAltitudesType theMergeType )
+                                         const Handle(HYDROData_Entity)&    theObject2,
+                                         HYDROData_Zone::MergeAltitudesType theMergeType,
+                                         HYDROData_CalculationCase::DataTag theDataTag )
 {
-  TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules );
+  TDF_Label aRulesLab = myLab.FindChild( theDataTag );
   HYDROData_PriorityQueue::AddRule( aRulesLab, theObject1, thePriority, theObject2, theMergeType );
 
   // Indicate model of the need to update splitting
@@ -1193,12 +1261,32 @@ void HYDROData_CalculationCase::SetWarning( HYDROData_WarningType theType, const
 }
 
 bool HYDROData_CalculationCase::GetRule( int theIndex, 
-                                         Handle(HYDROData_Object)&           theObject1,
+                                         Handle(HYDROData_Entity)&           theObject1,
                                          HYDROData_PriorityType&             thePriority,
-                                         Handle(HYDROData_Object)&           theObject2,
-                                         HYDROData_Zone::MergeAltitudesType& theMergeType ) const
+                                         Handle(HYDROData_Entity)&           theObject2,
+                                         HYDROData_Zone::MergeAltitudesType& theMergeType,
+                                         HYDROData_CalculationCase::DataTag& theDataTag) const
 {
-  TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules );
+  TDF_Label aRulesLab = myLab.FindChild( theDataTag );
   return HYDROData_PriorityQueue::GetRule( aRulesLab, theIndex,
     theObject1, thePriority, theObject2, theMergeType );
 }
+
+void HYDROData_CalculationCase::SetAssignmentLandCoverMode( AssignmentMode theMode )
+{
+  TDF_Label aModeLab = myLab.FindChild( DataTag_AssignmentLandCoverMode );
+  TDataStd_Integer::Set( aModeLab, ( int ) theMode );
+
+  // Indicate model of the need to update land covers partition
+  SetToUpdate( true );
+}
+
+HYDROData_CalculationCase::AssignmentMode HYDROData_CalculationCase::GetAssignmentLandCoverMode() const
+{
+  Handle(TDataStd_Integer) aModeAttr;
+  bool isOK = myLab.FindChild( DataTag_AssignmentLandCoverMode ).FindAttribute( TDataStd_Integer::GetID(), aModeAttr );
+  if( isOK )
+    return ( AssignmentMode ) aModeAttr->Get();
+  else
+    return MANUAL;
+}