diff --git a/src/View/LateralContribution/Table.py b/src/View/LateralContribution/Table.py index e7596d14..5bee4de8 100644 --- a/src/View/LateralContribution/Table.py +++ b/src/View/LateralContribution/Table.py @@ -38,7 +38,7 @@ from View.LateralContribution.UndoCommand import ( SetNameCommand, SetEdgeCommand, SetTypeCommand, SetBeginCommand, SetEndCommand, AddCommand, DelCommand, SortCommand, - MoveCommand, PasteCommand, DuplicateCommand, + MoveCommand, PasteCommand, DuplicateCommand, ImportCommand, ) from Model.LateralContribution.LateralContributionTypes import ( @@ -116,17 +116,20 @@ class ComboBoxDelegate(QItemDelegate): def setModelData(self, editor, model, index): text = str(editor.currentText()) - if self._mode == "rk" and self._data.reach is not None: - profiles = list( - filter( - lambda p: p.display_name() == text, - self._data.reach.profiles - ) - ) - - value = profiles[0].rk if len(profiles) > 0 else None - else: + if self._data is None: value = text + else: + if self._mode == "rk" and self._data.reach is not None: + profiles = list( + filter( + lambda p: p.display_name() == text, + self._data.reach.profiles + ) + ) + + value = profiles[0].rk if len(profiles) > 0 else None + else: + value = text model.setData(index, value) editor.close() @@ -293,3 +296,34 @@ class TableModel(PamhyrTableModel): self.endMoveRows() self.layoutChanged.emit() + + def read_from_lat(self, file_name): + logger.debug(f"Import lateral contributions from {file_name}") + data = [] + current_reach = -1 + with open(file_name, encoding="utf-8") as lat_file: + for line in lat_file: + if not (line.startswith("#") or + line.startswith("*") or + len(line) < 1): + line = line.split() + if line[0] == "$": + current_reach = int(line[1]) - 1 + if (current_reach <= len(self._data.enable_edges()) and + current_reach > 0) : + data.append([self._data.enable_edges()[current_reach], float(line[2]), float(line[3])]) + else: + if (current_reach <= len(self._data.enable_edges()) and + current_reach > 0) : + data[-1].append([float(line[0]), float(line[1])]) + + self.layoutAboutToBeChanged.emit() + + self._undo.push( + ImportCommand( + self._lst, self._tab, data + ) + ) + + self.layoutAboutToBeChanged.emit() + self.layoutChanged.emit() diff --git a/src/View/LateralContribution/UndoCommand.py b/src/View/LateralContribution/UndoCommand.py index 2ecbe67b..a320073f 100644 --- a/src/View/LateralContribution/UndoCommand.py +++ b/src/View/LateralContribution/UndoCommand.py @@ -28,6 +28,10 @@ from Model.LateralContribution.LateralContributionList import ( LateralContributionList ) +from Model.LateralContribution.LateralContributionTypes import ( + NotDefined, LateralContrib, +) + class SetNameCommand(QUndoCommand): def __init__(self, lcs, tab, index, new_value): @@ -213,36 +217,72 @@ class MoveCommand(QUndoCommand): class PasteCommand(QUndoCommand): - def __init__(self, lcs, tab, row, bc): + def __init__(self, lcs, tab, row, lc): QUndoCommand.__init__(self) self._lcs = lcs self._tab = tab self._row = row - self._lc = deepcopy(bc) + self._lc = deepcopy(lc) self._lc.reverse() def undo(self): self._lcs.delete(self._tab, self._lc) def redo(self): - for bc in self._lc: - self._lcs.insert(self._tab, self._row, bc) + for lc in self._lc: + self._lcs.insert(self._tab, self._row, lc) +class ImportCommand(QUndoCommand): + def __init__(self, lcs, tab, data): + QUndoCommand.__init__(self) + + self._tab = tab + self._lcs = lcs + self._data = data + self._old_rows = list(range(len(self._lcs.get_tab(self._tab)))) + self._new_rows = list(range(len(self._data))) + + self._new_lc = None + self._old_lc = [] + for row in self._old_rows: + self._old_lc.append((row, self._lcs.get(self._tab, row))) + + def undo(self): + self._lcs.delete_i(self._tab, self._new_rows) + for row, el in self._old_lc: + self._lcs.insert(self._tab, row, el) + + def redo(self): + self._lcs.delete_i(self._tab, self._old_rows) + if self._new_lc == None: + self._new_lc = [] + for row, data in enumerate(self._data): + new = LateralContrib(status=self._lcs._status) + new.edge = data[0] + new.begin_rk = data[1] + new.end_rk = data[2] + for i, val in enumerate(data[3:]): + new.insert(i, val) + self._new_lc.append(new) + + for row, el in enumerate(self._new_lc): + self._lcs.insert(self._tab, row, el) + class DuplicateCommand(QUndoCommand): - def __init__(self, lcs, tab, rows, bc): + def __init__(self, lcs, tab, rows, lc): QUndoCommand.__init__(self) self._lcs = lcs self._tab = tab self._rows = rows - self._lc = deepcopy(bc) + self._lc = deepcopy(lc) self._lc.reverse() def undo(self): self._lcs.delete(self._tab, self._lc) def redo(self): - for bc in self._lcs: - self._lcs.insert(self._tab, self._rows[0], bc) + for lc in self._lcs: + self._lcs.insert(self._tab, self._rows[0], lc) diff --git a/src/View/LateralContribution/Window.py b/src/View/LateralContribution/Window.py index db8b2791..1b74f5cf 100644 --- a/src/View/LateralContribution/Window.py +++ b/src/View/LateralContribution/Window.py @@ -22,6 +22,7 @@ from tools import trace, timer from View.Tools.PamhyrWindow import PamhyrWindow +from PyQt5 import QtWidgets from PyQt5.QtGui import ( QKeySequence, ) @@ -29,7 +30,7 @@ from PyQt5.QtGui import ( from PyQt5.QtCore import ( Qt, QVariant, QAbstractTableModel, QCoreApplication, QModelIndex, pyqtSlot, - QRect, + QRect, QSettings, ) from PyQt5.QtWidgets import ( @@ -153,6 +154,8 @@ class LateralContributionWindow(PamhyrWindow): ) 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_edit").triggered.connect(self.edit) @@ -297,3 +300,26 @@ class LateralContributionWindow(PamhyrWindow): parent=self ) win.show() + + def import_from_file(self): + options = QFileDialog.Options() + settings = QSettings(QSettings.IniFormat, + QSettings.UserScope, 'MyOrg', ) + options |= QFileDialog.DontUseNativeDialog + + file_types = [ + self._trad["file_lat"], + self._trad["file_all"], + ] + + filename, _ = QtWidgets.QFileDialog.getOpenFileName( + self, + self._trad["open_file"], + "", + ";; ".join(file_types), + options=options + ) + + if filename != "": + tab = self.current_tab() + self._table[tab].read_from_lat(filename) diff --git a/src/View/LateralContribution/translate.py b/src/View/LateralContribution/translate.py index e3de3d87..787e0cfb 100644 --- a/src/View/LateralContribution/translate.py +++ b/src/View/LateralContribution/translate.py @@ -52,6 +52,10 @@ class LCTranslate(MainTranslate): self._dict["x"] = _translate("Geometry", "X (m)") self._dict["y"] = _translate("Geometry", "Y (m)") self._dict["z"] = _translate("Geometry", "Z (m)") + self._dict["file_lat"] = _translate( + "LateralContribution", "Shapefile (*.LAT *.lat)") + self._dict["file_all"] = _translate( + "LateralContribution", "All files (*)") self._sub_dict["table_headers"] = { "name": self._dict["name"], diff --git a/src/View/ui/EditLateralContribution.ui b/src/View/ui/EditLateralContribution.ui index 21736a6b..2e739f88 100644 --- a/src/View/ui/EditLateralContribution.ui +++ b/src/View/ui/EditLateralContribution.ui @@ -112,6 +112,18 @@ Sort points + + + + ressources/import.pngressources/import.png + + + Import + + + Import from file + + diff --git a/src/View/ui/LateralContributions.ui b/src/View/ui/LateralContributions.ui index 32f4f60a..5d44cba2 100644 --- a/src/View/ui/LateralContributions.ui +++ b/src/View/ui/LateralContributions.ui @@ -97,6 +97,7 @@ false + @@ -162,6 +163,18 @@ Sort by names + + + + ressources/import.pngressources/import.png + + + Import + + + Import from file + +