From fe30a2088271d322e1d9128c1a18ca0905feef6f Mon Sep 17 00:00:00 2001
From: Theophile Terraz <theophile.terraz@inrae.fr>
Date: Fri, 5 Jul 2024 10:09:43 +0200
Subject: [PATCH] allow to define height or discharge only

---
 .../InitialConditions/InitialConditions.py    | 78 +++++++++++--------
 src/View/InitialConditions/DialogDischarge.py |  4 +-
 src/View/InitialConditions/DialogHeight.py    |  4 +-
 src/View/InitialConditions/Table.py           |  4 +-
 src/View/InitialConditions/UndoCommand.py     |  9 ++-
 src/View/InitialConditions/Window.py          |  6 +-
 src/View/Network/translate.py                 |  4 +-
 ...alConditions_Dialog_Generator_Discharge.ui | 22 ++++--
 ...itialConditions_Dialog_Generator_Height.ui | 22 ++++--
 9 files changed, 98 insertions(+), 55 deletions(-)

diff --git a/src/Model/InitialConditions/InitialConditions.py b/src/Model/InitialConditions/InitialConditions.py
index d77e2498..be12428f 100644
--- a/src/Model/InitialConditions/InitialConditions.py
+++ b/src/Model/InitialConditions/InitialConditions.py
@@ -140,7 +140,6 @@ class Data(SQLSubModel):
             reach=self._reach,
             status=self._status,
         )
-
         return new
 
     @property
@@ -368,53 +367,68 @@ class InitialConditions(SQLSubModel):
                 key=lambda p: p.kp
             )
 
-    def generate_growing_constante_height(self, height: float):
-        self._data = []
+    def generate_growing_constante_height(self, height: float, compute_discharge: bool):
 
         profiles = self._reach.reach.profiles.copy()
         self._sort_by_z_and_kp(profiles)
 
-        incline = self._reach.reach.get_incline_median_mean()
         logger.debug(f"incline = {incline}")
 
         previous_elevation = -99999.99
-        for profile in profiles:
-            width = profile.width_approximation()
-            strickler = 25
-            discharge = (
-                ((width * 0.8)
-                 * strickler
-                 * (height ** (5/3))
-                 * (abs(incline) ** (0.5)))
-            )
 
-            elevation = max(
-                profile.z_min() + height,
-                previous_elevation
-            )
+        if compute_discharge:
+            incline = self._reach.reach.get_incline_median_mean()
+            self._data = []
+            for profile in profiles:
+                width = profile.width_approximation()
+                strickler = 25
+                discharge = (
+                    ((width * 0.8)
+                    * strickler
+                    * (height ** (5/3))
+                    * (abs(incline) ** (0.5)))
+                )
 
-            logger.debug(f"({profile.kp}):")
-            logger.debug(f"  width  = {width}")
-            logger.debug(f"  strickler = {strickler}")
-            logger.debug(f"  discharge = {discharge}")
+                elevation = max(
+                    profile.z_min() + height,
+                    previous_elevation
+                )
 
-            new = Data(reach=self._reach, status=self._status)
-            new["kp"] = profile.kp
-            new["discharge"] = discharge
+                logger.debug(f"({profile.kp}):")
+                logger.debug(f"  width  = {width}")
+                logger.debug(f"  strickler = {strickler}")
+                logger.debug(f"  discharge = {discharge}")
 
-            new["elevation"] = elevation
+                new = Data(reach=self._reach, status=self._status)
+                new["kp"] = profile.kp
+                new["discharge"] = discharge
 
-            self._data.append(new)
-            previous_elevation = elevation
+                new["elevation"] = elevation
+
+                self._data.append(new)
+        else:
+            for data, profile in zip(self._data, profiles):
+
+                elevation = max(
+                    profile.z_min() + height,
+                    previous_elevation
+                )
+                data["elevation"] = elevation
+                previous_elevation = elevation
 
         self._generate_resort_data(profiles)
 
