77from napari .types import LayerDataTuple
88from typing import List
99
10+
1011# This is the actual plugin function, where we export our function
1112# (The functions themselves are defined below)
1213@napari_hook_implementation
@@ -18,6 +19,7 @@ def napari_experimental_provide_function():
1819def crop_region (
1920 layer : napari .layers .Layer ,
2021 shapes_layer : napari .layers .Shapes ,
22+ viewer : 'napari.viewer.Viewer' = None ,
2123) -> List [LayerDataTuple ]:
2224 """Crop regions in napari defined by shapes."""
2325 if shapes_layer is None :
@@ -42,7 +44,14 @@ def crop_region(
4244 shape_types = shapes_layer .shape_type
4345 shapes = shapes_layer .data
4446 cropped_list = []
45- for count , [shape , shape_type ] in enumerate (zip (shapes , shape_types )):
47+ new_layer_index = 0
48+ new_name = layer_props ["name" ] + " cropped [0]"
49+ names_list = []
50+ if viewer is not None :
51+ # Get existing layer names in viewer
52+ names_list = [layer .name for layer in viewer .layers ]
53+ for shape_count , [shape , shape_type ] in enumerate (zip (shapes ,
54+ shape_types )):
4655 # move shape vertices to within image coordinate limits
4756 layer_shape = np .array (layer_data .shape )
4857 if rgb :
@@ -101,6 +110,16 @@ def crop_region(
101110 cropped_data = cropped_data [tuple (indices )]
102111
103112 new_layer_props = layer_props .copy ()
104- new_layer_props ["name" ] = layer_props ["name" ] + f" (cropped { count + 1 } )"
113+ # If layer name is in viewer or is about to be added,
114+ # give it a different name
115+ while True :
116+ new_name = layer_props ["name" ] \
117+ + f" cropped [{ shape_count + new_layer_index } ]"
118+ if new_name not in names_list :
119+ break
120+ else :
121+ new_layer_index += 1
122+ new_layer_props ["name" ] = new_name
123+ names_list .append (new_name )
105124 cropped_list .append ((cropped_data , new_layer_props , layer_type ))
106125 return cropped_list
0 commit comments