From 8250efcd6202c1ca7ac5a1b9a3cd16699ec6faa2 Mon Sep 17 00:00:00 2001
From: Theophile Terraz <theophile.terraz@inrae.fr>
Date: Wed, 18 Sep 2024 17:22:26 +0200
Subject: [PATCH] add generate constant height in IC

---
 .../InitialConditions/InitialConditions.py    | 23 ++++-
 src/View/InitialConditions/DialogDepth.py     | 56 +++++++++++
 src/View/InitialConditions/DialogHeight.py    |  4 +-
 src/View/InitialConditions/UndoCommand.py     |  6 +-
 src/View/InitialConditions/Window.py          | 22 ++++-
 src/View/ui/InitialConditions.ui              | 13 ++-
 ...nitialConditions_Dialog_Generator_Depth.ui | 95 +++++++++++++++++++
 ...itialConditions_Dialog_Generator_Height.ui | 12 +--
 8 files changed, 205 insertions(+), 26 deletions(-)
 create mode 100644 src/View/InitialConditions/DialogDepth.py
 create mode 100644 src/View/ui/InitialConditions_Dialog_Generator_Depth.ui

diff --git a/src/Model/InitialConditions/InitialConditions.py b/src/Model/InitialConditions/InitialConditions.py
index a4becbae..c16c87ac 100644
--- a/src/Model/InitialConditions/InitialConditions.py
+++ b/src/Model/InitialConditions/InitialConditions.py
@@ -374,8 +374,8 @@ class InitialConditions(SQLSubModel):
                 key=lambda p: p.rk
             )
 
-    def generate_growing_constante_height(self, height: float,
-                                          compute_discharge: bool):
+    def generate_growing_constant_depth(self, height: float,
+                                        compute_discharge: bool):
 
         profiles = self._reach.reach.profiles.copy()
         self._sort_by_z_and_rk(profiles)
@@ -492,6 +492,25 @@ class InitialConditions(SQLSubModel):
 
         self._generate_resort_data(profiles)
 
+    def generate_height(self, elevation: float):
+        profiles = self._reach.reach.profiles.copy()
+        data_discharge = {}
+        if len(self._data) == 0:
+            for profile in profiles:
+                data_discharge[profile.rk] = 0.0
+        else:
+            for data in self._data:
+                data_discharge[data["rk"]] = data["discharge"]
+        self._data = []
+        for profile in profiles:
+            new = Data(reach=self._reach, status=self._status)
+            new["rk"] = profile.rk
+            new["discharge"] = data_discharge[profile.rk]
+            new["elevation"] = elevation
+            self._data.append(new)
+
+        self._generate_resort_data(profiles)
+
     def _generate_resort_data(self, profiles):
         is_reverse = False
         if profiles[0].rk > profiles[-1].rk:
diff --git a/src/View/InitialConditions/DialogDepth.py b/src/View/InitialConditions/DialogDepth.py
new file mode 100644
index 00000000..67c89ca0
--- /dev/null
+++ b/src/View/InitialConditions/DialogDepth.py
@@ -0,0 +1,56 @@
+# DialogDepth.py -- Pamhyr
+# Copyright (C) 2023-2024  INRAE
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# -*- coding: utf-8 -*-
+
+from View.Tools.PamhyrWindow import PamhyrDialog
+
+from PyQt5.QtGui import (
+    QKeySequence,
+)
+
+from PyQt5.QtCore import (
+    Qt, QVariant, QAbstractTableModel,
+)
+
+from PyQt5.QtWidgets import (
+    QDialogButtonBox, QComboBox, QUndoStack, QShortcut,
+    QDoubleSpinBox, QCheckBox,
+)
+
+
+class DepthDialog(PamhyrDialog):
+    _pamhyr_ui = "InitialConditions_Dialog_Generator_Depth"
+    _pamhyr_name = "Depth"
+
+    def __init__(self, trad=None, parent=None):
+        super(DepthDialog, self).__init__(
+            title=trad[self._pamhyr_name],
+            options=[],
+            trad=trad,
+            parent=parent
+        )
+
+        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):
+        self.close()
diff --git a/src/View/InitialConditions/DialogHeight.py b/src/View/InitialConditions/DialogHeight.py
index d4e541aa..e835716d 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, QCheckBox,
+    QDoubleSpinBox
 )
 
 
@@ -45,11 +45,9 @@ 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/UndoCommand.py b/src/View/InitialConditions/UndoCommand.py
index 2331d9bc..b461e643 100644
--- a/src/View/InitialConditions/UndoCommand.py
+++ b/src/View/InitialConditions/UndoCommand.py
@@ -188,8 +188,10 @@ class GenerateCommand(QUndoCommand):
 
     def redo(self):
         if self._generator == "growing":
-            self._ics.generate_growing_constante_height(self._param,
-                                                        self._option)
+            self._ics.generate_growing_constant_depth(self._param,
+                                                      self._option)
         elif self._generator == "discharge":
             self._ics.generate_discharge(self._param,
                                          self._option)
