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