bec-widgets 1.25.1__py3-none-any.whl → 2.0.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.
- .gitlab-ci.yml +3 -5
- CHANGELOG.md +631 -0
- PKG-INFO +3 -3
- bec_widgets/__init__.py +4 -0
- bec_widgets/applications/bw_launch.py +23 -0
- bec_widgets/applications/launch_window.py +430 -0
- bec_widgets/assets/app_icons/auto_update.png +0 -0
- bec_widgets/assets/app_icons/ui_loader_tile.png +0 -0
- bec_widgets/cli/__init__.py +0 -1
- bec_widgets/cli/client.py +1779 -2064
- bec_widgets/cli/client_utils.py +346 -174
- bec_widgets/cli/generate_cli.py +143 -37
- bec_widgets/cli/rpc/rpc_base.py +152 -21
- bec_widgets/cli/rpc/rpc_register.py +113 -6
- bec_widgets/cli/rpc/rpc_widget_handler.py +13 -11
- bec_widgets/cli/server.py +125 -239
- bec_widgets/examples/jupyter_console/jupyter_console_window.py +97 -145
- bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +1 -1
- bec_widgets/utils/bec_connector.py +190 -21
- bec_widgets/utils/bec_designer.py +7 -0
- bec_widgets/utils/bec_dispatcher.py +71 -4
- bec_widgets/utils/bec_plugin_helper.py +89 -0
- bec_widgets/utils/bec_signal_proxy.py +1 -1
- bec_widgets/utils/bec_widget.py +26 -10
- bec_widgets/utils/colors.py +1 -1
- bec_widgets/{qt_utils → utils}/compact_popup.py +2 -0
- bec_widgets/utils/container_utils.py +37 -12
- bec_widgets/utils/crosshair.py +25 -8
- bec_widgets/utils/entry_validator.py +3 -1
- bec_widgets/{qt_utils → utils}/error_popups.py +18 -0
- bec_widgets/{qt_utils → utils}/expandable_frame.py +2 -2
- bec_widgets/utils/forms_from_types/forms.py +182 -0
- bec_widgets/{widgets/editors/scan_metadata/_metadata_widgets.py → utils/forms_from_types/items.py} +41 -30
- bec_widgets/utils/generate_designer_plugin.py +40 -36
- bec_widgets/utils/linear_region_selector.py +2 -0
- bec_widgets/utils/name_utils.py +16 -0
- bec_widgets/{qt_utils → utils}/palette_viewer.py +2 -2
- bec_widgets/utils/plot_indicator_items.py +2 -5
- bec_widgets/utils/plugin_utils.py +47 -1
- bec_widgets/{qt_utils → utils}/round_frame.py +14 -14
- bec_widgets/utils/rpc_server.py +277 -0
- bec_widgets/utils/serialization.py +44 -0
- bec_widgets/{qt_utils → utils}/settings_dialog.py +26 -1
- bec_widgets/{qt_utils → utils}/side_panel.py +17 -10
- bec_widgets/{qt_utils → utils}/toolbar.py +69 -25
- bec_widgets/utils/ui_loader.py +8 -8
- bec_widgets/utils/widget_io.py +166 -25
- bec_widgets/widgets/containers/auto_update/auto_updates.py +364 -0
- bec_widgets/widgets/containers/dock/dock.py +157 -49
- bec_widgets/widgets/containers/dock/dock_area.py +186 -138
- bec_widgets/widgets/containers/layout_manager/layout_manager.py +2 -1
- bec_widgets/widgets/containers/main_window/addons/web_links.py +15 -0
- bec_widgets/widgets/containers/main_window/main_window.py +189 -41
- bec_widgets/widgets/control/buttons/button_abort/button_abort.py +3 -4
- bec_widgets/widgets/control/buttons/button_reset/button_reset.py +3 -4
- bec_widgets/widgets/control/buttons/button_resume/button_resume.py +3 -3
- bec_widgets/widgets/control/buttons/stop_button/stop_button.py +18 -7
- bec_widgets/widgets/control/device_control/position_indicator/position_indicator.py +22 -3
- bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py +31 -13
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +3 -1
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.ui +27 -4
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +5 -2
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui +97 -31
- bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.ui +11 -4
- bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py +2 -3
- bec_widgets/widgets/control/device_input/base_classes/device_input_base.py +29 -4
- bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py +1 -0
- bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py +2 -2
- bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py +2 -2
- bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py +1 -2
- bec_widgets/widgets/control/device_input/signal_line_edit/signal_line_edit.py +1 -2
- bec_widgets/widgets/control/scan_control/scan_control.py +7 -5
- bec_widgets/widgets/control/scan_control/scan_group_box.py +28 -5
- bec_widgets/widgets/dap/dap_combo_box/dap_combo_box.py +1 -2
- bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog.py +3 -4
- bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_vertical.ui +14 -8
- bec_widgets/widgets/editors/console/console.py +1 -1
- bec_widgets/widgets/editors/{scan_metadata/additional_metadata_table.py → dict_backed_table.py} +29 -6
- bec_widgets/widgets/editors/scan_metadata/__init__.py +0 -7
- bec_widgets/widgets/editors/scan_metadata/_util.py +1 -1
- bec_widgets/widgets/{plots/motor_map/register_bec_motor_map_widget.py → editors/scan_metadata/register_scan_metadata.py} +2 -4
- bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +42 -136
- bec_widgets/widgets/editors/scan_metadata/scan_metadata.pyproject +1 -0
- bec_widgets/widgets/{plots/multi_waveform/bec_multi_waveform_widget_plugin.py → editors/scan_metadata/scan_metadata_plugin.py} +9 -9
- bec_widgets/widgets/editors/text_box/text_box.py +2 -3
- bec_widgets/widgets/editors/website/website.py +2 -2
- bec_widgets/widgets/games/minesweeper.py +3 -2
- bec_widgets/widgets/plots/image/image.py +960 -0
- bec_widgets/widgets/plots/image/image.pyproject +1 -0
- bec_widgets/widgets/plots/image/image_item.py +279 -0
- bec_widgets/widgets/plots/{motor_map/bec_motor_map_widget_plugin.py → image/image_plugin.py} +11 -13
- bec_widgets/widgets/{containers/figure/plots → plots}/image/image_processor.py +31 -64
- bec_widgets/widgets/plots/image/{register_bec_image_widget.py → register_image.py} +2 -2
- bec_widgets/widgets/plots/image/toolbar_bundles/image_selection.py +59 -0
- bec_widgets/widgets/plots/image/toolbar_bundles/processing.py +79 -0
- bec_widgets/widgets/plots/motor_map/motor_map.py +832 -0
- bec_widgets/widgets/plots/motor_map/motor_map.pyproject +1 -0
- bec_widgets/widgets/plots/motor_map/motor_map_plugin.py +54 -0
- bec_widgets/widgets/plots/{multi_waveform/register_bec_multi_waveform_widget.py → motor_map/register_motor_map.py} +2 -4
- bec_widgets/widgets/plots/motor_map/settings/motor_map_settings.py +129 -0
- bec_widgets/widgets/plots/motor_map/settings/motor_map_settings.ui +120 -0
- bec_widgets/widgets/plots/motor_map/toolbar_bundles/motor_selection.py +70 -0
- bec_widgets/widgets/plots/multi_waveform/multi_waveform.py +508 -0
- bec_widgets/widgets/plots/multi_waveform/multi_waveform.pyproject +1 -0
- bec_widgets/widgets/plots/multi_waveform/multi_waveform_plugin.py +54 -0
- bec_widgets/widgets/plots/multi_waveform/register_multi_waveform.py +15 -0
- bec_widgets/widgets/plots/multi_waveform/settings/control_panel.py +144 -0
- bec_widgets/widgets/plots/multi_waveform/settings/multi_waveform_controls.ui +164 -0
- bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/monitor_selection.py +65 -0
- bec_widgets/widgets/{plots_next_gen → plots}/plot_base.py +321 -40
- bec_widgets/widgets/plots/{waveform/register_bec_waveform_widget.py → scatter_waveform/register_scatter_waveform.py} +3 -3
- bec_widgets/widgets/plots/scatter_waveform/scatter_curve.py +197 -0
- bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.py +553 -0
- bec_widgets/widgets/plots/scatter_waveform/scatter_waveform.pyproject +1 -0
- bec_widgets/widgets/plots/{image/bec_image_widget_plugin.py → scatter_waveform/scatter_waveform_plugin.py} +9 -13
- bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_setting.py +138 -0
- bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_settings_horizontal.ui +195 -0
- bec_widgets/widgets/plots/scatter_waveform/settings/scatter_curve_settings_vertical.ui +204 -0
- bec_widgets/widgets/{plots_next_gen → plots}/setting_menus/axis_settings.py +8 -8
- bec_widgets/widgets/{plots_next_gen → plots}/toolbar_bundles/mouse_interactions.py +4 -18
- bec_widgets/widgets/{plots_next_gen → plots}/toolbar_bundles/plot_export.py +14 -3
- bec_widgets/widgets/{plots_next_gen → plots}/toolbar_bundles/roi_bundle.py +6 -1
- bec_widgets/widgets/{plots_next_gen → plots}/toolbar_bundles/save_state.py +2 -2
- bec_widgets/widgets/{containers/figure/plots/waveform/waveform_curve.py → plots/waveform/curve.py} +119 -49
- bec_widgets/widgets/plots/waveform/register_waveform.py +15 -0
- bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_setting.py +125 -0
- bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py +576 -0
- bec_widgets/widgets/plots/waveform/utils/__init__.py +0 -0
- bec_widgets/widgets/plots/waveform/utils/roi_manager.py +84 -0
- bec_widgets/widgets/plots/waveform/waveform.py +1794 -0
- bec_widgets/widgets/plots/waveform/waveform.pyproject +1 -0
- bec_widgets/widgets/plots/waveform/{bec_waveform_widget_plugin.py → waveform_plugin.py} +9 -13
- bec_widgets/widgets/progress/bec_progressbar/bec_progressbar.py +1 -2
- bec_widgets/widgets/progress/ring_progress_bar/ring.py +11 -10
- bec_widgets/widgets/progress/ring_progress_bar/ring_progress_bar.py +24 -14
- bec_widgets/widgets/services/bec_queue/bec_queue.py +13 -11
- bec_widgets/widgets/services/bec_status_box/bec_status_box.py +3 -4
- bec_widgets/widgets/services/device_browser/device_browser.py +5 -2
- bec_widgets/widgets/services/device_browser/device_item/device_item.py +1 -1
- bec_widgets/widgets/utility/logpanel/logpanel.py +36 -17
- bec_widgets/widgets/utility/spinbox/decimal_spinbox.py +3 -3
- bec_widgets/widgets/utility/visual/color_button/color_button.py +1 -1
- bec_widgets/widgets/utility/visual/colormap_widget/colormap_widget.py +4 -6
- bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py +4 -8
- {bec_widgets-1.25.1.dist-info → bec_widgets-2.0.0.dist-info}/METADATA +3 -3
- {bec_widgets-1.25.1.dist-info → bec_widgets-2.0.0.dist-info}/RECORD +168 -153
- pyproject.toml +3 -3
- bec_widgets/applications/alignment/alignment_1d/alignment_1d.py +0 -198
- bec_widgets/applications/alignment/alignment_1d/alignment_1d.ui +0 -615
- bec_widgets/applications/bec_app.py +0 -84
- bec_widgets/cli/auto_updates.py +0 -168
- bec_widgets/widgets/containers/figure/__init__.py +0 -1
- bec_widgets/widgets/containers/figure/figure.py +0 -796
- bec_widgets/widgets/containers/figure/plots/axis_settings.py +0 -91
- bec_widgets/widgets/containers/figure/plots/axis_settings.ui +0 -256
- bec_widgets/widgets/containers/figure/plots/image/image.py +0 -772
- bec_widgets/widgets/containers/figure/plots/image/image_item.py +0 -337
- bec_widgets/widgets/containers/figure/plots/motor_map/motor_map.py +0 -525
- bec_widgets/widgets/containers/figure/plots/multi_waveform/multi_waveform.py +0 -340
- bec_widgets/widgets/containers/figure/plots/plot_base.py +0 -505
- bec_widgets/widgets/containers/figure/plots/waveform/waveform.py +0 -1563
- bec_widgets/widgets/plots/image/bec_image_widget.pyproject +0 -1
- bec_widgets/widgets/plots/image/image_widget.py +0 -515
- bec_widgets/widgets/plots/motor_map/bec_motor_map_widget.pyproject +0 -1
- bec_widgets/widgets/plots/motor_map/motor_map_dialog/motor_map_settings.py +0 -56
- bec_widgets/widgets/plots/motor_map/motor_map_dialog/motor_map_settings.ui +0 -108
- bec_widgets/widgets/plots/motor_map/motor_map_widget.py +0 -234
- bec_widgets/widgets/plots/multi_waveform/bec_multi_waveform_widget.pyproject +0 -1
- bec_widgets/widgets/plots/multi_waveform/multi_waveform_controls.ui +0 -99
- bec_widgets/widgets/plots/multi_waveform/multi_waveform_widget.py +0 -536
- bec_widgets/widgets/plots/waveform/bec_waveform_widget.pyproject +0 -1
- bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/curve_dialog.py +0 -336
- bec_widgets/widgets/plots/waveform/waveform_popups/curve_dialog/curve_dialog.ui +0 -372
- bec_widgets/widgets/plots/waveform/waveform_popups/dap_summary_dialog/dap_summary_dialog.py +0 -25
- bec_widgets/widgets/plots/waveform/waveform_widget.py +0 -751
- /bec_widgets/{qt_utils → utils}/collapsible_panel_manager.py +0 -0
- /bec_widgets/{applications/alignment → utils/forms_from_types}/__init__.py +0 -0
- /bec_widgets/{qt_utils → utils}/redis_message_waiter.py +0 -0
- /bec_widgets/{applications/alignment/alignment_1d → widgets/containers/auto_update}/__init__.py +0 -0
- /bec_widgets/{qt_utils → widgets/containers/main_window/addons}/__init__.py +0 -0
- /bec_widgets/widgets/{containers/figure/plots → plots/image/toolbar_bundles}/__init__.py +0 -0
- /bec_widgets/widgets/{containers/figure/plots/image → plots/motor_map/settings}/__init__.py +0 -0
- /bec_widgets/widgets/{containers/figure/plots/motor_map → plots/motor_map/toolbar_bundles}/__init__.py +0 -0
- /bec_widgets/widgets/{containers/figure/plots/multi_waveform → plots/multi_waveform/settings}/__init__.py +0 -0
- /bec_widgets/widgets/{containers/figure/plots/waveform → plots/multi_waveform/toolbar_bundles}/__init__.py +0 -0
- /bec_widgets/widgets/plots/{motor_map/motor_map_dialog → scatter_waveform}/__init__.py +0 -0
- /bec_widgets/widgets/plots/{waveform/waveform_popups → scatter_waveform/settings}/__init__.py +0 -0
- /bec_widgets/widgets/plots/{waveform/waveform_popups/curve_dialog → setting_menus}/__init__.py +0 -0
- /bec_widgets/widgets/{plots_next_gen → plots}/setting_menus/axis_settings_horizontal.ui +0 -0
- /bec_widgets/widgets/{plots_next_gen → plots}/setting_menus/axis_settings_vertical.ui +0 -0
- /bec_widgets/widgets/plots/{waveform/waveform_popups/dap_summary_dialog → toolbar_bundles}/__init__.py +0 -0
- /bec_widgets/widgets/{plots_next_gen/setting_menus → plots/waveform/settings}/__init__.py +0 -0
- /bec_widgets/widgets/{plots_next_gen/toolbar_bundles → plots/waveform/settings/curve_settings}/__init__.py +0 -0
- {bec_widgets-1.25.1.dist-info → bec_widgets-2.0.0.dist-info}/WHEEL +0 -0
- {bec_widgets-1.25.1.dist-info → bec_widgets-2.0.0.dist-info}/entry_points.txt +0 -0
- {bec_widgets-1.25.1.dist-info → bec_widgets-2.0.0.dist-info}/licenses/LICENSE +0 -0
@@ -6,11 +6,11 @@ def main(): # pragma: no cover
|
|
6
6
|
return
|
7
7
|
from PySide6.QtDesigner import QPyDesignerCustomWidgetCollection
|
8
8
|
|
9
|
-
from bec_widgets.widgets.plots.
|
10
|
-
|
9
|
+
from bec_widgets.widgets.plots.scatter_waveform.scatter_waveform_plugin import (
|
10
|
+
ScatterWaveformPlugin,
|
11
11
|
)
|
12
12
|
|
13
|
-
QPyDesignerCustomWidgetCollection.addCustomWidget(
|
13
|
+
QPyDesignerCustomWidgetCollection.addCustomWidget(ScatterWaveformPlugin())
|
14
14
|
|
15
15
|
|
16
16
|
if __name__ == "__main__": # pragma: no cover
|
@@ -0,0 +1,197 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Literal
|
4
|
+
|
5
|
+
import numpy as np
|
6
|
+
import pyqtgraph as pg
|
7
|
+
from bec_lib import bec_logger
|
8
|
+
from pydantic import BaseModel, Field, ValidationError, field_validator
|
9
|
+
from qtpy import QtCore
|
10
|
+
|
11
|
+
from bec_widgets.utils import BECConnector, Colors, ConnectionConfig
|
12
|
+
|
13
|
+
if TYPE_CHECKING: # pragma: no cover
|
14
|
+
from bec_widgets.widgets.plots.scatter_waveform.scatter_waveform import ScatterWaveform
|
15
|
+
|
16
|
+
logger = bec_logger.logger
|
17
|
+
|
18
|
+
|
19
|
+
# noinspection PyDataclass
|
20
|
+
class ScatterDeviceSignal(BaseModel):
|
21
|
+
"""The configuration of a signal in the scatter waveform widget."""
|
22
|
+
|
23
|
+
name: str
|
24
|
+
entry: str
|
25
|
+
|
26
|
+
model_config: dict = {"validate_assignment": True}
|
27
|
+
|
28
|
+
|
29
|
+
# noinspection PyDataclass
|
30
|
+
class ScatterCurveConfig(ConnectionConfig):
|
31
|
+
parent_id: str | None = Field(None, description="The parent plot of the curve.")
|
32
|
+
label: str | None = Field(None, description="The label of the curve.")
|
33
|
+
color: str | tuple = Field("#808080", description="The color of the curve.")
|
34
|
+
symbol: str | None = Field("o", description="The symbol of the curve.")
|
35
|
+
symbol_size: int | None = Field(7, description="The size of the symbol of the curve.")
|
36
|
+
pen_width: int | None = Field(4, description="The width of the pen of the curve.")
|
37
|
+
pen_style: Literal["solid", "dash", "dot", "dashdot"] = Field(
|
38
|
+
"solid", description="The style of the pen of the curve."
|
39
|
+
)
|
40
|
+
color_map: str | None = Field(
|
41
|
+
"plasma", description="The color palette of the figure widget.", validate_default=True
|
42
|
+
)
|
43
|
+
x_device: ScatterDeviceSignal | None = Field(
|
44
|
+
None, description="The x device signal of the scatter waveform."
|
45
|
+
)
|
46
|
+
y_device: ScatterDeviceSignal | None = Field(
|
47
|
+
None, description="The y device signal of the scatter waveform."
|
48
|
+
)
|
49
|
+
z_device: ScatterDeviceSignal | None = Field(
|
50
|
+
None, description="The z device signal of the scatter waveform."
|
51
|
+
)
|
52
|
+
|
53
|
+
model_config: dict = {"validate_assignment": True}
|
54
|
+
_validate_color_palette = field_validator("color_map")(Colors.validate_color_map)
|
55
|
+
|
56
|
+
|
57
|
+
class ScatterCurve(BECConnector, pg.PlotDataItem):
|
58
|
+
"""Scatter curve item for the scatter waveform widget."""
|
59
|
+
|
60
|
+
USER_ACCESS = ["color_map"]
|
61
|
+
|
62
|
+
def __init__(
|
63
|
+
self,
|
64
|
+
parent_item: ScatterWaveform,
|
65
|
+
name: str | None = None,
|
66
|
+
config: ScatterCurveConfig | None = None,
|
67
|
+
gui_id: str | None = None,
|
68
|
+
**kwargs,
|
69
|
+
):
|
70
|
+
if config is None:
|
71
|
+
config = ScatterCurveConfig(
|
72
|
+
label=name,
|
73
|
+
widget_class=self.__class__.__name__,
|
74
|
+
parent_id=parent_item.config.gui_id,
|
75
|
+
)
|
76
|
+
self.config = config
|
77
|
+
else:
|
78
|
+
self.config = config
|
79
|
+
name = config.label
|
80
|
+
self.parent_item = parent_item
|
81
|
+
object_name = name.replace("-", "_").replace(" ", "_") if name else None
|
82
|
+
super().__init__(name=name, object_name=object_name, config=config, gui_id=gui_id, **kwargs)
|
83
|
+
|
84
|
+
self.data_z = None # color scaling needs to be cashed for changing colormap
|
85
|
+
self.apply_config()
|
86
|
+
|
87
|
+
def parent(self):
|
88
|
+
return self.parent_item
|
89
|
+
|
90
|
+
def apply_config(self, config: dict | ScatterCurveConfig | None = None, **kwargs) -> None:
|
91
|
+
"""
|
92
|
+
Apply the configuration to the curve.
|
93
|
+
|
94
|
+
Args:
|
95
|
+
config(dict|ScatterCurveConfig, optional): The configuration to apply.
|
96
|
+
"""
|
97
|
+
|
98
|
+
if config is not None:
|
99
|
+
if isinstance(config, dict):
|
100
|
+
config = ScatterCurveConfig(**config)
|
101
|
+
self.config = config
|
102
|
+
|
103
|
+
pen_style_map = {
|
104
|
+
"solid": QtCore.Qt.SolidLine,
|
105
|
+
"dash": QtCore.Qt.DashLine,
|
106
|
+
"dot": QtCore.Qt.DotLine,
|
107
|
+
"dashdot": QtCore.Qt.DashDotLine,
|
108
|
+
}
|
109
|
+
pen_style = pen_style_map.get(self.config.pen_style, QtCore.Qt.SolidLine)
|
110
|
+
|
111
|
+
pen = pg.mkPen(color=self.config.color, width=self.config.pen_width, style=pen_style)
|
112
|
+
self.setPen(pen)
|
113
|
+
|
114
|
+
if self.config.symbol:
|
115
|
+
self.setSymbolSize(self.config.symbol_size)
|
116
|
+
self.setSymbol(self.config.symbol)
|
117
|
+
|
118
|
+
@property
|
119
|
+
def color_map(self) -> str:
|
120
|
+
"""The color map of the scatter curve."""
|
121
|
+
return self.config.color_map
|
122
|
+
|
123
|
+
@color_map.setter
|
124
|
+
def color_map(self, value: str):
|
125
|
+
"""
|
126
|
+
Set the color map of the scatter curve.
|
127
|
+
|
128
|
+
Args:
|
129
|
+
value(str): The color map to set.
|
130
|
+
"""
|
131
|
+
try:
|
132
|
+
if value != self.config.color_map:
|
133
|
+
self.config.color_map = value
|
134
|
+
self.refresh_color_map(value)
|
135
|
+
except ValidationError:
|
136
|
+
return
|
137
|
+
|
138
|
+
def set_data(
|
139
|
+
self,
|
140
|
+
x: list[float] | np.ndarray,
|
141
|
+
y: list[float] | np.ndarray,
|
142
|
+
z: list[float] | np.ndarray,
|
143
|
+
color_map: str | None = None,
|
144
|
+
):
|
145
|
+
"""
|
146
|
+
Set the data of the scatter curve.
|
147
|
+
|
148
|
+
Args:
|
149
|
+
x (list[float] | np.ndarray): The x data of the scatter curve.
|
150
|
+
y (list[float] | np.ndarray): The y data of the scatter curve.
|
151
|
+
z (list[float] | np.ndarray): The z data of the scatter curve.
|
152
|
+
color_map (str | None): The color map of the scatter curve.
|
153
|
+
"""
|
154
|
+
if color_map is None:
|
155
|
+
color_map = self.config.color_map
|
156
|
+
|
157
|
+
self.data_z = z
|
158
|
+
color_z = self._make_z_gradient(z, color_map)
|
159
|
+
try:
|
160
|
+
self.setData(x=x, y=y, symbolBrush=color_z)
|
161
|
+
except TypeError:
|
162
|
+
logger.error("Error in setData, one of the data arrays is None")
|
163
|
+
|
164
|
+
def _make_z_gradient(self, data_z: list | np.ndarray, colormap: str) -> list | None:
|
165
|
+
"""
|
166
|
+
Make a gradient color for the z values.
|
167
|
+
|
168
|
+
Args:
|
169
|
+
data_z(list|np.ndarray): Z values.
|
170
|
+
colormap(str): Colormap for the gradient color.
|
171
|
+
|
172
|
+
Returns:
|
173
|
+
list: List of colors for the z values.
|
174
|
+
"""
|
175
|
+
# Normalize z_values for color mapping
|
176
|
+
z_min, z_max = np.min(data_z), np.max(data_z)
|
177
|
+
|
178
|
+
if z_max != z_min: # Ensure that there is a range in the z values
|
179
|
+
z_values_norm = (data_z - z_min) / (z_max - z_min)
|
180
|
+
colormap = pg.colormap.get(colormap) # using colormap from global settings
|
181
|
+
colors = [colormap.map(z, mode="qcolor") for z in z_values_norm]
|
182
|
+
return colors
|
183
|
+
else:
|
184
|
+
return None
|
185
|
+
|
186
|
+
def refresh_color_map(self, color_map: str):
|
187
|
+
"""
|
188
|
+
Refresh the color map of the scatter curve.
|
189
|
+
|
190
|
+
Args:
|
191
|
+
color_map(str): The color map to use.
|
192
|
+
"""
|
193
|
+
x_data, y_data = self.getData()
|
194
|
+
if x_data is None or y_data is None:
|
195
|
+
return
|
196
|
+
if self.data_z is not None:
|
197
|
+
self.set_data(x_data, y_data, self.data_z, color_map)
|