bec-widgets 0.44.4__py3-none-any.whl → 0.45.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.
- bec_widgets/cli/client.py +105 -5
- bec_widgets/cli/client_utils.py +4 -4
- bec_widgets/cli/generate_cli.py +6 -4
- bec_widgets/cli/server.py +2 -3
- bec_widgets/examples/__init__.py +1 -1
- bec_widgets/examples/eiger_plot/eiger_plot.py +3 -11
- bec_widgets/examples/mca_readout/mca_plot.py +21 -24
- bec_widgets/examples/mca_readout/mca_sim.py +7 -12
- bec_widgets/examples/motor_movement/__init__.py +1 -1
- bec_widgets/examples/motor_movement/motor_control_compilations.py +3 -8
- bec_widgets/examples/motor_movement/motor_controller.ui +1 -1
- bec_widgets/examples/motor_movement/motor_example.py +13 -14
- bec_widgets/examples/stream_plot/stream_plot.py +5 -4
- bec_widgets/utils/__init__.py +5 -5
- bec_widgets/utils/bec_connector.py +1 -1
- bec_widgets/utils/bec_dispatcher.py +1 -2
- bec_widgets/utils/bec_table.py +1 -1
- bec_widgets/utils/crosshair.py +2 -1
- bec_widgets/utils/validator_delegate.py +1 -1
- bec_widgets/utils/widget_io.py +6 -6
- bec_widgets/utils/yaml_dialog.py +1 -0
- bec_widgets/validation/monitor_config_validator.py +6 -6
- bec_widgets/widgets/__init__.py +7 -8
- bec_widgets/widgets/editor/editor.py +6 -14
- bec_widgets/widgets/figure/__init__.py +1 -1
- bec_widgets/widgets/figure/figure.py +74 -4
- bec_widgets/widgets/monitor/__init__.py +0 -1
- bec_widgets/widgets/monitor/config_dialog.py +7 -8
- bec_widgets/widgets/monitor/monitor.py +16 -26
- bec_widgets/widgets/monitor_scatter_2D/monitor_scatter_2D.py +11 -19
- bec_widgets/widgets/motor_control/__init__.py +2 -2
- bec_widgets/widgets/motor_control/motor_control.py +11 -10
- bec_widgets/widgets/motor_map/motor_map.py +2 -3
- bec_widgets/widgets/plots/__init__.py +4 -3
- bec_widgets/widgets/plots/image.py +7 -6
- bec_widgets/widgets/plots/motor_map.py +423 -0
- bec_widgets/widgets/plots/plot_base.py +1 -2
- bec_widgets/widgets/plots/waveform1d.py +24 -23
- bec_widgets/widgets/scan_control/scan_control.py +12 -12
- bec_widgets/widgets/toolbar/toolbar.py +2 -4
- {bec_widgets-0.44.4.dist-info → bec_widgets-0.45.0.dist-info}/METADATA +2 -1
- bec_widgets-0.45.0.dist-info/RECORD +98 -0
- tests/client_mocks.py +76 -30
- tests/conftest.py +2 -1
- tests/test_bec_connector.py +2 -1
- tests/test_bec_dispatcher.py +3 -4
- tests/test_bec_figure.py +14 -2
- tests/test_bec_monitor.py +7 -76
- tests/test_bec_monitor_scatter2D.py +8 -32
- tests/test_bec_motor_map.py +125 -0
- tests/test_config_dialog.py +4 -66
- tests/test_editor.py +2 -4
- tests/test_eiger_plot.py +2 -0
- tests/test_generate_cli_client.py +4 -2
- tests/test_motor_control.py +25 -92
- tests/test_motor_map.py +10 -66
- tests/test_plot_base.py +1 -0
- tests/test_scan_control.py +1 -1
- tests/test_stream_plot.py +2 -2
- tests/test_validator_errors.py +5 -4
- tests/test_waveform1d.py +31 -12
- tests/test_widget_io.py +1 -8
- tests/test_yaml_dialog.py +2 -1
- bec_widgets-0.44.4.dist-info/RECORD +0 -96
- {bec_widgets-0.44.4.dist-info → bec_widgets-0.45.0.dist-info}/LICENSE +0 -0
- {bec_widgets-0.44.4.dist-info → bec_widgets-0.45.0.dist-info}/WHEEL +0 -0
- {bec_widgets-0.44.4.dist-info → bec_widgets-0.45.0.dist-info}/top_level.txt +0 -0
bec_widgets/widgets/__init__.py
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
from .monitor import BECMonitor, ConfigDialog
|
2
|
-
from .motor_map import MotorMap
|
3
|
-
from .scan_control import ScanControl
|
4
|
-
from .toolbar import ModularToolBar
|
5
1
|
from .editor import BECEditor
|
2
|
+
from .figure import BECFigure, FigureConfig
|
3
|
+
from .monitor import BECMonitor
|
6
4
|
from .monitor_scatter_2D import BECMonitor2DScatter
|
7
5
|
from .motor_control import (
|
8
|
-
MotorControlRelative,
|
9
6
|
MotorControlAbsolute,
|
7
|
+
MotorControlRelative,
|
10
8
|
MotorControlSelection,
|
11
|
-
MotorThread,
|
12
9
|
MotorCoordinateTable,
|
10
|
+
MotorThread,
|
13
11
|
)
|
14
|
-
from .
|
15
|
-
from .plots import
|
12
|
+
from .motor_map import MotorMap
|
13
|
+
from .plots import BECCurve, BECMotorMap, BECWaveform1D
|
14
|
+
from .scan_control import ScanControl
|
@@ -3,24 +3,16 @@ import subprocess
|
|
3
3
|
import qdarktheme
|
4
4
|
from jedi import Script
|
5
5
|
from jedi.api import Completion
|
6
|
+
from qtconsole.manager import QtKernelManager
|
7
|
+
from qtconsole.rich_jupyter_widget import RichJupyterWidget
|
6
8
|
|
7
9
|
# pylint: disable=no-name-in-module
|
8
|
-
from qtpy.Qsci import
|
9
|
-
from qtpy.QtCore import Qt
|
10
|
-
from qtpy.QtCore import Signal, QThread
|
10
|
+
from qtpy.Qsci import QsciAPIs, QsciLexerPython, QsciScintilla
|
11
|
+
from qtpy.QtCore import Qt, QThread, Signal
|
11
12
|
from qtpy.QtGui import QColor, QFont
|
12
|
-
from qtpy.QtWidgets import
|
13
|
-
QApplication,
|
14
|
-
QFileDialog,
|
15
|
-
QTextEdit,
|
16
|
-
QVBoxLayout,
|
17
|
-
QWidget,
|
18
|
-
)
|
19
|
-
from qtpy.QtWidgets import QSplitter
|
20
|
-
from qtconsole.manager import QtKernelManager
|
21
|
-
from qtconsole.rich_jupyter_widget import RichJupyterWidget
|
13
|
+
from qtpy.QtWidgets import QApplication, QFileDialog, QSplitter, QTextEdit, QVBoxLayout, QWidget
|
22
14
|
|
23
|
-
from bec_widgets.widgets import ModularToolBar
|
15
|
+
from bec_widgets.widgets.toolbar import ModularToolBar
|
24
16
|
|
25
17
|
|
26
18
|
class AutoCompleter(QThread):
|
@@ -1 +1 @@
|
|
1
|
-
from .figure import
|
1
|
+
from .figure import BECFigure, FigureConfig
|
@@ -11,19 +11,20 @@ import pyqtgraph as pg
|
|
11
11
|
import qdarktheme
|
12
12
|
from pydantic import Field
|
13
13
|
from pyqtgraph.Qt import uic
|
14
|
-
from qtpy.QtWidgets import QApplication, QWidget
|
15
|
-
from qtpy.QtWidgets import QVBoxLayout, QMainWindow
|
16
14
|
from qtpy.QtCore import Signal as pyqtSignal
|
15
|
+
from qtpy.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
|
17
16
|
|
18
17
|
from bec_widgets.utils import BECConnector, BECDispatcher, ConnectionConfig
|
19
18
|
from bec_widgets.widgets.plots import (
|
19
|
+
BECImageShow,
|
20
|
+
BECMotorMap,
|
20
21
|
BECPlotBase,
|
21
22
|
BECWaveform1D,
|
22
23
|
Waveform1DConfig,
|
23
24
|
WidgetConfig,
|
24
|
-
BECImageShow,
|
25
25
|
)
|
26
26
|
from bec_widgets.widgets.plots.image import ImageConfig
|
27
|
+
from bec_widgets.widgets.plots.motor_map import MotorMapConfig
|
27
28
|
|
28
29
|
|
29
30
|
class FigureConfig(ConnectionConfig):
|
@@ -45,6 +46,7 @@ class WidgetHandler:
|
|
45
46
|
"PlotBase": (BECPlotBase, WidgetConfig),
|
46
47
|
"Waveform1D": (BECWaveform1D, Waveform1DConfig),
|
47
48
|
"ImShow": (BECImageShow, ImageConfig),
|
49
|
+
"MotorMap": (BECMotorMap, MotorMapConfig),
|
48
50
|
}
|
49
51
|
|
50
52
|
def create_widget(
|
@@ -99,8 +101,10 @@ class BECFigure(BECConnector, pg.GraphicsLayoutWidget):
|
|
99
101
|
"widgets",
|
100
102
|
"add_plot",
|
101
103
|
"add_image",
|
104
|
+
"add_motor_map",
|
102
105
|
"plot",
|
103
106
|
"image",
|
107
|
+
"motor_map",
|
104
108
|
"remove",
|
105
109
|
"change_layout",
|
106
110
|
"change_theme",
|
@@ -348,7 +352,7 @@ class BECFigure(BECConnector, pg.GraphicsLayoutWidget):
|
|
348
352
|
row(int): The row coordinate of the widget in the figure. If not provided, the next empty row will be used.
|
349
353
|
col(int): The column coordinate of the widget in the figure. If not provided, the next empty column will be used.
|
350
354
|
config(dict): Additional configuration for the widget.
|
351
|
-
**axis_kwargs:
|
355
|
+
**axis_kwargs: Additional axis properties to set on the widget after creation.
|
352
356
|
|
353
357
|
Returns:
|
354
358
|
BECImageShow: The image widget.
|
@@ -390,6 +394,72 @@ class BECFigure(BECConnector, pg.GraphicsLayoutWidget):
|
|
390
394
|
|
391
395
|
return image
|
392
396
|
|
397
|
+
def motor_map(self, motor_x: str = None, motor_y: str = None, **axis_kwargs) -> BECMotorMap:
|
398
|
+
"""
|
399
|
+
Add a motor map to the figure. Always access the first motor map widget in the figure.
|
400
|
+
Args:
|
401
|
+
motor_x(str): The name of the motor for the X axis.
|
402
|
+
motor_y(str): The name of the motor for the Y axis.
|
403
|
+
**axis_kwargs: Additional axis properties to set on the widget after creation.
|
404
|
+
|
405
|
+
Returns:
|
406
|
+
BECMotorMap: The motor map widget.
|
407
|
+
"""
|
408
|
+
motor_map = self._find_first_widget_by_class(BECMotorMap, can_fail=True)
|
409
|
+
if motor_map is not None:
|
410
|
+
if axis_kwargs:
|
411
|
+
motor_map.set(**axis_kwargs)
|
412
|
+
else:
|
413
|
+
motor_map = self.add_motor_map(**axis_kwargs)
|
414
|
+
|
415
|
+
if motor_x is not None and motor_y is not None:
|
416
|
+
motor_map.change_motors(motor_x, motor_y)
|
417
|
+
|
418
|
+
return motor_map
|
419
|
+
|
420
|
+
def add_motor_map(
|
421
|
+
self,
|
422
|
+
motor_x: str = None,
|
423
|
+
motor_y: str = None,
|
424
|
+
row: int = None,
|
425
|
+
col: int = None,
|
426
|
+
config=None,
|
427
|
+
**axis_kwargs,
|
428
|
+
) -> BECMotorMap:
|
429
|
+
"""
|
430
|
+
|
431
|
+
Args:
|
432
|
+
motor_x(str): The name of the motor for the X axis.
|
433
|
+
motor_y(str): The name of the motor for the Y axis.
|
434
|
+
row(int): The row coordinate of the widget in the figure. If not provided, the next empty row will be used.
|
435
|
+
col(int): The column coordinate of the widget in the figure. If not provided, the next empty column will be used.
|
436
|
+
config(dict): Additional configuration for the widget.
|
437
|
+
**axis_kwargs:
|
438
|
+
|
439
|
+
Returns:
|
440
|
+
BECMotorMap: The motor map widget.
|
441
|
+
"""
|
442
|
+
widget_id = self._generate_unique_widget_id()
|
443
|
+
if config is None:
|
444
|
+
config = MotorMapConfig(
|
445
|
+
widget_class="BECMotorMap",
|
446
|
+
gui_id=widget_id,
|
447
|
+
parent_id=self.gui_id,
|
448
|
+
)
|
449
|
+
motor_map = self.add_widget(
|
450
|
+
widget_type="MotorMap",
|
451
|
+
widget_id=widget_id,
|
452
|
+
row=row,
|
453
|
+
col=col,
|
454
|
+
config=config,
|
455
|
+
**axis_kwargs,
|
456
|
+
)
|
457
|
+
|
458
|
+
if motor_x is not None and motor_y is not None:
|
459
|
+
motor_map.change_motors(motor_x, motor_y)
|
460
|
+
|
461
|
+
return motor_map
|
462
|
+
|
393
463
|
def add_widget(
|
394
464
|
self,
|
395
465
|
widget_type: Literal["PlotBase", "Waveform1D", "ImShow"] = "PlotBase",
|
@@ -1,23 +1,22 @@
|
|
1
1
|
import os
|
2
2
|
|
3
|
+
from pydantic import ValidationError
|
3
4
|
from qtpy import uic
|
4
5
|
from qtpy.QtCore import Signal as pyqtSignal
|
5
6
|
from qtpy.QtWidgets import (
|
6
7
|
QApplication,
|
7
|
-
|
8
|
-
|
8
|
+
QLineEdit,
|
9
|
+
QMessageBox,
|
9
10
|
QTableWidget,
|
10
|
-
QTabWidget,
|
11
11
|
QTableWidgetItem,
|
12
|
-
|
12
|
+
QTabWidget,
|
13
|
+
QVBoxLayout,
|
14
|
+
QWidget,
|
13
15
|
)
|
14
16
|
|
17
|
+
from bec_widgets.utils.bec_dispatcher import BECDispatcher
|
15
18
|
from bec_widgets.utils.yaml_dialog import load_yaml, save_yaml
|
16
19
|
from bec_widgets.validation import MonitorConfigValidator
|
17
|
-
from pydantic import ValidationError
|
18
|
-
from qtpy.QtWidgets import QApplication, QMessageBox
|
19
|
-
from bec_widgets.utils.bec_dispatcher import BECDispatcher
|
20
|
-
|
21
20
|
|
22
21
|
current_path = os.path.dirname(__file__)
|
23
22
|
Ui_Form, BaseClass = uic.loadUiType(os.path.join(current_path, "config_dialog.ui"))
|
@@ -11,8 +11,9 @@ from qtpy.QtCore import Slot as pyqtSlot
|
|
11
11
|
from qtpy.QtWidgets import QApplication, QMessageBox
|
12
12
|
|
13
13
|
from bec_widgets.utils import Colors, Crosshair, yaml_dialog
|
14
|
-
from bec_widgets.validation import MonitorConfigValidator
|
15
14
|
from bec_widgets.utils.bec_dispatcher import BECDispatcher
|
15
|
+
from bec_widgets.validation import MonitorConfigValidator
|
16
|
+
from bec_widgets.widgets.monitor.config_dialog import ConfigDialog
|
16
17
|
|
17
18
|
# just for demonstration purposes if script run directly
|
18
19
|
CONFIG_SCAN_MODE = {
|
@@ -59,10 +60,7 @@ CONFIG_SCAN_MODE = {
|
|
59
60
|
"sources": [
|
60
61
|
{
|
61
62
|
"type": "scan_segment",
|
62
|
-
"signals": {
|
63
|
-
"x": [{"name": "samy"}],
|
64
|
-
"y": [{"name": "bpm4i"}],
|
65
|
-
},
|
63
|
+
"signals": {"x": [{"name": "samy"}], "y": [{"name": "bpm4i"}]},
|
66
64
|
}
|
67
65
|
],
|
68
66
|
},
|
@@ -137,7 +135,7 @@ CONFIG_WRONG = {
|
|
137
135
|
},
|
138
136
|
{
|
139
137
|
"type": "history",
|
140
|
-
"
|
138
|
+
"scan_id": "<scan_id>",
|
141
139
|
"signals": {
|
142
140
|
"x": [{"name": "samy"}],
|
143
141
|
"y": [{"name": "bpm4i", "entry": "bpm4i"}],
|
@@ -170,11 +168,8 @@ CONFIG_WRONG = {
|
|
170
168
|
{
|
171
169
|
"signals": {
|
172
170
|
"x": [{"name": "samx", "entry": "samx"}],
|
173
|
-
"y": [
|
174
|
-
|
175
|
-
{"name": "samy", "entry": "samx"},
|
176
|
-
],
|
177
|
-
},
|
171
|
+
"y": [{"name": "samx"}, {"name": "samy", "entry": "samx"}],
|
172
|
+
}
|
178
173
|
}
|
179
174
|
],
|
180
175
|
},
|
@@ -315,7 +310,7 @@ class BECMonitor(pg.GraphicsLayoutWidget):
|
|
315
310
|
self.plots = None
|
316
311
|
self.curves_data = None
|
317
312
|
self.grid_coordinates = None
|
318
|
-
self.
|
313
|
+
self.scan_id = None
|
319
314
|
|
320
315
|
# TODO make colors accessible to users
|
321
316
|
self.user_colors = {} # key: (plot_name, y_name, y_entry), value: color
|
@@ -352,7 +347,7 @@ class BECMonitor(pg.GraphicsLayoutWidget):
|
|
352
347
|
# Initialize the UI
|
353
348
|
self._init_ui(self.plot_settings["num_columns"])
|
354
349
|
|
355
|
-
if self.
|
350
|
+
if self.scan_id is not None:
|
356
351
|
self.replot_last_scan()
|
357
352
|
|
358
353
|
def _init_database(self, plot_data_config: dict, source_type_to_init=None) -> dict:
|
@@ -602,7 +597,6 @@ class BECMonitor(pg.GraphicsLayoutWidget):
|
|
602
597
|
|
603
598
|
def show_config_dialog(self):
|
604
599
|
"""Show the configuration dialog."""
|
605
|
-
from bec_widgets.widgets import ConfigDialog
|
606
600
|
|
607
601
|
dialog = ConfigDialog(
|
608
602
|
client=self.client, default_config=self.config, skip_validation=self.skip_validation
|
@@ -729,11 +723,11 @@ class BECMonitor(pg.GraphicsLayoutWidget):
|
|
729
723
|
msg (dict): Message received with scan data.
|
730
724
|
metadata (dict): Metadata of the scan.
|
731
725
|
"""
|
732
|
-
|
733
|
-
if
|
726
|
+
current_scan_id = msg.get("scan_id", None)
|
727
|
+
if current_scan_id is None:
|
734
728
|
return
|
735
729
|
|
736
|
-
if
|
730
|
+
if current_scan_id != self.scan_id:
|
737
731
|
if self.scan_types is False:
|
738
732
|
self.plot_data = self.plot_data_config
|
739
733
|
elif self.scan_types is True:
|
@@ -753,10 +747,10 @@ class BECMonitor(pg.GraphicsLayoutWidget):
|
|
753
747
|
# Init UI
|
754
748
|
self._init_ui(self.plot_settings["num_columns"])
|
755
749
|
|
756
|
-
self.
|
757
|
-
self.scan_data = self.queue.scan_storage.find_scan_by_ID(self.
|
750
|
+
self.scan_id = current_scan_id
|
751
|
+
self.scan_data = self.queue.scan_storage.find_scan_by_ID(self.scan_id)
|
758
752
|
if not self.scan_data:
|
759
|
-
print(f"No data found for
|
753
|
+
print(f"No data found for scan_id: {self.scan_id}") # TODO better error
|
760
754
|
return
|
761
755
|
self.flush(source_type_to_flush="scan_segment")
|
762
756
|
|
@@ -766,7 +760,7 @@ class BECMonitor(pg.GraphicsLayoutWidget):
|
|
766
760
|
|
767
761
|
def scan_segment_update(self):
|
768
762
|
"""
|
769
|
-
Update the database with data from scan storage based on the provided
|
763
|
+
Update the database with data from scan storage based on the provided scan_id.
|
770
764
|
"""
|
771
765
|
scan_data = self.scan_data.data
|
772
766
|
for device_name, device_entries in self.database.get("scan_segment", {}).items():
|
@@ -840,11 +834,7 @@ if __name__ == "__main__": # pragma: no cover
|
|
840
834
|
client = BECDispatcher().client
|
841
835
|
client.start()
|
842
836
|
app = QApplication(sys.argv)
|
843
|
-
monitor = BECMonitor(
|
844
|
-
config=config,
|
845
|
-
gui_id=args.id,
|
846
|
-
skip_validation=False,
|
847
|
-
)
|
837
|
+
monitor = BECMonitor(config=config, gui_id=args.id, skip_validation=False)
|
848
838
|
monitor.show()
|
849
839
|
# just to test redis data
|
850
840
|
# redis_data = {
|
@@ -4,20 +4,16 @@ from collections import defaultdict
|
|
4
4
|
|
5
5
|
import numpy as np
|
6
6
|
import pyqtgraph as pg
|
7
|
+
from bec_lib import MessageEndpoints
|
7
8
|
from qtpy.QtCore import Signal as pyqtSignal
|
8
9
|
from qtpy.QtCore import Slot as pyqtSlot
|
9
|
-
from qtpy.QtWidgets import QApplication
|
10
|
-
from qtpy.QtWidgets import QVBoxLayout, QWidget
|
10
|
+
from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget
|
11
11
|
|
12
|
-
from bec_lib import MessageEndpoints
|
13
12
|
from bec_widgets.utils import yaml_dialog
|
14
13
|
from bec_widgets.utils.bec_dispatcher import BECDispatcher
|
15
14
|
|
16
15
|
CONFIG_DEFAULT = {
|
17
|
-
"plot_settings": {
|
18
|
-
"colormap": "CET-L4",
|
19
|
-
"num_columns": 1,
|
20
|
-
},
|
16
|
+
"plot_settings": {"colormap": "CET-L4", "num_columns": 1},
|
21
17
|
"waveform2D": [
|
22
18
|
{
|
23
19
|
"plot_name": "Waveform 2D Scatter (1)",
|
@@ -97,7 +93,7 @@ class BECMonitor2DScatter(QWidget):
|
|
97
93
|
self.plots = None
|
98
94
|
self.curves_data = None
|
99
95
|
self.grid_coordinates = None
|
100
|
-
self.
|
96
|
+
self.scan_id = None
|
101
97
|
|
102
98
|
# Connect the update signal to the update plot method
|
103
99
|
self.proxy_update_plot = pg.SignalProxy(
|
@@ -275,15 +271,15 @@ class BECMonitor2DScatter(QWidget):
|
|
275
271
|
"""
|
276
272
|
|
277
273
|
# TODO check if this is correct
|
278
|
-
|
279
|
-
if
|
274
|
+
current_scan_id = msg.get("scan_id", None)
|
275
|
+
if current_scan_id is None:
|
280
276
|
return
|
281
277
|
|
282
|
-
if
|
283
|
-
self.
|
284
|
-
self.scan_data = self.queue.scan_storage.find_scan_by_ID(self.
|
278
|
+
if current_scan_id != self.scan_id:
|
279
|
+
self.scan_id = current_scan_id
|
280
|
+
self.scan_data = self.queue.scan_storage.find_scan_by_ID(self.scan_id)
|
285
281
|
if not self.scan_data:
|
286
|
-
print(f"No data found for
|
282
|
+
print(f"No data found for scan_id: {self.scan_id}") # TODO better error
|
287
283
|
return
|
288
284
|
self.flush()
|
289
285
|
|
@@ -373,10 +369,6 @@ if __name__ == "__main__": # pragma: no cover
|
|
373
369
|
client = BECDispatcher().client
|
374
370
|
client.start()
|
375
371
|
app = QApplication(sys.argv)
|
376
|
-
monitor = BECMonitor2DScatter(
|
377
|
-
config=config,
|
378
|
-
gui_id=args.id,
|
379
|
-
skip_validation=True,
|
380
|
-
)
|
372
|
+
monitor = BECMonitor2DScatter(config=config, gui_id=args.id, skip_validation=True)
|
381
373
|
monitor.show()
|
382
374
|
sys.exit(app.exec())
|
@@ -2,25 +2,26 @@
|
|
2
2
|
import os
|
3
3
|
from enum import Enum
|
4
4
|
|
5
|
+
from bec_lib.alarm_handler import AlarmBase
|
6
|
+
from bec_lib.device import Positioner
|
5
7
|
from qtpy import uic
|
6
|
-
from qtpy.QtCore import
|
7
|
-
from qtpy.QtCore import Signal as pyqtSignal
|
8
|
-
from qtpy.
|
9
|
-
from qtpy.
|
8
|
+
from qtpy.QtCore import Qt, QThread
|
9
|
+
from qtpy.QtCore import Signal as pyqtSignal
|
10
|
+
from qtpy.QtCore import Slot as pyqtSlot
|
11
|
+
from qtpy.QtGui import QDoubleValidator, QKeySequence
|
10
12
|
from qtpy.QtWidgets import (
|
13
|
+
QCheckBox,
|
11
14
|
QComboBox,
|
12
|
-
QWidget,
|
13
15
|
QDoubleSpinBox,
|
16
|
+
QLineEdit,
|
17
|
+
QMessageBox,
|
18
|
+
QPushButton,
|
14
19
|
QShortcut,
|
15
20
|
QTableWidget,
|
16
|
-
QPushButton,
|
17
21
|
QTableWidgetItem,
|
18
|
-
|
19
|
-
QLineEdit,
|
22
|
+
QWidget,
|
20
23
|
)
|
21
24
|
|
22
|
-
from bec_lib.alarm_handler import AlarmBase
|
23
|
-
from bec_lib.device import Positioner
|
24
25
|
from bec_widgets.utils.bec_dispatcher import BECDispatcher
|
25
26
|
|
26
27
|
CONFIG_DEFAULT = {
|
@@ -7,14 +7,13 @@ from typing import Any, Union
|
|
7
7
|
import numpy as np
|
8
8
|
import pyqtgraph as pg
|
9
9
|
from bec_lib import MessageEndpoints
|
10
|
-
from qtpy import QtCore
|
11
|
-
from qtpy import QtGui
|
10
|
+
from qtpy import QtCore, QtGui
|
12
11
|
from qtpy.QtCore import Signal as pyqtSignal
|
13
12
|
from qtpy.QtCore import Slot as pyqtSlot
|
14
13
|
from qtpy.QtWidgets import QApplication
|
15
14
|
|
16
|
-
from bec_widgets.utils.yaml_dialog import load_yaml
|
17
15
|
from bec_widgets.utils.bec_dispatcher import BECDispatcher
|
16
|
+
from bec_widgets.utils.yaml_dialog import load_yaml
|
18
17
|
|
19
18
|
CONFIG_DEFAULT = {
|
20
19
|
"plot_settings": {
|
@@ -1,3 +1,4 @@
|
|
1
|
-
from .
|
2
|
-
from .
|
3
|
-
from .
|
1
|
+
from .image import BECImageItem, BECImageShow, ImageItemConfig
|
2
|
+
from .motor_map import BECMotorMap, MotorMapConfig
|
3
|
+
from .plot_base import AxisConfig, BECPlotBase, WidgetConfig
|
4
|
+
from .waveform1d import BECCurve, BECWaveform1D, Waveform1DConfig
|
@@ -1,19 +1,20 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
from collections import defaultdict
|
4
|
-
from typing import Literal, Optional
|
4
|
+
from typing import Any, Literal, Optional
|
5
5
|
|
6
6
|
import numpy as np
|
7
7
|
import pyqtgraph as pg
|
8
|
-
from
|
9
|
-
from
|
8
|
+
from bec_lib import MessageEndpoints
|
9
|
+
from pydantic import BaseModel, Field, ValidationError
|
10
|
+
from qtpy.QtCore import QObject, QThread
|
10
11
|
from qtpy.QtCore import Signal as pyqtSignal
|
11
12
|
from qtpy.QtCore import Slot as pyqtSlot
|
12
13
|
from qtpy.QtWidgets import QWidget
|
13
14
|
|
14
|
-
from
|
15
|
-
|
16
|
-
from
|
15
|
+
from bec_widgets.utils import BECConnector, ConnectionConfig
|
16
|
+
|
17
|
+
from .plot_base import BECPlotBase, WidgetConfig
|
17
18
|
|
18
19
|
|
19
20
|
class ProcessingConfig(BaseModel):
|