From 181776f33fef562ffc57cab63019b85a6fe6f41d Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr> Date: Tue, 25 Jul 2023 13:51:49 +0200 Subject: [PATCH] SL: Edit: Add Plot. --- src/Model/SedimentLayer/SedimentLayer.py | 14 +++ src/View/SedimentLayers/Edit/Plot.py | 104 +++++++++++++++++++++++ src/View/SedimentLayers/Edit/Window.py | 15 ++-- 3 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 src/View/SedimentLayers/Edit/Plot.py diff --git a/src/Model/SedimentLayer/SedimentLayer.py b/src/Model/SedimentLayer/SedimentLayer.py index f1b8a88a..020f247a 100644 --- a/src/Model/SedimentLayer/SedimentLayer.py +++ b/src/Model/SedimentLayer/SedimentLayer.py @@ -143,6 +143,15 @@ class SedimentLayer(SQLSubModel): def __len__(self): return len(self._layers) + @property + def layers(self): + return self._layers.copy() + + def height(self): + return list( + map(lambda l: l.height, self._layers) + ) + @property def name(self): return self._name @@ -151,6 +160,11 @@ class SedimentLayer(SQLSubModel): def name(self, name): self._name = name + def names(self): + return list( + map(lambda l: l.name, self._layers) + ) + @property def comment(self): return self._comment diff --git a/src/View/SedimentLayers/Edit/Plot.py b/src/View/SedimentLayers/Edit/Plot.py new file mode 100644 index 00000000..86a1c8d9 --- /dev/null +++ b/src/View/SedimentLayers/Edit/Plot.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- + +import logging + +from functools import reduce + +from tools import timer +from View.Plot.APlot import APlot + +from PyQt5.QtCore import ( + QCoreApplication +) + +_translate = QCoreApplication.translate + +logger = logging.getLogger() + +class Plot(APlot): + def __init__(self, canvas=None, data=None, toolbar=None, + display_current=True): + super(Plot, self).__init__( + canvas=canvas, + data=data, + toolbar=toolbar + ) + + self._display_current = display_current + + self.line_kp_zmin = None + self.line_kp_sl = [] + + @timer + def draw(self): + self.canvas.axes.cla() + self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) + + if self.data is None: + return + + self.canvas.axes.set_xlabel( + _translate("MainWindow_reach", "X (m)"), + color='green', fontsize=12 + ) + self.canvas.axes.set_ylabel( + _translate("MainWindow_reach", "Height (m)"), + color='green', fontsize=12 + ) + + x = [0,1] + z = [0,0] + sl = self.data.height() + names = ["fond"] + self.data.names() + + self.canvas.axes.set_xlim( + left = min(x), right = max(x) + ) + + lsl = [] + for i in range(len(sl)): + cur = [] + for _ in x: + cur.append(sl[i]) + lsl.append(cur) + + # Compute sediment layer in function to point z + z_sl = reduce( + lambda acc, v: acc + [ + list( + map(lambda x, y: y - x, v, acc[-1]) + ) + ], + lsl, + [z] + ) + + for i, zsl in enumerate(z_sl): + self.line_kp_sl.append(None) + self.line_kp_sl[i], = self.canvas.axes.plot( + x, zsl, + label=names[i], + linestyle="solid" if i == 0 else "--", + lw=1.8, + color='grey' if i == 0 else None + ) + self.canvas.axes.text(x[0] + 0.01, zsl[0] + 0.01, f'{names[i]}') + + self.canvas.figure.tight_layout() + self.canvas.figure.canvas.draw_idle() + if self.toolbar is not None: + self.toolbar.update() + + self._init = True + + @timer + def update(self, ind=None): + if self._init == False: + self.draw() + return + + if ind is None: + logger.info("TODO: Update") + + self.canvas.axes.autoscale_view(True, True, True) + self.canvas.figure.canvas.draw_idle() diff --git a/src/View/SedimentLayers/Edit/Window.py b/src/View/SedimentLayers/Edit/Window.py index 44100d6f..a95e4ff0 100644 --- a/src/View/SedimentLayers/Edit/Window.py +++ b/src/View/SedimentLayers/Edit/Window.py @@ -28,6 +28,7 @@ from View.Plot.MplCanvas import MplCanvas from View.SedimentLayers.Edit.UndoCommand import * from View.SedimentLayers.Edit.Table import * +from View.SedimentLayers.Edit.Plot import Plot from View.SedimentLayers.Edit.translate import * _translate = QCoreApplication.translate @@ -91,13 +92,13 @@ class EditSedimentLayersWindow(ASubMainWindow, ListedSubWindow): self.plot_layout = self.find(QVBoxLayout, "verticalLayout") self.plot_layout.addWidget(self.canvas) - # self.plot = PlotKPC( - # canvas = self.canvas, - # data = self._reach.reach, - # toolbar = None, - # display_current = False - # ) - # self.plot.draw() + self.plot = Plot( + canvas = self.canvas, + data = self._sl, + toolbar = None, + display_current = False + ) + self.plot.draw() def setup_connections(self): -- GitLab