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