Results: Add hydrograph.

mesh
Pierre-Antoine Rouby 2023-08-11 09:28:15 +02:00
parent add8261ceb
commit 35ee6617ac
2 changed files with 150 additions and 0 deletions

131
src/View/Results/PlotH.py Normal file
View File

@ -0,0 +1,131 @@
# PlotH.py -- Pamhyr
# Copyright (C) 2023 INRAE
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# -*- coding: utf-8 -*-
import logging
from functools import reduce
from tools import timer, trace
from View.Plot.APlot import APlot
from PyQt5.QtCore import (
QCoreApplication
)
_translate = QCoreApplication.translate
logger = logging.getLogger()
class PlotH(APlot):
def __init__(self, canvas=None, results=None,
reach_id=0, profile_id=0,
toolbar=None, display_current=True):
super(PlotH, self).__init__(
canvas=canvas,
data=results,
toolbar=toolbar
)
self.display_current = display_current
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)
profile = reach.profile(self._current_profile_id)
if reach.geometry.number_profiles == 0:
self._init = False
return
kp_min, kp_max = (-1, -1)
if highlight is not None:
kp_min, kp_max = highlight
# Axes
self.canvas.axes.set_xlabel(
_translate("Results", "Time (s)"),
color='green', fontsize=12
)
self.canvas.axes.set_ylabel(
_translate("Results", "Discharge (m³/s)"),
color='green', fontsize=12
)
ts = list(self.results.get("timestamps"))
ts.sort()
self.canvas.axes.set_xlim(
left = min(ts), right = max(ts)
)
# Draw discharge for each timestamp
x = ts
y = profile.get_key("Q")
if len(ts) != len(x):
logger.warning(
"Results as less Q data ({len(x)}) " +
"than timestamps ({len(ts)}) " +
"for profile {self._current_profile_id}"
)
return
self._line = [
self.canvas.axes.plot(
x, y, lw=1.,
color='r',
markersize=3, marker='+'
)
]
self.canvas.axes.autoscale_view(True, True, True)
self.canvas.axes.autoscale()
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()

View File

@ -45,6 +45,7 @@ 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.PlotH import PlotH
from View.Results.Table import TableModel
from View.Results.translate import *
@ -165,6 +166,20 @@ class ResultsWindow(ASubMainWindow, ListedSubWindow):
)
self.plot_ac.draw()
self.canvas_4 = MplCanvas(width=5, height=4, dpi=100)
self.canvas_4.setObjectName("canvas_4")
self.plot_layout_4 = self.find(QVBoxLayout, "verticalLayout_hydrograph")
self.plot_layout_4.addWidget(self.canvas_4)
self.plot_h = PlotH(
canvas = self.canvas_4,
results = self._results,
reach_id = 0,
profile_id = 0,
toolbar = None
)
self.plot_h.draw()
def setup_connections(self):
self.undo_sc.activated.connect(self.undo)
self.redo_sc.activated.connect(self.redo)
@ -194,18 +209,22 @@ class ResultsWindow(ASubMainWindow, ListedSubWindow):
self.plot_xy.set_reach(reach_id)
self.plot_ac.set_reach(reach_id)
self.plot_kpc.set_reach(reach_id)
self.plot_h.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)
self.plot_h.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_h.set_timestamp(timestamp)
self.plot_xy.draw()
self.plot_ac.draw()
self.plot_kpc.draw()
self.plot_h.draw()
def _set_current_reach(self):