0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 03:31:50 +02:00

refactor(motor_map_widget): moved to top level

This commit is contained in:
2024-07-02 14:43:23 +02:00
parent 5bba788153
commit 55be644bf3
7 changed files with 206 additions and 54 deletions

View File

@ -18,6 +18,7 @@ class Widgets(str, enum.Enum):
BECDock = "BECDock" BECDock = "BECDock"
BECDockArea = "BECDockArea" BECDockArea = "BECDockArea"
BECFigure = "BECFigure" BECFigure = "BECFigure"
BECMotorMapWidget = "BECMotorMapWidget"
RingProgressBar = "RingProgressBar" RingProgressBar = "RingProgressBar"
ScanControl = "ScanControl" ScanControl = "ScanControl"
TextBox = "TextBox" TextBox = "TextBox"
@ -1192,6 +1193,7 @@ class BECMotorMap(RPCBase):
def get_data(self) -> "dict": def get_data(self) -> "dict":
""" """
Get the data of the motor map. Get the data of the motor map.
Returns: Returns:
dict: Data of the motor map. dict: Data of the motor map.
""" """
@ -1213,12 +1215,12 @@ class BECMotorMapWidget(RPCBase):
@rpc_call @rpc_call
def change_motors( def change_motors(
self, self,
motor_x: str, motor_x: "str",
motor_y: str, motor_y: "str",
motor_x_entry: str = None, motor_x_entry: "str" = None,
motor_y_entry: str = None, motor_y_entry: "str" = None,
validate_bec: bool = True, validate_bec: "bool" = True,
) -> None: ) -> "None":
""" """
Change the active motors for the plot. Change the active motors for the plot.
@ -1230,6 +1232,66 @@ class BECMotorMapWidget(RPCBase):
validate_bec(bool, optional): If True, validate the signal with BEC. Defaults to True. validate_bec(bool, optional): If True, validate the signal with BEC. Defaults to True.
""" """
@rpc_call
def set_max_points(self, max_points: "int") -> "None":
"""
Set the maximum number of points to display on the motor map.
Args:
max_points(int): Maximum number of points to display.
"""
@rpc_call
def set_precision(self, precision: "int") -> "None":
"""
Set the precision of the motor map.
Args:
precision(int): Precision to set.
"""
@rpc_call
def set_num_dim_points(self, num_dim_points: "int") -> "None":
"""
Set the number of points to display on the motor map.
Args:
num_dim_points(int): Number of points to display.
"""
@rpc_call
def set_background_value(self, background_value: "int") -> "None":
"""
Set the background value of the motor map.
Args:
background_value(int): Background value of the motor map.
"""
@rpc_call
def set_scatter_size(self, scatter_size: "int") -> "None":
"""
Set the scatter size of the motor map.
Args:
scatter_size(int): Scatter size of the motor map.
"""
@rpc_call
def get_data(self) -> "dict":
"""
Get the data of the motor map.
Returns:
dict: Data of the motor map.
"""
@rpc_call
def reset_history(self) -> "None":
"""
Reset the history of the motor map.
"""
class BECPlotBase(RPCBase): class BECPlotBase(RPCBase):
@property @property

View File

