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