From 77baba08935e8aba3db692fa5f5a75d6e93456f3 Mon Sep 17 00:00:00 2001 From: Theophile Terraz <theophile.terraz@inrae.fr> Date: Wed, 30 Oct 2024 12:00:11 +0100 Subject: [PATCH] add XY geom view in main window --- src/View/MainWindowTabInfo.py | 35 ++++++++++ src/View/PlotXY.py | 119 ++++++++++++++++++++++++++++++++++ src/View/Translate.py | 5 +- 3 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 src/View/PlotXY.py diff --git a/src/View/MainWindowTabInfo.py b/src/View/MainWindowTabInfo.py index f655d799..2dd9881a 100644 --- a/src/View/MainWindowTabInfo.py +++ b/src/View/MainWindowTabInfo.py @@ -20,8 +20,13 @@ import logging from tools import timer, trace +from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar +from View.Tools.Plot.PamhyrCanvas import MplCanvas +from View.PlotXY import PlotXY from View.Tools.PamhyrWidget import PamhyrWidget +from PyQt5.QtWidgets import QVBoxLayout + logger = logging.getLogger() @@ -38,7 +43,9 @@ class WidgetInfo(PamhyrWidget): parent=parent ) + self.parent = parent self.set_initial_values() + self.setup_graph() @property def study(self): @@ -64,6 +71,25 @@ class WidgetInfo(PamhyrWidget): self.set_label_text("label_lc", "-") self.set_label_text("label_hs", "-") + def setup_graph(self): + self.canvas = MplCanvas(width=5, height=4, dpi=100) + self.canvas.setObjectName("canvas") + self.plot_layout_xy = self.find(QVBoxLayout, "verticalLayout") + self._toolbar_xy = PamhyrPlotToolbar( + self.canvas, self, + items=["home", "zoom", "save", "iso", "back/forward", "move"] + ) + self.plot_layout_xy.addWidget(self._toolbar_xy) + self.plot_layout_xy.addWidget(self.canvas) + + self.plot = PlotXY( + canvas=self.canvas, + data=None, + trad=self.parent._trad, + toolbar=self._toolbar_xy, + parent=self + ) + def update(self): if self._study is None: self.set_initial_values() @@ -75,6 +101,15 @@ class WidgetInfo(PamhyrWidget): self.set_network_values() self.set_geometry_values() + self.plot = PlotXY( + canvas=self.canvas, + data=self._study.river.enable_edges(), + trad=self.parent._trad, + toolbar=self._toolbar_xy, + parent=self + ) + self.plot.update() + def set_network_values(self): river = self._study.river diff --git a/src/View/PlotXY.py b/src/View/PlotXY.py new file mode 100644 index 00000000..07ae3fad --- /dev/null +++ b/src/View/PlotXY.py @@ -0,0 +1,119 @@ +# PlotXY.py -- Pamhyr +# Copyright (C) 2023-2024 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 -*- + +from tools import timer, trace +from View.Tools.PamhyrPlot import PamhyrPlot +from matplotlib import collections +import numpy as np + +from PyQt5.QtCore import ( + QCoreApplication, Qt, QItemSelectionModel, + QItemSelection, QItemSelectionRange, +) +from PyQt5.QtWidgets import QApplication, QTableView + +_translate = QCoreApplication.translate + + +class PlotXY(PamhyrPlot): + def __init__(self, canvas=None, trad=None, data=None, toolbar=None, + table=None, parent=None): + super(PlotXY, self).__init__( + canvas=canvas, + trad=trad, + data=data, + toolbar=toolbar, + table=table, + parent=parent + ) + + self._data = data + self.label_x = self._trad["x"] + self.label_y = self._trad["y"] + self.parent = parent + + self._isometric_axis = True + + self._auto_relim_update = True + self._autoscale_update = True + + @timer + def draw(self): + self.init_axes() + + if self._data is None: + self.idle() + return + + if len(self._data) < 1: + self.idle() + return + + self.line_lr = [] + for data in self._data: + if data.reach.number_profiles != 0: + self.draw_xy(data.reach) + self.draw_lr(data.reach) + self.idle() + return + + def draw_xy(self, reach): + line_xy = [] + for xy in zip(reach.get_x(), reach.get_y()): + line_xy.append(np.column_stack(xy)) + + line_xy_collection = collections.LineCollection( + line_xy, + colors=self.color_plot_river_bottom + ) + self.canvas.axes.add_collection(line_xy_collection) + + def draw_lr(self, reach): + lx = [] + ly = [] + rx = [] + ry = [] + + for x, y in zip(reach.get_x(), + reach.get_y()): + lx.append(x[0]) + ly.append(y[0]) + + rx.append(x[-1]) + ry.append(y[-1]) + + line = self.canvas.axes.plot( + lx, ly, + color=self.color_plot_river_bottom, + linestyle="dotted", + lw=1., + ) + self.line_lr.append(line) + + line = self.canvas.axes.plot( + rx, ry, + color=self.color_plot_river_bottom, + linestyle="dotted", + lw=1., + ) + self.line_lr.append(line) + + @timer + def update(self): + self.draw() + self.update_idle() diff --git a/src/View/Translate.py b/src/View/Translate.py index eb289f6a..e39279e5 100644 --- a/src/View/Translate.py +++ b/src/View/Translate.py @@ -73,8 +73,7 @@ class UnitTranslate(CommonWordTranslate): self._dict["unit_date_s"] = _translate("Unit", "Date (sec)") self._dict["unit_date_iso"] = _translate("Unit", "Date (ISO format)") - - self._dict["unit_wet_area"] = _translate("Unit", "Wet Area (m^2)") + self._dict["unit_wet_area"] = _translate("Unit", "Wet Area (m²)") self._dict["unit_wet_perimeter"] = _translate( "Unit", "Wet Perimeter (m)" ) @@ -133,3 +132,5 @@ class MainTranslate(UnitTranslate): "MainWindow", "Do you want to save current study before closing it?" ) + self._dict["x"] = _translate("MainWindow", "X (m)") + self._dict["y"] = _translate("MainWindow", "Y (m)") -- GitLab