def test_unselect_select_shape(mode, create_known_shapes_layer, Event): """Select a shape by clicking on one in select mode.""" layer, n_shapes, _ = create_known_shapes_layer layer.mode = mode layer.position = tuple(layer.data[0][0]) layer.selected_data = {1} # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, modifiers=[])) mouse_release_callbacks(layer, event) # Check clicked shape selected assert len(layer.selected_data) == 1 assert layer.selected_data == {0}
def test_after_in_select_mode_point(create_known_points_layer, Event): """Don't add or select a point by clicking on one in pan_zoom mode.""" layer, n_points, _ = create_known_points_layer layer.mode = 'select' layer.mode = 'pan_zoom' layer.position = tuple(layer.data[0]) # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, modifiers=[])) mouse_release_callbacks(layer, event) # Check no new point added and non selected assert len(layer.data) == n_points assert len(layer.selected_data) == 0
def test_unselect_select_point(create_known_points_layer, Event): """Select a point by clicking on one in select mode.""" layer, n_points, _ = create_known_points_layer layer.mode = 'select' layer.position = tuple(layer.data[0]) layer.selected_data = {2, 3} # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, modifiers=[])) mouse_release_callbacks(layer, event) # Check clicked point selected assert len(layer.selected_data) == 1 assert 0 in layer.selected_data
def test_remove_select_point(create_known_points_layer, Event): """Remove from a selection of points point by shift-clicking on one.""" layer, n_points, _ = create_known_points_layer layer.mode = 'select' layer.position = tuple(layer.data[0]) layer.selected_data = {0, 2, 3} # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=['Shift'])) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, modifiers=['Shift'])) mouse_release_callbacks(layer, event) # Check clicked point selected assert len(layer.selected_data) == 2 assert layer.selected_data == {2, 3}
def test_add_point(create_known_points_layer, Event): """Add point by clicking in add mode.""" layer, n_points, known_non_point = create_known_points_layer # Add point at location where non exists layer.mode = 'add' layer.position = known_non_point # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, modifiers=[])) mouse_release_callbacks(layer, event) # Check new point added at coordinates location assert len(layer.data) == n_points + 1 np.testing.assert_allclose(layer.data[-1], known_non_point)
def test_unselecting_points(create_known_points_layer, Event): """Unselect points by not clicking on one in select mode.""" layer, n_points, known_non_point = create_known_points_layer layer.mode = 'select' layer.position = known_non_point layer.selected_data = {2, 3} assert len(layer.selected_data) == 2 # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, modifiers=[])) mouse_release_callbacks(layer, event) # Check clicked point selected assert len(layer.selected_data) == 0
def test_add_select_point(create_known_points_layer_2d): """Add to a selection of points point by shift-clicking on one.""" layer, n_points, _ = create_known_points_layer_2d layer.mode = 'select' position = tuple(layer.data[0]) layer.selected_data = {2, 3} # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', modifiers=['Shift'], position=position)) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', modifiers=['Shift'], position=position)) mouse_release_callbacks(layer, event) # Check clicked point selected assert len(layer.selected_data) == 3 assert layer.selected_data == {2, 3, 0}
def test_pick(Event): """Test picking label.""" data = np.ones((20, 20), dtype=np.int32) data[:5, :5] = 2 data[-5:, -5:] = 3 layer = Labels(data) assert layer.selected_label == 1 layer.mode = 'pick' # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, position=(0, 0))) mouse_press_callbacks(layer, event) assert layer.selected_label == 2 # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, position=(19, 19))) mouse_press_callbacks(layer, event) assert layer.selected_label == 3
def test_unselecting_shapes(mode, create_known_shapes_layer, Event): """Unselect shapes by not clicking on one in select mode.""" layer, n_shapes, known_non_shape = create_known_shapes_layer layer.mode = mode layer.position = known_non_shape layer.selected_data = {0, 1} assert len(layer.selected_data) == 2 # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, modifiers=[])) mouse_release_callbacks(layer, event) # Check clicked shape selected assert len(layer.selected_data) == 0
def test_vertex_remove(create_known_shapes_layer, Event): """Remove vertex from shape.""" layer, n_shapes, known_non_shape = create_known_shapes_layer n_coord = len(layer.data[0]) layer.mode = 'vertex_remove' layer.selected_data = {0} layer.position = tuple(layer.data[0][0]) # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) mouse_press_callbacks(layer, event) # Simulate drag end event = ReadOnlyWrapper( Event(type='mouse_move', is_dragging=True, modifiers=[])) mouse_move_callbacks(layer, event) # Check new shape added at coordinates assert len(layer.data) == n_shapes assert len(layer.data[0]) == n_coord - 1
def setup(self, n): np.random.seed(0) self.data = [50 * np.random.random((6, 2)) for i in range(n)] self.layer = Shapes(self.data, shape_type='polygon') self.layer.mode = 'select' # create events self.click_event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) self.release_event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, modifiers=[])) self.drag_event = ReadOnlyWrapper( Event(type='mouse_move', is_dragging=True, modifiers=[])) # initialize the position and select a shape self.layer.position = tuple(np.mean(self.layer.data[0], axis=0)) # Simulate click mouse_press_callbacks(self.layer, self.click_event) # Simulate release mouse_release_callbacks(self.layer, self.release_event)
def test_fill_nD_all(Event): """Test filling label nD.""" data = np.ones((20, 20, 20)) data[:5, :5, :5] = 2 data[0, 8:10, 8:10] = 2 data[-5:, -5:, -5:] = 3 layer = Labels(data) assert np.unique(layer.data[:5, :5, :5]) == 2 assert np.unique(layer.data[-5:, -5:, -5:]) == 3 assert np.unique(layer.data[:5, -5:, -5:]) == 1 assert np.unique(layer.data[-5:, :5, -5:]) == 1 assert np.unique(layer.data[0, 8:10, 8:10]) == 2 layer.n_dimensional = True layer.mode = 'fill' layer.position = (0, 0) layer.selected_label = 4 # Simulate click event = ReadOnlyWrapper(Event(type='mouse_press', is_dragging=False)) mouse_press_callbacks(layer, event) assert np.unique(layer.data[:5, :5, :5]) == 4 assert np.unique(layer.data[-5:, -5:, -5:]) == 3 assert np.unique(layer.data[:5, -5:, -5:]) == 1 assert np.unique(layer.data[-5:, :5, -5:]) == 1 assert np.unique(layer.data[0, 8:10, 8:10]) == 2 layer.position = (19, 19) layer.selected_label = 5 # Simulate click event = ReadOnlyWrapper(Event(type='mouse_press', is_dragging=False)) mouse_press_callbacks(layer, event) assert np.unique(layer.data[:5, :5, :5]) == 4 assert np.unique(layer.data[-5:, -5:, -5:]) == 3 assert np.unique(layer.data[:5, -5:, -5:]) == 5 assert np.unique(layer.data[-5:, :5, -5:]) == 5 assert np.unique(layer.data[0, 8:10, 8:10]) == 2
def test_erase_3d_undo_empty(MouseEvent): """Nothing should be added to undo queue when clicks fall outside data.""" data = np.zeros((20, 20, 20), dtype=np.int32) data[10, :, :] = 1 layer = Labels(data) layer.brush_size = 5 layer.mode = 'erase' layer._slice_dims(point=(0, 0, 0), ndisplay=3) layer.n_edit_dimensions = 3 # Simulate click, outside data event = ReadOnlyWrapper( MouseEvent( type='mouse_press', is_dragging=False, position=(-1, -1, -1), view_direction=(1, 0, 0), dims_displayed=(0, 1, 2), dims_point=(0, 0, 0), ) ) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( MouseEvent( type='mouse_release', is_dragging=False, position=(-1, -1, -1), view_direction=(1, 0, 0), dims_displayed=(0, 1, 2), dims_point=(0, 0, 0), ) ) mouse_release_callbacks(layer, event) # Undo queue should be empty assert len(layer._undo_history) == 0
def test_erase(Event, brush_shape, expected_sum): """Test erasing labels with different brush shapes.""" data = np.ones((20, 20), dtype=np.int32) layer = Labels(data) with pytest.warns(FutureWarning): layer.brush_shape = brush_shape layer.brush_size = 10 layer.mode = 'erase' with pytest.warns(FutureWarning): layer.brush_shape = brush_shape layer.selected_label = 3 # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, position=(0, 0))) mouse_press_callbacks(layer, event) # Simulate drag event = ReadOnlyWrapper( Event(type='mouse_move', is_dragging=True, position=(19, 19))) mouse_move_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', is_dragging=False, position=(19, 19))) mouse_release_callbacks(layer, event) # Painting goes from (0, 0) to (19, 19) with a brush size of 10, changing # all pixels along that path, but non outside it. assert np.unique(layer.data[:8, :8]) == 0 assert np.unique(layer.data[-8:, -8:]) == 0 assert np.unique(layer.data[:5, -5:]) == 1 assert np.unique(layer.data[-5:, :5]) == 1 assert np.sum(layer.data == 1) == expected_sum
def test_add_point_3d(create_known_points_layer_3d): """Add a point by clicking in 3D mode.""" layer, n_points, known_not_point = create_known_points_layer_3d layer.mode = 'add' # Simulate click event = ReadOnlyWrapper( Event( type='mouse_press', position=known_not_point, view_direction=[1, 0, 0], dims_displayed=[0, 1, 2], )) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event(type='mouse_release', position=known_not_point)) mouse_release_callbacks(layer, event) # Check clicked point selected assert len(layer.data) == (n_points + 1) np.testing.assert_array_equal(layer.data[-1], known_not_point)
def test_drag_in_add_mode(create_known_points_layer_2d): """Drag in add mode and make sure no point is added.""" layer, n_points, known_non_point = create_known_points_layer_2d # Add point at location where non exists layer.mode = 'add' layer.interactive = True # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', position=known_non_point) ) mouse_press_callbacks(layer, event) known_non_point_end = [40, 60] # Simulate drag end event = ReadOnlyWrapper( Event( type='mouse_move', is_dragging=True, position=known_non_point_end ) ) mouse_move_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event( type='mouse_release', position=known_non_point_end, pos=np.array([4, 4]), ) ) mouse_release_callbacks(layer, event) # Check that no new point has been added assert len(layer.data) == n_points
def test_vertex_insert(create_known_shapes_layer, Event): """Add vertex to shape.""" layer, n_shapes, known_non_shape = create_known_shapes_layer n_coord = len(layer.data[0]) layer.mode = 'vertex_insert' layer.selected_data = {0} layer.position = known_non_shape # Simulate click event = ReadOnlyWrapper( Event(type='mouse_press', is_dragging=False, modifiers=[])) mouse_press_callbacks(layer, event) # Simulate drag end event = ReadOnlyWrapper( Event(type='mouse_move', is_dragging=True, modifiers=[])) mouse_move_callbacks(layer, event) # Check new shape added at coordinates assert len(layer.data) == n_shapes assert len(layer.data[0]) == n_coord + 1 np.testing.assert_allclose( np.min(abs(layer.data[0] - known_non_shape), axis=0), [0, 0])
def test_select_point_3d(create_known_points_layer_3d): """Select a point by clicking on one in select mode in 3D mode.""" layer, n_points, _ = create_known_points_layer_3d layer.mode = 'select' position = tuple(layer.data[1]) # Simulate click event = ReadOnlyWrapper( Event( type='mouse_press', position=position, view_direction=[1, 0, 0], dims_displayed=[0, 1, 2], )) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper(Event(type='mouse_release', position=position)) mouse_release_callbacks(layer, event) # Check clicked point selected assert len(layer.selected_data) == 1 assert 1 in layer.selected_data
def test_labels_painting(make_napari_viewer): """Test painting labels updates image.""" data = np.zeros((100, 100), dtype=np.int32) viewer = make_napari_viewer(show=True) viewer.add_labels(data) layer = viewer.layers[0] screenshot = viewer.screenshot(canvas_only=True) # Check that no painting has occurred assert layer.data.max() == 0 assert screenshot[:, :, :2].max() == 0 # Enter paint mode viewer.cursor.position = (0, 0) layer.mode = 'paint' layer.selected_label = 3 # Simulate click Event = collections.namedtuple( 'Event', field_names=['type', 'is_dragging', 'position']) # Simulate click event = ReadOnlyWrapper( Event( type='mouse_press', is_dragging=False, position=viewer.cursor.position, )) mouse_press_callbacks(layer, event) viewer.cursor.position = (100, 100) # Simulate drag event = ReadOnlyWrapper( Event( type='mouse_move', is_dragging=True, position=viewer.cursor.position, )) mouse_move_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event( type='mouse_release', is_dragging=False, position=viewer.cursor.position, )) mouse_release_callbacks(layer, event) event = ReadOnlyWrapper( Event( type='mouse_press', is_dragging=False, position=viewer.cursor.position, )) mouse_press_callbacks(layer, event) screenshot = viewer.screenshot(canvas_only=True) # Check that painting has now occurred assert layer.data.max() > 0 assert screenshot[:, :, :2].max() > 0
def test_drag_shape(create_known_shapes_layer, Event): """Select and drag vertex.""" layer, n_shapes, _ = create_known_shapes_layer layer.mode = 'select' # Zoom in so as to not select any vertices layer.scale_factor = 0.01 orig_data = layer.data[0].copy() assert len(layer.selected_data) == 0 position = tuple(np.mean(layer.data[0], axis=0)) # Check shape under cursor value = layer.get_value(position, world=True) assert value == (0, None) # Simulate click event = ReadOnlyWrapper( Event( type='mouse_press', is_dragging=False, modifiers=[], position=position, )) mouse_press_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event( type='mouse_release', is_dragging=False, modifiers=[], position=position, )) mouse_release_callbacks(layer, event) assert len(layer.selected_data) == 1 assert layer.selected_data == {0} # Check shape but not vertex under cursor value = layer.get_value(event.position, world=True) assert value == (0, None) # Simulate click event = ReadOnlyWrapper( Event( type='mouse_press', is_dragging=True, modifiers=[], position=position, )) mouse_press_callbacks(layer, event) # start drag event event = ReadOnlyWrapper( Event( type='mouse_move', is_dragging=True, modifiers=[], position=position, )) mouse_move_callbacks(layer, event) position = tuple(np.add(position, [10, 5])) # Simulate move, click, and release event = ReadOnlyWrapper( Event( type='mouse_move', is_dragging=True, modifiers=[], position=position, )) mouse_move_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( Event( type='mouse_release', is_dragging=True, modifiers=[], position=position, )) mouse_release_callbacks(layer, event) # Check clicked shape selected assert len(layer.selected_data) == 1 assert layer.selected_data == {0} np.testing.assert_allclose(layer.data[0], orig_data + [10, 5])
def test_erase_3d_undo(MouseEvent): """Test erasing labels in 3D then undoing the erase. Specifically, this test checks that undo is correctly filled even when a click and drag starts outside of the data volume. """ data = np.zeros((20, 20, 20), dtype=np.int32) data[10, :, :] = 1 layer = Labels(data) layer.brush_size = 5 layer.mode = 'erase' layer._slice_dims(point=(0, 0, 0), ndisplay=3) layer.n_edit_dimensions = 3 # Simulate click event = ReadOnlyWrapper( MouseEvent( type='mouse_press', is_dragging=False, position=(-1, -1, -1), view_direction=(1, 0, 0), dims_displayed=(0, 1, 2), dims_point=(0, 0, 0), ) ) mouse_press_callbacks(layer, event) # Simulate drag. Note: we need to include top left and bottom right in the # drag or there are no coordinates to interpolate event = ReadOnlyWrapper( MouseEvent( type='mouse_move', is_dragging=True, position=(-1, 0.1, 0.1), view_direction=(1, 0, 0), dims_displayed=(0, 1, 2), dims_point=(0, 0, 0), ) ) mouse_move_callbacks(layer, event) event = ReadOnlyWrapper( MouseEvent( type='mouse_move', is_dragging=True, position=(-1, 18.9, 18.9), view_direction=(1, 0, 0), dims_displayed=(0, 1, 2), dims_point=(0, 0, 0), ) ) mouse_move_callbacks(layer, event) # Simulate release event = ReadOnlyWrapper( MouseEvent( type='mouse_release', is_dragging=False, position=(-1, 21, 21), view_direction=(1, 0, 0), dims_displayed=(0, 1, 2), dims_point=(0, 0, 0), ) ) mouse_release_callbacks(layer, event) # Erasing goes from (-1, -1, -1) to (-1, 21, 21), should split the labels # into two sections. Undoing should work and reunite the labels to one # square assert ndi.label(layer.data)[1] == 2 layer.undo() assert ndi.label(layer.data)[1] == 1