bec-widgets 0.47.0__py3-none-any.whl → 0.48.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,2 @@
1
+ from .auto_updates import AutoUpdates, ScanInfo
1
2
  from .client import BECFigure
@@ -0,0 +1,118 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from pydantic import BaseModel
6
+
7
+ if TYPE_CHECKING:
8
+ from .client import BECFigure
9
+
10
+
11
+ class ScanInfo(BaseModel):
12
+ scan_id: str
13
+ scan_number: int
14
+ scan_name: str
15
+ scan_report_devices: list
16
+ monitored_devices: list
17
+ status: str
18
+
19
+
20
+ class AutoUpdates:
21
+ def __init__(self, figure: BECFigure, enabled: bool = True):
22
+ self.enabled = enabled
23
+ self.figure = figure
24
+
25
+ @staticmethod
26
+ def get_scan_info(msg) -> ScanInfo:
27
+ """
28
+ Update the script with the given data.
29
+ """
30
+ info = msg.info
31
+ status = msg.status
32
+ scan_id = msg.scan_id
33
+ scan_number = info.get("scan_number", 0)
34
+ scan_name = info.get("scan_name", "Unknown")
35
+ scan_report_devices = info.get("scan_report_devices", [])
36
+ monitored_devices = info.get("readout_priority", {}).get("monitored", [])
37
+ monitored_devices = [dev for dev in monitored_devices if dev not in scan_report_devices]
38
+ return ScanInfo(
39
+ scan_id=scan_id,
40
+ scan_number=scan_number,
41
+ scan_name=scan_name,
42
+ scan_report_devices=scan_report_devices,
43
+ monitored_devices=monitored_devices,
44
+ status=status,
45
+ )
46
+
47
+ def run(self, msg):
48
+ """
49
+ Run the update function if enabled.
50
+ """
51
+ if not self.enabled:
52
+ return
53
+ if msg.status != "open":
54
+ return
55
+ info = self.get_scan_info(msg)
56
+ self.handler(info)
57
+
58
+ @staticmethod
59
+ def get_selected_device(monitored_devices, selected_device):
60
+ """
61
+ Get the selected device for the plot. If no device is selected, the first
62
+ device in the monitored devices list is selected.
63
+ """
64
+ if selected_device:
65
+ return selected_device
66
+ if len(monitored_devices) > 0:
67
+ sel_device = monitored_devices[0]
68
+ return sel_device
69
+ return None
70
+
71
+ def handler(self, info: ScanInfo) -> None:
72
+ """
73
+ Default update function.
74
+ """
75
+ if info.scan_name == "line_scan" and info.scan_report_devices:
76
+ self.simple_line_scan(info)
77
+ return
78
+ if info.scan_name == "grid_scan" and info.scan_report_devices:
79
+ self.simple_grid_scan(info)
80
+ return
81
+ if info.scan_report_devices:
82
+ self.best_effort(info)
83
+ return
84
+
85
+ def simple_line_scan(self, info: ScanInfo) -> None:
86
+ """
87
+ Simple line scan.
88
+ """
89
+ dev_x = info.scan_report_devices[0]
90
+ dev_y = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
91
+ if not dev_y:
92
+ return
93
+ self.figure.clear_all()
94
+ plt = self.figure.plot(dev_x, dev_y)
95
+ plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
96
+
97
+ def simple_grid_scan(self, info: ScanInfo) -> None:
98
+ """
99
+ Simple grid scan.
100
+ """
101
+ dev_x = info.scan_report_devices[0]
102
+ dev_y = info.scan_report_devices[1]
103
+ dev_z = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
104
+ self.figure.clear_all()
105
+ plt = self.figure.plot(dev_x, dev_y, dev_z, label=f"Scan {info.scan_number}")
106
+ plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
107
+
108
+ def best_effort(self, info: ScanInfo) -> None:
109
+ """
110
+ Best effort scan.
111
+ """
112
+ dev_x = info.scan_report_devices[0]
113
+ dev_y = self.get_selected_device(info.monitored_devices, self.figure.selected_device)
114
+ if not dev_y:
115
+ return
116
+ self.figure.clear_all()
117
+ plt = self.figure.plot(dev_x, dev_y, label=f"Scan {info.scan_number}")
118
+ plt.set(title=f"Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import importlib
4
+ import importlib.metadata as imd
4
5
  import os
5
6
  import select
6
7
  import subprocess
@@ -17,6 +18,7 @@ from bec_lib.device import DeviceBase
17
18
  from qtpy.QtCore import QCoreApplication
18
19
 
19
20
  import bec_widgets.cli.client as client
21
+ from bec_widgets.cli.auto_updates import AutoUpdates
20
22
  from bec_widgets.utils.bec_dispatcher import BECDispatcher
21
23
 
22
24
  if TYPE_CHECKING:
@@ -54,68 +56,22 @@ def rpc_call(func):
54
56
  return wrapper
55
57
 
56
58
 
57
- def get_selected_device(monitored_devices, selected_device):
58
- """
59
- Get the selected device for the plot. If no device is selected, the first
60
- device in the monitored devices list is selected.
61
- """
62
- if selected_device:
63
- return selected_device
64
- if len(monitored_devices) > 0:
65
- sel_device = monitored_devices[0]
66
- return sel_device
67
- return None
68
-
69
-
70
- def update_script(figure: BECFigure, msg):
71
- """
72
- Update the script with the given data.
73
- """
74
- info = msg.info
75
- status = msg.status
76
- scan_id = msg.scan_id
77
- scan_number = info.get("scan_number", 0)
78
- scan_name = info.get("scan_name", "Unknown")
79
- scan_report_devices = info.get("scan_report_devices", [])
80
- monitored_devices = info.get("readout_priority", {}).get("monitored", [])
81
- monitored_devices = [dev for dev in monitored_devices if dev not in scan_report_devices]
82
-
83
- if scan_name == "line_scan" and scan_report_devices:
84
- dev_x = scan_report_devices[0]
85
- dev_y = get_selected_device(monitored_devices, figure.selected_device)
86
- print(f"Selected device: {dev_y}")
87
- if not dev_y:
88
- return
89
- figure.clear_all()
90
- plt = figure.plot(dev_x, dev_y)
91
- plt.set(title=f"Scan {scan_number}", x_label=dev_x, y_label=dev_y)
92
- elif scan_name == "grid_scan" and scan_report_devices:
93
- print(f"Scan {scan_number} is running")
94
- dev_x = scan_report_devices[0]
95
- dev_y = scan_report_devices[1]
96
- dev_z = get_selected_device(monitored_devices, figure.selected_device)
97
- figure.clear_all()
98
- plt = figure.plot(dev_x, dev_y, dev_z, label=f"Scan {scan_number}")
99
- plt.set(title=f"Scan {scan_number}", x_label=dev_x, y_label=dev_y)
100
- elif scan_report_devices:
101
- dev_x = scan_report_devices[0]
102
- dev_y = get_selected_device(monitored_devices, figure.selected_device)
103
- if not dev_y:
104
- return
105
- figure.clear_all()
106
- plt = figure.plot(dev_x, dev_y, label=f"Scan {scan_number}")
107
- plt.set(title=f"Scan {scan_number}", x_label=dev_x, y_label=dev_y)
108
-
109
-
110
59
  class BECFigureClientMixin:
111
60
  def __init__(self, **kwargs) -> None:
112
61
  super().__init__(**kwargs)
113
62
  self._process = None
114
- self.update_script = update_script
63
+ self.update_script = self._get_update_script()
115
64
  self._target_endpoint = MessageEndpoints.scan_status()
116
65
  self._selected_device = None
117
66
  self.stderr_output = []
118
67
 
68
+ def _get_update_script(self) -> AutoUpdates:
69
+ eps = imd.entry_points(group="bec.widgets.auto_updates")
70
+ for ep in eps:
71
+ if ep.name == "plugin_widgets_update":
72
+ return ep.load()(figure=self)
73
+ return None
74
+
119
75
  @property
120
76
  def selected_device(self):
121
77
  """
@@ -147,8 +103,7 @@ class BECFigureClientMixin:
147
103
  if isinstance(msg, messages.ScanStatusMessage):
148
104
  if not self.gui_is_alive():
149
105
  return
150
- if msg.status == "open":
151
- self.update_script(self, msg)
106
+ self.update_script.run(msg)
152
107
 
153
108
  def show(self) -> None:
154
109
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bec-widgets
3
- Version: 0.47.0
3
+ Version: 0.48.0
4
4
  Summary: BEC Widgets
5
5
  Home-page: https://gitlab.psi.ch/bec/bec-widgets
6
6
  Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec-widgets/issues
@@ -1,7 +1,8 @@
1
1
  bec_widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- bec_widgets/cli/__init__.py,sha256=yFyAmDteCcndbReunhnrfDib6JujQ7-BKWeVvuU0Ylw,30
2
+ bec_widgets/cli/__init__.py,sha256=ULoNTVnv2UeSSjhFq3uCQJ-0JTJf9oU76l27aRiizL4,78
3
+ bec_widgets/cli/auto_updates.py,sha256=ptZeBKr13o9THc8oKLn93K_16i6G3pxzw8hZ4MUgjW4,3845
3
4
  bec_widgets/cli/client.py,sha256=4QedDVBgkCOnRQFYQcAabyAsl5UQ0aRwwLwk1OR5M1k,37882
4
- bec_widgets/cli/client_utils.py,sha256=zsFHcE75IWoPKh5NCawUVbE20_o_7ggPWkj7_49-Bns,10939
5
+ bec_widgets/cli/client_utils.py,sha256=Tv3K3J6rIQlQdVLaa6LDRt_gmQBNOgfCVbqmDbp2wqw,9159
5
6
  bec_widgets/cli/generate_cli.py,sha256=JLqUlUgfz_f_4KHPRUAN-Xli-K7uNOc8-F-LkAC7Scw,4004
6
7
  bec_widgets/cli/server.py,sha256=OMWnl99RrSTKK1EVEyu3MFjkJ54bWfh_fpg38b-bres,4760
7
8
  bec_widgets/examples/__init__.py,sha256=WWQ0cu7m8sA4Ehy-DWdTIqSISjaHsbxhsNmNrMnhDZU,202
@@ -94,8 +95,8 @@ tests/unit_tests/test_widget_io.py,sha256=FeL3ZYSBQnRt6jxj8VGYw1cmcicRQyHKleahw7
94
95
  tests/unit_tests/test_yaml_dialog.py,sha256=HNrqferkdg02-9ieOhhI2mr2Qvt7GrYgXmQ061YCTbg,5794
95
96
  tests/unit_tests/test_msgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
97
  tests/unit_tests/test_msgs/available_scans_message.py,sha256=m_z97hIrjHXXMa2Ex-UvsPmTxOYXfjxyJaGkIY6StTY,46532
97
- bec_widgets-0.47.0.dist-info/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
98
- bec_widgets-0.47.0.dist-info/METADATA,sha256=fWRxvjg6pFXNEcNvoKCEcl9B3MSBi0eEPh61nI17B7s,3714
99
- bec_widgets-0.47.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
100
- bec_widgets-0.47.0.dist-info/top_level.txt,sha256=EXCwhJYmXmd1DjYYL3hrGsddX-97IwYSiIHrf27FFVk,18
101
- bec_widgets-0.47.0.dist-info/RECORD,,
98
+ bec_widgets-0.48.0.dist-info/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
99
+ bec_widgets-0.48.0.dist-info/METADATA,sha256=g91-DgNcINlv5MWQP0jHYvJj60MeYwu0BbmY7gaPuDQ,3714
100
+ bec_widgets-0.48.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
101
+ bec_widgets-0.48.0.dist-info/top_level.txt,sha256=EXCwhJYmXmd1DjYYL3hrGsddX-97IwYSiIHrf27FFVk,18
102
+ bec_widgets-0.48.0.dist-info/RECORD,,