From e7b6e66890f3562c78beb14dc82aea140767d473 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr> Date: Wed, 19 Apr 2023 10:21:55 +0200 Subject: [PATCH] geometry: Put graphic 1 into PlotXY classes. --- src/View/Geometry/GeometryWindow.py | 124 +++---------------------- src/View/Geometry/reach_plot_xy.py | 137 ++++++++++++++++++++++++++++ src/View/Plot/APlot.py | 44 +++++++++ src/tools.py | 2 +- 4 files changed, 193 insertions(+), 114 deletions(-) create mode 100644 src/View/Geometry/reach_plot_xy.py create mode 100644 src/View/Plot/APlot.py diff --git a/src/View/Geometry/GeometryWindow.py b/src/View/Geometry/GeometryWindow.py index 5e7b19fd..c200458d 100644 --- a/src/View/Geometry/GeometryWindow.py +++ b/src/View/Geometry/GeometryWindow.py @@ -17,12 +17,12 @@ from PyQt5.QtWidgets import ( QApplication, QMainWindow, QFileDialog, QCheckBox ) +from View.Geometry.reach_plot_xy import PlotXY from View.Geometry.mainwindow_ui_reach import Ui_MainWindow from View.Geometry import qtableview_reach from View.Geometry import window_profileXYZ from View.ASubWindow import WindowToolKit - _translate = QCoreApplication.translate class GeometryWindow(QMainWindow, WindowToolKit): @@ -125,8 +125,6 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.graphic_2() self.graphic_3() - - def messagebox_profile_editing(self): msg_box = QtWidgets.QMessageBox() msg_box.setIcon(QtWidgets.QMessageBox.Information) @@ -222,70 +220,13 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.list_second_window = [] self.list_row = [] - @timer def graphic_1(self): - self.ui.canvas_1.axes.cla() - self.ui.canvas_1.axes.grid(color='grey', linestyle='--', linewidth=0.5) - - # Axes - self.ui.canvas_1.axes.set_xlabel( - _translate("MainWindow_reach", "X (m)"), color='green', fontsize=12 - ) - self.ui.canvas_1.axes.set_ylabel( - _translate("MainWindow_reach", "Y (m)"), color='green', fontsize=12 - ) - - # Draw line for each profile - self.line_xy = [ - self.ui.canvas_1.axes.plot( - x, y, - color='r', lw=1., - markersize=3, marker='+' - ) - for x, y in zip(self._reach.get_x(), self._reach.get_y()) - ] - - # Guide lines - self.x_complete = self._reach.get_guidelines_x() - self.y_complete = self._reach.get_guidelines_y() - - self.line_gl_1 = [ - self.ui.canvas_1.axes.plot( - x, y, - ) - for x, y in zip(self.x_complete, self.y_complete) - ] - - # Current profile - self.plot_selected_1, = self.ui.canvas_1.axes.plot( - self._reach.profile(0).x(), - self._reach.profile(0).y(), - lw=1., markersize=3, - marker='+', color="b" + self.plot_xy = PlotXY( + canvas = self.ui.canvas_1, + data = self._reach, + toolbar = self.ui.toolbar_1 ) - self.plot_selected_1.set_visible(False) - - # Previous profile - self.before_plot_selected_1, = self.ui.canvas_1.axes.plot( - self._reach.profile(0).x(), - self._reach.profile(0).y(), - lw=1., markersize=3, - marker='+', color="k", linestyle="--" - ) - self.before_plot_selected_1.set_visible(False) - - # Next profile - self.after_plot_selected_1, = self.ui.canvas_1.axes.plot( - self._reach.profile(0).x(), - self._reach.profile(0).y(), - lw=1., markersize=3, - marker='+', color="m", linestyle='--' - ) - self.after_plot_selected_1.set_visible(False) - - self.ui.canvas_1.figure.tight_layout() - self.ui.canvas_1.figure.canvas.draw_idle() - self.ui.toolbar_1.update() + self.plot_xy.draw() @timer def graphic_2(self): @@ -356,27 +297,12 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.ui.canvas_2.figure.canvas.draw_idle() self.ui.toolbar_2.update() - @timer def update_graphic_1(self): self.tableView.model().blockSignals(True) - for ind in range(self._tablemodel.rowCount()): - self.line_xy[ind][0].set_data( - self._reach.profile(ind).x(), - self._reach.profile(ind).y() - ) - - self.x_complete = self._reach.get_guidelines_x() - self.y_complete = self._reach.get_guidelines_y() - - for i in range(len(self.line_gl_1)): - self.line_gl_1[i].set_data( - [x[i] for x in self.x_complete], - [y[i] for y in self.y_complete] - ) + self.plot_xy.update() self.tableView.model().blockSignals(False) - self.ui.canvas_1.figure.canvas.draw_idle() @timer def update_graphic_2(self): @@ -456,7 +382,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): lcomplete = list(self.complete_gl) lincomplete = list(self.incomplete_gl) - line_2d = [line_2D for line_2D in self.line_gl_1] + line_2d = [line_2D for line_2D in self.plot_xy.line_gl] self.color_complete_gl = self.get_line_gl_colors(line_2d) self.color_incomplete_gl = 2 * ["#000000"] @@ -621,10 +547,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): def select_plot_graphic_1(self, ind: int): self.tableView.model().blockSignals(True) - if 0 <= ind < self._tablemodel.rowCount(): - self.plot_selected_1.set_data(self._reach.profile(ind).x(), - self._reach.profile(ind).y()) - self.plot_selected_1.set_visible(True) + self.plot_xy.update(ind=ind) self.tableView.model().blockSignals(False) @@ -638,26 +561,6 @@ class GeometryWindow(QMainWindow, WindowToolKit): (z_min_i, z_max_i)) self.plot_selected_2.set_visible(True) - def select_before_plot_selected_1(self, ind: int): - if 0 <= ind < self._tablemodel.rowCount(): - self.before_plot_selected_1.set_data( - self._reach.profile(ind).x(), - self._reach.profile(ind).y() - ) - - self.before_plot_selected_1.set_visible(True) - self.ui.canvas_1.figure.canvas.draw_idle() - - def select_after_plot_selected_1(self, ind: int): - if 0 <= ind < self._tablemodel.rowCount(): - self.after_plot_selected_1.set_data( - self._reach.profile(ind).x(), - self._reach.profile(ind).y() - ) - - self.after_plot_selected_1.set_visible(True) - self.ui.canvas_1.figure.canvas.draw_idle() - def select_before_plot_selected_2(self, ind: int): if 0 <= ind < self._tablemodel.rowCount(): kp_i = self._reach.profile(ind).kp @@ -710,25 +613,20 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.select_plot_graphic_1(row) self.select_plot_graphic_2(row) + self.plot_xy.update(ind = row) + if row == 0: - self.before_plot_selected_1.set_visible(False) - self.select_after_plot_selected_1(row + 1) self.before_plot_selected_2.set_visible(False) self.select_after_plot_selected_2(row + 1) elif 0 < row < self._tablemodel.rowCount() - 1: - self.select_before_plot_selected_1(row - 1) - self.select_after_plot_selected_1(row + 1) self.select_before_plot_selected_2(row - 1) self.select_after_plot_selected_2(row + 1) elif row == self._tablemodel.rowCount() - 1: - self.after_plot_selected_1.set_visible(False) - self.select_before_plot_selected_1(row - 1) self.after_plot_selected_2.set_visible(False) self.select_before_plot_selected_2(row - 1) self.tableView.model().blockSignals(False) self.update_graphic_3(row) - self.ui.canvas_1.figure.canvas.draw_idle() self.ui.canvas_2.figure.canvas.draw_idle() def changed_slider_value(self): diff --git a/src/View/Geometry/reach_plot_xy.py b/src/View/Geometry/reach_plot_xy.py new file mode 100644 index 00000000..4d625133 --- /dev/null +++ b/src/View/Geometry/reach_plot_xy.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- + +from tools import timer +from View.Plot.APlot import APlot + +from PyQt5.QtCore import ( + QCoreApplication +) + + +_translate = QCoreApplication.translate + +class PlotXY(APlot): + def __init__(self, canvas=None, data=None, toolbar=None): + super(PlotXY, self).__init__( + canvas=canvas, + data=data, + toolbar=toolbar + ) + + self.line_xy = [] + self.line_gl = [] + + self.before_plot_selected = None + self.plot_selected = None + self.after_plot_selected = None + + @timer + def draw(self): + self.canvas.axes.cla() + self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) + + # Axes + self.canvas.axes.set_xlabel( + _translate("MainWindow_reach", "X (m)"), + color='green', fontsize=12 + ) + self.canvas.axes.set_ylabel( + _translate("MainWindow_reach", "Y (m)"), + color='green', fontsize=12 + ) + + # Draw line for each profile + self.line_xy = [ + self.canvas.axes.plot( + x, y, + color='r', lw=1., + markersize=3, marker='+' + ) + for x, y in zip(self.data.get_x(), self.data.get_y()) + ] + + # Guide lines + x_complete = self.data.get_guidelines_x() + y_complete = self.data.get_guidelines_y() + + self.line_gl = [ + self.canvas.axes.plot( + x, y, + ) + for x, y in zip(x_complete, y_complete) + ] + + # Previous profile + self.before_plot_selected, = self.canvas.axes.plot( + self.data.profile(0).x(), + self.data.profile(0).y(), + lw=1., markersize=3, + marker='+', color="k", linestyle="--" + ) + self.before_plot_selected.set_visible(False) + + # Current profile + self.plot_selected, = self.canvas.axes.plot( + self.data.profile(0).x(), + self.data.profile(0).y(), + lw=1., markersize=3, + marker='+', color="b" + ) + self.plot_selected.set_visible(False) + + # Next profile + self.after_plot_selected, = self.canvas.axes.plot( + self.data.profile(0).x(), + self.data.profile(0).y(), + lw=1., markersize=3, + marker='+', color="m", linestyle='--' + ) + self.after_plot_selected.set_visible(False) + + self.canvas.figure.tight_layout() + self.canvas.figure.canvas.draw_idle() + self.toolbar.update() + + @timer + def update(self, ind=None): + if ind: + before = ind - 1 + after = ind + 1 + + self.before_plot_selected.set_visible(False) + self.plot_selected.set_visible(False) + self.after_plot_selected.set_visible(False) + + if 0 <= before < self.data.number_profiles: + self.before_plot_selected.set_data(self.data.profile(before).x(), + self.data.profile(before).y()) + self.before_plot_selected.set_visible(True) + + if 0 <= ind < self.data.number_profiles: + self.plot_selected.set_data(self.data.profile(ind).x(), + self.data.profile(ind).y()) + self.plot_selected.set_visible(True) + + if 0 <= after < self.data.number_profiles: + self.after_plot_selected.set_data(self.data.profile(after).x(), + self.data.profile(after).y()) + self.after_plot_selected.set_visible(True) + + self.canvas.figure.canvas.draw_idle() + else: + for ind in range(self.data.number_profiles): + self.line_xy[ind][0].set_data( + self.data.profile(ind).x(), + self.data.profile(ind).y() + ) + + x_complete = self.data.get_guidelines_x() + y_complete = self.data.get_guidelines_y() + + for i in range(len(self.line_gl)): + self.line_gl[i].set_data( + [x[i] for x in x_complete], + [y[i] for y in y_complete] + ) + + self.canvas.figure.canvas.draw_idle() diff --git a/src/View/Plot/APlot.py b/src/View/Plot/APlot.py new file mode 100644 index 00000000..baf544f3 --- /dev/null +++ b/src/View/Plot/APlot.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +class APlot(object): + def __init__(self, canvas=None, data=None, toolbar=None): + super(APlot, self).__init__() + + self._canvas = canvas + self._data = data + self._toolbar = toolbar + + @property + def canvas(self): + return self._canvas + + @property + def data(self): + return self._data + + @property + def toolbar(self): + return self._toolbar + + def draw(self): + """Draw plot + + Returns: + Nothing + """ + raise NotImplementedMethodeError(self, self.draw) + + + def update(self, ind = None): + """Update plot + + Update the plot, update for data index IND if define, else + update all the plot + + Args: + ind: Data index to update + + Returns: + Nothing + """ + raise NotImplementedMethodeError(self, self.update) diff --git a/src/tools.py b/src/tools.py index eee57547..8d6b5faa 100644 --- a/src/tools.py +++ b/src/tools.py @@ -30,7 +30,7 @@ def display_timers(): lambda f: (f, _timers[f], _calls[f]), _timers ), - key=lambda f: f[1], + key = lambda f: f[1], reverse = True ) -- GitLab