From 4a97105e4bd2ce77d72dfe5f8307dd9ee65b21b0 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Thu, 27 Jun 2024 16:38:08 +0200 Subject: [PATCH] fix(figure): subplot methods consolidated; added subplot factory --- bec_widgets/cli/client.py | 113 +++------------------ tests/end-2-end/test_bec_figure_rpc_e2e.py | 4 +- tests/end-2-end/test_rpc_register_e2e.py | 2 +- tests/unit_tests/test_waveform1d.py | 35 +++---- 4 files changed, 37 insertions(+), 117 deletions(-) diff --git a/bec_widgets/cli/client.py b/bec_widgets/cli/client.py index 7175a7a1..de6d965a 100644 --- a/bec_widgets/cli/client.py +++ b/bec_widgets/cli/client.py @@ -454,103 +454,6 @@ class BECFigure(RPCBase): dict: All widgets within the figure. """ - @rpc_call - def add_plot( - self, - x: "list | np.ndarray" = None, - y: "list | np.ndarray" = None, - x_name: "str" = None, - y_name: "str" = None, - z_name: "str" = None, - x_entry: "str" = None, - y_entry: "str" = None, - z_entry: "str" = None, - color: "Optional[str]" = None, - color_map_z: "Optional[str]" = "plasma", - label: "Optional[str]" = None, - validate: "bool" = True, - row: "int" = None, - col: "int" = None, - config=None, - dap: "str | None" = None, - **axis_kwargs, - ) -> "BECWaveform": - """ - Add a Waveform1D plot to the figure at the specified position. - - Args: - x(list | np.ndarray): Custom x data to plot. - y(list | np.ndarray): Custom y data to plot. - x_name(str): The name of the device for the x-axis. - y_name(str): The name of the device for the y-axis. - z_name(str): The name of the device for the z-axis. - x_entry(str): The name of the entry for the x-axis. - y_entry(str): The name of the entry for the y-axis. - z_entry(str): The name of the entry for the z-axis. - color(str): The color of the curve. - color_map_z(str): The color map to use for the z-axis. - label(str): The label of the curve. - validate(bool): If True, validate the device names and entries. - row(int): The row coordinate of the widget in the figure. If not provided, the next empty row will be used. - col(int): The column coordinate of the widget in the figure. If not provided, the next empty column will be used. - config(dict): Additional configuration for the widget. - **axis_kwargs(dict): Additional axis properties to set on the widget after creation. - """ - - @rpc_call - def add_image( - self, - monitor: "str" = None, - color_bar: "Literal['simple', 'full']" = "full", - color_map: "str" = "magma", - data: "np.ndarray" = None, - vrange: "tuple[float, float]" = None, - row: "int" = None, - col: "int" = None, - config=None, - **axis_kwargs, - ) -> "BECImageShow": - """ - Add an image to the figure at the specified position. - - Args: - monitor(str): The name of the monitor to display. - color_bar(Literal["simple","full"]): The type of color bar to display. - color_map(str): The color map to use for the image. - data(np.ndarray): Custom data to display. - vrange(tuple[float, float]): The range of values to display. - row(int): The row coordinate of the widget in the figure. If not provided, the next empty row will be used. - col(int): The column coordinate of the widget in the figure. If not provided, the next empty column will be used. - config(dict): Additional configuration for the widget. - **axis_kwargs: Additional axis properties to set on the widget after creation. - - Returns: - BECImageShow: The image widget. - """ - - @rpc_call - def add_motor_map( - self, - motor_x: "str" = None, - motor_y: "str" = None, - row: "int" = None, - col: "int" = None, - config=None, - **axis_kwargs, - ) -> "BECMotorMap": - """ - Args: - motor_x(str): The name of the motor for the X axis. - motor_y(str): The name of the motor for the Y axis. - row(int): The row coordinate of the widget in the figure. If not provided, the next empty row will be used. - col(int): The column coordinate of the widget in the figure. If not provided, the next empty column will be used. - config(dict): Additional configuration for the widget. - **axis_kwargs: - - Returns: - BECMotorMap: The motor map widget. - """ - @rpc_call def plot( self, @@ -566,7 +469,11 @@ class BECFigure(RPCBase): color_map_z: "str | None" = "plasma", label: "str | None" = None, validate: "bool" = True, + new: "bool" = False, + row: "int | None" = None, + col: "int | None" = None, dap: "str | None" = None, + config: "dict | None" = None, **axis_kwargs, ) -> "BECWaveform": """ @@ -585,7 +492,11 @@ class BECFigure(RPCBase): color_map_z(str): The color map to use for the z-axis. label(str): The label of the curve. validate(bool): If True, validate the device names and entries. + new(bool): If True, create a new plot instead of using the first plot. + row(int): The row coordinate of the widget in the figure. If not provided, the next empty row will be used. + col(int): The column coordinate of the widget in the figure. If not provided, the next empty column will be used. dap(str): The DAP model to use for the curve. + config(dict): Recreates the whole BECWaveform widget from provided configuration. **axis_kwargs: Additional axis properties to set on the widget after creation. Returns: @@ -600,6 +511,10 @@ class BECFigure(RPCBase): color_map: "str" = "magma", data: "np.ndarray" = None, vrange: "tuple[float, float]" = None, + new: "bool" = False, + row: "int | None" = None, + col: "int | None" = None, + config: "dict | None" = None, **axis_kwargs, ) -> "BECImageShow": """ @@ -611,6 +526,10 @@ class BECFigure(RPCBase): color_map(str): The color map to use for the image. data(np.ndarray): Custom data to display. vrange(tuple[float, float]): The range of values to display. + new(bool): If True, create a new plot instead of using the first plot. + row(int): The row coordinate of the widget in the figure. If not provided, the next empty row will be used. + col(int): The column coordinate of the widget in the figure. If not provided, the next empty column will be used. + config(dict): Recreates the whole BECImageShow widget from provided configuration. **axis_kwargs: Additional axis properties to set on the widget after creation. Returns: diff --git a/tests/end-2-end/test_bec_figure_rpc_e2e.py b/tests/end-2-end/test_bec_figure_rpc_e2e.py index 4ebea4b2..1841ec05 100644 --- a/tests/end-2-end/test_bec_figure_rpc_e2e.py +++ b/tests/end-2-end/test_bec_figure_rpc_e2e.py @@ -10,7 +10,7 @@ from bec_widgets.cli.client import BECFigure, BECImageShow, BECMotorMap, BECWave def test_rpc_waveform1d_custom_curve(rpc_server_figure): fig = BECFigure(rpc_server_figure) - ax = fig.add_plot() + ax = fig.plot() curve = ax.plot(x=[1, 2, 3], y=[1, 2, 3]) curve.set_color("red") curve = ax.curves[0] @@ -26,7 +26,7 @@ def test_rpc_plotting_shortcuts_init_configs(rpc_server_figure, qtbot): plt = fig.plot(x_name="samx", y_name="bpm4i") im = fig.image("eiger") motor_map = fig.motor_map("samx", "samy") - plt_z = fig.add_plot(x_name="samx", y_name="samy", z_name="bpm4i") + plt_z = fig.plot(x_name="samx", y_name="samy", z_name="bpm4i", new=True) # Checking if classes are correctly initialised assert len(fig.widgets) == 4 diff --git a/tests/end-2-end/test_rpc_register_e2e.py b/tests/end-2-end/test_rpc_register_e2e.py index 2314d3cb..2a2e532d 100644 --- a/tests/end-2-end/test_rpc_register_e2e.py +++ b/tests/end-2-end/test_rpc_register_e2e.py @@ -9,7 +9,7 @@ def test_rpc_register_list_connections(rpc_server_figure): plt = fig.plot(x_name="samx", y_name="bpm4i") im = fig.image("eiger") motor_map = fig.motor_map("samx", "samy") - plt_z = fig.add_plot(x_name="samx", y_name="samy", z_name="bpm4i") + plt_z = fig.plot(x_name="samx", y_name="samy", z_name="bpm4i", new=True) # keep only class names from objects, since objects on server and client are different # so the best we can do is to compare types (rpc register is unit-tested elsewhere) diff --git a/tests/unit_tests/test_waveform1d.py b/tests/unit_tests/test_waveform1d.py index b0b14580..f3c295b9 100644 --- a/tests/unit_tests/test_waveform1d.py +++ b/tests/unit_tests/test_waveform1d.py @@ -11,7 +11,7 @@ from .test_bec_figure import bec_figure def test_adding_curve_to_waveform(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() # adding curve which is in bec - only names c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i") @@ -39,7 +39,7 @@ def test_adding_curve_to_waveform(bec_figure): def test_adding_curve_with_same_id(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i", gui_id="test_curve") with pytest.raises(ValueError) as excinfo: @@ -122,9 +122,10 @@ def test_create_waveform1D_by_config(bec_figure): }, } - w1 = bec_figure.add_plot(config=w1_config_input) + w1 = bec_figure.plot(config=w1_config_input) w1_config_output = w1.get_config() + w1_config_input["gui_id"] = w1.gui_id assert w1_config_input == w1_config_output assert w1.plot_item.titleLabel.text == "Widget 1" @@ -132,7 +133,7 @@ def test_create_waveform1D_by_config(bec_figure): def test_change_gui_id(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i") w1.change_gui_id("new_id") @@ -141,7 +142,7 @@ def test_change_gui_id(bec_figure): def test_getting_curve(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i", gui_id="test_curve") c1_expected_config = CurveConfig( widget_class="BECCurve", @@ -171,7 +172,7 @@ def test_getting_curve(bec_figure): def test_getting_curve_errors(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i", gui_id="test_curve") with pytest.raises(ValueError) as excinfo: @@ -188,7 +189,7 @@ def test_getting_curve_errors(bec_figure): def test_add_curve(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i") @@ -199,7 +200,7 @@ def test_add_curve(bec_figure): def test_change_legend_font_size(bec_figure): - plot = bec_figure.add_plot() + plot = bec_figure.plot() w1 = plot.add_curve_scan(x_name="samx", y_name="bpm4i") my_func = plot.plot_item.legend @@ -211,7 +212,7 @@ def test_change_legend_font_size(bec_figure): def test_remove_curve(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() w1.add_curve_scan(x_name="samx", y_name="bpm4i") w1.add_curve_scan(x_name="samx", y_name="bpm3a") @@ -229,7 +230,7 @@ def test_remove_curve(bec_figure): def test_change_curve_appearance_methods(bec_figure, qtbot): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i") @@ -258,7 +259,7 @@ def test_change_curve_appearance_methods(bec_figure, qtbot): def test_change_curve_appearance_args(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i") @@ -288,7 +289,7 @@ def test_change_curve_appearance_args(bec_figure): def test_set_custom_curve_data(bec_figure, qtbot): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_custom( x=[1, 2, 3], @@ -336,7 +337,7 @@ def test_custom_data_2D_array(bec_figure, qtbot): def test_get_all_data(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_custom( x=[1, 2, 3], @@ -371,7 +372,7 @@ def test_get_all_data(bec_figure): def test_curve_add_by_config(bec_figure): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1_config_input = { "widget_class": "BECCurve", @@ -411,7 +412,7 @@ def test_curve_add_by_config(bec_figure): def test_scan_update(bec_figure, qtbot): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i") @@ -445,7 +446,7 @@ def test_scan_update(bec_figure, qtbot): def test_scan_history_with_val_access(bec_figure, qtbot): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="bpm4i") @@ -470,7 +471,7 @@ def test_scan_history_with_val_access(bec_figure, qtbot): def test_scatter_2d_update(bec_figure, qtbot): - w1 = bec_figure.add_plot() + w1 = bec_figure.plot() c1 = w1.add_curve_scan(x_name="samx", y_name="samx", z_name="bpm4i")