Overlapping intervals: we cannot select rk that is already selected, to avoid the confusion of multiple definitions over the same interval

temperature_test
Dylan Jeannin 2026-08-12 14:03:17 +02:00
parent c0000bb332
commit 9309aa9d2d
2 changed files with 48 additions and 6 deletions

View File

@ -30,7 +30,7 @@ from PyQt5.QtWidgets import (
QDialogButtonBox, QPushButton, QLineEdit,
QFileDialog, QTableView, QAbstractItemView,
QUndoStack, QShortcut, QAction, QItemDelegate,
QComboBox,
QComboBox, QMessageBox,
)
from View.Tools.PamhyrTable import PamhyrTableModel
@ -212,15 +212,28 @@ class InitialConditionTableModel(PamhyrTableModel):
row = index.row()
column = index.column()
column_name = self._headers[column]
try:
self._undo.push(
SetCommandSpec(
self._data, self._lst, row, self._headers[column],
(self._river.edge(value).id
if self._headers[column] == "reach"
new_value = (
self._river.edge(value).id
if column_name == "reach"
else value
)
if (column_name in ("reach", "rk")
and self._overlaps_existing_rk(
row, column_name, new_value
)):
QMessageBox.warning(
self._table_view,
self._trad["msg_rk_overlap_title"],
self._trad["msg_rk_overlap_text"]
)
return False
self._undo.push(
SetCommandSpec(
self._data, self._lst, row, column_name, new_value
)
)
except Exception as e:
@ -230,6 +243,25 @@ class InitialConditionTableModel(PamhyrTableModel):
self.dataChanged.emit(index, index)
return True
def _overlaps_existing_rk(self, row, column, value):
current = self._lst[row]
reach = value if column == "reach" else current.reach
rk = value if column == "rk" else current.start_rk
if reach in (None, -1) or rk is None:
return False
rk = float(rk)
return any(
other is not current
and not other.is_deleted()
and other.reach == reach
and other.start_rk is not None
and other.end_rk is not None
and min(other.start_rk, other.end_rk) <= rk
<= max(other.start_rk, other.end_rk)
for other in self._data._data
)
def add(self, row, parent=QModelIndex()):
self.beginInsertRows(parent, row, row - 1)

View File

@ -32,6 +32,16 @@ class IcTemperatureTranslate(MainTranslate):
self._dict["rk"] = self._dict["unit_rk"]
self._dict["msg_rk_overlap_title"] = _translate(
"InitialConditionTemperature",
"Chainage already used"
)
self._dict["msg_rk_overlap_text"] = _translate(
"InitialConditionTemperature",
"An initial temperature condition is already defined at this "
"chainage on the selected reach."
)
self._sub_dict["table_headers"] = {
"name": self._dict["name"],
"temperature": self._dict["unit_temperature"],