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.
Files changed (67) hide show
  1. bec_widgets/cli/client.py +105 -5
  2. bec_widgets/cli/client_utils.py +4 -4
  3. bec_widgets/cli/generate_cli.py +6 -4
  4. bec_widgets/cli/server.py +2 -3
  5. bec_widgets/examples/__init__.py +1 -1
  6. bec_widgets/examples/eiger_plot/eiger_plot.py +3 -11
  7. bec_widgets/examples/mca_readout/mca_plot.py +21 -24
  8. bec_widgets/examples/mca_readout/mca_sim.py +7 -12
  9. bec_widgets/examples/motor_movement/__init__.py +1 -1
  10. bec_widgets/examples/motor_movement/motor_control_compilations.py +3 -8
  11. bec_widgets/examples/motor_movement/motor_controller.ui +1 -1
  12. bec_widgets/examples/motor_movement/motor_example.py +13 -14
  13. bec_widgets/examples/stream_plot/stream_plot.py +5 -4
  14. bec_widgets/utils/__init__.py +5 -5
  15. bec_widgets/utils/bec_connector.py +1 -1
  16. bec_widgets/utils/bec_dispatcher.py +1 -2
  17. bec_widgets/utils/bec_table.py +1 -1
  18. bec_widgets/utils/crosshair.py +2 -1
  19. bec_widgets/utils/validator_delegate.py +1 -1
  20. bec_widgets/utils/widget_io.py +6 -6
  21. bec_widgets/utils/yaml_dialog.py +1 -0
  22. bec_widgets/validation/monitor_config_validator.py +6 -6
  23. bec_widgets/widgets/__init__.py +7 -8
  24. bec_widgets/widgets/editor/editor.py +6 -14
  25. bec_widgets/widgets/figure/__init__.py +1 -1
  26. bec_widgets/widgets/figure/figure.py +74 -4
  27. bec_widgets/widgets/monitor/__init__.py +0 -1
  28. bec_widgets/widgets/monitor/config_dialog.py +7 -8
  29. bec_widgets/widgets/monitor/monitor.py +16 -26
  30. bec_widgets/widgets/monitor_scatter_2D/monitor_scatter_2D.py +11 -19
  31. bec_widgets/widgets/motor_control/__init__.py +2 -2
  32. bec_widgets/widgets/motor_control/motor_control.py +11 -10
  33. bec_widgets/widgets/motor_map/motor_map.py +2 -3
  34. bec_widgets/widgets/plots/__init__.py +4 -3
  35. bec_widgets/widgets/plots/image.py +7 -6
  36. bec_widgets/widgets/plots/motor_map.py +423 -0
  37. bec_widgets/widgets/plots/plot_base.py +1 -2
  38. bec_widgets/widgets/plots/waveform1d.py +24 -23
  39. bec_widgets/widgets/scan_control/scan_control.py +12 -12
  40. bec_widgets/widgets/toolbar/toolbar.py +2 -4
  41. {bec_widgets-0.44.4.dist-info → bec_widgets-0.45.0.dist-info}/METADATA +2 -1
  42. bec_widgets-0.45.0.dist-info/RECORD +98 -0
  43. tests/client_mocks.py +76 -30
  44. tests/conftest.py +2 -1
  45. tests/test_bec_connector.py +2 -1
  46. tests/test_bec_dispatcher.py +3 -4
  47. tests/test_bec_figure.py +14 -2
  48. tests/test_bec_monitor.py +7 -76
  49. tests/test_bec_monitor_scatter2D.py +8 -32
  50. tests/test_bec_motor_map.py +125 -0
  51. tests/test_config_dialog.py +4 -66
  52. tests/test_editor.py +2 -4
  53. tests/test_eiger_plot.py +2 -0
  54. tests/test_generate_cli_client.py +4 -2
  55. tests/test_motor_control.py +25 -92
  56. tests/test_motor_map.py +10 -66
  57. tests/test_plot_base.py +1 -0
  58. tests/test_scan_control.py +1 -1
  59. tests/test_stream_plot.py +2 -2
  60. tests/test_validator_errors.py +5 -4
  61. tests/test_waveform1d.py +31 -12
  62. tests/test_widget_io.py +1 -8
  63. tests/test_yaml_dialog.py +2 -1
  64. bec_widgets-0.44.4.dist-info/RECORD +0 -96
  65. {bec_widgets-0.44.4.dist-info → bec_widgets-0.45.0.dist-info}/LICENSE +0 -0
  66. {bec_widgets-0.44.4.dist-info → bec_widgets-0.45.0.dist-info}/WHEEL +0 -0
  67. {bec_widgets-0.44.4.dist-info → bec_widgets-0.45.0.dist-info}/top_level.txt +0 -0
