1- import networkx as nx
21import numpy as np
3- import pytest
4- from funtracks .data_model import NodeAttr , SolutionTracks
2+ from funtracks .data_model import SolutionTracks
53from napari .layers import Labels , Points
64from napari_orthogonal_views .ortho_view_widget import OrthoViewWidget
75
1311from motile_tracker .data_views .views_coordinator .tracks_viewer import TracksViewer
1412
1513
16- @pytest .fixture
17- def graph_3d ():
18- graph = nx .DiGraph ()
19- nodes = [
20- (
21- 1 ,
22- {
23- NodeAttr .POS .value : [50 , 50 , 50 ],
24- NodeAttr .TIME .value : 0 ,
25- },
26- ),
27- (
28- 2 ,
29- {
30- NodeAttr .POS .value : [20 , 50 , 80 ],
31- NodeAttr .TIME .value : 1 ,
32- },
33- ),
34- (
35- 3 ,
36- {
37- NodeAttr .POS .value : [60 , 50 , 45 ],
38- NodeAttr .TIME .value : 1 ,
39- },
40- ),
41- ]
42- edges = [
43- (1 , 2 ),
44- (1 , 3 ),
45- ]
46- graph .add_nodes_from (nodes )
47- graph .add_edges_from (edges )
48- return graph
49-
50-
51- @pytest .fixture
52- def segmentation_3d ():
53- frame_shape = (100 , 100 , 100 )
54- total_shape = (5 , * frame_shape )
55- segmentation = np .zeros (total_shape , dtype = "int32" )
56- segmentation [0 , 45 :55 , 45 :55 , 45 :55 ] = 1
57- segmentation [1 , 15 :25 , 45 :55 , 75 :85 ] = 2
58- segmentation [1 , 55 :65 , 45 :55 , 40 :50 ] = 3
59- return segmentation
60-
61-
6214class MockEvent :
6315 def __init__ (self , value ):
6416 self .value = value
@@ -71,52 +23,74 @@ def test_ortho_views(make_napari_viewer, qtbot, graph_3d, segmentation_3d):
7123 viewer = make_napari_viewer ()
7224 m = initialize_ortho_views (viewer )
7325
74- m .show ()
75- qtbot .waitUntil (lambda : m .is_shown (), timeout = 1000 )
76- assert isinstance (m .right_widget , OrthoViewWidget )
77-
7826 # Create example tracks
7927 tracks = SolutionTracks (graph = graph_3d , segmentation = segmentation_3d , ndim = 4 )
8028 tracks_viewer = TracksViewer .get_instance (viewer )
8129 tracks_viewer .update_tracks (tracks = tracks , name = "test" )
8230
8331 assert isinstance (viewer .layers [- 1 ], TrackPoints )
8432 assert isinstance (viewer .layers [- 2 ], TrackLabels )
33+
34+ # change attributes on the TrackLabels layer to check that they are correctly copied
35+ viewer .layers [- 2 ].contour = 1
36+ viewer .layers [- 2 ].mode = "erase"
37+
38+ # show orthogonal views and check attributes
39+ m .show ()
40+ qtbot .waitUntil (lambda : m .is_shown (), timeout = 1000 )
41+ assert isinstance (m .right_widget , OrthoViewWidget )
8542 assert isinstance (m .right_widget .vm_container .viewer_model .layers [- 1 ], Points )
8643 assert isinstance (m .bottom_widget .vm_container .viewer_model .layers [- 1 ], Points )
8744 assert isinstance (m .right_widget .vm_container .viewer_model .layers [- 2 ], Labels )
8845 assert isinstance (m .bottom_widget .vm_container .viewer_model .layers [- 2 ], Labels )
46+ assert (
47+ m .right_widget .vm_container .viewer_model .layers [- 2 ].contour
48+ == viewer .layers [- 2 ].contour
49+ )
50+ assert (
51+ m .right_widget .vm_container .viewer_model .layers [- 2 ].mode
52+ == viewer .layers [- 2 ].mode
53+ )
54+
55+ # set to paint mode and test syncing
56+ viewer .layers [- 2 ].mode = "paint"
57+ assert (
58+ viewer .layers [- 2 ].mode
59+ == m .right_widget .vm_container .viewer_model .layers [- 2 ].mode
60+ == m .bottom_widget .vm_container .viewer_model .layers [- 2 ].mode
61+ )
8962
9063 # Test paint event on main viewer (indices, orig value, target_value)
9164 event_val = [
9265 (
9366 (np .array ([1 ]), np .array ([15 ]), np .array ([45 ]), np .array ([75 ])),
9467 np .array ([2 ], dtype = np .uint16 ),
95- np .uint16 (4 ),
68+ np .uint16 (5 ),
9669 )
9770 ]
9871 event = MockEvent (event_val )
72+ step = list (viewer .dims .current_step )
73+ step [0 ] = 1
74+ viewer .dims .current_step = step
9975 viewer .layers [- 2 ]._on_paint (event )
10076
101- assert viewer .layers [- 2 ].data [1 , 15 , 45 , 75 ] == 4
77+ assert viewer .layers [- 2 ].data [1 , 15 , 45 , 75 ] == 5
10278 assert np .array_equal (
10379 viewer .layers [- 2 ].data , m .right_widget .vm_container .viewer_model .layers [- 2 ].data
10480 )
10581
106- # test paint even on one of the ortho views and see if a new node is added
82+ # test paint event on one of the ortho views and see if a new node is added
83+ assert len (tracks_viewer .tracks .graph .nodes ) == 5
84+ step = list (viewer .dims .current_step )
85+ step [0 ] = 2
86+ viewer .dims .current_step = step
10787 m .right_widget .vm_container .viewer_model .layers [- 2 ].paint (
108- coord = (2 , 63 , 20 , 30 ), new_label = 5 , refresh = True
88+ coord = (2 , 63 , 20 , 30 ), new_label = 6 , refresh = True
10989 )
110- assert len (tracks_viewer .tracks .graph .nodes ) == 5
90+ assert len (tracks_viewer .tracks .graph .nodes ) == 6
11191
11292 # test syncing of properties
113- viewer .layers [- 2 ].mode = "paint"
114- assert (
115- viewer .layers [- 2 ].mode
116- == m .right_widget .vm_container .viewer_model .layers [- 2 ].mode
117- == m .bottom_widget .vm_container .viewer_model .layers [- 2 ].mode
118- )
119- viewer .layers [- 2 ].selected_label = 6
93+ viewer .layers [- 2 ].selected_label = 7 # forward sync only
12094 assert (
12195 viewer .layers [- 2 ].selected_label
12296 == m .right_widget .vm_container .viewer_model .layers [- 2 ].selected_label
0 commit comments