# 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 PyQt5.QtCore import ( QCoreApplication ) _translate = QCoreApplication.translate class PlotXY(PamhyrPlot): def __init__(self, canvas=None, trad=None, data=None, toolbar=None, parent=None): super(PlotXY, self).__init__( canvas=canvas, trad=trad, data=data, toolbar=toolbar, parent=parent ) self.line_xy = [] self.line_gl = [] self.label_x = self._trad["x"] self.label_y = self._trad["y"] self.before_plot_selected = None self.plot_selected = None self.after_plot_selected = None @timer def draw(self): self.init_axes() if self.data is None: self.idle() return if self.data.number_profiles == 0: self._init = False self.idle() return self.draw_xy() self.draw_gl() self.draw_current() self.idle() self._init = True def draw_xy(self): kp = self.data.get_kp_complete_profiles() kp_min, kp_max = (-1, -1) if self._highlight_data is not None: kp_min, kp_max = self._highlight_data def color_hightlight(kp): if kp_min <= kp <= kp_max: return self.color_plot_highlight return self.color_plot self.line_xy = [] for x, y, kp in zip(self.data.get_x(), self.data.get_y(), kp): line = self.canvas.axes.plot( x, y, color=color_hightlight(kp), **self.plot_default_kargs ) self.line_xy.append(line) def draw_gl(self): x_complete = self.data.get_guidelines_x() y_complete = self.data.get_guidelines_y() ind = 0 self.line_gl = [] for x, y in zip(x_complete, y_complete): line = self.canvas.axes.plot( x, y, color=self.colors[ind % len(self.colors)], linestyle=self.linestyle[ind // len(self.colors)] ) self.line_gl.append(line) ind += 1 def draw_current(self): # Previous profile self.before_plot_selected, = self.canvas.axes.plot( self.data.profile(0).x(), self.data.profile(0).y(), color=self.color_plot_previous, linestyle="--", **self.plot_default_kargs ) 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(), color=self.color_plot_current, **self.plot_default_kargs ) 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(), color=self.color_plot_next, linestyle='--', **self.plot_default_kargs ) self.after_plot_selected.set_visible(False) @timer def update(self): if not self._init: self.draw() return if self.data is None: return self.update_gl() self.update_current() self.update_idle() def update_gl(self): self.data.compute_guidelines() x_complete = list(self.data.get_guidelines_x()) y_complete = list(self.data.get_guidelines_y()) for i in range(self.data.number_profiles): if i < len(self.line_xy): self.line_xy[i][0].set_data( self.data.profile(i).x(), self.data.profile(i).y() ) else: self.line_xy.append( self.canvas.axes.plot( self.data.profile(i).x(), self.data.profile(i).y(), color='r', **self.plot_default_kargs ) ) for i in range(len(x_complete)): if i < len(self.line_gl): self.line_gl[i][0].set_data( x_complete[i], y_complete[i] ) else: self.line_gl.append( self.canvas.axes.plot( x_complete[i], y_complete[i] ) ) def update_current(self): if self._current_data_update: ind = self._current_data 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)