@ -10,7 +10,7 @@ from pydantic import Field, ValidationError, field_validator
from pydantic_core import PydanticCustomError from pydantic_core import PydanticCustomError
from qtpy import QtCore, QtGui from qtpy import QtCore, QtGui
from qtpy.QtCore import Signal as pyqtSignal from qtpy.QtCore import Signal as pyqtSignal
from qtpy.QtCore import Slot as pyqtSlot from qtpy.QtCore import Slot
from qtpy.QtWidgets import QWidget from qtpy.QtWidgets import QWidget
from bec_widgets.utils import Colors, EntryValidator from bec_widgets.utils import Colors, EntryValidator
@ -121,7 +121,7 @@ class BECMotorMap(BECPlotBase):
motor_y_entry=self.config.signals.y.entry, motor_y_entry=self.config.signals.y.entry,
) )
@pyqtSlot(str, str, str, str, bool) @Slot(str, str, str, str, bool)
def change_motors( def change_motors(
self, self,
motor_x: str, motor_x: str,
@ -165,6 +165,7 @@ class BECMotorMap(BECPlotBase):
def get_data(self) -> dict: def get_data(self) -> dict:
""" """
Get the data of the motor map. Get the data of the motor map.
Returns: Returns:
dict: Data of the motor map. dict: Data of the motor map.
""" """
@ -179,7 +180,7 @@ class BECMotorMap(BECPlotBase):
self.database_buffer["y"] = [self.database_buffer["y"][-1]] self.database_buffer["y"] = [self.database_buffer["y"][-1]]
self.update_signal.emit() self.update_signal.emit()
def set_color(self, color: [str | tuple]): def set_color(self, color: str | tuple):
""" """
Set color of the motor trace. Set color of the motor trace.
@ -437,6 +438,7 @@ class BECMotorMap(BECPlotBase):
print(f"The device '{motor}' does not have defined limits.") print(f"The device '{motor}' does not have defined limits.")
return None return None
@Slot()
def _update_plot(self): def _update_plot(self):
"""Update the motor map plot.""" """Update the motor map plot."""
# If the number of points exceeds max_points, delete the oldest points # If the number of points exceeds max_points, delete the oldest points
@ -486,7 +488,7 @@ class BECMotorMap(BECPlotBase):
f"Motor position: ({round(float(current_x),precision)}, {round(float(current_y),precision)})" f"Motor position: ({round(float(current_x),precision)}, {round(float(current_y),precision)})"
) )
@pyqtSlot(dict) @Slot(dict)
def on_device_readback(self, msg: dict) -> None: def on_device_readback(self, msg: dict) -> None:
""" """
Update the motor map plot with the new motor position. Update the motor map plot with the new motor position.

View File

Before

Width:  |  Height:  |  Size: 313 B

After

Width:  |  Height:  |  Size: 313 B

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,43 @@
import os
from qtpy.QtCore import QSize
from qtpy.QtGui import QAction, QIcon
from qtpy.QtWidgets import QHBoxLayout, QLabel, QWidget
from bec_widgets.widgets.device_inputs import DeviceComboBox
from bec_widgets.widgets.toolbar.toolbar import ToolBarAction
class SettingsAction(ToolBarAction):
def add_to_toolbar(self, toolbar, target):
current_path = os.path.dirname(__file__)
icon = QIcon()
icon.addFile(os.path.join(current_path, "assets", "settings.svg"), size=QSize(20, 20))
action = QAction(icon, "Config", target)
action.triggered.connect(lambda: print(target.config_dict))
toolbar.addAction(action)
class DeviceSelectionAction(ToolBarAction):
def __init__(self, label: str):
self.label = label
self.device_combobox = DeviceComboBox(device_filter="Positioner")
def add_to_toolbar(self, toolbar, target):
widget = QWidget()
layout = QHBoxLayout(widget)
label = QLabel(f"{self.label}")
layout.addWidget(label)
layout.addWidget(self.device_combobox)
toolbar.addWidget(widget)
class ConnectAction(ToolBarAction):
def add_to_toolbar(self, toolbar, target):
current_path = os.path.dirname(__file__)
icon = QIcon()
icon.addFile(os.path.join(current_path, "assets", "connection.svg"), size=QSize(20, 20))
self.action = QAction(icon, "Connect Motors", target)
toolbar.addAction(self.action)

View File

