diff --git a/src/Model/InitialConditions/InitialConditions.py b/src/Model/InitialConditions/InitialConditions.py index e450a94f60890efef707fc8d8c4f98b6c4b64471..f598ade0785698129d46ad3701eb9c67842f116b 100644 --- a/src/Model/InitialConditions/InitialConditions.py +++ b/src/Model/InitialConditions/InitialConditions.py @@ -2,6 +2,7 @@ from copy import copy from tools import trace, timer +from functools import reduce class Data(object): def __init__(self, reach = None, status = None): @@ -117,6 +118,10 @@ class InitialConditions(object): def data(self): return self._data.copy() + @data.setter + def data(self, data): + self._data = data + def get(self, index): return self._data[index] @@ -175,3 +180,40 @@ class InitialConditions(object): def get_flow(self): return self._data_get("flow") + + def _sort_by_z_and_kp(self, profiles): + profiles.sort( + reverse = False, + key = lambda p: p.kp + ) + + first_z = profiles[0].z() + last_z = profiles[-1].z() + + if first_z > last_z: + profiles.sort( + reverse = True, + key = lambda p: p.kp + ) + + def generate_growing_constante_draft(self, draft:int): + self._data = [] + + profiles = self._reach.reach.profiles + self._sort_by_z_and_kp(profiles) + + prev = None + for profile in profiles: + new = Data(reach = self._reach, status = self._status) + new["kp"] = profile.kp + + if prev is None: + new["elevation"] = profile.z_min() + draft + else: + new["elevation"] = max( + profile.z_min() + draft, + prev["elevation"] + ) + + self._data.append(new) + prev = new diff --git a/src/View/InitialConditions/PlotDKP.py b/src/View/InitialConditions/PlotDKP.py index 60fd433528bf894274bcd1312e7cba9fb16b5bf7..247605b3a143e280845d2984dd2f47911e64352f 100644 --- a/src/View/InitialConditions/PlotDKP.py +++ b/src/View/InitialConditions/PlotDKP.py @@ -25,9 +25,6 @@ class PlotDKP(APlot): if self.data is None: return - if len(self.data) == 0: - return - self.canvas.axes.set_ylabel( _translate("MainWindow_reach", "Draft (m)"), color='green', fontsize=11 @@ -49,13 +46,14 @@ class PlotDKP(APlot): color='grey', lw=1. ) - kp = self.data.get_kp() - elevation = self.data.get_elevation() + if len(self.data) != 0: + kp = self.data.get_kp() + elevation = self.data.get_elevation() - self.line_kp_elevation = self.canvas.axes.plot( - kp, elevation, - color='b', marker='+', lw=1. - ) + self.line_kp_elevation = self.canvas.axes.plot( + kp, elevation, + color='b', marker='+', lw=1. + ) self.canvas.figure.tight_layout() self.canvas.figure.canvas.draw_idle() diff --git a/src/View/InitialConditions/PlotFlow.py b/src/View/InitialConditions/PlotFlow.py index 16f29eb4aef51b62f85c7379432ca8d58f1fd72d..dad90e49e1ad133fdc5f16cabeb2c13f1e288747 100644 --- a/src/View/InitialConditions/PlotFlow.py +++ b/src/View/InitialConditions/PlotFlow.py @@ -25,9 +25,6 @@ class PlotFlow(APlot): if self.data is None: return - if len(self.data) == 0: - return - self.canvas.axes.set_ylabel( _translate("MainWindow_reach", "Flow (m^3/s)"), color='green', fontsize=11 @@ -43,13 +40,14 @@ class PlotFlow(APlot): left = min(kp), right = max(kp) ) - kp = self.data.get_kp() - flow = self.data.get_flow() + if len(self.data) != 0: + kp = self.data.get_kp() + flow = self.data.get_flow() - self.line_kp_zmin = self.canvas.axes.plot( - kp, flow, - color='r', lw=1. - ) + self.line_kp_zmin = self.canvas.axes.plot( + kp, flow, + color='r', lw=1. + ) self.canvas.figure.tight_layout() self.canvas.figure.canvas.draw_idle() diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py index d969ee514c759b47ffc0ffe7f48a8c4b9b474a74..13eb52181869a72dbc5cfd0532c0958f57be59c7 100644 --- a/src/View/InitialConditions/Table.py +++ b/src/View/InitialConditions/Table.py @@ -18,7 +18,7 @@ from PyQt5.QtWidgets import ( from View.InitialConditions.UndoCommand import ( SetCommand, AddCommand, DelCommand, SortCommand, MoveCommand, PasteCommand, - DuplicateCommand, + DuplicateCommand, GenerateCommand, ) from View.InitialConditions.translate import * @@ -173,7 +173,7 @@ class TableModel(QAbstractTableModel): self.beginMoveRows(parent, row - 1, row - 1, parent, target) - self._undo_stack.push( + self._undo.push( MoveCommand( self._ics, "up", row ) @@ -190,7 +190,7 @@ class TableModel(QAbstractTableModel): self.beginMoveRows(parent, row + 1, row + 1, parent, target) - self._undo_stack.push( + self._undo.push( MoveCommand( self._ics, "down", row ) @@ -206,3 +206,11 @@ class TableModel(QAbstractTableModel): def redo(self): self._undo.redo() self.layoutChanged.emit() + + def generate(self, generator, param): + self._undo.push( + GenerateCommand( + self._ics, generator, param + ) + ) + self.layoutChanged.emit() diff --git a/src/View/InitialConditions/UndoCommand.py b/src/View/InitialConditions/UndoCommand.py index 0daeb4b0be7a8436b6e39e4693be9df29482ebef..df4f96b8a984aa41507d8393fa2b42d91397a9f2 100644 --- a/src/View/InitialConditions/UndoCommand.py +++ b/src/View/InitialConditions/UndoCommand.py @@ -146,3 +146,19 @@ class DuplicateCommand(QUndoCommand): def redo(self): for ic in self._ics: self._ics.insert(self._rows[0], ic) + +class GenerateCommand(QUndoCommand): + def __init__(self, ics, generator, param): + QUndoCommand.__init__(self) + + self._ics = ics + self._param = param + self._copy = self._ics.data + self._generator = generator + + def undo(self): + self._ics.data = self._copy + + def redo(self): + #if self._generator == "growing": + self._ics.generate_growing_constante_draft(self._param) diff --git a/src/View/InitialConditions/Window.py b/src/View/InitialConditions/Window.py index 91d2c975b85fac75397f8f2ca146aa65c4ca66da..7a8fdd022ccffdb0d26a3ba5f3deba3ca1c0e3a3 100644 --- a/src/View/InitialConditions/Window.py +++ b/src/View/InitialConditions/Window.py @@ -126,6 +126,10 @@ class InitialConditionsWindow(ASubMainWindow, ListedSubWindow): self.find(QAction, "action_del").triggered.connect(self.delete) self.find(QAction, "action_sort").triggered.connect(self.sort) + self.find(QPushButton, "pushButton_generate_1").clicked.connect( + self.generate_growing_constante_draft + ) + self.undo_sc.activated.connect(self.undo) self.redo_sc.activated.connect(self.redo) self.copy_sc.activated.connect(self.copy) @@ -201,3 +205,7 @@ class InitialConditionsWindow(ASubMainWindow, ListedSubWindow): def redo(self): self._table.redo() self._update_plot() + + def generate_growing_constante_draft(self): + self._table.generate("growing", 1) + self._update_plot() diff --git a/src/View/Plot/MplCanvas.py b/src/View/Plot/MplCanvas.py index a78da19c6f411d0c98743a477b3c4b9491fbf4af..5b3fc4a8ff5a8eafb273fe81a765fdc78505136c 100644 --- a/src/View/Plot/MplCanvas.py +++ b/src/View/Plot/MplCanvas.py @@ -4,7 +4,11 @@ from matplotlib.figure import Figure class MplCanvas(FigureCanvasQTAgg): def __init__(self, width=5, height=4, dpi=100): - fig = Figure(figsize=(width, height), dpi=dpi) + fig = Figure( + figsize=(width, height), + dpi=dpi, + layout='tight', + ) super(MplCanvas, self).__init__(fig) self.axes = fig.add_subplot(111)