-    def generate_discharge(self, discharge: float):
-        self._data = []
+    def generate_discharge(self, discharge: float, compute_height: bool):
 
-        self._generate_height_estimation_from_discharge(
-            discharge
-        )
+        if compute_height:
+            self._data = []
+
+            self._generate_height_estimation_from_discharge(
+                discharge
+            )
+        else:
+            for data in self._data:
+                data["discharge"] = discharge
 
     def _generate_height_estimation_from_discharge(self, discharge: float):
         profiles = self._reach.reach.profiles.copy()
diff --git a/src/View/InitialConditions/DialogDischarge.py b/src/View/InitialConditions/DialogDischarge.py
index 9b63bdab..3f0a83bb 100644
--- a/src/View/InitialConditions/DialogDischarge.py
+++ b/src/View/InitialConditions/DialogDischarge.py
@@ -28,7 +28,7 @@ from PyQt5.QtCore import (
 
 from PyQt5.QtWidgets import (
     QDialogButtonBox, QComboBox, QUndoStack, QShortcut,
-    QDoubleSpinBox,
+    QDoubleSpinBox, QCheckBox,
 )
 
 
@@ -45,9 +45,11 @@ class DischargeDialog(PamhyrDialog):
         )
 
         self.value = None
+        self.option = None
 
     def accept(self):
         self.value = self.find(QDoubleSpinBox, "doubleSpinBox").value()
+        self.option = self.find(QCheckBox, "checkBox").isChecked()
         super().accept()
 
     def reject(self):
diff --git a/src/View/InitialConditions/DialogHeight.py b/src/View/InitialConditions/DialogHeight.py
index 40821232..d4e541aa 100644
--- a/src/View/InitialConditions/DialogHeight.py
+++ b/src/View/InitialConditions/DialogHeight.py
@@ -28,7 +28,7 @@ from PyQt5.QtCore import (
 
 from PyQt5.QtWidgets import (
     QDialogButtonBox, QComboBox, QUndoStack, QShortcut,
-    QDoubleSpinBox,
+    QDoubleSpinBox, QCheckBox,
 )
 
 
@@ -45,9 +45,11 @@ class HeightDialog(PamhyrDialog):
         )
 
         self.value = None
+        self.option = None
 
     def accept(self):
         self.value = self.find(QDoubleSpinBox, "doubleSpinBox").value()
+        self.option = self.find(QCheckBox, "checkBox").isChecked()
         super().accept()
 
     def reject(self):
diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py
index 5461e862..cc7e712e 100644
--- a/src/View/InitialConditions/Table.py
+++ b/src/View/InitialConditions/Table.py
@@ -289,10 +289,10 @@ class InitialConditionTableModel(PamhyrTableModel):
         self._undo.redo()
         self.layoutChanged.emit()
 
-    def generate(self, generator, param):
+    def generate(self, generator, param, option):
         self._undo.push(
             GenerateCommand(
-                self._lst, generator, param
+                self._lst, generator, param, option
             )
         )
         self.layoutChanged.emit()
diff --git a/src/View/InitialConditions/UndoCommand.py b/src/View/InitialConditions/UndoCommand.py
index fecb6c6d..cb880bc9 100644
--- a/src/View/InitialConditions/UndoCommand.py
+++ b/src/View/InitialConditions/UndoCommand.py
@@ -174,11 +174,12 @@ class DuplicateCommand(QUndoCommand):
 
 
 class GenerateCommand(QUndoCommand):
-    def __init__(self, ics, generator, param):
+    def __init__(self, ics, generator, param, option):
         QUndoCommand.__init__(self)
 
         self._ics = ics
         self._param = param
+        self._option = option
         self._copy = self._ics.data
         self._generator = generator
 
@@ -187,6 +188,8 @@ class GenerateCommand(QUndoCommand):
 
     def redo(self):
         if self._generator == "growing":
