From bbdd18e8eff4e3b8bc330e4a215b1a05487609a3 Mon Sep 17 00:00:00 2001 From: Dylan Jeannin Date: Fri, 24 Jul 2026 15:35:12 +0200 Subject: [PATCH] LateralContributions: propagate LAT when splitting reach + display only enabled reach in combobox --- .../LateralContributionAdisTS.py | 19 ++++++++ .../LateralContributionsAdisTSList.py | 40 ++++++++++++++++ src/Model/River.py | 3 ++ src/Solver/AdisTS.py | 2 +- src/View/D90AdisTS/Table.py | 2 +- src/View/DIFAdisTS/Table.py | 2 +- .../InitialConditionsTemperature/Table.py | 2 +- src/View/LateralContributionsAdisTS/Table.py | 47 +++++++++++++++++-- .../LateralContributionsAdisTS/UndoCommand.py | 16 +++++-- src/View/LateralContributionsAdisTS/Window.py | 30 ++++++++---- src/View/WeatherParameters/Table.py | 5 +- 11 files changed, 148 insertions(+), 20 deletions(-) diff --git a/src/Model/LateralContributionsAdisTS/LateralContributionAdisTS.py b/src/Model/LateralContributionsAdisTS/LateralContributionAdisTS.py index b0deda44..2b3faa6f 100644 --- a/src/Model/LateralContributionsAdisTS/LateralContributionAdisTS.py +++ b/src/Model/LateralContributionsAdisTS/LateralContributionAdisTS.py @@ -192,6 +192,13 @@ class Data(SQLSubModel): def __setitem__(self, key, value): self._data[key] = self._types[key](value) + def cloned(self): + return Data( + self[0], self[1], + types=self._types, + status=self._status + ) + class LateralContributionAdisTS(SQLSubModel): _sub_classes = [Data] @@ -477,6 +484,18 @@ class LateralContributionAdisTS(SQLSubModel): self._end_rk = end_rk self.modified() + def cloned_for(self, reach, begin_rk, end_rk): + new = LateralContributionAdisTS( + pollutant=self._pollutant, + status=self._status + ) + new._reach = reach + new._begin_rk = begin_rk + new._end_rk = end_rk + new._data = [data.cloned() for data in self.data] + new.modified() + return new + @property def _default_0(self): return self._types[0](0) diff --git a/src/Model/LateralContributionsAdisTS/LateralContributionsAdisTSList.py b/src/Model/LateralContributionsAdisTS/LateralContributionsAdisTSList.py index 2baad522..ad9d2783 100644 --- a/src/Model/LateralContributionsAdisTS/LateralContributionsAdisTSList.py +++ b/src/Model/LateralContributionsAdisTS/LateralContributionsAdisTSList.py @@ -68,6 +68,46 @@ class LateralContributionsAdisTSList(PamhyrModelList): self._status.modified() return n + def split_reach(self, reach, profile, reach1, reach2): + parts = [] + for new_reach in (reach1, reach2): + rks = new_reach.reach.get_rk() + if len(rks) == 0: + continue + parts.append((new_reach.id, min(rks), max(rks))) + + contributions = [ + contribution + for contribution in self.lst + if contribution.reach == reach.id + ] + clones = [] + + for contribution in contributions: + begin = contribution.begin_rk + end = contribution.end_rk + if begin is None or end is None: + continue + + lower, upper = sorted((begin, end)) + reverse = begin > end + + for new_reach, part_lower, part_upper in parts: + clipped_lower = max(lower, part_lower) + clipped_upper = min(upper, part_upper) + if clipped_lower > clipped_upper: + continue + + begin_rk = clipped_upper if reverse else clipped_lower + end_rk = clipped_lower if reverse else clipped_upper + clones.append(contribution.cloned_for( + new_reach, begin_rk, end_rk + )) + + if len(clones) != 0: + self._lst.extend(clones) + self._status.modified() + @property def Lat_Cont_List(self): return self.lst diff --git a/src/Model/River.py b/src/Model/River.py index 286aeef5..00a0a799 100644 --- a/src/Model/River.py +++ b/src/Model/River.py @@ -991,5 +991,8 @@ Last export at: @date.""" self._InitialConditionsAdisTS.split_reach( reach, profile, r1, r2 ) + self._LateralContributionsAdisTS.split_reach( + reach, profile, r1, r2 + ) return r1, r2 diff --git a/src/Solver/AdisTS.py b/src/Solver/AdisTS.py index 2ab237dc..4c0c11e7 100644 --- a/src/Solver/AdisTS.py +++ b/src/Solver/AdisTS.py @@ -549,7 +549,7 @@ class AdisTSwc(AdisTS): for LC in POL_LC: reach = next(( edge for edge in study.river.enable_edges() - if edge.id == LC.edge + if edge.id == LC.reach ), None) if reach is None: continue diff --git a/src/View/D90AdisTS/Table.py b/src/View/D90AdisTS/Table.py index 7435ddad..0e2b21d0 100644 --- a/src/View/D90AdisTS/Table.py +++ b/src/View/D90AdisTS/Table.py @@ -78,7 +78,7 @@ class ComboBoxDelegate(QItemDelegate): else: val = list( map( - lambda n: n.name, self._data.edges() + lambda n: n.name, self._data.enable_edges() ) ) diff --git a/src/View/DIFAdisTS/Table.py b/src/View/DIFAdisTS/Table.py index 5f00da7d..2a8fce12 100644 --- a/src/View/DIFAdisTS/Table.py +++ b/src/View/DIFAdisTS/Table.py @@ -80,7 +80,7 @@ class ComboBoxDelegate(QItemDelegate): else: val = list( map( - lambda n: n.name, self._data.edges() + lambda n: n.name, self._data.enable_edges() ) ) diff --git a/src/View/InitialConditionsTemperature/Table.py b/src/View/InitialConditionsTemperature/Table.py index 037d0d27..1acafd00 100644 --- a/src/View/InitialConditionsTemperature/Table.py +++ b/src/View/InitialConditionsTemperature/Table.py @@ -75,7 +75,7 @@ class ComboBoxDelegate(QItemDelegate): else: val = list( map( - lambda n: n.name, self._data.edges() + lambda n: n.name, self._data.enable_edges() ) ) diff --git a/src/View/LateralContributionsAdisTS/Table.py b/src/View/LateralContributionsAdisTS/Table.py index 952458b3..01e7d428 100644 --- a/src/View/LateralContributionsAdisTS/Table.py +++ b/src/View/LateralContributionsAdisTS/Table.py @@ -81,7 +81,10 @@ class ComboBoxDelegate(QItemDelegate): else: self.editor.addItems( [self._trad['not_associated']] + - self._data.edges_names() + [ + reach.name + for reach in self._data.enable_edges() + ] ) self.editor.setCurrentText(index.data(Qt.DisplayRole)) @@ -119,6 +122,11 @@ class TableModel(PamhyrTableModel): self._setup_lst() def _setup_lst(self): + enabled_reach_ids = { + reach.id + for reach in self._data.enable_edges() + } + if self._lcs_list is not None: self._lcs_pol_list = [ lcs for lcs in self._lcs_list._lst @@ -127,7 +135,13 @@ class TableModel(PamhyrTableModel): self._lst = list( filter( - lambda x: x._deleted is False, + lambda x: ( + x._deleted is False and + ( + x.reach in (None, -1) or + x.reach in enabled_reach_ids + ) + ), self._lcs_pol_list ) ) @@ -137,6 +151,18 @@ class TableModel(PamhyrTableModel): def rowCount(self, parent): return len(self._lst) + def get(self, row): + if 0 <= row < len(self._lst): + return self._lst[row] + return None + + def refresh(self): + self.beginResetModel() + try: + self._setup_lst() + finally: + self.endResetModel() + def data(self, index, role): if role != Qt.ItemDataRole.DisplayRole: return QVariant() @@ -170,11 +196,18 @@ class TableModel(PamhyrTableModel): try: if self._headers[column] == "reach": + reach = self._data.reach(value) + rks = reach.reach.get_rk() + if len(rks) == 0: + return False + self._undo.push( SetReachCommand( self._lcs_list, self._lst, row, - self._data.reach(value).id + reach.id, + min(rks), + max(rks) ) ) elif self._headers[column] == "begin_rk": @@ -193,7 +226,13 @@ class TableModel(PamhyrTableModel): logger.info(e) logger.debug(traceback.format_exc()) - self.dataChanged.emit(index, index) + if self._headers[column] == "reach": + end_index = self.index( + row, self._headers.index("end_rk") + ) + self.dataChanged.emit(index, end_index) + else: + self.dataChanged.emit(index, index) return True def add(self, row, parent=QModelIndex()): diff --git a/src/View/LateralContributionsAdisTS/UndoCommand.py b/src/View/LateralContributionsAdisTS/UndoCommand.py index a7bef5be..83b8116f 100644 --- a/src/View/LateralContributionsAdisTS/UndoCommand.py +++ b/src/View/LateralContributionsAdisTS/UndoCommand.py @@ -64,20 +64,30 @@ class SetEndCommand(QUndoCommand): class SetReachCommand(QUndoCommand): - def __init__(self, lcs, lcs_lst, index, reach): + def __init__(self, lcs, lcs_lst, index, reach, begin_rk, end_rk): QUndoCommand.__init__(self) self._lcs = lcs self._lcs_lst = lcs_lst self._index = index self._old = self._lcs_lst[self._index].reach + self._old_begin_rk = self._lcs_lst[self._index].begin_rk + self._old_end_rk = self._lcs_lst[self._index].end_rk self._new = reach + self._new_begin_rk = begin_rk + self._new_end_rk = end_rk def undo(self): - self._lcs_lst[self._index].reach = self._old + contribution = self._lcs_lst[self._index] + contribution.reach = self._old + contribution.begin_rk = self._old_begin_rk + contribution.end_rk = self._old_end_rk def redo(self): - self._lcs_lst[self._index].reach = self._new + contribution = self._lcs_lst[self._index] + contribution.reach = self._new + contribution.begin_rk = self._new_begin_rk + contribution.end_rk = self._new_end_rk class AddCommand(QUndoCommand): diff --git a/src/View/LateralContributionsAdisTS/Window.py b/src/View/LateralContributionsAdisTS/Window.py index 56a7b777..92038bb3 100644 --- a/src/View/LateralContributionsAdisTS/Window.py +++ b/src/View/LateralContributionsAdisTS/Window.py @@ -20,6 +20,7 @@ import logging from tools import trace, timer +from Modules import Modules from View.Tools.PamhyrWindow import PamhyrWindow from PyQt5.QtGui import ( @@ -187,12 +188,13 @@ class LateralContributionAdisTSWindow(PamhyrWindow): data = None highlight = None - tab = "liquid" - if len(rows) > 0: - reach_id = self._study.river\ - .lateral_contributions_adists.lst[rows[0]]\ - .reach + contribution = self._table.get(rows[0]) + reach_id = ( + contribution.reach + if contribution is not None + else None + ) if reach_id: reach = next( @@ -201,8 +203,10 @@ class LateralContributionAdisTSWindow(PamhyrWindow): self._study.river.reachs())) data = reach.reach - lc = self._lcs.lst[rows[0]] - highlight = (lc.begin_rk, lc.end_rk) + highlight = ( + contribution.begin_rk, + contribution.end_rk + ) for delegate in self._delegate_rk: delegate.data = reach @@ -254,13 +258,23 @@ class LateralContributionAdisTSWindow(PamhyrWindow): self._table.redo() self._set_current_reach() + def _propagated_update(self, key=Modules(0)): + if Modules.NETWORK not in key: + return + + self._table.refresh() + self.find(QTableView, "tableView").clearSelection() + self._set_current_reach() + def edit(self): rows = self.index_selected_rows() if not rows: return for row in rows: - data = self._lcs.lst[row] + data = self._table.get(row) + if data is None: + continue if self.sub_window_exists( EditLateralContributionAdisTSWindow, diff --git a/src/View/WeatherParameters/Table.py b/src/View/WeatherParameters/Table.py index 7ce653d8..8b394248 100644 --- a/src/View/WeatherParameters/Table.py +++ b/src/View/WeatherParameters/Table.py @@ -87,7 +87,10 @@ class ComboBoxDelegate(QItemDelegate): else: self.editor.addItems( [self._trad['not_associated']] + - self._data.edges_names() + [ + reach.name + for reach in self._data.enable_edges() + ] ) self.editor.setCurrentText(str(index.data(Qt.DisplayRole)))