@@ -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 .figure import FigureConfig, BECFigure
15
- from .plots import BECWaveform1D, BECCurve, BECPlotBase
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 QsciScintilla, QsciLexerPython, QsciAPIs
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 FigureConfig, BECFigure
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,2 +1 @@
1
1
  from .monitor import BECMonitor
2
- from .config_dialog import ConfigDialog
@@ -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
- QWidget,
8
- QVBoxLayout,
8
+ QLineEdit,
9
+ QMessageBox,
9
10
  QTableWidget,
10
- QTabWidget,
11
11
  QTableWidgetItem,
12
- QLineEdit,
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
- "scanID": "<scanID>",
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
- {"name": "samx"},
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.scanID = None
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.scanID is not None:
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
- current_scanID = msg.get("scanID", None)
733
- if current_scanID is None:
726
+ current_scan_id = msg.get("scan_id", None)
727
+ if current_scan_id is None:
734
728
  return
735
729
 
736
- if current_scanID != self.scanID:
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.scanID = current_scanID
757
- self.scan_data = self.queue.scan_storage.find_scan_by_ID(self.scanID)
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 scanID: {self.scanID}") # TODO better error
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 scanID.
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.scanID = None
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
- current_scanID = msg.get("scanID", None)
279
- if current_scanID is None:
274
+ current_scan_id = msg.get("scan_id", None)
275
+ if current_scan_id is None:
280
276
  return
281
277
 
282
- if current_scanID != self.scanID:
283
- self.scanID = current_scanID
284
- self.scan_data = self.queue.scan_storage.find_scan_by_ID(self.scanID)
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 scanID: {self.scanID}") # TODO better error
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())
@@ -1,7 +1,7 @@
1
1
  from .motor_control import (
2
- MotorControlRelative,
3
2
  MotorControlAbsolute,
3
+ MotorControlRelative,
4
4
  MotorControlSelection,
5
- MotorThread,
6
5
  MotorCoordinateTable,
6
+ MotorThread,
7
7
  )
@@ -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 QThread, Slot as pyqtSlot
7
- from qtpy.QtCore import Signal as pyqtSignal, Qt
8
- from qtpy.QtGui import QKeySequence, QDoubleValidator
9
- from qtpy.QtWidgets import QMessageBox
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
- QCheckBox,
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 .plot_base import AxisConfig, WidgetConfig, BECPlotBase
2
- from .waveform1d import Waveform1DConfig, BECWaveform1D, BECCurve
3
- from .image import BECImageShow, ImageItemConfig, BECImageItem
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, Any
4
+ from typing import Any, Literal, Optional
5
5
 
6
6
  import numpy as np
7
7
  import pyqtgraph as pg
8
- from pydantic import Field, BaseModel, ValidationError
9
- from qtpy.QtCore import QThread, QObject
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 bec_lib import MessageEndpoints
15
- from bec_widgets.utils import ConnectionConfig, BECConnector
16
- from bec_widgets.widgets.plots import BECPlotBase, WidgetConfig
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):