-            self._ics.generate_growing_constante_height(self._param)
+            self._ics.generate_growing_constante_height(self._param,
+                                                        self._option)
         elif self._generator == "discharge":
-            self._ics.generate_discharge(self._param)
+            self._ics.generate_discharge(self._param,
+                                         self._option)
diff --git a/src/View/InitialConditions/Window.py b/src/View/InitialConditions/Window.py
index a9f4c6ad..02cdd791 100644
--- a/src/View/InitialConditions/Window.py
+++ b/src/View/InitialConditions/Window.py
@@ -349,12 +349,14 @@ class InitialConditionsWindow(PamhyrWindow):
         dlg = HeightDialog(trad=self._trad, parent=self)
         if dlg.exec():
             value = dlg.value
-            self._table.generate("growing", value)
+            compute_discharge = dlg.option
+            self._table.generate("growing", value, compute_discharge)
             self._update()
 
     def generate_discharge(self):
         dlg = DischargeDialog(trad=self._trad, parent=self)
         if dlg.exec():
             value = dlg.value
-            self._table.generate("discharge", value)
+            compute_height = dlg.option
+            self._table.generate("discharge", value, compute_height)
             self._update()
diff --git a/src/View/Network/translate.py b/src/View/Network/translate.py
index d6024681..ea999db2 100644
--- a/src/View/Network/translate.py
+++ b/src/View/Network/translate.py
@@ -54,12 +54,12 @@ class NetworkTranslate(MainTranslate):
         self._sub_dict["table_headers_node"] = {
             "name": self._dict['name'],
             "type": self._dict['type'],
-            # "id": _translate("Network", "Index"),
+            "id": _translate("Network", "Index"),
         }
 
         self._sub_dict["table_headers_edge"] = {
             "name": self._dict['name'],
             "node1": _translate("Network", "Source node"),
             "node2": _translate("Network", "Destination node"),
-            # "id": _translate("Network", "Index"),
+            "id": _translate("Network", "Index"),
         }
diff --git a/src/View/ui/InitialConditions_Dialog_Generator_Discharge.ui b/src/View/ui/InitialConditions_Dialog_Generator_Discharge.ui
index 8a0b7a8a..58ae2b98 100644
--- a/src/View/ui/InitialConditions_Dialog_Generator_Discharge.ui
+++ b/src/View/ui/InitialConditions_Dialog_Generator_Discharge.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>284</width>
-    <height>80</height>
+    <height>107</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -17,6 +17,16 @@
    <locale language="English" country="Europe"/>
   </property>
   <layout class="QGridLayout" name="gridLayout">
+   <item row="2" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
    <item row="0" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
@@ -39,12 +49,12 @@
     </layout>
    </item>
    <item row="1" column="0">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
+    <widget class="QCheckBox" name="checkBox">
+     <property name="text">
+      <string>Generate height</string>
      </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     <property name="checked">
+      <bool>true</bool>
      </property>
     </widget>
    </item>
diff --git a/src/View/ui/InitialConditions_Dialog_Generator_Height.ui b/src/View/ui/InitialConditions_Dialog_Generator_Height.ui
index 027fb621..500a2b0b 100644
--- a/src/View/ui/InitialConditions_Dialog_Generator_Height.ui
+++ b/src/View/ui/InitialConditions_Dialog_Generator_Height.ui
@@ -17,6 +17,16 @@
    <locale language="English" country="Europe"/>
   </property>
   <layout class="QGridLayout" name="gridLayout">
+   <item row="2" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
    <item row="0" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
@@ -29,19 +39,19 @@
      <item>
       <widget class="QDoubleSpinBox" name="doubleSpinBox">
        <property name="maximum">
-        <double>999999.998999999952503</double>
+        <double>1000000.000000000000000</double>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item row="1" column="0">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
+    <widget class="QCheckBox" name="checkBox">
+     <property name="text">
+      <string>Generate discharge</string>
      </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     <property name="checked">
+      <bool>true</bool>
      </property>
     </widget>
    </item>
-- 
GitLab