From d48b4ebe9dc4f8be656a91797080ba3b79857626 Mon Sep 17 00:00:00 2001 From: Petter <petter.kallstrom@liu.se> Date: Mon, 20 Feb 2023 13:09:07 +0100 Subject: [PATCH] PlotWindow: Replaced PlotCanvas with FigureCanvas --- b_asic/gui_utils/plot_window.py | 90 ++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/b_asic/gui_utils/plot_window.py b/b_asic/gui_utils/plot_window.py index ff067c02..658abf33 100644 --- a/b_asic/gui_utils/plot_window.py +++ b/b_asic/gui_utils/plot_window.py @@ -2,7 +2,7 @@ # TODO's: # * Solve the legend update. That isn't working at all. -# * Zoom etc. Might need to change FigureCanvas. Or just something very little. +# * Add a function to run this as a "stand-alone". import re import sys @@ -12,49 +12,48 @@ from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as Navigatio from matplotlib.figure import Figure from matplotlib.ticker import MaxNLocator from qtpy.QtCore import Qt -from qtpy.QtGui import QKeySequence # Intereme imports for the Plot class: -from qtpy.QtWidgets import ( # QFrame,; QScrollArea,; QLineEdit,; QSizePolicy,; QLabel, +from qtpy.QtWidgets import ( # QFrame,; QScrollArea,; QLineEdit,; QSizePolicy,; QLabel,; QFileDialog,; QShortcut, QApplication, QCheckBox, QDialog, - QFileDialog, QHBoxLayout, QListWidget, QListWidgetItem, QPushButton, - QShortcut, QVBoxLayout, ) +# from qtpy.QtGui import QKeySequence -class PlotCanvas(FigureCanvas): - """PlotCanvas is used as a part in the PlotWindow.""" - def __init__(self, logger, parent=None, width=5, height=4, dpi=100): - fig = Figure(figsize=(width, height), dpi=dpi) - super().__init__(fig) - self.axes = fig.add_subplot(111) - self.axes.xaxis.set_major_locator(MaxNLocator(integer=True)) - self.legend = None - self.logger = logger +# class PlotCanvas(FigureCanvas): +# """PlotCanvas is used as a part in the PlotWindow.""" - FigureCanvas.updateGeometry(self) - self.save_figure = QShortcut(QKeySequence("Ctrl+S"), self) - self.save_figure.activated.connect(self._save_plot_figure) +# def __init__(self, logger, parent=None, width=5, height=4, dpi=100): +# fig = Figure(figsize=(width, height), dpi=dpi) +# super().__init__(fig) +# self.axes = fig.add_subplot(111) +# self.axes.xaxis.set_major_locator(MaxNLocator(integer=True)) +# self.legend = None +# self.logger = logger - def _save_plot_figure(self): - self.logger.info(f"Saving plot of figure: {self.sfg.name}.") - file_choices = "PNG (*.png)|*.png" - path, ext = QFileDialog.getSaveFileName(self, "Save file", "", file_choices) - path = path.encode("utf-8") - if not path[-4:] == file_choices[-4:].encode("utf-8"): - path += file_choices[-4:].encode("utf-8") +# FigureCanvas.updateGeometry(self) +# self.save_figure = QShortcut(QKeySequence("Ctrl+S"), self) +# self.save_figure.activated.connect(self._save_plot_figure) - if path: - self.print_figure(path.decode(), dpi=self.dpi) - self.logger.info(f"Saved plot: {self.sfg.name} to path: {path}.") +# def _save_plot_figure(self): +# self.logger.info(f"Saving plot of figure: {self.sfg.name}.") +# file_choices = "PNG (*.png)|*.png" +# path, ext = QFileDialog.getSaveFileName(self, "Save file", "", file_choices) +# path = path.encode("utf-8") +# if not path[-4:] == file_choices[-4:].encode("utf-8"): +# path += file_choices[-4:].encode("utf-8") + +# if path: +# self.print_figure(path.decode(), dpi=self.dpi) +# self.logger.info(f"Saved plot: {self.sfg.name} to path: {path}.") class PlotWindow(QDialog): @@ -101,7 +100,7 @@ class PlotWindow(QDialog): sim_res_others[key] = sim_result[key] # Layout: ############################################ - # | list | | + # | list | icons | # | ... | plot | # | misc | | @@ -117,18 +116,25 @@ class PlotWindow(QDialog): ########### Plot: ############## # Do this before the list layout, as the list layout will re/set visibility # Note: The order is of importens. Interesting lines last, to be on top. - self.plotcanvas = PlotCanvas( - logger=logger, parent=self, width=5, height=4, dpi=100 - ) + # self.plotcanvas = PlotCanvas( + # logger=logger, parent=self, width=5, height=4, dpi=100 + # ) + self._plot_fig = Figure(figsize=(5, 4), dpi=100) + self._plot_axes = self._plot_fig.add_subplot(111) + self._plot_axes.xaxis.set_major_locator(MaxNLocator(integer=True)) self._lines = {} for key in sim_res_others | sim_res_delays | sim_res_ins | sim_res_outs: - line = self.plotcanvas.axes.plot(sim_result[key], visible=False, label=key) + # line = self.plotcanvas.axes.plot(sim_result[key], visible=False, label=key) + line = self._plot_axes.plot(sim_result[key], visible=False, label=key) self._lines[key] = line - self.plotcanvas.legend = self.plotcanvas.axes.legend() + # self.plotcanvas.legend = self.plotcanvas.axes.legend() + self._legend = self._plot_axes.legend() + + self._plot_canvas = FigureCanvas(self._plot_fig) - plotlayout.addWidget(NavigationToolbar(self.plotcanvas, self)) - plotlayout.addWidget(self.plotcanvas) + plotlayout.addWidget(NavigationToolbar(self._plot_canvas, self)) + plotlayout.addWidget(self._plot_canvas) ########### List layout: ############## @@ -178,11 +184,11 @@ class PlotWindow(QDialog): self._auto_redraw = True def _legend_checkbox_change(self, checkState): - self.plotcanvas.legend.set(visible=(checkState == Qt.CheckState.Checked)) + self._legend.set(visible=(checkState == Qt.CheckState.Checked)) if self._auto_redraw: if checkState == Qt.CheckState.Checked: - self.plotcanvas.legend = self.plotcanvas.axes.legend() - self.plotcanvas.draw() + self._legend = self._plot_axes.legend() + self._plot_canvas.draw() # def _ontop_checkbox_change(self, checkState): # Bugg: It seems the window closes if you change the WindowStaysOnTopHint. @@ -196,14 +202,14 @@ class PlotWindow(QDialog): for x in range(self.checklist.count()): self.checklist.item(x).setCheckState(Qt.CheckState.Checked) self._auto_redraw = True - self.plotcanvas.draw() + self._plot_canvas.draw() def _button_none_click(self, event): self._auto_redraw = False for x in range(self.checklist.count()): self.checklist.item(x).setCheckState(Qt.CheckState.Unchecked) self._auto_redraw = True - self.plotcanvas.draw() + self._plot_canvas.draw() def _item_change(self, listitem): key = listitem.text() @@ -212,8 +218,8 @@ class PlotWindow(QDialog): ) if self._auto_redraw: if self.legend_checkbox.checkState == Qt.CheckState.Checked: - self.plotcanvas.legend = self.plotcanvas.axes.legend() - self.plotcanvas.draw() + self._legend = self._plot_axes.legend() + self._plot_canvas.draw() # Simple test of the dialog -- GitLab