From f95c646ef3fd3de88cf420d18a4a937e528cd86e Mon Sep 17 00:00:00 2001 From: Dylan Jeannin Date: Tue, 11 Aug 2026 17:29:49 +0200 Subject: [PATCH] Split reach: D90 and DIF now spread by the split --- src/Model/D90AdisTS/D90AdisTS.py | 41 ++++++++++++++++++++++++++++ src/Model/D90AdisTS/D90AdisTSList.py | 4 +++ src/Model/D90AdisTS/D90AdisTSSpec.py | 10 +++++++ src/Model/DIFAdisTS/DIFAdisTS.py | 41 ++++++++++++++++++++++++++++ src/Model/DIFAdisTS/DIFAdisTSList.py | 4 +++ src/Model/DIFAdisTS/DIFAdisTSSpec.py | 12 ++++++++ src/Model/River.py | 6 ++++ src/View/D90AdisTS/Table.py | 9 +++++- src/View/DIFAdisTS/Table.py | 9 +++++- 9 files changed, 134 insertions(+), 2 deletions(-) diff --git a/src/Model/D90AdisTS/D90AdisTS.py b/src/Model/D90AdisTS/D90AdisTS.py index 5c222f65..f901bf01 100644 --- a/src/Model/D90AdisTS/D90AdisTS.py +++ b/src/Model/D90AdisTS/D90AdisTS.py @@ -275,3 +275,44 @@ class D90AdisTS(SQLSubModel): x.set_as_not_deleted() self.modified() + + def split_reach(self, reach, profile, reach1, reach2): + split_rk = profile.rk + reach_rks = reach.reach.get_rk() + if len(reach_rks) == 0: + return + + parts = [ + (reach1.id, min(reach_rks), split_rk), + (reach2.id, split_rk, max(reach_rks)), + ] + specifications = [ + specification + for specification in self._data + if (not specification.is_deleted() and + specification.reach == reach.id) + ] + + for specification in specifications: + begin = specification.start_rk + end = specification.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 + + start_rk = clipped_upper if reverse else clipped_lower + end_rk = clipped_lower if reverse else clipped_upper + self._data.append(specification.cloned_for( + new_reach, start_rk, end_rk + )) + + if len(specifications) != 0: + self.modified() diff --git a/src/Model/D90AdisTS/D90AdisTSList.py b/src/Model/D90AdisTS/D90AdisTSList.py index ce4f6ef6..89a0353d 100644 --- a/src/Model/D90AdisTS/D90AdisTSList.py +++ b/src/Model/D90AdisTS/D90AdisTSList.py @@ -61,6 +61,10 @@ class D90AdisTSList(PamhyrModelList): self._status.modified() return n + def split_reach(self, reach, profile, reach1, reach2): + for d90 in self.lst: + d90.split_reach(reach, profile, reach1, reach2) + @property def D90_AdisTS_List(self): return self.lst diff --git a/src/Model/D90AdisTS/D90AdisTSSpec.py b/src/Model/D90AdisTS/D90AdisTSSpec.py index 8d8252bb..4da6b1bf 100644 --- a/src/Model/D90AdisTS/D90AdisTSSpec.py +++ b/src/Model/D90AdisTS/D90AdisTSSpec.py @@ -261,3 +261,13 @@ class D90AdisTSSpec(SQLSubModel): def enabled(self, enabled): self._enabled = enabled self.modified() + + def cloned_for(self, reach, start_rk, end_rk): + new = D90AdisTSSpec(name=self._name_section, status=self._status) + new._reach = reach + new._start_rk = start_rk + new._end_rk = end_rk + new._d90 = self._d90 + new._enabled = self._enabled + new.modified() + return new diff --git a/src/Model/DIFAdisTS/DIFAdisTS.py b/src/Model/DIFAdisTS/DIFAdisTS.py index b642f7d6..97c05064 100644 --- a/src/Model/DIFAdisTS/DIFAdisTS.py +++ b/src/Model/DIFAdisTS/DIFAdisTS.py @@ -329,3 +329,44 @@ class DIFAdisTS(SQLSubModel): x.set_as_not_deleted() self.modified() + + def split_reach(self, reach, profile, reach1, reach2): + split_rk = profile.rk + reach_rks = reach.reach.get_rk() + if len(reach_rks) == 0: + return + + parts = [ + (reach1.id, min(reach_rks), split_rk), + (reach2.id, split_rk, max(reach_rks)), + ] + specifications = [ + specification + for specification in self._data + if (not specification.is_deleted() and + specification.reach == reach.id) + ] + + for specification in specifications: + begin = specification.start_rk + end = specification.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 + + start_rk = clipped_upper if reverse else clipped_lower + end_rk = clipped_lower if reverse else clipped_upper + self._data.append(specification.cloned_for( + new_reach, start_rk, end_rk + )) + + if len(specifications) != 0: + self.modified() diff --git a/src/Model/DIFAdisTS/DIFAdisTSList.py b/src/Model/DIFAdisTS/DIFAdisTSList.py index a765547c..d80fabc1 100644 --- a/src/Model/DIFAdisTS/DIFAdisTSList.py +++ b/src/Model/DIFAdisTS/DIFAdisTSList.py @@ -61,6 +61,10 @@ class DIFAdisTSList(PamhyrModelList): self._status.modified() return n + def split_reach(self, reach, profile, reach1, reach2): + for dif in self.lst: + dif.split_reach(reach, profile, reach1, reach2) + @property def DIF_AdisTS_List(self): return self.lst diff --git a/src/Model/DIFAdisTS/DIFAdisTSSpec.py b/src/Model/DIFAdisTS/DIFAdisTSSpec.py index fe185dfa..83daa989 100644 --- a/src/Model/DIFAdisTS/DIFAdisTSSpec.py +++ b/src/Model/DIFAdisTS/DIFAdisTSSpec.py @@ -293,3 +293,15 @@ class DIFAdisTSSpec(SQLSubModel): def enabled(self, enabled): self._enabled = enabled self._status.modified() + + def cloned_for(self, reach, start_rk, end_rk): + new = DIFAdisTSSpec(method=self._method, status=self._status) + new._reach = reach + new._start_rk = start_rk + new._end_rk = end_rk + new._dif = self._dif + new._b = self._b + new._c = self._c + new._enabled = self._enabled + new.modified() + return new diff --git a/src/Model/River.py b/src/Model/River.py index 35e4416f..8c29fef3 100644 --- a/src/Model/River.py +++ b/src/Model/River.py @@ -1000,5 +1000,11 @@ Last export at: @date.""" self._WeatherParameters.split_reach( reach, profile, r1, r2 ) + self._D90AdisTS.split_reach( + reach, profile, r1, r2 + ) + self._DIFAdisTS.split_reach( + reach, profile, r1, r2 + ) return r1, r2 diff --git a/src/View/D90AdisTS/Table.py b/src/View/D90AdisTS/Table.py index 0e2b21d0..f875c6ba 100644 --- a/src/View/D90AdisTS/Table.py +++ b/src/View/D90AdisTS/Table.py @@ -123,9 +123,16 @@ class D90TableModel(PamhyrTableModel): self._undo.indexChanged.connect(lambda _: self.update()) def _setup_lst(self): + enabled_reaches = { + reach.id for reach in self._river.enable_edges() + } self._lst = list( filter( - lambda d90: d90._deleted is False, + lambda d90: ( + d90._deleted is False + and (d90.reach in (None, -1) + or d90.reach in enabled_reaches) + ), self._data._data ) ) diff --git a/src/View/DIFAdisTS/Table.py b/src/View/DIFAdisTS/Table.py index 2a8fce12..3a41d379 100644 --- a/src/View/DIFAdisTS/Table.py +++ b/src/View/DIFAdisTS/Table.py @@ -125,9 +125,16 @@ class DIFTableModel(PamhyrTableModel): self._undo.indexChanged.connect(lambda _: self.update()) def _setup_lst(self): + enabled_reaches = { + reach.id for reach in self._river.enable_edges() + } self._lst = list( filter( - lambda dif: dif._deleted is False, + lambda dif: ( + dif._deleted is False + and (dif.reach in (None, -1) + or dif.reach in enabled_reaches) + ), self._data._data ) )