diff --git a/src/View/BoundaryCondition/Edit/Table.py b/src/View/BoundaryCondition/Edit/Table.py index ad4ba66d..e50308fc 100644 --- a/src/View/BoundaryCondition/Edit/Table.py +++ b/src/View/BoundaryCondition/Edit/Table.py @@ -214,15 +214,15 @@ class TableModel(PamhyrTableModel): def read_from_file(self, file_name, bctype): - logger.debug(f"Import initial conditions from {file_name}") + logger.debug(f"Import boundary conditions from {file_name}") data0 = [] data1 = [] if bctype == "ZD": mult = 1 else: mult = 60 - with open(file_name, encoding="utf-8") as ini_file: - for line in ini_file: + with open(file_name, encoding="utf-8") as bc_file: + for line in bc_file: if not (line.startswith("#") or line.startswith("*") or line.startswith("$")): diff --git a/src/View/Frictions/Table.py b/src/View/Frictions/Table.py index 2347a41d..9ba17e3a 100644 --- a/src/View/Frictions/Table.py +++ b/src/View/Frictions/Table.py @@ -38,7 +38,7 @@ from View.Frictions.UndoCommand import ( SetNameCommand, SetBeginCommand, SetEndCommand, SetBeginStricklerCommand, SetEndStricklerCommand, AddCommand, DelCommand, SortCommand, - MoveCommand, PasteCommand, DuplicateCommand, + MoveCommand, PasteCommand, DuplicateCommand, ReplaceDataCommand, ) from View.Tools.PamhyrTable import PamhyrTableModel @@ -99,7 +99,7 @@ class ComboBoxDelegate(QItemDelegate): self.commitData.emit(self.sender()) -class TableModel(PamhyrTableModel): +class FrictionTableModel(PamhyrTableModel): def _setup_lst(self): self._lst = self._data.frictions self._study = self._opt_data @@ -199,6 +199,18 @@ class TableModel(PamhyrTableModel): self.endRemoveRows() self.layoutChanged.emit() + def replace_data(self, new_data): + self.layoutAboutToBeChanged.emit() + + self._undo.push( + ReplaceDataCommand( + self._lst, new_data + ) + ) + + self.layoutAboutToBeChanged.emit() + self.layoutChanged.emit() + def sort(self, _reverse, parent=QModelIndex()): self.layoutAboutToBeChanged.emit() @@ -252,3 +264,34 @@ class TableModel(PamhyrTableModel): def redo(self): self._undo.redo() self.layoutChanged.emit() + + def read_from_file(self, file_name): + + reach_id = self._study.river.enable_edges().index(self._data) + 1 + + logger.debug(f"Import frictions from {file_name}") + data = [] + with open(file_name, encoding="utf-8") as rug_file: + for line in rug_file: + if line.upper().startswith("K"): + line = line.split() + if int(line[1]) == reach_id: + data.append(line[1:]) + + print(data) + new_data = [] + for d in data: + new = None + minor = float(d[3]) + medium = float(d[4]) + for s in self._study.river.stricklers.stricklers: + if s.minor == minor and s.medium == medium: + new = s + break + if new is None: + new = self._study.river.stricklers.new(len( + self._study.river.stricklers)) + new.minor = minor + new.medium = medium + new_data.append([self._data, float(d[1]), float(d[2]), new, new]) + self.replace_data(new_data) diff --git a/src/View/Frictions/UndoCommand.py b/src/View/Frictions/UndoCommand.py index 6aab35d5..4fc0637d 100644 --- a/src/View/Frictions/UndoCommand.py +++ b/src/View/Frictions/UndoCommand.py @@ -143,6 +143,41 @@ class AddCommand(QUndoCommand): self._frictions.insert(self._index, self._new) +class ReplaceDataCommand(QUndoCommand): + def __init__(self, frictions, new_data): + QUndoCommand.__init__(self) + + self._frictions = frictions + self._new_data = new_data + self._old_rows = list(range(len(frictions))) + self._new_rows = list(range(len(new_data))) + + self._old_friction = [] + for row in self._old_rows: + self._old_friction.append((row, self._frictions.lst[row])) + + self._new_friction = [] + for row in self._new_rows: + new = Friction(status=self._frictions._status) + d = new_data[row] + new.edge = d[0] + new.begin_rk = d[1] + new.end_rk = d[2] + new.begin_strickler = d[3] + new.end_strickler = d[4] + self._new_friction.append((row, new)) + + def undo(self): + self._frictions.delete_i(self._new_rows) + for row, el in self._old_friction: + self._frictions.insert(row, el) + + def redo(self): + self._frictions.delete_i(self._old_rows) + for row, el in self._new_friction: + self._frictions.insert(row, el) + + class DelCommand(QUndoCommand): def __init__(self, frictions, rows): QUndoCommand.__init__(self) diff --git a/src/View/Frictions/Window.py b/src/View/Frictions/Window.py index 8e4959ea..f335a777 100644 --- a/src/View/Frictions/Window.py +++ b/src/View/Frictions/Window.py @@ -26,10 +26,11 @@ from PyQt5.QtGui import ( QKeySequence, ) +from PyQt5 import QtWidgets from PyQt5.QtCore import ( Qt, QVariant, QAbstractTableModel, QCoreApplication, QModelIndex, pyqtSlot, - QRect, + QRect, QSettings, ) from PyQt5.QtWidgets import ( @@ -46,7 +47,7 @@ from View.Frictions.UndoCommand import ( ) from View.Frictions.Table import ( - TableModel, ComboBoxDelegate + FrictionTableModel, ComboBoxDelegate ) from View.Tools.Plot.PamhyrCanvas import MplCanvas @@ -106,7 +107,7 @@ class FrictionsWindow(PamhyrWindow): ) table = self.find(QTableView, f"tableView") - self._table = TableModel( + self._table = FrictionTableModel( table_view=table, table_headers=self._trad.get_dict("table_headers"), editable_headers=[ @@ -157,6 +158,8 @@ class FrictionsWindow(PamhyrWindow): self.plot_2.draw() def setup_connections(self): + self.find(QAction, "action_import").triggered\ + .connect(self.import_from_file) self.find(QAction, "action_add").triggered.connect(self.add) self.find(QAction, "action_del").triggered.connect(self.delete) self.find(QAction, "action_sort").triggered.connect(self.sort) @@ -265,3 +268,22 @@ class FrictionsWindow(PamhyrWindow): parent=self ) strick.show() + + def import_from_file(self): + options = QFileDialog.Options() + settings = QSettings(QSettings.IniFormat, + QSettings.UserScope, 'MyOrg', ) + options |= QFileDialog.DontUseNativeDialog + + file_types = [self._trad["file_rug"], self._trad["file_all"]] + + file_name, _ = QtWidgets.QFileDialog.getOpenFileName( + self, + self._trad["open_file"], + "", + ";; ".join(file_types), + options=options + ) + + if file_name != "": + self._table.read_from_file(file_name) diff --git a/src/View/Frictions/translate.py b/src/View/Frictions/translate.py index 9f2d329b..969b9849 100644 --- a/src/View/Frictions/translate.py +++ b/src/View/Frictions/translate.py @@ -38,6 +38,10 @@ class FrictionsTranslate(MainTranslate): self._dict["Edit frictions"] = _translate( "Frictions", "Edit frictions" ) + self._dict["file_rug"] = _translate( + "Frictions", "Mage initial frictions file (*.RUG *.rug)") + self._dict["file_all"] = _translate( + "Frictions", "All files (*)") self._sub_dict["table_headers"] = { # "name": self._dict["name"], diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py index e61f0d9d..bf1d0f28 100644 --- a/src/View/InitialConditions/Table.py +++ b/src/View/InitialConditions/Table.py @@ -284,7 +284,6 @@ class InitialConditionTableModel(PamhyrTableModel): def read_from_ini(self, file_name): reach_id = self._data.river.enable_edges().index(self._reach) + 1 - print(f"reach : {reach_id}") logger.debug(f"Import initial conditions from {file_name}") data = [] diff --git a/src/View/ui/Frictions.ui b/src/View/ui/Frictions.ui index 77c32181..44127713 100644 --- a/src/View/ui/Frictions.ui +++ b/src/View/ui/Frictions.ui @@ -60,6 +60,7 @@ false + @@ -107,6 +108,18 @@ Ctrl+E + + + + ressources/import.pngressources/import.png + + + Import + + + Import from file + +