# -*- coding: utf-8 -*- from tools import timer, trace 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, display_current=True): super(PlotXY, self).__init__( canvas=canvas, data=data, toolbar=toolbar ) self.display_current = display_current self.line_xy = [] self.line_gl = [] self.before_plot_selected = None self.plot_selected = None self.after_plot_selected = None @timer def draw(self, highlight=None): self.canvas.axes.cla() self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) if self.data is None: return if self.data.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("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, lw=1., color='b' if kp_min <= kp <= kp_max else 'r', markersize=3, marker='+' ) for x, y, kp in zip( self.data.get_x(), self.data.get_y(), self.data.get_kp() ) ] # 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) ] if self.display_current: # 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.axes.autoscale_view(True, True, True) self.canvas.axes.autoscale() self.canvas.figure.tight_layout() self.canvas.figure.canvas.draw_idle() self.toolbar.update() self._init = True @timer def update(self, ind=None): if self._init == False: self.draw() return if self.data is None: return self.data.compute_guidelines() x_complete = self.data.get_guidelines_x() y_complete = 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(), lw=1., color='r', markersize=3, marker='+' ) ) 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] ) ) if ind is not None and self.display_current: 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.axes.relim() self.canvas.axes.autoscale() self.canvas.axes.autoscale_view() self.canvas.figure.tight_layout() self.canvas.figure.canvas.draw_idle()