From a3f6a0627e3c27ddfb0c59eca3f87f73d659cf8e Mon Sep 17 00:00:00 2001 From: Tiomat85 Date: Thu, 16 Oct 2025 14:54:47 +0100 Subject: [PATCH 1/2] Mirrored fix from 48b60bd Mirrored fix from 48b60bd Moved across the fix from 48b60bd to correctly handle display layer transfer. --- .../nion_experimental_tools/SequenceSplitJoin.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/nionswift_plugin/nion_experimental_tools/SequenceSplitJoin.py b/nionswift_plugin/nion_experimental_tools/SequenceSplitJoin.py index 0711a2b..96f3f1d 100755 --- a/nionswift_plugin/nion_experimental_tools/SequenceSplitJoin.py +++ b/nionswift_plugin/nion_experimental_tools/SequenceSplitJoin.py @@ -9,6 +9,7 @@ from nion.typeshed import API_1_0 as API from nion.data import xdata_1_0 as xd from nion.swift import Facade +from nion.swift.model import DisplayItem from nion.swift.model import Symbolic _ = gettext.gettext @@ -117,7 +118,7 @@ def sequence_split(api: Facade.API_1, window: Facade.DocumentWindow, display_ite # For line plots with multiple display layers we want to copy the display properties so that the split items # look like the original display item. Exclude case where the display layers are generated from the sequence # dimension because in this case the display layers are not valid anymore. - display_layers = None + display_layers: list[DisplayItem.DisplayLayer] | None = None legend_position = None display_type = None data_item_ = display_item._display_item.data_item @@ -127,7 +128,7 @@ def sequence_split(api: Facade.API_1, window: Facade.DocumentWindow, display_ite if not data_item_xdata: return list() if data_item_xdata and len(data_item_xdata.data_shape) > 2 and (data_item_xdata.datum_dimension_count == 1 or display_item.display_type == 'line_plot'): - display_layers = copy.deepcopy(display_item._display_item.display_layers) + display_layers = typing.cast(list[DisplayItem.DisplayLayer], display_item._display_item.display_layers) legend_position = display_item._display_item.get_display_property('legend_position') display_type = display_item.display_type @@ -147,12 +148,8 @@ def sequence_split(api: Facade.API_1, window: Facade.DocumentWindow, display_ite result_display_item = window._document_controller.document_model.get_display_item_for_data_item(result_data_item._data_item) if result_display_item: window._document_controller.show_display_item(result_display_item) - if display_layers: - while result_display_item.display_layers: - result_display_item.remove_display_layer(0) - for display_layer in display_layers: - result_display_item.append_display_layer(display_layer) + result_display_item.display_layers_list = display_layers if legend_position is not None: result_display_item.set_display_property('legend_position', legend_position) if display_type is not None: From 18cde9271667bc08383b4fb14cddec0d7798dde4 Mon Sep 17 00:00:00 2001 From: Tiomat85 Date: Sat, 18 Oct 2025 15:56:14 +0100 Subject: [PATCH 2/2] Adding Integration test for Issue 55 Added Integration test checking sequences for sequence split. Test replicates the scenario as described in Issue 55, failing before the fix and working after. --- .../test/MultiDimensionalProcessing_test.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/nionswift_plugin/nion_experimental_tools/test/MultiDimensionalProcessing_test.py b/nionswift_plugin/nion_experimental_tools/test/MultiDimensionalProcessing_test.py index 6e94708..91d8497 100755 --- a/nionswift_plugin/nion_experimental_tools/test/MultiDimensionalProcessing_test.py +++ b/nionswift_plugin/nion_experimental_tools/test/MultiDimensionalProcessing_test.py @@ -551,3 +551,25 @@ def test_sequence_split_computation(self) -> None: # print([computation.error_text for computation in document_model.computations]) # print([data_item.title for data_item in document_model.data_items]) + + def test_sequence_split_computation_sequence(self) -> None: + with create_memory_profile_context() as test_context: + document_controller = test_context.create_document_controller_with_application() + document_model = document_controller.document_model + api = Facade.get_api("~1.0", "~1.0") + # setup + xdata = DataAndMetadata.new_data_and_metadata(numpy.random.randn(10,16,16,512), data_descriptor=DataAndMetadata.DataDescriptor(True, 2, 1)) + data_item = DataItem.new_data_item(xdata) + data_item.title = "Sequence" + document_model.append_data_item(data_item) + display_item = document_model.get_display_item_for_data_item(data_item) + # make computation and execute + result_data_items = SequenceSplitJoin.sequence_split(api, Facade.DocumentWindow(document_controller), Facade.Display(display_item)) + document_model.recompute_all() + document_controller.periodic() + # check results + self.assertEqual(11, len(document_model.data_items)) + self.assertFalse(any(computation.error_text for computation in document_model.computations)) + self.assertIn("Split 1/10", result_data_items[0].title) + self.assertIn("Split 2/10", result_data_items[1].title) + self.assertIn("Split 10/10", result_data_items[9].title)