1+ import json
12import warnings
3+ from pathlib import Path
24from typing import Optional , Tuple
35
46import napari
2426STATE_COLOR_CYCLE = ["#00FFFF" , "#FF00FF" , ]
2527"""@private"""
2628
29+ COMMITTED_LINEAGES = []
30+ """@private"""
31+
2732
2833#
2934# util functionality
@@ -336,6 +341,8 @@ def _reset_tracking_state():
336341
337342@magicgui (call_button = "Commit [C]" , layer = {"choices" : ["current_track" ]})
338343def _commit_tracking_widget (v : Viewer , layer : str = "current_track" ) -> None :
344+ global COMMITTED_LINEAGES
345+
339346 seg = v .layers [layer ].data
340347
341348 id_offset = int (v .layers ["committed_tracks" ].data .max ())
@@ -348,6 +355,11 @@ def _commit_tracking_widget(v: Viewer, layer: str = "current_track") -> None:
348355 v .layers [layer ].data = np .zeros (shape , dtype = "uint32" )
349356 v .layers [layer ].refresh ()
350357
358+ updated_lineage = {
359+ parent + id_offset : [child + id_offset for child in children ] for parent , children in LINEAGE .items ()
360+ }
361+ COMMITTED_LINEAGES .append (updated_lineage )
362+
351363 _reset_tracking_state ()
352364 vutil .clear_annotations (v , clear_segmentations = False )
353365
@@ -358,6 +370,13 @@ def _clear_widget_tracking(v: Viewer) -> None:
358370 vutil .clear_annotations (v )
359371
360372
373+ @magicgui (call_button = "Save Lineage" )
374+ def _save_lineage_widget (v : Viewer , path : Path ) -> None :
375+ path = path .with_suffix (".json" )
376+ with open (path , "w" ) as f :
377+ json .dump (COMMITTED_LINEAGES , f )
378+
379+
361380def annotator_tracking (
362381 raw : np .ndarray ,
363382 embedding_path : Optional [str ] = None ,
@@ -486,6 +505,7 @@ def annotator_tracking(
486505 v .window .add_dock_widget (_segment_frame_wigdet )
487506 v .window .add_dock_widget (_track_objet_widget )
488507 v .window .add_dock_widget (_commit_tracking_widget )
508+ v .window .add_dock_widget (_save_lineage_widget )
489509 v .window .add_dock_widget (_clear_widget_tracking )
490510
491511 #
0 commit comments