From 4b976d3b5f0e0c30456f34de4e2c96e837d5d13e Mon Sep 17 00:00:00 2001 From: Theophile Terraz <theophile.terraz@inrae.fr> Date: Mon, 17 Feb 2025 09:43:02 +0100 Subject: [PATCH] add copy/paste in pollutant BC + debug --- .../BoundaryConditionAdisTS.py | 30 +++++++++++++++++++ src/Model/Pollutants/Pollutants.py | 5 +++- .../BoundaryConditionsAdisTS/Edit/Table.py | 27 ++++++++++++++++- .../Edit/UndoCommand.py | 19 ++++++++++++ .../BoundaryConditionsAdisTS/Edit/Window.py | 16 ++++++++++ src/View/BoundaryConditionsAdisTS/Window.py | 3 ++ 6 files changed, 98 insertions(+), 2 deletions(-) diff --git a/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py b/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py index c61d047b..94641b65 100644 --- a/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py +++ b/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py @@ -222,3 +222,33 @@ class BoundaryConditionAdisTS(SQLSubModel): @property def data(self): return self._data.copy() + + @property + def _default_0(self): + return self._types[0](0) + + @property + def _default_1(self): + return self._types[1](0.0) + + def new_from_data(self, header, data): + new_0 = self._default_0 + new_1 = self._default_1 + + if len(header) != 0: + for i in [0, 1]: + for j in range(len(header)): + if self._header[i] == header[j]: + if i == 0: + new_0 = self._types[i](data[j].replace(",", ".")) + else: + new_1 = self._types[i](data[j].replace(",", ".")) + else: + new_0 = self._types[0](data[0].replace(",", ".")) + new_1 = self._types[1](data[1].replace(",", ".")) + + return (new_0, new_1) + + def insert(self, index: int, value): + self._data.insert(index, value) + self._status.modified() diff --git a/src/Model/Pollutants/Pollutants.py b/src/Model/Pollutants/Pollutants.py index 79f64514..645417d4 100644 --- a/src/Model/Pollutants/Pollutants.py +++ b/src/Model/Pollutants/Pollutants.py @@ -45,7 +45,10 @@ class Pollutants(SQLSubModel): else: self.id = id - self._name = str(name) + if name is None or name == "": + self.name = f"pol{self.id}" + else: + self._name = str(name) self._enabled = True self._data = [] diff --git a/src/View/BoundaryConditionsAdisTS/Edit/Table.py b/src/View/BoundaryConditionsAdisTS/Edit/Table.py index 59ac78a6..3bcb594e 100644 --- a/src/View/BoundaryConditionsAdisTS/Edit/Table.py +++ b/src/View/BoundaryConditionsAdisTS/Edit/Table.py @@ -41,7 +41,7 @@ from PyQt5.QtWidgets import ( ) from View.BoundaryConditionsAdisTS.Edit.UndoCommand import ( - AddCommand, DelCommand, SetDataCommand, + AddCommand, DelCommand, SetDataCommand, PasteCommand, ) _translate = QCoreApplication.translate @@ -118,3 +118,28 @@ class TableModel(PamhyrTableModel): ) self.endRemoveRows() + + def paste(self, row, header, data): + if len(data) == 0: + return + + self.layoutAboutToBeChanged.emit() + + self._undo.push( + PasteCommand( + self._data, row, + list( + map( + lambda d: self._data.new_from_data(header, d), + data + ) + ) + ) + ) + + self.layoutAboutToBeChanged.emit() + self.update() + + def update(self): + # self.auto_sort() + self.layoutChanged.emit() diff --git a/src/View/BoundaryConditionsAdisTS/Edit/UndoCommand.py b/src/View/BoundaryConditionsAdisTS/Edit/UndoCommand.py index 81b9c3c1..84b03187 100644 --- a/src/View/BoundaryConditionsAdisTS/Edit/UndoCommand.py +++ b/src/View/BoundaryConditionsAdisTS/Edit/UndoCommand.py @@ -102,3 +102,22 @@ class DelCommand(QUndoCommand): def redo(self): for row in self._rows: del self._data._data[row] + + +class PasteCommand(QUndoCommand): + def __init__(self, data, row, bcs): + QUndoCommand.__init__(self) + + self._data = data + self._row = row + self._bcs = bcs + self._bcs.reverse() + + def undo(self): + self._data.delete_i( + range(self._row, self._row + len(self._bcs)) + ) + + def redo(self): + for bc in self._bcs: + self._data.insert(self._row, bc) diff --git a/src/View/BoundaryConditionsAdisTS/Edit/Window.py b/src/View/BoundaryConditionsAdisTS/Edit/Window.py index 2c9afb3e..3b565cd8 100644 --- a/src/View/BoundaryConditionsAdisTS/Edit/Window.py +++ b/src/View/BoundaryConditionsAdisTS/Edit/Window.py @@ -200,6 +200,22 @@ class EditBoundaryConditionWindow(PamhyrWindow): self.copyTableIntoClipboard(table) + def _paste(self): + header, data = self.parseClipboardTable() + + logger.debug(f"paste: h:{header}, d:{data}") + + if len(data) == 0: + return + + row = 0 + rows = self.index_selected_rows() + if len(rows) != 0: + row = rows[0] + + self._table.paste(row, header, data) + self.plot.update() + def _undo(self): self._table.undo() self.plot.update() diff --git a/src/View/BoundaryConditionsAdisTS/Window.py b/src/View/BoundaryConditionsAdisTS/Window.py index 3bc0a587..1a537856 100644 --- a/src/View/BoundaryConditionsAdisTS/Window.py +++ b/src/View/BoundaryConditionsAdisTS/Window.py @@ -182,6 +182,9 @@ class BoundaryConditionAdisTSWindow(PamhyrWindow): for row in rows: data = self._bcs.lst[row] + if data.node is None: + continue + if self.sub_window_exists( EditBoundaryConditionWindow, data=[self._study, None, data] -- GitLab