This commit is contained in:
Youcef AOUAD committed 2024-06-11 16:22:07 +02:00
1 parent 6f3e1e31f0
commit 35cc348f03
6 files changed
+183 -184

No files matched your search

+71 -150
View File
@@ -47,24 +47,39 @@ _translate = QCoreApplication.translate
class ComboBoxDelegate(QItemDelegate):
def __init__(self, data=None, reach=None, parent=None, mode="reaches"):
def __init__(self, data=None, ic_spec_lst=None, trad=None, parent=None, mode="reaches"):
super(ComboBoxDelegate, self).__init__(parent)
self._reach = reach.reach
self._data = data
self._mode = mode
self._trad = trad
self._ic_spec_lst = ic_spec_lst
def createEditor(self, parent, option, index):
self.editor = QComboBox(parent)
self.editor.addItems(
list(
val = []
if self._mode == "kp":
reach_id = self._ic_spec_lst[index.row()].reach
reach = next(filter(lambda edge: edge.id == reach_id, self._data.edges()))
if reach_id is not None:
val = list(
map(
lambda kp: str(kp), reach.reach.get_kp()
)
)
else:
val = list(
map(
str,
self._reach.get_kp()
lambda n: n.name, self._data.edges()
)
)
self.editor.addItems(
[self._trad['not_associated']] +
val
)
self.editor.setCurrentText(str(index.data(Qt.DisplayRole)))
@@ -93,13 +108,10 @@ class ComboBoxDelegate(QItemDelegate):
class InitialConditionTableModel(PamhyrTableModel):
def __init__(self, reach=None, **kwargs):
self._reach = reach
def __init__(self, data=None, **kwargs):
self._lst = data[0]._data
super(InitialConditionTableModel, self).__init__(**kwargs)
def _setup_lst(self):
self._lst = self._data.river.initial_conditions.get(self._reach)
def data(self, index, role):
if role != Qt.ItemDataRole.DisplayRole:
return QVariant()
@@ -107,22 +119,51 @@ class InitialConditionTableModel(PamhyrTableModel):
row = index.row()
column = index.column()
if self._headers[column] is "speed":
z = self._lst.get(row)["elevation"]
q = self._lst.get(row)["discharge"]
profile = self._reach.reach.get_profiles_from_kp(
self._lst.get(row)["kp"]
)
if len(profile) >= 1:
speed = profile[0].speed(q, z)
return f"{speed:.4f}"
return ""
elif self._headers[column] not in ["name", "comment"]:
v = self._lst.get(row)[self._headers[column]]
return f"{v:.4f}"
else:
return self._lst.get(row)[self._headers[column]]
if self._headers[column] is "name":
n = self._lst[row].name
if n is None:
return self._trad['not_associated']
return n
elif self._headers[column] is "reach":
n = self._lst[row].reach
if n is None:
return self._trad['not_associated']
return next(filter(lambda edge: edge.id == n, self._data.edges())).name
elif self._headers[column] is "start_kp":
n = self._lst[row].start_kp
if n is None:
return self._trad['not_associated']
return n
elif self._headers[column] is "end_kp":
n = self._lst[row].end_kp
if n is None:
return self._trad['not_associated']
return n
elif self._headers[column] is "concentration":
n = self._lst[row].concentration
if n is None:
return self._trad['not_associated']
return n
elif self._headers[column] is "eg":
n = self._lst[row].eg
if n is None:
return self._trad['not_associated']
return n
elif self._headers[column] is "em":
n = self._lst[row].em
if n is None:
return self._trad['not_associated']
return n
elif self._headers[column] is "ed":
n = self._lst[row].ed
if n is None:
return self._trad['not_associated']
return n
elif self._headers[column] is "rate":
n = self._lst[row].rate
if n is None:
return self._trad['not_associated']
return n
return QVariant()
@@ -152,7 +193,7 @@ class InitialConditionTableModel(PamhyrTableModel):
self._undo.push(
AddCommand(
self._lst, row
self._data, self._lst, row
)
)
@@ -164,126 +205,13 @@ class InitialConditionTableModel(PamhyrTableModel):
self._undo.push(
DelCommand(
self._lst, rows
self._data, self._lst, rows
)
)
self.endRemoveRows()
self.layoutChanged.emit()
def sort(self, _reverse, parent=QModelIndex()):
self.layoutAboutToBeChanged.emit()
self._undo.push(
SortCommand(
self._lst, False
)
)
self.layoutAboutToBeChanged.emit()
self.layoutChanged.emit()
def move_up(self, row, parent=QModelIndex()):
if row <= 0:
return
target = row + 2
self.beginMoveRows(parent, row - 1, row - 1, parent, target)
self._undo.push(
MoveCommand(
self._lst, "up", row
)
)
self.endMoveRows()
self.layoutChanged.emit()
def move_down(self, row, parent=QModelIndex()):
if row > len(self._lst):
return
target = row
self.beginMoveRows(parent, row + 1, row + 1, parent, target)
self._undo.push(
MoveCommand(
self._lst, "down", row
)
)
self.endMoveRows()
self.layoutChanged.emit()
def paste(self, index, header, data):
if len(header) != 0:
logger.error("Unexpected header in IC past data")
return
if len(data) == 0:
logger.error("Empty data")
return
if len(data[0]) != 3:
logger.error(f"Unexpected data size: [{data[0]}, ...]")
return
self.layoutAboutToBeChanged.emit()
self._undo.push(
InsertCommand(
self._lst, index,
list(
map(
lambda d: self._lst.new_from_data(*d),
data
)
)
)
)
self.layoutAboutToBeChanged.emit()
self.layoutChanged.emit()
def import_from_results(self, index, results):
if results is None:
logger.error("No results data")
return
self.layoutAboutToBeChanged.emit()
ts = max(results.get("timestamps"))
res_reach = results.river.get_reach_by_geometry(
self._reach.reach
)
data = list(
map(
lambda p: [
p.geometry.kp,
p.get_ts_key(ts, "Q"),
p.get_ts_key(ts, "Z"),
],
res_reach.profiles
)
)
self._undo.push(
InsertCommand(
self._lst, index,
list(
map(
lambda d: self._lst.new_from_data(*d),
data
)
)
)
)
self.layoutAboutToBeChanged.emit()
self.layoutChanged.emit()
def undo(self):
self._undo.undo()
self.layoutChanged.emit()
@@ -292,10 +220,3 @@ class InitialConditionTableModel(PamhyrTableModel):
self._undo.redo()
self.layoutChanged.emit()
def generate(self, generator, param):
self._undo.push(
GenerateCommand(
self._lst, generator, param
)
)
self.layoutChanged.emit()