+        elif self._generator == "height":
+            self._ics.generate_height(self._param)
diff --git a/src/View/InitialConditions/Window.py b/src/View/InitialConditions/Window.py
index e6563169..739f4974 100644
--- a/src/View/InitialConditions/Window.py
+++ b/src/View/InitialConditions/Window.py
@@ -58,6 +58,7 @@ from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar
 from View.InitialConditions.PlotDRK import PlotDRK
 from View.InitialConditions.PlotDischarge import PlotDischarge
 from View.InitialConditions.translate import ICTranslate
+from View.InitialConditions.DialogDepth import DepthDialog
 from View.InitialConditions.DialogHeight import HeightDialog
 from View.InitialConditions.DialogDischarge import DischargeDialog
 from View.Results.ReadingResultsDialog import ReadingResultsDialog
@@ -174,13 +175,17 @@ class InitialConditionsWindow(PamhyrWindow):
                                            .connect(self.import_from_file)
 
         self.find(QPushButton, "pushButton_generate_1").clicked.connect(
-            self.generate_growing_constante_height
+            self.generate_growing_constant_depth
         )
 
         self.find(QPushButton, "pushButton_generate_2").clicked.connect(
             self.generate_discharge
         )
 
+        self.find(QPushButton, "pushButton_generate_3").clicked.connect(
+            self.generate_height
+        )
+
         self._table.dataChanged.connect(self._update_plot)
 
     def index_selected_row(self):
@@ -345,8 +350,8 @@ class InitialConditionsWindow(PamhyrWindow):
         self._table.redo()
         self._update()
 
-    def generate_growing_constante_height(self):
-        dlg = HeightDialog(trad=self._trad, parent=self)
+    def generate_growing_constant_depth(self):
+        dlg = DepthDialog(trad=self._trad, parent=self)
         if dlg.exec():
             value = dlg.value
             compute_discharge = dlg.option
@@ -357,6 +362,13 @@ class InitialConditionsWindow(PamhyrWindow):
         dlg = DischargeDialog(trad=self._trad, parent=self)
         if dlg.exec():
             value = dlg.value
-            compute_height = dlg.option
-            self._table.generate("discharge", value, compute_height)
+            compute_depth = dlg.option
+            self._table.generate("discharge", value, compute_depth)
+            self._update()
+
+    def generate_height(self):
+        dlg = HeightDialog(trad=self._trad, parent=self)
+        if dlg.exec():
+            value = dlg.value
+            self._table.generate("height", value, None)
             self._update()
diff --git a/src/View/ui/InitialConditions.ui b/src/View/ui/InitialConditions.ui
index 68ed2f94..e0268872 100644
--- a/src/View/ui/InitialConditions.ui
+++ b/src/View/ui/InitialConditions.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1024</width>
+    <width>849</width>
     <height>576</height>
    </rect>
   </property>
@@ -27,7 +27,7 @@
           <item>
            <widget class="QPushButton" name="pushButton_generate_1">
             <property name="text">
-             <string>Generate height</string>
+             <string>Generate depth</string>
             </property>
            </widget>
           </item>
@@ -38,6 +38,13 @@
             </property>
            </widget>
           </item>
+          <item>
+           <widget class="QPushButton" name="pushButton_generate_3">
+            <property name="text">
+             <string>Generate elevation</string>
+            </property>
+           </widget>
+          </item>
          </layout>
         </item>
         <item>
@@ -65,7 +72,7 @@
     <rect>
      <x>0</x>
      <y>0</y>
-     <width>1024</width>
+     <width>849</width>
      <height>22</height>
     </rect>
    </property>
diff --git a/src/View/ui/InitialConditions_Dialog_Generator_Depth.ui b/src/View/ui/InitialConditions_Dialog_Generator_Depth.ui
new file mode 100644
index 00000000..deb89169
--- /dev/null
+++ b/src/View/ui/InitialConditions_Dialog_Generator_Depth.ui
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>284</width>
+    <height>107</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <property name="locale">
+   <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>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Depth (m)</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QDoubleSpinBox" name="doubleSpinBox">
+       <property name="maximum">
+        <double>1000000.000000000000000</double>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QCheckBox" name="checkBox">
+     <property name="text">
+      <string>Generate discharge</string>
+     </property>
+     <property name="checked">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Dialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Dialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/View/ui/InitialConditions_Dialog_Generator_Height.ui b/src/View/ui/InitialConditions_Dialog_Generator_Height.ui
index 500a2b0b..40e9cd9b 100644
--- a/src/View/ui/InitialConditions_Dialog_Generator_Height.ui
+++ b/src/View/ui/InitialConditions_Dialog_Generator_Height.ui
@@ -17,7 +17,7 @@
    <locale language="English" country="Europe"/>
   </property>
   <layout class="QGridLayout" name="gridLayout">
-   <item row="2" column="0">
+   <item row="1" column="0">
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
@@ -45,16 +45,6 @@
      </item>
     </layout>
    </item>
-   <item row="1" column="0">
-    <widget class="QCheckBox" name="checkBox">
-     <property name="text">
-      <string>Generate discharge</string>
-     </property>
-     <property name="checked">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
   </layout>
  </widget>
  <resources/>
-- 
GitLab