import vtk.*;
import gdcm.*;
import java.io.File;
import java.awt.Canvas;
public class MIPViewer extends Canvas
{
static {
System.loadLibrary("vtkCommonJava");
System.loadLibrary("vtkFilteringJava");
System.loadLibrary("vtkIOJava");
System.loadLibrary("vtkImagingJava");
System.loadLibrary("vtkGraphicsJava");
System.loadLibrary("vtkRenderingJava");
System.loadLibrary("vtkVolumeRenderingJava");
System.loadLibrary("vtkWidgetsJava");
System.loadLibrary("vtkgdcmJava");
}
static FilenamesType fns = new FilenamesType();
protected native int Lock();
protected native int UnLock();
public static void process(String path)
{
fns.add( path );
}
public static void visitAllFiles(File dir)
{
if (dir.isDirectory())
{
String[] children = dir.list();
for (int i=0; i<children.length; i++)
{
visitAllFiles(new File(dir, children[i]));
}
}
else
{
process(dir.getPath());
}
}
public static void main(String[] args) throws Exception
{
String dirname = args[0];
if( !PosixEmulation.FileIsDirectory( dirname ) )
{
return;
}
File dir = new File(dirname);
visitAllFiles(dir);
IPPSorter ipp = new IPPSorter();
ipp.SetComputeZSpacing( true );
ipp.SetZSpacingTolerance( 1e-3 );
boolean b = ipp.Sort( fns );
if(!b)
{
throw new Exception("Could not scan");
}
double ippzspacing = ipp.GetZSpacing();
FilenamesType sorted = ipp.GetFilenames();
vtkStringArray files = new vtkStringArray();
long nfiles = sorted.size();
for (int i = 0; i < nfiles; i++) {
String f = sorted.get(i);
files.InsertNextValue( f );
}
reader.Update();
double[] spacing = reader.GetOutput().GetSpacing();
vtkImageChangeInformation change = new vtkImageChangeInformation();
change.SetInputConnection( reader.GetOutputPort() );
change.SetOutputSpacing( spacing[0], spacing[1], ippzspacing );
vtkVolume volume = new vtkVolume();
vtkSmartVolumeMapper mapper = new vtkSmartVolumeMapper();
vtkRenderWindowInteractor iren = new vtkRenderWindowInteractor();
vtkBoxWidget box = new vtkBoxWidget();
box.SetInteractor(iren);
box.SetPlaceFactor(1.01);
box.SetInput(change.GetOutput());
box.InsideOutOn();
box.PlaceWidget();
box.GetSelectedFaceProperty().SetOpacity(0.0);
mapper.SetInputConnection( change.GetOutputPort() );
vtkColorTransferFunction colorFun = new vtkColorTransferFunction();
vtkPiecewiseFunction opacityFun = new vtkPiecewiseFunction();
vtkVolumeProperty property = new vtkVolumeProperty();
property.IndependentComponentsOn();
property.SetColor( colorFun );
property.SetScalarOpacity( opacityFun );
property.SetInterpolationTypeToLinear();
volume.SetProperty( property );
volume.SetMapper( mapper );
vtkMedicalImageProperties medprop = reader.GetMedicalImageProperties();
int n = medprop.GetNumberOfWindowLevelPresets();
double opacityWindow = 4096;
double opacityLevel = 2048;
for( int i = 0; i < n; ++i )
{
double wl[] = medprop.GetNthWindowLevelPreset(i);
opacityWindow = wl[0];
opacityLevel = wl[1];
}
colorFun.AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0 );
opacityFun.AddSegment( opacityLevel - 0.5*opacityWindow, 0.0,
opacityLevel + 0.5*opacityWindow, 1.0 );
mapper.SetBlendModeToMaximumIntensity();
vtkRenderer ren1 = new vtkRenderer();
vtkRenderWindow renWin = new vtkRenderWindow();
renWin.AddRenderer(ren1);
renWin.SetSize(600,600);
ren1.AddVolume( volume );
ren1.ResetCamera();
iren.SetRenderWindow( renWin );
renWin.Render();
iren.Start();
}
}