3131import org .scijava .ItemVisibility ;
3232import org .scijava .module .MutableModuleItem ;
3333import org .scijava .plugin .Parameter ;
34+ import org .scijava .prefs .PrefService ;
35+ import org .scijava .widget .Button ;
3436import org .scijava .widget .ChoiceWidget ;
3537import org .scijava .widget .FileWidget ;
3638import org .scijava .widget .NumberWidget ;
@@ -90,6 +92,9 @@ public abstract class GWDTTracerCommonCmd extends CommonDynamicCmd {
9092 private static final String AFTER_PROOFREAD = "Prepare for proofreading" ;
9193 private static final String AFTER_REPLACE_AND_PROOFREAD = "Replace existing paths & prepare for proofreading" ;
9294
95+ @ Parameter
96+ protected PrefService prefService ;
97+
9398 @ Parameter (required = false , persist = false , visibility = ItemVisibility .MESSAGE )
9499 private String HEADER1 = "<HTML><b>Input Image" ;
95100
@@ -264,6 +269,10 @@ public abstract class GWDTTracerCommonCmd extends CommonDynamicCmd {
264269 "</dl>" )
265270 String afterTracingChoice = AFTER_DO_NOTHING ;
266271
272+ @ Parameter (label = " Apply Defaults " , callback = "applyDefaults" ,
273+ description = "<HTML>Resets all fields above to their default values." )
274+ private Button applyDefaultsButton ;
275+
267276 protected boolean abortRun ;
268277 protected ImgPlus <?> chosenImp ;
269278 /** Populated by auto-detection; null when ROI-based strategy is used. */
@@ -323,6 +332,7 @@ protected void initForImage() {
323332 }
324333 }
325334 debugMode = SNTUtils .isDebugMode ();
335+ readPreferences ();
326336 }
327337
328338 protected void initForFile () {
@@ -334,6 +344,66 @@ protected void initForFile() {
334344 resolveInput ("roiPlaneOnly" );
335345 resolveInput ("debugMode" ); // debug mode is always enabled to report progress to console
336346 debugMode = SNTUtils .isDebugMode ();
347+ readPreferences ();
348+ }
349+
350+ protected void readPreferences () {
351+ somaStrategyChoice = prefService .get (getClass (), "somaStrategyChoice" , somaStrategyChoice );
352+ roiPlaneOnly = prefService .getBoolean (getClass (), "roiPlaneOnly" , roiPlaneOnly );
353+ backgroundThreshold = prefService .getDouble (getClass (), "backgroundThreshold" , backgroundThreshold );
354+ scoreMapFilter = prefService .get (getClass (), "scoreMapFilter" , scoreMapFilter );
355+ lengthThreshold = prefService .getDouble (getClass (), "lengthThreshold" , lengthThreshold );
356+ srRatio = prefService .getDouble (getClass (), "srRatio" , srRatio );
357+ sphereOverlapThreshold = prefService .getDouble (getClass (), "sphereOverlapThreshold" , sphereOverlapThreshold );
358+ leafPruneEnabled = prefService .getBoolean (getClass (), "leafPruneEnabled" , leafPruneEnabled );
359+ branchTuneMaxAngle = prefService .getDouble (getClass (), "branchTuneMaxAngle" , branchTuneMaxAngle );
360+ tipExtensionDistance = prefService .getDouble (getClass (), "tipExtensionDistance" , tipExtensionDistance );
361+ zigzagRemovalEnabled = prefService .getBoolean (getClass (), "zigzagRemovalEnabled" , zigzagRemovalEnabled );
362+ overshootRemovalEnabled = prefService .getBoolean (getClass (), "overshootRemovalEnabled" , overshootRemovalEnabled );
363+ smoothWindowSize = prefService .getInt (getClass (), "smoothWindowSize" , smoothWindowSize );
364+ resampleStep = prefService .getDouble (getClass (), "resampleStep" , resampleStep );
365+ connectivityChoice = prefService .get (getClass (), "connectivityChoice" , connectivityChoice );
366+ afterTracingChoice = prefService .get (getClass (), "afterTracingChoice" , afterTracingChoice );
367+ }
368+
369+ protected void savePreferences () {
370+ prefService .put (getClass (), "somaStrategyChoice" , somaStrategyChoice );
371+ prefService .put (getClass (), "roiPlaneOnly" , roiPlaneOnly );
372+ prefService .put (getClass (), "backgroundThreshold" , backgroundThreshold );
373+ prefService .put (getClass (), "scoreMapFilter" , scoreMapFilter );
374+ prefService .put (getClass (), "lengthThreshold" , lengthThreshold );
375+ prefService .put (getClass (), "srRatio" , srRatio );
376+ prefService .put (getClass (), "sphereOverlapThreshold" , sphereOverlapThreshold );
377+ prefService .put (getClass (), "leafPruneEnabled" , leafPruneEnabled );
378+ prefService .put (getClass (), "branchTuneMaxAngle" , branchTuneMaxAngle );
379+ prefService .put (getClass (), "tipExtensionDistance" , tipExtensionDistance );
380+ prefService .put (getClass (), "zigzagRemovalEnabled" , zigzagRemovalEnabled );
381+ prefService .put (getClass (), "overshootRemovalEnabled" , overshootRemovalEnabled );
382+ prefService .put (getClass (), "smoothWindowSize" , smoothWindowSize );
383+ prefService .put (getClass (), "resampleStep" , resampleStep );
384+ prefService .put (getClass (), "connectivityChoice" , connectivityChoice );
385+ prefService .put (getClass (), "afterTracingChoice" , afterTracingChoice );
386+ }
387+
388+ @ SuppressWarnings ("unused" )
389+ protected void applyDefaults () {
390+ somaStrategyChoice = SOMA_AUTO ;
391+ roiPlaneOnly = false ;
392+ backgroundThreshold = -1.00 ;
393+ scoreMapFilter = SCORE_MAP_TUBENESS ;
394+ lengthThreshold = 5.0 ;
395+ srRatio = 0.3 ;
396+ sphereOverlapThreshold = 0.1 ;
397+ leafPruneEnabled = false ;
398+ branchTuneMaxAngle = 90.0 ;
399+ tipExtensionDistance = 0 ;
400+ zigzagRemovalEnabled = true ;
401+ overshootRemovalEnabled = true ;
402+ smoothWindowSize = 5 ;
403+ resampleStep = 2.0 ;
404+ connectivityChoice = "Medium" ;
405+ afterTracingChoice = AFTER_DO_NOTHING ;
406+ scoreMapFilterCallback (); // keep secondaryImageSuffix visibility in sync w/ reset scoreMapFilter
337407 }
338408
339409 /**
@@ -469,6 +539,7 @@ protected void runCommand() {
469539
470540 applyWorldOriginOffsetIfAny (trees );
471541 handleTracedTrees (trees );
542+ savePreferences ();
472543
473544 } catch (final java .util .concurrent .CancellationException ce ) {
474545 // Expected outcome of user-requested cancellation (SNTUI abort/exit); not an error
0 commit comments