From 6055065e27894eaef85d16cbf0ae2ee3047aeac8 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Mon, 19 Feb 2024 10:57:58 +0100
Subject: [PATCH] Results: Update plot KPC.

---
 src/View/Results/PlotKPC.py | 130 +++++++++++++++++++++++++++---------
 1 file changed, 98 insertions(+), 32 deletions(-)

diff --git a/src/View/Results/PlotKPC.py b/src/View/Results/PlotKPC.py
index 82aa3a44..34a4ca5e 100644
--- a/src/View/Results/PlotKPC.py
+++ b/src/View/Results/PlotKPC.py
@@ -16,6 +16,8 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+
 from tools import timer
 from View.Tools.PamhyrPlot import PamhyrPlot
 
@@ -23,6 +25,8 @@ from PyQt5.QtCore import (
     QCoreApplication
 )
 
+logger = logging.getLogger()
+
 _translate = QCoreApplication.translate
 
 
@@ -42,6 +46,15 @@ class PlotKPC(PamhyrPlot):
         self._current_reach_id = reach_id
         self._current_profile_id = profile_id
 
+        self.label_x = _translate("Results", "KP (m)")
+        self.label_y = _translate("Results", "Elevation (m)")
+
+        self.label_bottom = _translate("Results", "River bottom")
+        self.label_water = _translate("Results", "Water elevation")
+        self.label_water_max = _translate("Results", "Max water elevation")
+
+        self._isometric_axis = False
+
     @property
     def results(self):
         return self.data
@@ -53,57 +66,84 @@ class PlotKPC(PamhyrPlot):
 
     @timer
     def draw(self, highlight=None):
-        self.canvas.axes.cla()
-        self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5)
+        self.init_axes()
 
         if self.results is None:
             return
 
         reach = self.results.river.reach(self._current_reach_id)
 
-        self.canvas.axes.set_ylabel(
-            _translate("MainWindow_reach", "Elevation (m)"),
-            color='black', fontsize=11
-        )
-        self.canvas.axes.set_xlabel(
-            _translate("MainWindow_reach", "KP (m)"),
-            color='black', fontsize=11
-        )
 
+        self.draw_bottom(reach)
+        self.draw_water_elevation(reach)
+        self.draw_water_elevation_max(reach)
+        self.draw_current(reach)
+
+        # self.enable_legend()
+
+        self.idle()
+        self._init = True
+
+    def draw_bottom(self, reach):
         kp = reach.geometry.get_kp()
         z_min = reach.geometry.get_z_min()
         z_max = reach.geometry.get_z_max()
 
-        self.canvas.axes.set_xlim(
-            left=min(kp), right=max(kp)
-        )
-
         self.line_kp_zmin = self.canvas.axes.plot(
             kp, z_min,
-            color='grey', lw=1.
+            color=self.color_plot_river_bottom,
+            lw=1.
         )
 
+    def draw_water_elevation(self, reach):
         if len(reach.geometry.profiles) != 0:
             kp = reach.geometry.get_kp()
+            z_min = reach.geometry.get_z_min()
 
-            # Water elevation
             water_z = list(
                 map(
-                    lambda p: p.get_ts_key(self._current_timestamp, "Z"),
+                    lambda p: p.get_ts_key(
+                        self._current_timestamp, "Z"
+                    ),
                     reach.profiles
                 )
             )
 
-            self.canvas.axes.plot(
-                kp, water_z, lw=1.,
-                color='b',
+            self.water = self.canvas.axes.plot(
+                kp, water_z,
+                lw=1., color=self.color_plot_river_water,
             )
 
-            self.canvas.axes.fill_between(
+            self.water_fill = self.canvas.axes.fill_between(
                 kp, z_min, water_z,
-                color='skyblue', alpha=0.7, interpolate=True
+                color=self.color_plot_river_water_zone,
+                alpha=0.7,
+                interpolate=True
+            )
+
+    def draw_water_elevation_max(self, reach):
+        if len(reach.geometry.profiles) != 0:
+            kp = reach.geometry.get_kp()
+            z_min = reach.geometry.get_z_min()
+
+            water_z = list(
+                map(
+                    lambda p: max(p.get_key("Z")),
+                    reach.profiles
+                )
             )
 
+            self.canvas.axes.plot(
+                kp, water_z, lw=1.,
+                color=self.color_plot_river_water,
+                linestyle='dotted',
+            )
+
+    def draw_current(self, reach):
+        kp = reach.geometry.get_kp()
+        z_min = reach.geometry.get_z_min()
+        z_max = reach.geometry.get_z_max()
+
         self.profile, = self.canvas.axes.plot(
             [
                 kp[self._current_profile_id],
@@ -113,31 +153,57 @@ class PlotKPC(PamhyrPlot):
                 z_max[self._current_profile_id],
                 z_min[self._current_profile_id]
             ],
-            color='red', lw=1.
+            color=self.color_plot,
+            lw=1.
         )
 
-        self.canvas.figure.tight_layout()
-        self.canvas.figure.canvas.draw_idle()
-        if self.toolbar is not None:
-            self.toolbar.update()
-
     def set_reach(self, reach_id):
         self._current_reach_id = reach_id
         self._current_profile_id = 0
-        self.update()
+        self.draw()
 
     def set_profile(self, profile_id):
         self._current_profile_id = profile_id
-        self.update_profil()
+        self.update_current()
 
     def set_timestamp(self, timestamp):
         self._current_timestamp = timestamp
         self.update()
 
     def update(self):
-        self.draw()
+        if not self._init:
+            self.draw()
+
+        self.update_water_elevation()
+
+        self.update_idle()
+
+    def update_water_elevation(self):
+        reach = self.results.river.reach(self._current_reach_id)
+        kp = reach.geometry.get_kp()
+        z_min = reach.geometry.get_z_min()
+
+        water_z = list(
+            map(
+                lambda p: p.get_ts_key(
+                    self._current_timestamp, "Z"
+                ),
+                reach.profiles
+            )
+        )
+
+        self.water[0].set_data(
+            kp, water_z
+        )
+
+        self.water_fill.remove()
+        self.water_fill = self.canvas.axes.fill_between(
+            kp, z_min, water_z,
+            color=self.color_plot_river_water_zone,
+            alpha=0.7, interpolate=True
+        )
 
-    def update_profil(self):
+    def update_current(self):
         reach = self.results.river.reach(self._current_reach_id)
         kp = reach.geometry.get_kp()
         z_min = reach.geometry.get_z_min()
-- 
GitLab