diff --git a/src/View/Geometry/PlotAC.py b/src/View/Geometry/PlotAC.py index 1d7bf8d84fde42d1af4d90f619501b949b261d42..7cc7518433041bb75ec8d130ed41b7f6ae2d9efa 100644 --- a/src/View/Geometry/PlotAC.py +++ b/src/View/Geometry/PlotAC.py @@ -72,11 +72,11 @@ class PlotAC(PamhyrPlot): self.canvas.axes.set_xlabel( _translate("MainWindow_reach", "Transverse abscissa (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("MainWindow_reach", "Height (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.figure.tight_layout() @@ -176,11 +176,11 @@ class PlotAC(PamhyrPlot): self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) self.canvas.axes.set_xlabel( _translate("MainWindow_reach", "Abscisse en travers (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("MainWindow_reach", "Cote (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.figure.tight_layout() diff --git a/src/View/Geometry/PlotKPZ.py b/src/View/Geometry/PlotKPZ.py index 41b08a8f074fa05888db408dc32bf1d0b9e6d408..79fbfe058f65f5350df34bd6964b2b85598059b1 100644 --- a/src/View/Geometry/PlotKPZ.py +++ b/src/View/Geometry/PlotKPZ.py @@ -64,11 +64,11 @@ class PlotKPZ(PamhyrPlot): self.canvas.axes.set_xlabel( _translate("MainWindow_reach", "Kp (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("MainWindow_reach", "Height (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) kp = self.data.get_kp() diff --git a/src/View/Geometry/PlotXY.py b/src/View/Geometry/PlotXY.py index a851cc82c999dfc54004d343378b95a202088658..fcd55ecce7e98d2ab7352c76a1d2c906dd26299b 100644 --- a/src/View/Geometry/PlotXY.py +++ b/src/View/Geometry/PlotXY.py @@ -65,11 +65,11 @@ class PlotXY(PamhyrPlot): # Axes self.canvas.axes.set_xlabel( _translate("Geometry", "X (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("Geometry", "Y (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.axis("equal") diff --git a/src/View/Results/CustomPlot/CustomPlotValuesSelectionDialog.py b/src/View/Results/CustomPlot/CustomPlotValuesSelectionDialog.py new file mode 100644 index 0000000000000000000000000000000000000000..1ffd673245db1eb4c9c00d2a4a83a7075f844663 --- /dev/null +++ b/src/View/Results/CustomPlot/CustomPlotValuesSelectionDialog.py @@ -0,0 +1,97 @@ +# CustomPlotValuesSelectionDialog.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 -*- + +from View.Tools.PamhyrWindow import PamhyrDialog + +from PyQt5.QtWidgets import ( + QRadioButton, QCheckBox, QVBoxLayout, +) + +from View.Results.CustomPlot.Translate import CustomPlotTranslate + + +class CustomPlotValuesSelectionDialog(PamhyrDialog): + _pamhyr_ui = "CustomPlotValuesSelectionDialog" + _pamhyr_name = "Custom Plot Selection" + + def __init__(self, parent=None): + super(CustomPlotValuesSelectionDialog, self).__init__( + title=self._pamhyr_name, + options=[], + trad=CustomPlotTranslate(), + parent=parent + ) + + self._available_values_x = self._trad.get_dict("values_x") + self._available_values_y = self._trad.get_dict("values_y") + + self.setup_radio_buttons() + self.setup_check_boxs() + + self.value = None + + def setup_radio_buttons(self): + self._radio = [] + layout = self.find(QVBoxLayout, "verticalLayout_x") + + for value in self._available_values_x: + btn = QRadioButton( + self._available_values_x[value], + parent=self + ) + self._radio.append((value, btn)) + layout.addWidget(btn) + + self._radio[0][1].setChecked(True) + layout.addStretch() + + def setup_check_boxs(self): + self._check = [] + layout = self.find(QVBoxLayout, "verticalLayout_y") + + for value in self._available_values_y: + btn = QCheckBox( + self._available_values_y[value], + parent=self + ) + self._check.append((value, btn)) + layout.addWidget(btn) + + self._check[0][1].setChecked(True) + layout.addStretch() + + def accept(self): + x = next( + filter( + lambda r: r[1].isChecked(), + self._radio + ) + )[0] + + y = list( + map( + lambda b: b[0], + filter( + lambda b: b[1].isChecked(), + self._check + ) + ) + ) + + self.value = x, y + super().accept() diff --git a/src/View/Results/CustomPlot/Plot.py b/src/View/Results/CustomPlot/Plot.py new file mode 100644 index 0000000000000000000000000000000000000000..9733448fd5f7775a5850db379d5d45186ec113cd --- /dev/null +++ b/src/View/Results/CustomPlot/Plot.py @@ -0,0 +1,348 @@ +# Plot.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 datetime import datetime + +from tools import timer +from View.Tools.PamhyrPlot import PamhyrPlot + +from View.Results.CustomPlot.Translate import CustomPlotTranslate + +logger = logging.getLogger() + +unit = { + "elevation": "0-meter", + "water_elevation": "0-meter", + "discharge": "1-m3s", +} + + +class CustomPlot(PamhyrPlot): + def __init__(self, x, y, reach, profile, timestamp, + data=None, canvas=None, trad=None, + toolbar=None, parent=None): + super(CustomPlot, self).__init__( + canvas=canvas, + trad=CustomPlotTranslate(), + data=data, + toolbar=toolbar, + parent=parent + ) + + self._x = x + self._y = y + self._reach = reach + self._profile = profile + self._timestamp = timestamp + + logger.debug( + "Create custom plot for: " + + f"{x} -> {','.join(y)}: " + + f"reach={reach}, profile={profile}, " + + f"timestamp={timestamp}" + ) + + self._y_axes = sorted( + set( + map( + lambda y: unit[y], + self._y + ) + ) + ) + + self._axes = {} + + def _draw_kp(self): + results = self.data + reach = results.river.reach(self._reach) + kp = reach.geometry.get_kp() + z_min = reach.geometry.get_z_min() + + self.canvas.axes.set_xlim( + left=min(kp), right=max(kp) + ) + + meter_axes = self.canvas.axes + m3S_axes = self.canvas.axes + if "0-meter" in self._y_axes and "1-m3s" in self._y_axes: + m3s_axes = self._axes["1-m3s"] + + + lines = {} + if "elevation" in self._y: + meter_axes.set_ylim( + bottom=min(0, min(z_min)), + top=max(z_min) + 1 + ) + + line = meter_axes.plot( + kp, z_min, + color='grey', lw=1., + ) + lines["elevation"] = line + + if "water_elevation" in self._y: + # Water elevation + water_z = list( + map( + lambda p: p.get_ts_key(self._timestamp, "Z"), + reach.profiles + ) + ) + + meter_axes.set_ylim( + bottom=min(0, min(z_min)), + top=max(water_z) + 1 + ) + + line = meter_axes.plot( + kp, water_z, lw=1., + color='blue', + ) + lines["water_elevation"] = line + + if "elevation" in self._y: + meter_axes.fill_between( + kp, z_min, water_z, + color='blue', alpha=0.5, interpolate=True + ) + + if "discharge" in self._y: + q = list( + map( + lambda p: p.get_ts_key(self._timestamp, "Q"), + reach.profiles + ) + ) + + m3s_axes.set_ylim( + bottom=min(0, min(q)), + top=max(q) + 1 + ) + + line = m3s_axes.plot( + kp, q, lw=1., + color='r', + ) + lines["discharge"] = line + + # Legend + lns = reduce( + lambda acc, l: acc + l, + map(lambda l: lines[l], lines), + [] + ) + labs = list(map(lambda l: self._trad[l], lines)) + self.canvas.axes.legend(lns, labs, loc="lower left") + + def _customize_x_axes_time(self, ts, mode="time"): + # Custom time display + nb = len(ts) + mod = int(nb / 5) + mod = mod if mod > 0 else nb + + fx = list( + map( + lambda x: x[1], + filter( + lambda x: x[0] % mod == 0, + enumerate(ts) + ) + ) + ) + + if mode == "time": + t0 = datetime.fromtimestamp(0) + xt = list( + map( + lambda v: ( + str( + datetime.fromtimestamp(v) - t0 + ).split(",")[0] + .replace("days", self._trad["days"]) + .replace("day", self._trad["day"]) + ), + fx + ) + ) + else: + xt = list( + map( + lambda v: str(datetime.fromtimestamp(v).date()), + fx + ) + ) + + self.canvas.axes.set_xticks(ticks=fx, labels=xt, rotation=45) + + def _draw_time(self): + results = self.data + reach = results.river.reach(self._reach) + profile = reach.profile(self._profile) + + meter_axes = self.canvas.axes + m3S_axes = self.canvas.axes + if "0-meter" in self._y_axes and "1-m3s" in self._y_axes: + m3s_axes = self._axes["1-m3s"] + + ts = list(results.get("timestamps")) + ts.sort() + + self.canvas.axes.set_xlim( + left=min(ts), right=max(ts) + ) + + x = ts + lines = {} + if "elevation" in self._y: + # Z min is constant in time + z_min = profile.geometry.z_min() + ts_z_min = list( + map( + lambda ts: z_min, + ts + ) + ) + + line = meter_axes.plot( + ts, ts_z_min, + color='grey', lw=1. + ) + lines["elevation"] = line + + if "water_elevation" in self._y: + # Water elevation + z = profile.get_key("Z") + + meter_axes.set_ylim( + bottom=min(0, min(z)), + top=max(z) + 1 + ) + + line = meter_axes.plot( + ts, z, lw=1., + color='b', + ) + lines["water_elevation"] = line + + if "elevation" in self._y: + z_min = profile.geometry.z_min() + ts_z_min = list( + map( + lambda ts: z_min, + ts + ) + ) + + meter_axes.fill_between( + ts, ts_z_min, z, + color='blue', alpha=0.5, interpolate=True + ) + + if "discharge" in self._y: + q = profile.get_key("Q") + + m3s_axes.set_ylim( + bottom=min(0, min(q)), + top=max(q) + 1 + ) + + line = m3s_axes.plot( + ts, q, lw=1., + color='r', + ) + lines["discharge"] = line + + + self._customize_x_axes_time(ts) + + # Legend + lns = reduce( + lambda acc, l: acc + l, + map(lambda l: lines[l], lines), + [] + ) + labs = list(map(lambda l: self._trad[l], lines)) + self.canvas.axes.legend(lns, labs, loc="lower left") + + @timer + def draw(self): + self.canvas.axes.cla() + self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) + + if self.data is None: + return + + self.canvas.axes.set_xlabel( + self._trad[self._x], + color='green', fontsize=10 + ) + + self.canvas.axes.set_ylabel( + self._trad[self._y_axes[0]], + color='green', fontsize=10 + ) + + for axes in self._y_axes[1:]: + if axes in self._axes: + continue + + ax_new = self.canvas.axes.twinx() + ax_new.set_ylabel( + self._trad[axes], + color='green', fontsize=10 + ) + self._axes[axes] = ax_new + + if self._x == "kp": + self._draw_kp() + elif self._x == "time": + self._draw_time() + + self.canvas.figure.tight_layout() + self.canvas.figure.canvas.draw_idle() + if self.toolbar is not None: + self.toolbar.update() + + @timer + def update(self): + if not self._init: + self.draw() + return + + def set_reach(self, reach_id): + self._reach = reach_id + self._profile = 0 + + self.update() + + def set_profile(self, profile_id): + self._profile = profile_id + + if self._x != "kp": + self.update() + + def set_timestamp(self, timestamp): + self._timestamp = timestamp + + if self._x != "time": + self.update() diff --git a/src/View/Results/CustomPlot/Translate.py b/src/View/Results/CustomPlot/Translate.py new file mode 100644 index 0000000000000000000000000000000000000000..555950cda5e61d262e4ca3493d5efe6540332b54 --- /dev/null +++ b/src/View/Results/CustomPlot/Translate.py @@ -0,0 +1,67 @@ +# Translate.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 -*- + +from PyQt5.QtCore import QCoreApplication + +from View.Results.translate import ResultsTranslate + +_translate = QCoreApplication.translate + + +class CustomPlotTranslate(ResultsTranslate): + def __init__(self): + super(CustomPlotTranslate, self).__init__() + + # Value type + + self._dict['time'] = _translate( + "CustomPlot", "Time (sec)" + ) + self._dict['kp'] = _translate( + "CustomPlot", "Kp (m)" + ) + self._dict['elevation'] = _translate( + "CustomPlot", "Elevation (m)" + ) + self._dict['water_elevation'] = _translate( + "CustomPlot", "Water elevation (m)" + ) + self._dict['discharge'] = _translate( + "CustomPlot", "Discharge (m³/s)" + ) + + # Unit corresponding long name (plot axes display) + + self._dict['0-meter'] = _translate( + "CustomPlot", "Elevation (m)" + ) + self._dict['1-m3s'] = _translate( + "CustomPlot", "Discharge (m³/s)" + ) + + # SubDict + + self._sub_dict["values_x"] = { + "kp": self._dict["kp"], + "time": self._dict["time"], + } + self._sub_dict["values_y"] = { + "elevation": self._dict["elevation"], + "water_elevation": self._dict["water_elevation"], + "discharge": self._dict["discharge"], + } diff --git a/src/View/Results/PlotH.py b/src/View/Results/PlotH.py index f4f38e7c1d583b55eda4c9c7c7721c3376fef039..a6184e21251dcf693e68f541e50044b0c516aa3e 100644 --- a/src/View/Results/PlotH.py +++ b/src/View/Results/PlotH.py @@ -82,11 +82,11 @@ class PlotH(PamhyrPlot): # Axes self.canvas.axes.set_xlabel( _translate("Results", "Time (s)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("Results", "Discharge (m³/s)"), - color='green', fontsize=12 + color='green', fontsize=10 ) ts = list(self.results.get("timestamps")) diff --git a/src/View/Results/PlotSedProfile.py b/src/View/Results/PlotSedProfile.py index 8d8f7b9137f3b915b439aab34e8d6293a11e54e5..5d25b189cbe8ed894fc241d2a5c7d5dc9e85053c 100644 --- a/src/View/Results/PlotSedProfile.py +++ b/src/View/Results/PlotSedProfile.py @@ -132,11 +132,11 @@ class PlotSedProfile(PamhyrPlot): self.canvas.axes.set_xlabel( _translate("MainWindow_reach", "X (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("MainWindow_reach", "Height (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) x = profile.geometry.get_station() diff --git a/src/View/Results/PlotSedReach.py b/src/View/Results/PlotSedReach.py index e404f09cd5ac1059e1ae1446c6ec5d7ce4088227..fe7498d14cde9ba8387e8bec11e9b99810bde509 100644 --- a/src/View/Results/PlotSedReach.py +++ b/src/View/Results/PlotSedReach.py @@ -213,11 +213,11 @@ class PlotSedReach(PamhyrPlot): self.canvas.axes.set_xlabel( _translate("MainWindow_reach", "Kp (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("MainWindow_reach", "Height (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) kp = reach.geometry.get_kp() diff --git a/src/View/Results/PlotXY.py b/src/View/Results/PlotXY.py index 78d4c66b47582f71d9da8ad21f7580a492a07cdd..276ab60014153d1d6db6eb5458f2b8f8afa288f4 100644 --- a/src/View/Results/PlotXY.py +++ b/src/View/Results/PlotXY.py @@ -83,11 +83,11 @@ class PlotXY(PamhyrPlot): # Axes self.canvas.axes.set_xlabel( _translate("Results", "X (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("Results", "Y (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.axis("equal") diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index d076fd42b0760da6e4091355a6919ee9da29221f..9d5d0f95981bfadcbbbedf6c9847fb6e06ede971 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -38,7 +38,7 @@ from PyQt5.QtWidgets import ( QFileDialog, QTableView, QAbstractItemView, QUndoStack, QShortcut, QAction, QItemDelegate, QComboBox, QVBoxLayout, QHeaderView, QTabWidget, - QSlider, QLabel, + QSlider, QLabel, QWidget, QGridLayout, ) from View.Tools.Plot.PamhyrCanvas import MplCanvas @@ -51,6 +51,11 @@ from View.Results.PlotH import PlotH from View.Results.PlotSedReach import PlotSedReach from View.Results.PlotSedProfile import PlotSedProfile +from View.Results.CustomPlot.Plot import CustomPlot +from View.Results.CustomPlot.CustomPlotValuesSelectionDialog import ( + CustomPlotValuesSelectionDialog, +) + from View.Results.Table import TableModel from View.Results.translate import ResultsTranslate from View.Stricklers.Window import StricklersWindow @@ -86,6 +91,8 @@ class ResultsWindow(PamhyrWindow): parent=parent ) + self._additional_plot = {} + self.setup_table() self.setup_plot() self.setup_slider() @@ -274,6 +281,7 @@ class ResultsWindow(PamhyrWindow): # Action actions = { "action_reload": self._reload, + "action_add": self._add_custom_plot } for action in actions: @@ -281,6 +289,7 @@ class ResultsWindow(PamhyrWindow): actions[action] ) + # Table and Plot fun = { "reach": self._set_current_reach, "profile": self._set_current_profile, @@ -336,6 +345,9 @@ class ResultsWindow(PamhyrWindow): self.plot_sed_reach.set_reach(reach_id) self.plot_sed_profile.set_reach(reach_id) + for plot in self._additional_plot: + self._additional_plot[plot].set_reach(reach_id) + self.update_table_selection_reach(reach_id) self.update_table_selection_profile(0) @@ -349,7 +361,11 @@ class ResultsWindow(PamhyrWindow): self.plot_sed_reach.set_profile(profile_id) self.plot_sed_profile.set_profile(profile_id) + for plot in self._additional_plot: + self._additional_plot[plot].set_profile(profile_id) + self.update_table_selection_profile(profile_id) + if timestamp is not None: self.plot_xy.set_timestamp(timestamp) self.plot_ac.set_timestamp(timestamp) @@ -360,17 +376,32 @@ class ResultsWindow(PamhyrWindow): self.plot_sed_reach.set_timestamp(timestamp) self.plot_sed_profile.set_timestamp(timestamp) - self.plot_xy.draw() - self.plot_ac.draw() - self.plot_kpc.draw() - self.plot_h.draw() - - if self._study.river.has_sediment(): - self.plot_sed_reach.draw() - self.plot_sed_profile.draw() + for plot in self._additional_plot: + self._additional_plot[plot].set_timestamp(timestamp) self.update_statusbar() + def _get_current_reach(self): + table = self.find(QTableView, f"tableView_reach") + indexes = table.selectedIndexes() + if len(indexes) == 0: + return 0 + + return indexes[0].row() + + def _get_current_profile(self): + table = self.find(QTableView, f"tableView_profile") + indexes = table.selectedIndexes() + if len(indexes) == 0: + return 0 + + return indexes[0].row() + + def _get_current_timestamp(self): + return self._timestamps[ + self._slider_time.value() + ] + def _set_current_reach(self): table = self.find(QTableView, f"tableView_reach") indexes = table.selectedIndexes() @@ -430,6 +461,56 @@ class ResultsWindow(PamhyrWindow): self._reload_plots() self._reload_slider() + def _add_custom_plot(self): + dlg = CustomPlotValuesSelectionDialog(parent=self) + if dlg.exec(): + x, y = dlg.value + self.create_new_tab_custom_plot(x, y) + + def create_new_tab_custom_plot(self, x: str, y: list): + name = f"{x}: {','.join(y)}" + wname = f"tab_custom_{x}_{y}" + + tab_widget = self.find(QTabWidget, f"tabWidget") + + # This plot already exists + if name in self._additional_plot: + tab_widget.setCurrentWidget( + tab_widget.findChild(QWidget, wname) + ) + return + + widget = QWidget() + grid = QGridLayout() + + widget.setObjectName(wname) + + canvas = MplCanvas(width=5, height=4, dpi=100) + canvas.setObjectName(f"canvas_{x}_{y}") + toolbar = PamhyrPlotToolbar( + canvas, self + ) + + plot = CustomPlot( + x, y, + self._get_current_reach(), + self._get_current_profile(), + self._get_current_timestamp(), + data=self._results, + canvas=canvas, + toolbar=toolbar, + parent=self, + ) + plot.draw() + + # Add plot to additional plot + self._additional_plot[name] = plot + + grid.addWidget(toolbar, 0, 0) + grid.addWidget(canvas, 1, 0) + widget.setLayout(grid) + tab_widget.addTab(widget, name) + def _copy(self): logger.info("TODO: copy") diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py index ae9dcad17d28dff1c7b8bc28196eb6eecc2447e3..4de61cc7b6c24b227ec7164fa390777b4f807b34 100644 --- a/src/View/Results/translate.py +++ b/src/View/Results/translate.py @@ -27,6 +27,13 @@ class ResultsTranslate(PamhyrTranslate): def __init__(self): super(ResultsTranslate, self).__init__() + self._dict['day'] = _translate( + "Results", "day" + ) + self._dict['days'] = _translate( + "Results", "days" + ) + self._sub_dict["table_headers_reach"] = { "name": _translate("Results", "Reach name"), } diff --git a/src/View/SedimentLayers/Edit/Plot.py b/src/View/SedimentLayers/Edit/Plot.py index 87cfe6448bf58a69109a5f753d31449ad97e6e2a..69e58f835080ddc69468d50d5c1baa7af5472a25 100644 --- a/src/View/SedimentLayers/Edit/Plot.py +++ b/src/View/SedimentLayers/Edit/Plot.py @@ -35,7 +35,7 @@ class Plot(PamhyrPlot): self.canvas.axes.axes.get_xaxis().set_visible(False) self.canvas.axes.set_ylabel( self._trad["height"], - color='green', fontsize=12 + color='green', fontsize=10 ) if self.data is None: diff --git a/src/View/SedimentLayers/Reach/Plot.py b/src/View/SedimentLayers/Reach/Plot.py index 3664081cfb22f997ed4e0492c14a8d0d379406f0..1bea651fea5e2c930d9c90d70cf5be316115ba13 100644 --- a/src/View/SedimentLayers/Reach/Plot.py +++ b/src/View/SedimentLayers/Reach/Plot.py @@ -46,11 +46,11 @@ class Plot(PamhyrPlot): self.canvas.axes.set_xlabel( self._trad["kp"], - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( self._trad["height"], - color='green', fontsize=12 + color='green', fontsize=10 ) kp = self.data.get_kp() diff --git a/src/View/SedimentLayers/Reach/Profile/Plot.py b/src/View/SedimentLayers/Reach/Profile/Plot.py index 38adb990e0ddaa596abb1afb2afc4afcf33d26e1..5000ca9bb2cf697b0b97d448003b98ac2136d3b1 100644 --- a/src/View/SedimentLayers/Reach/Profile/Plot.py +++ b/src/View/SedimentLayers/Reach/Profile/Plot.py @@ -46,11 +46,11 @@ class Plot(PamhyrPlot): self.canvas.axes.set_xlabel( _translate("MainWindow_reach", "X (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) self.canvas.axes.set_ylabel( _translate("MainWindow_reach", "Height (m)"), - color='green', fontsize=12 + color='green', fontsize=10 ) x = self.data.get_station() diff --git a/src/View/ui/CustomPlotValuesSelectionDialog.ui b/src/View/ui/CustomPlotValuesSelectionDialog.ui new file mode 100644 index 0000000000000000000000000000000000000000..88ca363caf69660b6a17b4b88797b54e7f826ff2 --- /dev/null +++ b/src/View/ui/CustomPlotValuesSelectionDialog.ui @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Dialog</class> + <widget class="QDialog" name="Dialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>414</width> + <height>482</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <widget class="QWidget" name="verticalLayoutWidget"> + <layout class="QVBoxLayout" name="verticalLayout_x"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>X axis:</string> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="verticalLayoutWidget_2"> + <layout class="QVBoxLayout" name="verticalLayout_y"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Y axis:</string> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + <item row="1" column="0"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>Dialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>Dialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>