Overlapping intervals: we cannot select rk if the interval overlaps anohter one, to avoid the confusion of multiple definitions over the same interval for WeatherParameters

temperature_test
Dylan Jeannin 2026-08-12 14:21:50 +02:00
parent 9309aa9d2d
commit 50fa4f7bd8
2 changed files with 65 additions and 2 deletions

View File

@ -30,7 +30,7 @@ from PyQt5.QtWidgets import (
QDialogButtonBox, QPushButton, QLineEdit, QDialogButtonBox, QPushButton, QLineEdit,
QFileDialog, QTableView, QAbstractItemView, QFileDialog, QTableView, QAbstractItemView,
QUndoStack, QShortcut, QAction, QItemDelegate, QUndoStack, QShortcut, QAction, QItemDelegate,
QComboBox, QComboBox, QMessageBox,
) )
from View.Tools.PamhyrTable import PamhyrTableModel from View.Tools.PamhyrTable import PamhyrTableModel
@ -222,6 +222,10 @@ class WeatherParametersTableModel(PamhyrTableModel):
p for p in _edge.reach.profiles p for p in _edge.reach.profiles
if p.pamhyr_id == value if p.pamhyr_id == value
) )
if self._overlaps_existing_interval(
row, begin_section=_begin_rk):
self._show_overlap_warning()
return False
self._undo.push( self._undo.push(
SetBeginCommand( SetBeginCommand(
self._data, global_row, _begin_rk self._data, global_row, _begin_rk
@ -233,15 +237,24 @@ class WeatherParametersTableModel(PamhyrTableModel):
p for p in _edge.reach.profiles p for p in _edge.reach.profiles
if p.pamhyr_id == value if p.pamhyr_id == value
) )
if self._overlaps_existing_interval(
row, end_section=_end_rk):
self._show_overlap_warning()
return False
self._undo.push( self._undo.push(
SetEndCommand( SetEndCommand(
self._data, global_row, _end_rk self._data, global_row, _end_rk
) )
) )
elif self._headers[column] == "reach": elif self._headers[column] == "reach":
new_reach = self._river.edge(value)
if self._overlaps_existing_interval(
row, reach=new_reach):
self._show_overlap_warning()
return False
self._undo.push( self._undo.push(
SetEdgeCommand( SetEdgeCommand(
self._data, global_row, self._river.edge(value) self._data, global_row, new_reach
) )
) )
except Exception as e: except Exception as e:
@ -251,6 +264,48 @@ class WeatherParametersTableModel(PamhyrTableModel):
self.dataChanged.emit(index, index) self.dataChanged.emit(index, index)
return True return True
def _overlaps_existing_interval(self, row, reach=None,
begin_section=None, end_section=None):
current = self._lst[row]
reach = current.reach if reach is None else reach
if reach is None:
return False
if begin_section is None:
begin_section = (
reach.reach.profiles[0]
if reach is not current.reach and reach.reach.profiles
else current.begin_section
)
if end_section is None:
end_section = (
reach.reach.profiles[-1]
if reach is not current.reach and reach.reach.profiles
else current.end_section
)
if begin_section is None or end_section is None:
return False
lower, upper = sorted((begin_section.rk, end_section.rk))
return any(
other is not current
and not other.is_deleted()
and other.type == current.type
and other.reach is reach
and other.begin_section is not None
and other.end_section is not None
and max(lower, min(other.begin_rk, other.end_rk))
< min(upper, max(other.begin_rk, other.end_rk))
for other in self._data.lst
)
def _show_overlap_warning(self):
QMessageBox.warning(
self._table_view,
self._trad["msg_rk_overlap_title"],
self._trad["msg_rk_overlap_text"]
)
def add(self, row, parent=QModelIndex()): def add(self, row, parent=QModelIndex()):
self.beginInsertRows(parent, row, row) self.beginInsertRows(parent, row, row)

View File

@ -41,6 +41,14 @@ class WeatherParametersTranslate(MainTranslate):
"These values are applied to sections that have not been " "These values are applied to sections that have not been "
"defined using time series." "defined using time series."
) )
self._dict["msg_rk_overlap_title"] = _translate(
"WeatherParameters", "Overlapping interval"
)
self._dict["msg_rk_overlap_text"] = _translate(
"WeatherParameters",
"Two weather-parameter intervals of the same type cannot "
"overlap on the same reach."
)
self._dict["rk"] = self._dict["unit_rk"] self._dict["rk"] = self._dict["unit_rk"]