diff --git a/src/View/InitialConditions/PlotDKP.py b/src/View/InitialConditions/PlotDKP.py index 23752aef6a77dd3bd47336d4bdc6d95a89dbc124..58a83219e3afea0ccc3672433ded6550a080f17e 100644 --- a/src/View/InitialConditions/PlotDKP.py +++ b/src/View/InitialConditions/PlotDKP.py @@ -42,7 +42,7 @@ class PlotDKP(APlot): return self.canvas.axes.set_ylabel( - _translate("MainWindow_reach", "Draft (m)"), + _translate("MainWindow_reach", "Elevation (m)"), color='green', fontsize=11 ) self.canvas.axes.set_xlabel( diff --git a/src/View/Results/PlotAC.py b/src/View/Results/PlotAC.py index 7c882e6e9f937e7c040355f25ebd83f96a802e3a..f0e4b0e287ae351699c5a531aba8aae22f5db797 100644 --- a/src/View/Results/PlotAC.py +++ b/src/View/Results/PlotAC.py @@ -15,3 +15,101 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. # -*- coding: utf-8 -*- + +from tools import timer +from View.Plot.APlot import APlot + +from PyQt5.QtCore import ( + QCoreApplication +) + +_translate = QCoreApplication.translate + +class PlotAC(APlot): + def __init__(self, canvas=None, results=None, + reach_id=0, profile_id=0, + toolbar=None): + super(PlotAC, self).__init__( + canvas=canvas, + data=results, + toolbar=toolbar + ) + + self._current_timestamp = max(results.get("timestamps")) + self._current_reach_id = reach_id + self._current_profile_id = profile_id + + @property + def results(self): + return self.data + + @timer + def draw(self, highlight=None): + self.canvas.axes.cla() + self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) + + if self.results is None: + return + + self.canvas.axes.set_xlabel( + _translate("MainWindow_reach", "X (m)"), + color='green', fontsize=11 + ) + self.canvas.axes.set_ylabel( + _translate("MainWindow_reach", "Elevation (m)"), + color='green', fontsize=11 + ) + + reach = self.results.river.reach(self._current_reach_id) + profile = reach.profile(self._current_profile_id) + x = profile.geometry.get_station() + z = profile.geometry.z() + + self.canvas.axes.set_xlim( + left = min(x), right = max(x) + ) + + self.line_kp, = self.canvas.axes.plot( + x, z, + linestyle="solid", + lw=1.8, + color='grey', + ) + + kp = reach.geometry.get_kp() + + # Water elevation + water_z = profile.get_ts_key(self._current_timestamp, "Z") + + self.canvas.axes.plot( + [min(x), max(x)], [water_z, water_z], + lw=1., color='b', + ) + + x_z = list(map(lambda _: water_z, x)) + self.canvas.axes.fill_between( + x, z, water_z, + where=z <= water_z, + color='blue', alpha=0.5, interpolate=True + ) + + 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.draw() + + def set_profile(self, profile_id): + self._current_profile_id = profile_id + self.draw() + + def set_timestamp(self, timestamp): + self._current_timestamp = timestamp + self.draw() + + def update(self): + self.draw() diff --git a/src/View/Results/PlotKPC.py b/src/View/Results/PlotKPC.py index c044d35e7fa1e8fc98645d0f0f6861887a5d008f..4d7f69a6d02b858c78704b09707ff67fed7177ca 100644 --- a/src/View/Results/PlotKPC.py +++ b/src/View/Results/PlotKPC.py @@ -15,3 +15,98 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. # -*- coding: utf-8 -*- + +from tools import timer +from View.Plot.APlot import APlot + +from PyQt5.QtCore import ( + QCoreApplication +) + +_translate = QCoreApplication.translate + +class PlotKPC(APlot): + def __init__(self, canvas=None, results=None, + reach_id=0, profile_id=0, + toolbar=None): + super(PlotKPC, self).__init__( + canvas=canvas, + data=results, + toolbar=toolbar + ) + + self._current_timestamp = max(results.get("timestamps")) + self._current_reach_id = reach_id + self._current_profile_id = profile_id + + @property + def results(self): + return self.data + + @timer + def draw(self, highlight=None): + self.canvas.axes.cla() + self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) + + 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='green', fontsize=11 + ) + self.canvas.axes.set_xlabel( + _translate("MainWindow_reach", "KP (m)"), + color='green', fontsize=11 + ) + + kp = reach.geometry.get_kp() + z_min = reach.geometry.get_z_min() + + 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. + ) + + if len(reach.geometry.profiles) != 0: + kp = reach.geometry.get_kp() + + # Water elevation + water_z = list( + map( + lambda p: p.get_ts_key(self._current_timestamp, "Z"), + reach.profiles + ) + ) + + self.canvas.axes.plot( + kp, water_z, lw=1., + color='b', + ) + + 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.draw() + + def set_profile(self, profile_id): + self._current_profile_id = profile_id + self.draw() + + def set_timestamp(self, timestamp): + self._current_timestamp = timestamp + self.draw() + + def update(self): + self.draw() diff --git a/src/View/Results/PlotXY.py b/src/View/Results/PlotXY.py index a0af6a2d81a91c0e6cbcf4632e15d2d3b2e5e18f..905692a3d31a8f1cf3eb94536184e61e1568146b 100644 --- a/src/View/Results/PlotXY.py +++ b/src/View/Results/PlotXY.py @@ -88,7 +88,7 @@ class PlotXY(APlot): self.line_xy = [ self.canvas.axes.plot( x, y, lw=1., - color='b' if kp_min <= kp <= kp_max else 'r', + color='b' if kp_min <= kp <= kp_max else 'grey', markersize=3, marker='+' ) for x, y, kp in zip( diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index dbf335f004344810dd0d759630028af57e8491d6..4ae5293e43938d26940a7fcc85c0129d7b1ea8de 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -43,6 +43,9 @@ from PyQt5.QtWidgets import ( from View.Plot.MplCanvas import MplCanvas from View.Results.PlotXY import PlotXY +from View.Results.PlotAC import PlotAC +from View.Results.PlotKPC import PlotKPC + from View.Results.Table import TableModel from View.Results.translate import * from View.Stricklers.Window import StricklersWindow @@ -112,9 +115,11 @@ class ResultsWindow(ASubMainWindow, ListedSubWindow): self._slider_profile = self.find(QSlider, f"verticalSlider_profile") default_reach = self._results.river.reach(0) self._slider_profile.setMaximum(len(default_reach.profiles) - 1) + self._slider_profile.setValue(0) self._slider_time = self.find(QSlider, f"horizontalSlider_time") self._slider_time.setMaximum(len(self._timestamps) - 1) + self._slider_time.setValue(len(self._timestamps) - 1) def setup_graph(self): self.canvas = MplCanvas(width=5, height=4, dpi=100) @@ -137,18 +142,28 @@ class ResultsWindow(ASubMainWindow, ListedSubWindow): self.plot_layout_2 = self.find(QVBoxLayout, "verticalLayout_2") self.plot_layout_2.addWidget(self.canvas_2) - # self.plot_2 = PlotStricklers( - # canvas = self.canvas_2, - # data = self._reach, - # toolbar = None - # ) - # self.plot_2.draw() + self.plot_kpc = PlotKPC( + canvas = self.canvas_2, + results = self._results, + reach_id = 0, + profile_id = 0, + toolbar = None + ) + self.plot_kpc.draw() self.canvas_3 = MplCanvas(width=5, height=4, dpi=100) self.canvas_3.setObjectName("canvas_3") self.plot_layout_3 = self.find(QVBoxLayout, "verticalLayout_3") self.plot_layout_3.addWidget(self.canvas_3) + self.plot_ac = PlotAC( + canvas = self.canvas_3, + results = self._results, + reach_id = 0, + profile_id = 0, + toolbar = None + ) + self.plot_ac.draw() def setup_connections(self): self.undo_sc.activated.connect(self.undo) @@ -177,25 +192,35 @@ class ResultsWindow(ASubMainWindow, ListedSubWindow): def update(self, reach_id = None, profile_id = None, timestamp = None): if reach_id is not None: self.plot_xy.set_reach(reach_id) + self.plot_ac.set_reach(reach_id) + self.plot_kpc.set_reach(reach_id) if profile_id is not None: self.plot_xy.set_profile(profile_id) + self.plot_ac.set_profile(profile_id) + self.plot_kpc.set_profile(profile_id) if timestamp is not None: self.plot_xy.set_timestamp(timestamp) + self.plot_ac.set_timestamp(timestamp) + self.plot_kpc.set_timestamp(timestamp) self.plot_xy.draw() + self.plot_ac.draw() + self.plot_kpc.draw() def _set_current_reach(self): table = self.find(QTableView, f"tableView_reach") indexes = table.selectedIndexes() - self.update(reach_id = indexes[0]) + self.update(reach_id = indexes[0].row()) def _set_current_profile(self): table = self.find(QTableView, f"tableView_profile") indexes = table.selectedIndexes() - self.update(profile_id = indexes[0]) + ind = indexes[0].row() + self.update(profile_id = ind) + self._slider_profile.setValue(ind) def _set_current_profile_slider(self): pid = self._slider_profile.value()