28
28
*/
29
29
package bdv ;
30
30
31
- import bdv .tools .PreferencesDialog ;
32
- import bdv .ui .UIUtils ;
33
- import bdv .ui .keymap .Keymap ;
34
- import bdv .ui .keymap .KeymapManager ;
35
- import bdv .ui .keymap .KeymapSettingsPage ;
36
- import bdv .viewer .ConverterSetups ;
37
- import bdv .viewer .ViewerState ;
38
- import bdv .ui .appearance .AppearanceManager ;
39
- import bdv .ui .appearance .AppearanceSettingsPage ;
40
- import dev .dirs .ProjectDirectories ;
41
31
import java .io .File ;
42
32
import java .io .FileNotFoundException ;
43
33
import java .io .FileWriter ;
53
43
import javax .swing .SwingUtilities ;
54
44
import javax .swing .filechooser .FileFilter ;
55
45
56
- import net .imglib2 .Volatile ;
57
- import net .imglib2 .converter .Converter ;
58
- import net .imglib2 .display .ColorConverter ;
59
- import net .imglib2 .display .RealARGBColorConverter ;
60
- import net .imglib2 .display .ScaledARGBConverter ;
61
- import net .imglib2 .type .numeric .ARGBType ;
62
- import net .imglib2 .type .numeric .NumericType ;
63
- import net .imglib2 .type .numeric .RealType ;
64
- import net .imglib2 .type .volatiles .VolatileARGBType ;
65
-
66
46
import org .jdom2 .Document ;
67
47
import org .jdom2 .Element ;
68
48
import org .jdom2 .JDOMException ;
71
51
import org .jdom2 .output .XMLOutputter ;
72
52
import org .scijava .ui .behaviour .io .InputTriggerConfig ;
73
53
import org .scijava .ui .behaviour .io .yaml .YamlConfigIO ;
54
+ import org .scijava .ui .behaviour .util .Actions ;
74
55
75
56
import bdv .cache .CacheControl ;
76
57
import bdv .export .ProgressWriter ;
80
61
import bdv .spimdata .XmlIoSpimDataMinimal ;
81
62
import bdv .tools .HelpDialog ;
82
63
import bdv .tools .InitializeViewerState ;
64
+ import bdv .tools .PreferencesDialog ;
83
65
import bdv .tools .RecordMaxProjectionDialog ;
84
66
import bdv .tools .RecordMovieDialog ;
85
67
import bdv .tools .VisibilityAndGroupingDialog ;
91
73
import bdv .tools .brightness .RealARGBColorConverterSetup ;
92
74
import bdv .tools .brightness .SetupAssignments ;
93
75
import bdv .tools .crop .CropDialog ;
76
+ import bdv .tools .links .ResourceManager ;
77
+ import bdv .tools .links .resource .SpimDataMinimalFileResource ;
78
+ import bdv .tools .links .resource .SpimDataSetupSourceResource ;
79
+ import bdv .tools .links .resource .TransformedSourceResource ;
94
80
import bdv .tools .transformation .ManualTransformation ;
95
81
import bdv .tools .transformation .ManualTransformationEditor ;
96
82
import bdv .tools .transformation .TransformedSource ;
83
+ import bdv .ui .UIUtils ;
84
+ import bdv .ui .appearance .AppearanceManager ;
85
+ import bdv .ui .appearance .AppearanceSettingsPage ;
86
+ import bdv .ui .keymap .Keymap ;
87
+ import bdv .ui .keymap .KeymapManager ;
88
+ import bdv .ui .keymap .KeymapSettingsPage ;
89
+ import bdv .viewer .ConverterSetups ;
97
90
import bdv .viewer .NavigationActions ;
98
91
import bdv .viewer .SourceAndConverter ;
99
92
import bdv .viewer .ViewerFrame ;
100
93
import bdv .viewer .ViewerOptions ;
101
94
import bdv .viewer .ViewerPanel ;
95
+ import bdv .viewer .ViewerState ;
96
+ import dev .dirs .ProjectDirectories ;
102
97
import mpicbg .spim .data .SpimDataException ;
103
98
import mpicbg .spim .data .generic .AbstractSpimData ;
104
99
import mpicbg .spim .data .generic .sequence .AbstractSequenceDescription ;
105
100
import mpicbg .spim .data .generic .sequence .BasicViewSetup ;
106
101
import mpicbg .spim .data .sequence .Angle ;
107
102
import mpicbg .spim .data .sequence .Channel ;
108
- import org .scijava .ui .behaviour .util .Actions ;
103
+ import net .imglib2 .Volatile ;
104
+ import net .imglib2 .converter .Converter ;
105
+ import net .imglib2 .display .ColorConverter ;
106
+ import net .imglib2 .display .RealARGBColorConverter ;
107
+ import net .imglib2 .display .ScaledARGBConverter ;
108
+ import net .imglib2 .type .numeric .ARGBType ;
109
+ import net .imglib2 .type .numeric .NumericType ;
110
+ import net .imglib2 .type .numeric .RealType ;
111
+ import net .imglib2 .type .volatiles .VolatileARGBType ;
109
112
110
113
public class BigDataViewer
111
114
{
@@ -137,6 +140,8 @@ public class BigDataViewer
137
140
138
141
private final AppearanceManager appearanceManager ;
139
142
143
+ private final ResourceManager resourceManager ;
144
+
140
145
protected final PreferencesDialog preferencesDialog ;
141
146
142
147
protected final ManualTransformationEditor manualTransformationEditor ;
@@ -257,49 +262,103 @@ public static ConverterSetup createConverterSetup( final SourceAndConverter< ? >
257
262
*/
258
263
public static < T , V extends Volatile < T > > SourceAndConverter < T > wrapWithTransformedSource ( final SourceAndConverter < T > soc )
259
264
{
260
- if ( soc . asVolatile () == null )
261
- return new SourceAndConverter <>( new TransformedSource <>( soc . getSpimSource () ), soc . getConverter () );
265
+ return wrapWithTransformedSource ( soc , null );
266
+ }
262
267
263
- @ SuppressWarnings ( "unchecked" )
264
- final SourceAndConverter < V > vsoc = ( SourceAndConverter < V > ) soc .asVolatile ();
268
+ /**
269
+ * Decorate source with an extra transformation, that can be edited manually
270
+ * in this viewer. {@link SourceAndConverter#asVolatile() Nested volatile}
271
+ * {@code SourceAndConverter} are wrapped as well, if present.
272
+ *
273
+ * @param soc
274
+ * source to decorate
275
+ * @param resources
276
+ * if non-null, a {@code ResourceSpec} for the created {@code TransformedSource} wrapper.
277
+ *
278
+ * @return {@code TransformedSource} wrapper around {@code soc}
279
+ */
280
+ public static < T , V extends Volatile < T > > SourceAndConverter < T > wrapWithTransformedSource ( final SourceAndConverter < T > soc , final ResourceManager resources )
281
+ {
265
282
final TransformedSource < T > ts = new TransformedSource <>( soc .getSpimSource () );
266
- final TransformedSource < V > vts = new TransformedSource <>( vsoc .getSpimSource (), ts );
267
- return new SourceAndConverter <>( ts , soc .getConverter (), new SourceAndConverter <>( vts , vsoc .getConverter () ) );
283
+
284
+ final SourceAndConverter < V > vtsoc ;
285
+ if ( soc .asVolatile () == null )
286
+ {
287
+ vtsoc = null ;
288
+ }
289
+ else
290
+ {
291
+ @ SuppressWarnings ( "unchecked" )
292
+ final SourceAndConverter < V > vsoc = ( SourceAndConverter < V > ) soc .asVolatile ();
293
+ final TransformedSource < V > vts = new TransformedSource <>( vsoc .getSpimSource (), ts );
294
+ vtsoc = new SourceAndConverter <>( vts , vsoc .getConverter () );
295
+ }
296
+
297
+ final SourceAndConverter < T > tsoc = new SourceAndConverter <>( ts , soc .getConverter (), vtsoc );
298
+ if (resources != null )
299
+ {
300
+ final TransformedSourceResource .Spec spec = new TransformedSourceResource .Spec (
301
+ resources .getResourceSpec ( soc ) );
302
+ resources .put ( tsoc , spec );
303
+ resources .keepAlive ( tsoc , soc );
304
+ }
305
+ return tsoc ;
268
306
}
269
307
270
308
private static < T extends NumericType < T >, V extends Volatile < T > & NumericType < V > > void initSetupNumericType (
271
309
final AbstractSpimData < ? > spimData ,
272
310
final BasicViewSetup setup ,
273
311
final List < ConverterSetup > converterSetups ,
274
- final List < SourceAndConverter < ? > > sources )
312
+ final List < SourceAndConverter < ? > > sources ,
313
+ final ResourceManager resources )
275
314
{
276
315
final int setupId = setup .getId ();
316
+ final String setupName = createSetupName ( setup );
317
+ final SourceAndConverter < T > soc = createSetupSourceNumericType ( spimData , setupId , setupName , resources );
318
+ final SourceAndConverter < T > tsoc = wrapWithTransformedSource ( soc , resources );
319
+ sources .add ( tsoc );
320
+
321
+ final ConverterSetup converterSetup = createConverterSetup ( tsoc , setupId );
322
+ if ( converterSetup != null )
323
+ converterSetups .add ( converterSetup );
324
+ }
325
+
326
+ public static < T extends NumericType < T >, V extends Volatile < T > & NumericType < V > > SourceAndConverter < T > createSetupSourceNumericType (
327
+ final AbstractSpimData < ? > spimData ,
328
+ final int setupId ,
329
+ final String name ,
330
+ final ResourceManager resources )
331
+ {
277
332
final ViewerImgLoader imgLoader = ( ViewerImgLoader ) spimData .getSequenceDescription ().getImgLoader ();
278
333
@ SuppressWarnings ( "unchecked" )
279
334
final ViewerSetupImgLoader < T , V > setupImgLoader = ( ViewerSetupImgLoader < T , V > ) imgLoader .getSetupImgLoader ( setupId );
335
+ if ( setupImgLoader == null )
336
+ throw new IllegalArgumentException ( "No SetupImgLoader for setup ID " + setupId + " found." );
337
+
280
338
final T type = setupImgLoader .getImageType ();
281
339
final V volatileType = setupImgLoader .getVolatileImageType ();
282
340
283
341
if ( ! ( type instanceof NumericType ) )
284
342
throw new IllegalArgumentException ( "ImgLoader of type " + type .getClass () + " not supported." );
285
343
286
- final String setupName = createSetupName ( setup );
287
-
288
344
SourceAndConverter < V > vsoc = null ;
289
345
if ( volatileType != null )
290
346
{
291
- final VolatileSpimSource < V > vs = new VolatileSpimSource <>( spimData , setupId , setupName );
347
+ final VolatileSpimSource < V > vs = new VolatileSpimSource <>( spimData , setupId , name );
292
348
vsoc = new SourceAndConverter <>( vs , createConverterToARGB ( volatileType ) );
293
349
}
294
350
295
- final SpimSource < T > s = new SpimSource <>( spimData , setupId , setupName );
351
+ final SpimSource < T > s = new SpimSource <>( spimData , setupId , name );
296
352
final SourceAndConverter < T > soc = new SourceAndConverter <>( s , createConverterToARGB ( type ), vsoc );
297
- final SourceAndConverter < T > tsoc = wrapWithTransformedSource ( soc );
298
- sources .add ( tsoc );
299
-
300
- final ConverterSetup converterSetup = createConverterSetup ( tsoc , setupId );
301
- if ( converterSetup != null )
302
- converterSetups .add ( converterSetup );
353
+ if (resources != null )
354
+ {
355
+ final SpimDataSetupSourceResource .Spec spec = new SpimDataSetupSourceResource .Spec (
356
+ resources .getResourceSpec ( spimData ),
357
+ setupId , name );
358
+ resources .put ( soc , spec );
359
+ resources .keepAlive ( soc , spimData );
360
+ }
361
+ return soc ;
303
362
}
304
363
305
364
public static void initSetups (
@@ -308,7 +367,17 @@ public static void initSetups(
308
367
final List < SourceAndConverter < ? > > sources )
309
368
{
310
369
for ( final BasicViewSetup setup : spimData .getSequenceDescription ().getViewSetupsOrdered () )
311
- initSetupNumericType ( spimData , setup , converterSetups , sources );
370
+ initSetupNumericType ( spimData , setup , converterSetups , sources , null );
371
+ }
372
+
373
+ public static void initSetups (
374
+ final AbstractSpimData < ? > spimData ,
375
+ final List < ConverterSetup > converterSetups ,
376
+ final List < SourceAndConverter < ? > > sources ,
377
+ final ResourceManager resources )
378
+ {
379
+ for ( final BasicViewSetup setup : spimData .getSequenceDescription ().getViewSetupsOrdered () )
380
+ initSetupNumericType ( spimData , setup , converterSetups , sources , resources );
312
381
}
313
382
314
383
@ Deprecated
@@ -355,6 +424,7 @@ public BigDataViewer(
355
424
final AppearanceManager optionsAppearanceManager = options .values .getAppearanceManager ();
356
425
keymapManager = optionsKeymapManager != null ? optionsKeymapManager : new KeymapManager ( configDir );
357
426
appearanceManager = optionsAppearanceManager != null ? optionsAppearanceManager : new AppearanceManager ( configDir );
427
+ resourceManager = options .values .getResourceManager ();
358
428
359
429
InputTriggerConfig inputTriggerConfig = options .values .getInputTriggerConfig ();
360
430
final Keymap keymap = this .keymapManager .getForwardSelectedKeymap ();
@@ -531,7 +601,8 @@ public static BigDataViewer open( final AbstractSpimData< ? > spimData, final St
531
601
532
602
final ArrayList < ConverterSetup > converterSetups = new ArrayList <>();
533
603
final ArrayList < SourceAndConverter < ? > > sources = new ArrayList <>();
534
- initSetups ( spimData , converterSetups , sources );
604
+ final ResourceManager resources = options .values .getResourceManager ();
605
+ initSetups ( spimData , converterSetups , sources , resources );
535
606
536
607
final AbstractSequenceDescription < ?, ?, ? > seq = spimData .getSequenceDescription ();
537
608
final int numTimepoints = seq .getTimePoints ().size ();
@@ -549,6 +620,8 @@ public static BigDataViewer open( final AbstractSpimData< ? > spimData, final St
549
620
public static BigDataViewer open ( final String xmlFilename , final String windowTitle , final ProgressWriter progressWriter , final ViewerOptions options ) throws SpimDataException
550
621
{
551
622
final SpimDataMinimal spimData = new XmlIoSpimDataMinimal ().load ( xmlFilename );
623
+ final ResourceManager resources = options .values .getResourceManager ();
624
+ resources .put ( spimData , new SpimDataMinimalFileResource .Spec ( xmlFilename ) );
552
625
final BigDataViewer bdv = open ( spimData , windowTitle , progressWriter , options );
553
626
if ( !bdv .tryLoadSettings ( xmlFilename ) )
554
627
InitializeViewerState .initBrightness ( 0.001 , 0.999 , bdv .viewerFrame );
@@ -609,6 +682,11 @@ public AppearanceManager getAppearanceManager()
609
682
return appearanceManager ;
610
683
}
611
684
685
+ public ResourceManager getResourceManager ()
686
+ {
687
+ return resourceManager ;
688
+ }
689
+
612
690
public boolean tryLoadSettings ( final String xmlFilename )
613
691
{
614
692
proposedSettingsFile = null ;
0 commit comments