From 616de26150f473342fbac4f2db80e9acca035a1b Mon Sep 17 00:00:00 2001 From: Ivan Usov Date: Thu, 17 Aug 2023 15:13:11 +0200 Subject: [PATCH] refactor: switch to generic connect_slot method in plots --- bec_widgets/basic_plot.py | 23 +++++++++++----------- bec_widgets/examples/oneplot/oneplot.py | 17 ++++++---------- bec_widgets/line_plot.py | 26 ++++++++++++------------- bec_widgets/scan_plot.py | 10 +++++++--- tests/test_scan_plot.py | 2 +- 5 files changed, 38 insertions(+), 40 deletions(-) diff --git a/bec_widgets/basic_plot.py b/bec_widgets/basic_plot.py index acbb3935..b452e34e 100644 --- a/bec_widgets/basic_plot.py +++ b/bec_widgets/basic_plot.py @@ -7,7 +7,8 @@ from typing import Any import numpy as np import pyqtgraph import pyqtgraph as pg -from bec_lib.core import BECMessage +from bec_lib.core import BECMessage, MessageEndpoints +from bec_lib.core.redis_connector import MessageObject, RedisConnector from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QCheckBox, QTableWidgetItem from pyqtgraph import mkBrush, mkColor, mkPen @@ -15,7 +16,6 @@ from pyqtgraph.Qt import QtCore, QtWidgets, uic from pyqtgraph.Qt.QtCore import pyqtSignal from bec_widgets.bec_dispatcher import bec_dispatcher -from bec_lib.core.redis_connector import MessageObject, RedisConnector client = bec_dispatcher.client @@ -410,13 +410,13 @@ class BasicPlot(QtWidgets.QWidget): self.update_signal.emit() @pyqtSlot(dict, dict) - def on_dap_update(self, data: dict, metadata: dict): - self.img.setImage(data["z"].T) + def on_dap_update(self, content: dict, _metadata: dict): + self.img.setImage(content["data"]["z"].T) # time.sleep(0,1) - @pyqtSlot(dict) - def new_proj(self, data): - proj_nr = data["proj_nr"] + @pyqtSlot(dict, dict) + def new_proj(self, content: dict, _metadata: dict): + proj_nr = content["signals"]["proj_nr"] endpoint = f"px_stream/projection_{proj_nr}/metadata" msg_raw = client.producer.get(topic=endpoint) msg = BECMessage.DeviceMessage.loads(msg_raw) @@ -432,7 +432,6 @@ if __name__ == "__main__": import argparse from bec_widgets import ctrl_c - from bec_widgets.bec_dispatcher import bec_dispatcher parser = argparse.ArgumentParser() parser.add_argument( @@ -449,9 +448,11 @@ if __name__ == "__main__": app = QtWidgets.QApplication([]) ctrl_c.setup(app) plot = BasicPlot(y_value_list=value.signals) - # bec_dispatcher.connect(plot) - bec_dispatcher.connect_proj_id(plot.new_proj) - bec_dispatcher.connect_dap_slot(plot.on_dap_update, "px_dap_worker") + + bec_dispatcher.connect_slot(plot.new_proj, "px_stream/proj_nr") + bec_dispatcher.connect_slot( + plot.on_dap_update, MessageEndpoints.processed_data("px_dap_worker") + ) plot.show() # client.callbacks.register("scan_segment", plot, sync=False) app.exec_() diff --git a/bec_widgets/examples/oneplot/oneplot.py b/bec_widgets/examples/oneplot/oneplot.py index b5c94b5e..27a377b3 100644 --- a/bec_widgets/examples/oneplot/oneplot.py +++ b/bec_widgets/examples/oneplot/oneplot.py @@ -1,18 +1,15 @@ import os -import PyQt5.QtWidgets import numpy as np - +import PyQt5.QtWidgets import pyqtgraph as pg +from bec_lib.core import MessageEndpoints from PyQt5.QtCore import pyqtSignal, pyqtSlot -from PyQt5.QtWidgets import QApplication, QWidget -from PyQt5.QtWidgets import QTableWidgetItem -from pyqtgraph import mkBrush, mkPen +from PyQt5.QtWidgets import QApplication, QTableWidgetItem, QWidget from pyqtgraph import mkBrush, mkColor, mkPen from pyqtgraph.Qt import QtCore, uic from bec_widgets.qt_utils import Crosshair -from bec_lib.core import MessageEndpoints # TODO implement: # - implement scanID database for visualizing previous scans @@ -106,10 +103,7 @@ class PlotApp(QWidget): # for ii, (monitor, color) in enumerate(zip(self.dap_worker, colors_y_daps)):#TODO adapt for multiple dap_workers pen_dap = mkPen(color="#3b5998", width=2, style=QtCore.Qt.DashLine) curve_dap = pg.PlotDataItem( - pen=pen_dap, - skipFiniteCheck=True, - symbolSize=5, - name=f"{self.dap_worker}", + pen=pen_dap, skipFiniteCheck=True, symbolSize=5, name=f"{self.dap_worker}" ) self.curves_dap.append(curve_dap) self.plot.addItem(curve_dap) @@ -243,6 +237,7 @@ class PlotApp(QWidget): if __name__ == "__main__": import yaml + from bec_widgets import ctrl_c from bec_widgets.bec_dispatcher import bec_dispatcher @@ -267,7 +262,7 @@ if __name__ == "__main__": plotApp = PlotApp(x_value=x_value, y_values=y_values, dap_worker=dap_worker) # Connecting signals from bec_dispatcher - bec_dispatcher.connect_dap_slot(plotApp.on_dap_update, dap_worker) + bec_dispatcher.connect_slot(plotApp.on_dap_update, MessageEndpoints.processed_data(dap_worker)) bec_dispatcher.connect_slot(plotApp.on_scan_segment, MessageEndpoints.scan_segment()) ctrl_c.setup(app) diff --git a/bec_widgets/line_plot.py b/bec_widgets/line_plot.py index 292e38f9..09a502c4 100644 --- a/bec_widgets/line_plot.py +++ b/bec_widgets/line_plot.py @@ -7,17 +7,16 @@ from typing import Any import numpy as np import pyqtgraph import pyqtgraph as pg -from bec_lib.core import BECMessage +from bec_lib.core import BECMessage, MessageEndpoints +from bec_lib.core.redis_connector import MessageObject, RedisConnector from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QCheckBox, QTableWidgetItem from pyqtgraph import mkBrush, mkColor, mkPen from pyqtgraph.Qt import QtCore, QtWidgets, uic from pyqtgraph.Qt.QtCore import pyqtSignal +from qt_utils import Crosshair from bec_widgets.bec_dispatcher import bec_dispatcher -from bec_lib.core.redis_connector import MessageObject, RedisConnector - -from qt_utils import Crosshair client = bec_dispatcher.client @@ -372,9 +371,9 @@ class BasicPlot(QtWidgets.QWidget): self.img.setImage(flipped_data) - @pyqtSlot(dict) - def new_proj(self, data): - proj_nr = data["proj_nr"] + @pyqtSlot(dict, dict) + def new_proj(self, content: dict, _metadata: dict): + proj_nr = content["signals"]["proj_nr"] endpoint = f"px_stream/projection_{proj_nr}/metadata" msg_raw = client.producer.get(topic=endpoint) msg = BECMessage.DeviceMessage.loads(msg_raw) @@ -390,14 +389,10 @@ if __name__ == "__main__": import argparse from bec_widgets import ctrl_c - from bec_widgets.bec_dispatcher import bec_dispatcher parser = argparse.ArgumentParser() parser.add_argument( - "--signals", - help="specify recorded signals", - nargs="+", - default=["gauss_bpm"], + "--signals", help="specify recorded signals", nargs="+", default=["gauss_bpm"] ) # default = ["gauss_bpm", "bpm4i", "bpm5i", "bpm6i", "xert"], # dispatcher = bec_dispatcher @@ -407,8 +402,11 @@ if __name__ == "__main__": app = QtWidgets.QApplication([]) ctrl_c.setup(app) plot = BasicPlot(y_value_list=value.signals) - bec_dispatcher.connect_proj_id(plot.new_proj) - bec_dispatcher.connect_dap_slot(plot.on_dap_update, "px_dap_worker") + + bec_dispatcher.connect_slot(plot.new_proj, "px_stream/proj_nr") + bec_dispatcher.connect_slot( + plot.on_dap_update, MessageEndpoints.processed_data("px_dap_worker") + ) plot.show() # client.callbacks.register("scan_segment", plot, sync=False) app.exec_() diff --git a/bec_widgets/scan_plot.py b/bec_widgets/scan_plot.py index 68393298..b2748343 100644 --- a/bec_widgets/scan_plot.py +++ b/bec_widgets/scan_plot.py @@ -1,6 +1,7 @@ import itertools import pyqtgraph as pg +from bec_lib.core import MessageEndpoints from bec_lib.core.logger import bec_logger from PyQt5.QtCore import pyqtProperty, pyqtSlot @@ -62,7 +63,8 @@ class BECScanPlot(pg.GraphicsView): plot_curve.setData(x=[*x, x_new], y=[*y, y_new]) @pyqtSlot(dict, dict) - def redraw_dap(self, data, _metadata): + def redraw_dap(self, content, _metadata): + data = content["data"] for chan, plot_curve in self.dap_curves.items(): if not chan: continue @@ -86,7 +88,8 @@ class BECScanPlot(pg.GraphicsView): chan_removed = [chan for chan in self._y_channel_list if chan not in new_list] if chan_removed and chan_removed[0].startswith("dap."): chan_removed = chan_removed[0].partition("dap.")[-1] - bec_dispatcher.disconnect_dap_slot(self.redraw_dap, chan_removed) + chan_removed_ep = MessageEndpoints.processed_data(chan_removed) + bec_dispatcher.disconnect_slot(self.redraw_dap, chan_removed_ep) self._y_channel_list = new_list @@ -100,7 +103,8 @@ class BECScanPlot(pg.GraphicsView): if y_chan.startswith("dap."): y_chan = y_chan.partition("dap.")[-1] curves = self.dap_curves - bec_dispatcher.connect_dap_slot(self.redraw_dap, y_chan) + y_chan_ep = MessageEndpoints.processed_data(y_chan) + bec_dispatcher.connect_slot(self.redraw_dap, y_chan_ep) else: curves = self.scan_curves diff --git a/tests/test_scan_plot.py b/tests/test_scan_plot.py index ec4bcb3b..89802a36 100644 --- a/tests/test_scan_plot.py +++ b/tests/test_scan_plot.py @@ -83,7 +83,7 @@ def test_scan_plot_redraws_dap(qtbot): plot.y_channel_list = ["dap.y1", "dap.y2"] - plot.redraw_dap({"y1": {"x": [1], "y": [1]}, "y2": {"x": [2], "y": [2]}}, {}) + plot.redraw_dap({"data": {"y1": {"x": [1], "y": [1]}, "y2": {"x": [2], "y": [2]}}}, {}) assert all(plot.dap_curves["y1"].getData()[0] == [1]) assert all(plot.dap_curves["y2"].getData()[1] == [2])