mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-13 19:21:50 +02:00
refactor(image): introduce image base and image layer; rename vrange to v_range
This commit is contained in:
@ -1252,16 +1252,16 @@ class Image(RPCBase):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
@rpc_call
|
@rpc_call
|
||||||
def vrange(self) -> "tuple":
|
def v_range(self) -> "QPointF":
|
||||||
"""
|
"""
|
||||||
Get the vrange of the image.
|
Set the v_range of the main image.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@vrange.setter
|
@v_range.setter
|
||||||
@rpc_call
|
@rpc_call
|
||||||
def vrange(self) -> "tuple":
|
def v_range(self) -> "QPointF":
|
||||||
"""
|
"""
|
||||||
Get the vrange of the image.
|
Set the v_range of the main image.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
File diff suppressed because it is too large
Load Diff
1016
bec_widgets/widgets/plots/image/image_base.py
Normal file
1016
bec_widgets/widgets/plots/image/image_base.py
Normal file
File diff suppressed because it is too large
Load Diff
@ -74,7 +74,7 @@ class ImageItem(BECConnector, pg.ImageItem):
|
|||||||
self,
|
self,
|
||||||
config: Optional[ImageItemConfig] = None,
|
config: Optional[ImageItemConfig] = None,
|
||||||
gui_id: Optional[str] = None,
|
gui_id: Optional[str] = None,
|
||||||
parent_image=None,
|
parent_image=None, # FIXME: rename to parent
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
if config is None:
|
if config is None:
|
||||||
@ -269,6 +269,7 @@ class ImageItem(BECConnector, pg.ImageItem):
|
|||||||
return self.image
|
return self.image
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
|
self.rpc_register.remove_rpc(self)
|
||||||
super().clear()
|
super().clear()
|
||||||
self.raw_data = None
|
self.raw_data = None
|
||||||
self.buffer = []
|
self.buffer = []
|
||||||
|
84
tests/unit_tests/test_image_layer.py
Normal file
84
tests/unit_tests/test_image_layer.py
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
from unittest import mock
|
||||||
|
|
||||||
|
import pyqtgraph as pg
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from bec_widgets.widgets.plots.image.image_base import ImageLayerManager
|
||||||
|
from bec_widgets.widgets.plots.image.image_item import ImageItem
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def image_layer_manager():
|
||||||
|
"""Fixture to create an instance of ImageLayer."""
|
||||||
|
layer = ImageLayerManager(plot_item=mock.MagicMock(spec=pg.PlotItem))
|
||||||
|
yield layer
|
||||||
|
layer.clear()
|
||||||
|
|
||||||
|
|
||||||
|
def test_image_layer_manager_initialization(image_layer_manager):
|
||||||
|
"""Test the initialization of the ImageLayer."""
|
||||||
|
assert isinstance(image_layer_manager, ImageLayerManager)
|
||||||
|
assert image_layer_manager.plot_item is not None
|
||||||
|
|
||||||
|
|
||||||
|
def test_add_image_layer(image_layer_manager):
|
||||||
|
"""Test adding an image layer to the ImageLayerManager."""
|
||||||
|
image = ImageItem()
|
||||||
|
layer = image_layer_manager.add(name="Test Layer", image=image)
|
||||||
|
assert layer.image.zValue() == 0
|
||||||
|
|
||||||
|
image2 = ImageItem()
|
||||||
|
layer2 = image_layer_manager.add(name="Test Layer 2", image=image2)
|
||||||
|
assert layer2.image.zValue() == 1
|
||||||
|
|
||||||
|
image3 = ImageItem()
|
||||||
|
layer3 = image_layer_manager.add(name="Test Layer 3", image=image3, z_position="top")
|
||||||
|
assert layer3.image.zValue() == 2
|
||||||
|
|
||||||
|
image4 = ImageItem()
|
||||||
|
layer4 = image_layer_manager.add(name="Test Layer 4", image=image4, z_position="bottom")
|
||||||
|
assert layer4.image.zValue() == -1
|
||||||
|
|
||||||
|
|
||||||
|
def test_remove_image_layer(image_layer_manager):
|
||||||
|
"""Test removing an image layer from the ImageLayerManager."""
|
||||||
|
image = ImageItem()
|
||||||
|
layer = image_layer_manager.add(name="Test Layer", image=image)
|
||||||
|
assert len(image_layer_manager) == 1
|
||||||
|
|
||||||
|
image_layer_manager.remove(layer)
|
||||||
|
assert len(image_layer_manager) == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_clear_image_layers(image_layer_manager):
|
||||||
|
"""Test clearing all image layers from the ImageLayerManager."""
|
||||||
|
image = ImageItem()
|
||||||
|
layer = image_layer_manager.add(name="Test Layer", image=image)
|
||||||
|
assert len(image_layer_manager) == 1
|
||||||
|
|
||||||
|
image_layer_manager.clear()
|
||||||
|
assert len(image_layer_manager) == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_image_layer_manager_getitem(image_layer_manager):
|
||||||
|
"""Test getting an image layer by index."""
|
||||||
|
image = ImageItem()
|
||||||
|
layer = image_layer_manager.add(name="Test Layer", image=image)
|
||||||
|
assert image_layer_manager["Test Layer"] == layer
|
||||||
|
|
||||||
|
with pytest.raises(TypeError):
|
||||||
|
_ = image_layer_manager[1]
|
||||||
|
|
||||||
|
image_layer_manager.remove("Test Layer")
|
||||||
|
assert len(image_layer_manager) == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_image_layer_iteration(image_layer_manager):
|
||||||
|
"""Test iterating over image layers."""
|
||||||
|
image = ImageItem()
|
||||||
|
layer = image_layer_manager.add(name="Test Layer", image=image)
|
||||||
|
assert list(image_layer_manager) == [layer]
|
||||||
|
|
||||||
|
image2 = ImageItem()
|
||||||
|
layer2 = image_layer_manager.add(name="Test Layer 2", image=image2)
|
||||||
|
assert list(image_layer_manager) == [layer, layer2]
|
@ -1,6 +1,7 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import pyqtgraph as pg
|
import pyqtgraph as pg
|
||||||
import pytest
|
import pytest
|
||||||
|
from qtpy.QtCore import QPointF
|
||||||
|
|
||||||
from bec_widgets.widgets.plots.image.image import Image
|
from bec_widgets.widgets.plots.image.image import Image
|
||||||
from tests.unit_tests.client_mocks import mocked_client
|
from tests.unit_tests.client_mocks import mocked_client
|
||||||
@ -61,8 +62,8 @@ def test_lock_aspect_ratio(qtbot, mocked_client):
|
|||||||
|
|
||||||
def test_set_vrange(qtbot, mocked_client):
|
def test_set_vrange(qtbot, mocked_client):
|
||||||
bec_image_view = create_widget(qtbot, Image, client=mocked_client)
|
bec_image_view = create_widget(qtbot, Image, client=mocked_client)
|
||||||
bec_image_view.vrange = (10, 100)
|
bec_image_view.v_range = (10, 100)
|
||||||
assert bec_image_view.vrange == (10, 100)
|
assert bec_image_view.v_range == QPointF(10, 100)
|
||||||
assert bec_image_view.main_image.levels == (10, 100)
|
assert bec_image_view.main_image.levels == (10, 100)
|
||||||
assert bec_image_view.main_image.config.v_range == (10, 100)
|
assert bec_image_view.main_image.config.v_range == (10, 100)
|
||||||
|
|
||||||
@ -107,7 +108,7 @@ def test_enable_colorbar_with_vrange(qtbot, mocked_client, colorbar_type):
|
|||||||
assert isinstance(bec_image_view._color_bar, pg.HistogramLUTItem)
|
assert isinstance(bec_image_view._color_bar, pg.HistogramLUTItem)
|
||||||
assert bec_image_view.enable_full_colorbar is True
|
assert bec_image_view.enable_full_colorbar is True
|
||||||
assert bec_image_view.config.color_bar == colorbar_type
|
assert bec_image_view.config.color_bar == colorbar_type
|
||||||
assert bec_image_view.vrange == (0, 100)
|
assert bec_image_view.v_range == QPointF(0, 100)
|
||||||
assert bec_image_view.main_image.levels == (0, 100)
|
assert bec_image_view.main_image.levels == (0, 100)
|
||||||
assert bec_image_view._color_bar is not None
|
assert bec_image_view._color_bar is not None
|
||||||
|
|
||||||
@ -150,7 +151,7 @@ def test_image_data_update_2d(qtbot, mocked_client):
|
|||||||
|
|
||||||
bec_image_view.on_image_update_2d(message, metadata)
|
bec_image_view.on_image_update_2d(message, metadata)
|
||||||
|
|
||||||
np.testing.assert_array_equal(bec_image_view._main_image.image, test_data)
|
np.testing.assert_array_equal(bec_image_view.main_image.image, test_data)
|
||||||
|
|
||||||
|
|
||||||
def test_image_data_update_1d(qtbot, mocked_client):
|
def test_image_data_update_1d(qtbot, mocked_client):
|
||||||
@ -160,10 +161,10 @@ def test_image_data_update_1d(qtbot, mocked_client):
|
|||||||
metadata = {"scan_id": "scan_test"}
|
metadata = {"scan_id": "scan_test"}
|
||||||
|
|
||||||
bec_image_view.on_image_update_1d({"data": waveform1}, metadata)
|
bec_image_view.on_image_update_1d({"data": waveform1}, metadata)
|
||||||
assert bec_image_view._main_image.raw_data.shape == (1, 50)
|
assert bec_image_view.main_image.raw_data.shape == (1, 50)
|
||||||
|
|
||||||
bec_image_view.on_image_update_1d({"data": waveform2}, metadata)
|
bec_image_view.on_image_update_1d({"data": waveform2}, metadata)
|
||||||
assert bec_image_view._main_image.raw_data.shape == (2, 60)
|
assert bec_image_view.main_image.raw_data.shape == (2, 60)
|
||||||
|
|
||||||
|
|
||||||
def test_toolbar_actions_presence(qtbot, mocked_client):
|
def test_toolbar_actions_presence(qtbot, mocked_client):
|
||||||
@ -207,8 +208,8 @@ def test_setting_vrange_with_colorbar(qtbot, mocked_client, colorbar_type):
|
|||||||
elif colorbar_type == "full":
|
elif colorbar_type == "full":
|
||||||
bec_image_view.enable_full_colorbar = True
|
bec_image_view.enable_full_colorbar = True
|
||||||
|
|
||||||
bec_image_view.vrange = (0, 100)
|
bec_image_view.v_range = (0, 100)
|
||||||
assert bec_image_view.vrange == (0, 100)
|
assert bec_image_view.v_range == QPointF(0, 100)
|
||||||
assert bec_image_view.main_image.levels == (0, 100)
|
assert bec_image_view.main_image.levels == (0, 100)
|
||||||
assert bec_image_view.main_image.config.v_range == (0, 100)
|
assert bec_image_view.main_image.config.v_range == (0, 100)
|
||||||
assert bec_image_view.v_min == 0
|
assert bec_image_view.v_min == 0
|
||||||
|
Reference in New Issue
Block a user