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

refactor: switch to generic connect_slot method in plots

This commit is contained in:
2023-08-17 15:13:11 +02:00
parent 78b666ffdb
commit 616de26150
5 changed files with 38 additions and 40 deletions

View File

@ -7,7 +7,8 @@ from typing import Any
import numpy as np import numpy as np
import pyqtgraph import pyqtgraph
import pyqtgraph as pg 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.QtCore import pyqtSlot
from PyQt5.QtWidgets import QCheckBox, QTableWidgetItem from PyQt5.QtWidgets import QCheckBox, QTableWidgetItem
from pyqtgraph import mkBrush, mkColor, mkPen from pyqtgraph import mkBrush, mkColor, mkPen
@ -15,7 +16,6 @@ from pyqtgraph.Qt import QtCore, QtWidgets, uic
from pyqtgraph.Qt.QtCore import pyqtSignal from pyqtgraph.Qt.QtCore import pyqtSignal
from bec_widgets.bec_dispatcher import bec_dispatcher from bec_widgets.bec_dispatcher import bec_dispatcher
from bec_lib.core.redis_connector import MessageObject, RedisConnector
client = bec_dispatcher.client client = bec_dispatcher.client
@ -410,13 +410,13 @@ class BasicPlot(QtWidgets.QWidget):
self.update_signal.emit() self.update_signal.emit()
@pyqtSlot(dict, dict) @pyqtSlot(dict, dict)
def on_dap_update(self, data: dict, metadata: dict): def on_dap_update(self, content: dict, _metadata: dict):
self.img.setImage(data["z"].T) self.img.setImage(content["data"]["z"].T)
# time.sleep(0,1) # time.sleep(0,1)
@pyqtSlot(dict) @pyqtSlot(dict, dict)
def new_proj(self, data): def new_proj(self, content: dict, _metadata: dict):
proj_nr = data["proj_nr"] proj_nr = content["signals"]["proj_nr"]
endpoint = f"px_stream/projection_{proj_nr}/metadata" endpoint = f"px_stream/projection_{proj_nr}/metadata"
msg_raw = client.producer.get(topic=endpoint) msg_raw = client.producer.get(topic=endpoint)
msg = BECMessage.DeviceMessage.loads(msg_raw) msg = BECMessage.DeviceMessage.loads(msg_raw)
@ -432,7 +432,6 @@ if __name__ == "__main__":
import argparse import argparse
from bec_widgets import ctrl_c from bec_widgets import ctrl_c
from bec_widgets.bec_dispatcher import bec_dispatcher
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument( parser.add_argument(
@ -449,9 +448,11 @@ if __name__ == "__main__":
app = QtWidgets.QApplication([]) app = QtWidgets.QApplication([])
ctrl_c.setup(app) ctrl_c.setup(app)
plot = BasicPlot(y_value_list=value.signals) plot = BasicPlot(y_value_list=value.signals)
# bec_dispatcher.connect(plot)
bec_dispatcher.connect_proj_id(plot.new_proj) bec_dispatcher.connect_slot(plot.new_proj, "px_stream/proj_nr")
bec_dispatcher.connect_dap_slot(plot.on_dap_update, "px_dap_worker") bec_dispatcher.connect_slot(
plot.on_dap_update, MessageEndpoints.processed_data("px_dap_worker")
)
plot.show() plot.show()
# client.callbacks.register("scan_segment", plot, sync=False) # client.callbacks.register("scan_segment", plot, sync=False)
app.exec_() app.exec_()

View File

@ -1,18 +1,15 @@
import os import os
import PyQt5.QtWidgets
import numpy as np import numpy as np
import PyQt5.QtWidgets
import pyqtgraph as pg import pyqtgraph as pg
from bec_lib.core import MessageEndpoints
from PyQt5.QtCore import pyqtSignal, pyqtSlot from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtWidgets import QApplication, QTableWidgetItem, QWidget
from PyQt5.QtWidgets import QTableWidgetItem
from pyqtgraph import mkBrush, mkPen
from pyqtgraph import mkBrush, mkColor, mkPen from pyqtgraph import mkBrush, mkColor, mkPen
from pyqtgraph.Qt import QtCore, uic from pyqtgraph.Qt import QtCore, uic
from bec_widgets.qt_utils import Crosshair from bec_widgets.qt_utils import Crosshair
from bec_lib.core import MessageEndpoints
# TODO implement: # TODO implement:
# - implement scanID database for visualizing previous scans # - 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 # 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) pen_dap = mkPen(color="#3b5998", width=2, style=QtCore.Qt.DashLine)
curve_dap = pg.PlotDataItem( curve_dap = pg.PlotDataItem(
pen=pen_dap, pen=pen_dap, skipFiniteCheck=True, symbolSize=5, name=f"{self.dap_worker}"
skipFiniteCheck=True,
symbolSize=5,
name=f"{self.dap_worker}",
) )
self.curves_dap.append(curve_dap) self.curves_dap.append(curve_dap)
self.plot.addItem(curve_dap) self.plot.addItem(curve_dap)
@ -243,6 +237,7 @@ class PlotApp(QWidget):
if __name__ == "__main__": if __name__ == "__main__":
import yaml import yaml
from bec_widgets import ctrl_c from bec_widgets import ctrl_c
from bec_widgets.bec_dispatcher import bec_dispatcher 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) plotApp = PlotApp(x_value=x_value, y_values=y_values, dap_worker=dap_worker)
# Connecting signals from bec_dispatcher # 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()) bec_dispatcher.connect_slot(plotApp.on_scan_segment, MessageEndpoints.scan_segment())
ctrl_c.setup(app) ctrl_c.setup(app)

View File

@ -7,17 +7,16 @@ from typing import Any
import numpy as np import numpy as np
import pyqtgraph import pyqtgraph
import pyqtgraph as pg 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.QtCore import pyqtSlot
from PyQt5.QtWidgets import QCheckBox, QTableWidgetItem from PyQt5.QtWidgets import QCheckBox, QTableWidgetItem
from pyqtgraph import mkBrush, mkColor, mkPen from pyqtgraph import mkBrush, mkColor, mkPen
from pyqtgraph.Qt import QtCore, QtWidgets, uic from pyqtgraph.Qt import QtCore, QtWidgets, uic
from pyqtgraph.Qt.QtCore import pyqtSignal from pyqtgraph.Qt.QtCore import pyqtSignal
from qt_utils import Crosshair
from bec_widgets.bec_dispatcher import bec_dispatcher 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 client = bec_dispatcher.client
@ -372,9 +371,9 @@ class BasicPlot(QtWidgets.QWidget):
self.img.setImage(flipped_data) self.img.setImage(flipped_data)
@pyqtSlot(dict) @pyqtSlot(dict, dict)
def new_proj(self, data): def new_proj(self, content: dict, _metadata: dict):
proj_nr = data["proj_nr"] proj_nr = content["signals"]["proj_nr"]
endpoint = f"px_stream/projection_{proj_nr}/metadata" endpoint = f"px_stream/projection_{proj_nr}/metadata"
msg_raw = client.producer.get(topic=endpoint) msg_raw = client.producer.get(topic=endpoint)
msg = BECMessage.DeviceMessage.loads(msg_raw) msg = BECMessage.DeviceMessage.loads(msg_raw)
@ -390,14 +389,10 @@ if __name__ == "__main__":
import argparse import argparse
from bec_widgets import ctrl_c from bec_widgets import ctrl_c
from bec_widgets.bec_dispatcher import bec_dispatcher
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument( parser.add_argument(
"--signals", "--signals", help="specify recorded signals", nargs="+", default=["gauss_bpm"]
help="specify recorded signals",
nargs="+",
default=["gauss_bpm"],
) )
# default = ["gauss_bpm", "bpm4i", "bpm5i", "bpm6i", "xert"], # default = ["gauss_bpm", "bpm4i", "bpm5i", "bpm6i", "xert"],
# dispatcher = bec_dispatcher # dispatcher = bec_dispatcher
@ -407,8 +402,11 @@ if __name__ == "__main__":
app = QtWidgets.QApplication([]) app = QtWidgets.QApplication([])
ctrl_c.setup(app) ctrl_c.setup(app)
plot = BasicPlot(y_value_list=value.signals) 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() plot.show()
# client.callbacks.register("scan_segment", plot, sync=False) # client.callbacks.register("scan_segment", plot, sync=False)
app.exec_() app.exec_()

View File

@ -1,6 +1,7 @@
import itertools import itertools
import pyqtgraph as pg import pyqtgraph as pg
from bec_lib.core import MessageEndpoints
from bec_lib.core.logger import bec_logger from bec_lib.core.logger import bec_logger
from PyQt5.QtCore import pyqtProperty, pyqtSlot 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]) plot_curve.setData(x=[*x, x_new], y=[*y, y_new])
@pyqtSlot(dict, dict) @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(): for chan, plot_curve in self.dap_curves.items():
if not chan: if not chan:
continue 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] 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."): if chan_removed and chan_removed[0].startswith("dap."):
chan_removed = chan_removed[0].partition("dap.")[-1] 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 self._y_channel_list = new_list
@ -100,7 +103,8 @@ class BECScanPlot(pg.GraphicsView):
if y_chan.startswith("dap."): if y_chan.startswith("dap."):
y_chan = y_chan.partition("dap.")[-1] y_chan = y_chan.partition("dap.")[-1]
curves = self.dap_curves 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: else:
curves = self.scan_curves curves = self.scan_curves

View File

@ -83,7 +83,7 @@ def test_scan_plot_redraws_dap(qtbot):
plot.y_channel_list = ["dap.y1", "dap.y2"] 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["y1"].getData()[0] == [1])
assert all(plot.dap_curves["y2"].getData()[1] == [2]) assert all(plot.dap_curves["y2"].getData()[1] == [2])