@ -1,54 +1,29 @@
import os from __future__ import annotations
from qtpy.QtCore import QSize, Slot from qtpy.QtWidgets import QVBoxLayout, QWidget
from qtpy.QtGui import QAction, QIcon
from qtpy.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QWidget
from bec_widgets.utils import BECConnector from bec_widgets.utils import BECConnector
from bec_widgets.widgets.device_inputs import DeviceComboBox
from bec_widgets.widgets.figure import BECFigure from bec_widgets.widgets.figure import BECFigure
from bec_widgets.widgets.figure.plots.motor_map.motor_map import MotorMapConfig from bec_widgets.widgets.figure.plots.motor_map.motor_map import MotorMapConfig
from bec_widgets.widgets.motor_map.motor_map_toolbar import (
ConnectAction,
DeviceSelectionAction,
SettingsAction,
)
from bec_widgets.widgets.toolbar import ModularToolBar from bec_widgets.widgets.toolbar import ModularToolBar
from bec_widgets.widgets.toolbar.toolbar import ToolBarAction
class SettingsAction(ToolBarAction):
def add_to_toolbar(self, toolbar, target):
current_path = os.path.dirname(__file__)
icon = QIcon()
icon.addFile(os.path.join(current_path, "assets", "settings.svg"), size=QSize(20, 20))
action = QAction(icon, "Config", target)
action.triggered.connect(lambda: print(target.config_dict))
toolbar.addAction(action)
class DeviceSelectionAction(ToolBarAction):
def __init__(self, label: str):
self.label = label
self.device_combobox = DeviceComboBox(device_filter="Positioner")
def add_to_toolbar(self, toolbar, target):
widget = QWidget()
layout = QHBoxLayout(widget)
label = QLabel(f"{self.label}")
layout.addWidget(label)
layout.addWidget(self.device_combobox)
toolbar.addWidget(widget)
class ConnectAction(ToolBarAction):
def add_to_toolbar(self, toolbar, target):
current_path = os.path.dirname(__file__)
icon = QIcon()
icon.addFile(os.path.join(current_path, "assets", "connection.svg"), size=QSize(20, 20))
self.action = QAction(icon, "Connect Motors", target)
toolbar.addAction(self.action)
class BECMotorMapWidget(BECConnector, QWidget): class BECMotorMapWidget(BECConnector, QWidget):
USER_ACCESS = ["change_motors"] USER_ACCESS = [
"change_motors",
"set_max_points",
"set_precision",
"set_num_dim_points",
"set_background_value",
"set_scatter_size",
"get_data",
"reset_history",
]
def __init__( def __init__(
self, self,
@ -98,6 +73,10 @@ class BECMotorMapWidget(BECConnector, QWidget):
motor_y = self.toolbar.widgets["motor_y"].device_combobox.currentText() motor_y = self.toolbar.widgets["motor_y"].device_combobox.currentText()
self.change_motors(motor_x, motor_y, None, None, True) self.change_motors(motor_x, motor_y, None, None, True)
###################################
# User Access Methods from MotorMap
###################################
def change_motors( def change_motors(
self, self,
motor_x: str, motor_x: str,
@ -118,8 +97,74 @@ class BECMotorMapWidget(BECConnector, QWidget):
""" """
self.map.change_motors(motor_x, motor_y, motor_x_entry, motor_y_entry, validate_bec) self.map.change_motors(motor_x, motor_y, motor_x_entry, motor_y_entry, validate_bec)
def set(self, **kwargs): def get_data(self) -> dict:
self.map.set(**kwargs) """
Get the data of the motor map.
Returns:
dict: Data of the motor map.
"""
return self.map.get_data()
def reset_history(self) -> None:
"""
Reset the history of the motor map.
"""
self.map.reset_history()
def set_color(self, color: str | tuple):
"""
Set the color of the motor map.
Args:
color(str, tuple): Color to set.
"""
self.map.set_color(color)
def set_max_points(self, max_points: int) -> None:
"""
Set the maximum number of points to display on the motor map.
Args:
max_points(int): Maximum number of points to display.
"""
self.map.set_max_points(max_points)
def set_precision(self, precision: int) -> None:
"""
Set the precision of the motor map.
Args:
precision(int): Precision to set.
"""
self.map.set_precision(precision)
def set_num_dim_points(self, num_dim_points: int) -> None:
"""
Set the number of points to display on the motor map.
Args:
num_dim_points(int): Number of points to display.
"""
self.map.set_num_dim_points(num_dim_points)
def set_background_value(self, background_value: int) -> None:
"""
Set the background value of the motor map.
Args:
background_value(int): Background value of the motor map.
"""
self.map.set_background_value(background_value)
def set_scatter_size(self, scatter_size: int) -> None:
"""
Set the scatter size of the motor map.
Args:
scatter_size(int): Scatter size of the motor map.
"""
self.map.set_scatter_size(scatter_size)
if __name__ == "__main__": if __name__ == "__main__":