diff --git a/src/main/java/bdv/ij/OpenImarisPlugIn.java b/src/main/java/bdv/ij/OpenImarisPlugIn.java new file mode 100644 index 0000000000000000000000000000000000000000..dafc4be70026e64a6b1ca8037dbc7c748477eda3 --- /dev/null +++ b/src/main/java/bdv/ij/OpenImarisPlugIn.java @@ -0,0 +1,125 @@ +package bdv.ij; + +import ij.ImageJ; +import ij.Prefs; +import ij.plugin.PlugIn; + +import java.awt.FileDialog; +import java.awt.Frame; +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileFilter; + +import bdv.BigDataViewer; +import bdv.ij.util.ProgressWriterIJ; +import bdv.img.imaris.Imaris; +import bdv.spimdata.SpimDataMinimal; + +public class OpenImarisPlugIn implements PlugIn +{ + static String lastDatasetPath = ""; + + public static void main( final String[] args ) + { + ImageJ.main( args ); + new OpenImarisPlugIn().run( null ); + } + @Override + public void run( final String arg ) + { + File file = null; + + if ( Prefs.useJFileChooser ) + { + final JFileChooser fileChooser = new JFileChooser(); + fileChooser.setSelectedFile( new File( lastDatasetPath ) ); + fileChooser.setFileFilter( new FileFilter() + { + @Override + public String getDescription() + { + return "ims files"; + } + + @Override + public boolean accept( final File f ) + { + if ( f.isDirectory() ) + return true; + if ( f.isFile() ) + { + final String s = f.getName(); + final int i = s.lastIndexOf('.'); + if (i > 0 && i < s.length() - 1) { + final String ext = s.substring(i+1).toLowerCase(); + return ext.equals( "ims" ); + } + } + return false; + } + } ); + + final int returnVal = fileChooser.showOpenDialog( null ); + if ( returnVal == JFileChooser.APPROVE_OPTION ) + file = fileChooser.getSelectedFile(); + } + else // use FileDialog + { + final FileDialog fd = new FileDialog( ( Frame ) null, "Open", FileDialog.LOAD ); + fd.setDirectory( new File( lastDatasetPath ).getParent() ); + fd.setFile( new File( lastDatasetPath ).getName() ); + final AtomicBoolean workedWithFilenameFilter = new AtomicBoolean( false ); + fd.setFilenameFilter( new FilenameFilter() + { + private boolean firstTime = true; + + @Override + public boolean accept( final File dir, final String name ) + { + if ( firstTime ) + { + workedWithFilenameFilter.set( true ); + firstTime = false; + } + + final int i = name.lastIndexOf( '.' ); + if ( i > 0 && i < name.length() - 1 ) + { + final String ext = name.substring( i + 1 ).toLowerCase(); + return ext.equals( "ims" ); + } + return false; + } + } ); + fd.setVisible( true ); + if ( !workedWithFilenameFilter.get() ) + { + fd.setFilenameFilter( null ); + fd.setVisible( true ); + } + final String filename = fd.getFile(); + if ( filename != null ) + { + file = new File( fd.getDirectory() + filename ); + } + } + + if ( file != null ) + { + try + { + lastDatasetPath = file.getAbsolutePath(); + final SpimDataMinimal spimData = Imaris.openIms( file.getAbsolutePath() ); + new BigDataViewer( spimData, file.getName(), new ProgressWriterIJ() ); + } + catch ( final IOException e ) + { + throw new RuntimeException( e ); + } + } + } +} diff --git a/src/main/resources/plugins.config b/src/main/resources/plugins.config index 9f82fc39e48c791e46fb1b4680b759c80aab35ae..2807a76d99315e407e329b6bcbe85023e5a61044 100644 --- a/src/main/resources/plugins.config +++ b/src/main/resources/plugins.config @@ -16,4 +16,5 @@ Plugins>BigDataViewer, "Export Current Image as XML/HDF5", bdv.ij.ExportImagePlu Plugins>BigDataViewer, "Export Spim Sequence as XML/HDF5", bdv.ij.ExportSpimSequencePlugIn Plugins>BigDataViewer, "Export Fused Sequence as XML/HDF5", bdv.ij.ExportSpimFusionPlugIn Plugins>BigDataViewer, "Export CellVoyager dataset as XML/HDF5", bdv.ij.ExportCellVoyagerPlugIn +Plugins>BigDataViewer, "Open Imaris (experimental)", bdv.ij.OpenImarisPlugIn File>Import, "BigDataViewer...", bdv.ij.ImportPlugIn \ No newline at end of file