0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 11:41:49 +02:00

feat(waveform): export to matplotlib window of current scene

This commit is contained in:
2024-07-17 11:37:59 +02:00
parent 6ff6111091
commit 8d93405399
6 changed files with 49 additions and 2 deletions

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
<path d="M354.61-386.61h391l-127-171-103 135-68-87-93 123ZM274.7-195.48q-32.51 0-55.87-23.35-23.35-23.36-23.35-55.87v-549.82q0-32.74 23.35-56.26 23.36-23.53 55.87-23.53h549.82q32.74 0 56.26 23.53 23.53 23.52 23.53 56.26v549.82q0 32.51-23.53 55.87-23.52 23.35-56.26 23.35H274.7Zm0-79.22h549.82v-549.82H274.7v549.82ZM135.48-55.69q-32.74 0-56.26-23.53-23.53-23.52-23.53-56.26v-629.04h79.79v629.04h629.04v79.79H135.48ZM274.7-824.52v549.82-549.82Z"/>
</svg>

After

Width:  |  Height:  |  Size: 564 B

View File

@ -2010,6 +2010,12 @@ class BECWaveformWidget(RPCBase):
Show the export dialog for the plot widget. Show the export dialog for the plot widget.
""" """
@rpc_call
def export_to_matplotlib(self):
"""
Export the plot widget to Matplotlib.
"""
class DeviceBox(RPCBase): class DeviceBox(RPCBase):
@property @property

View File

@ -4,7 +4,6 @@ from typing import Literal, Optional
import pyqtgraph as pg import pyqtgraph as pg
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from pyqtgraph.GraphicsScene.exportDialog import ExportDialog
from qtpy.QtWidgets import QWidget from qtpy.QtWidgets import QWidget
from bec_widgets.utils import BECConnector, ConnectionConfig from bec_widgets.utils import BECConnector, ConnectionConfig

View File

@ -9,6 +9,7 @@ from bec_lib import messages
from bec_lib.device import ReadoutPriority from bec_lib.device import ReadoutPriority
from bec_lib.endpoints import MessageEndpoints from bec_lib.endpoints import MessageEndpoints
from pydantic import Field, ValidationError, field_validator from pydantic import Field, ValidationError, field_validator
from pyqtgraph.exporters import MatplotlibExporter
from qtpy.QtCore import Signal as pyqtSignal from qtpy.QtCore import Signal as pyqtSignal
from qtpy.QtCore import Slot as pyqtSlot from qtpy.QtCore import Slot as pyqtSlot
from qtpy.QtWidgets import QWidget from qtpy.QtWidgets import QWidget
@ -1324,6 +1325,13 @@ class BECWaveform(BECPlotBase):
return combined_data return combined_data
return data return data
def export_to_matplotlib(self):
"""
Export current waveform to matplotlib gui. Available only if matplotlib is installed in the enviroment.
"""
MatplotlibExporter(self.plot_item).export()
def clear_all(self): def clear_all(self):
curves_data = self._curves_data curves_data = self._curves_data
sources = list(curves_data.keys()) sources = list(curves_data.keys())

View File

@ -19,6 +19,17 @@ class SaveAction(ToolBarAction):
toolbar.addAction(self.action) toolbar.addAction(self.action)
class MatplotlibAction(ToolBarAction):
def add_to_toolbar(self, toolbar, target):
icon = QIcon()
icon.addFile(
os.path.join(MODULE_PATH, "assets", "toolbar_icons", "photo_library.svg"),
size=QSize(20, 20),
)
self.action = QAction(icon, "Open Matplotlib Plot", target)
toolbar.addAction(self.action)
class CurveAction(ToolBarAction): class CurveAction(ToolBarAction):
def add_to_toolbar(self, toolbar, target): def add_to_toolbar(self, toolbar, target):
icon = QIcon() icon = QIcon()

View File

@ -6,7 +6,7 @@ from typing import Literal
import numpy as np import numpy as np
from qtpy.QtWidgets import QVBoxLayout, QWidget from qtpy.QtWidgets import QVBoxLayout, QWidget
from bec_widgets.qt_utils.error_popups import error_managed from bec_widgets.qt_utils.error_popups import WarningPopupUtility, error_managed
from bec_widgets.qt_utils.settings_dialog import SettingsDialog from bec_widgets.qt_utils.settings_dialog import SettingsDialog
from bec_widgets.qt_utils.toolbar import ModularToolBar, SeparatorAction from bec_widgets.qt_utils.toolbar import ModularToolBar, SeparatorAction
from bec_widgets.utils import BECConnector from bec_widgets.utils import BECConnector
@ -44,6 +44,7 @@ class BECWaveformWidget(BECConnector, QWidget):
"set_grid", "set_grid",
"lock_aspect_ratio", "lock_aspect_ratio",
"export", "export",
"export_to_matplotlib",
] ]
def __init__( def __init__(
@ -69,6 +70,7 @@ class BECWaveformWidget(BECConnector, QWidget):
self.toolbar = ModularToolBar( self.toolbar = ModularToolBar(
actions={ actions={
"save": SaveAction(), "save": SaveAction(),
"matplotlib": MatplotlibAction(),
"separator_1": SeparatorAction(), "separator_1": SeparatorAction(),
"curves": CurveAction(), "curves": CurveAction(),
"axis_settings": SettingsAction(), "axis_settings": SettingsAction(),
@ -82,6 +84,8 @@ class BECWaveformWidget(BECConnector, QWidget):
self.layout.addWidget(self.toolbar) self.layout.addWidget(self.toolbar)
self.layout.addWidget(self.fig) self.layout.addWidget(self.fig)
self.warning_util = WarningPopupUtility(self)
self.waveform = self.fig.plot() self.waveform = self.fig.plot()
self.waveform.apply_config(config) self.waveform.apply_config(config)
@ -96,6 +100,7 @@ class BECWaveformWidget(BECConnector, QWidget):
def _hook_actions(self): def _hook_actions(self):
self.toolbar.widgets["save"].action.triggered.connect(self.export) self.toolbar.widgets["save"].action.triggered.connect(self.export)
self.toolbar.widgets["matplotlib"].action.triggered.connect(self.export_to_matplotlib)
self.toolbar.widgets["curves"].action.triggered.connect(self.show_curve_settings) self.toolbar.widgets["curves"].action.triggered.connect(self.show_curve_settings)
self.toolbar.widgets["axis_settings"].action.triggered.connect(self.show_axis_settings) self.toolbar.widgets["axis_settings"].action.triggered.connect(self.show_axis_settings)
self.toolbar.widgets["import"].action.triggered.connect( self.toolbar.widgets["import"].action.triggered.connect(
@ -467,6 +472,21 @@ class BECWaveformWidget(BECConnector, QWidget):
""" """
self.waveform.export() self.waveform.export()
def export_to_matplotlib(self):
"""
Export the plot widget to Matplotlib.
"""
try:
import matplotlib as mpl
except ImportError:
self.warning_util.show_warning(
title="Matplotlib not installed",
message="Matplotlib is required for this feature.",
detailed_text="Please install matplotlib in your Python environment by using 'pip install matplotlib'.",
)
return
self.waveform.export_to_matplotlib()
####################################### #######################################
# User Access Methods from BECConnector # User Access Methods from BECConnector
###################################### ######################################