GDCM
2.2.3
|
/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ import vtk.*; import gdcm.*; import java.io.File; /* * Compilation: * CLASSPATH=vtkgdcm.jar:/usr/share/java/vtk.jar javac MPRViewer2.java * * Usage: * LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/amd64/xawt:/usr/lib/jni:. CLASSPATH=/usr/share/java/vtk.jar:vtkgdcm.jar:gdcm.jar:. java MPRViewer2 BRAINX * */ public class MPRViewer2 { static { // VTK System.loadLibrary("vtkCommonJava"); System.loadLibrary("vtkFilteringJava"); System.loadLibrary("vtkIOJava"); System.loadLibrary("vtkImagingJava"); System.loadLibrary("vtkGraphicsJava"); System.loadLibrary("vtkRenderingJava"); System.loadLibrary("vtkHybridJava"); System.loadLibrary("vtkWidgetsJava"); // VTK-GDCM System.loadLibrary("vtkgdcmJava"); } static FilenamesType fns = new FilenamesType(); public static void process(String path) { fns.add( path ); } // Process only files under dir 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 void dointer(vtkImagePlaneWidget current_widget) { int cstat = current_widget.GetCursorDataStatus(); double[] v = current_widget.GetCurrentCursorPosition(); //System.out.println( cstat ); //System.out.println( v[0] ); //System.out.println( v[1] ); //System.out.println( v[2] ); planeWidgetX.SetSliceIndex( (int)v[0] ); planeWidgetY.SetSliceIndex( (int)v[1] ); planeWidgetZ.SetSliceIndex( (int)v[2] ); planeWidgetX.GetCurrentRenderer().ResetCameraClippingRange(); planeWidgetY.GetCurrentRenderer().ResetCameraClippingRange(); planeWidgetZ.GetCurrentRenderer().ResetCameraClippingRange(); } public void startinterX() { dointer( planeWidgetX ); } public void interX() { dointer( planeWidgetX ); } public void endinterX() { } public void startinterY() { dointer( planeWidgetY ); } public void interY() { dointer( planeWidgetY ); } public void endinterY() { } public void startinterZ() { dointer( planeWidgetZ ); } public void interZ() { dointer( planeWidgetZ ); } public void endinterZ() { //System.out.println( "endinter" ); } public static void AlignCamera(int slice_number, vtkImagePlaneWidget current_widget) { vtkImageData image = (vtkImageData)current_widget.GetInput(); vtkRenderer ren = current_widget.GetCurrentRenderer(); double[] origin = image.GetOrigin(); double ox = origin[0]; double oy = origin[1]; double oz = origin[2]; int wextent[] = image.GetWholeExtent(); int xMin = wextent[0]; int xMax = wextent[1]; int yMin = wextent[2]; int yMax = wextent[3]; int zMin = wextent[4]; int zMax = wextent[5]; double[] spacing = image.GetSpacing(); double sx = spacing[0]; double sy = spacing[1]; double sz = spacing[2]; double cx = ox+(0.5*(xMax-xMin))*sx; double cy = oy+(0.5*(yMax-yMin))*sy; double cz = oy+(0.5*(zMax-zMin))*sz; double vx = 0, vy = 0, vz = 0; double nx = 0, ny = 0, nz = 0; int iaxis = current_widget.GetPlaneOrientation(); if ( iaxis == 0 ) { vz = -1; nx = ox + xMax*sx; cx = ox + slice_number*sx; } else if ( iaxis == 1 ) { vz = -1; ny = oy+yMax*sy; cy = oy+slice_number*sy; } else { vy = 1; nz = oz+zMax*sz; cz = oz+slice_number*sz; } double px = cx+nx*2; double py = cy+ny*2; double pz = cz+nz*3; vtkCamera camera = ren.GetActiveCamera(); camera.SetViewUp(vx, vy, vz); camera.SetFocalPoint(cx, cy, cz); camera.SetPosition(px, py, pz); camera.OrthogonalizeViewUp(); ren.ResetCameraClippingRange(); } private vtkImagePlaneWidget planeWidgetX = new vtkImagePlaneWidget(); private vtkImagePlaneWidget planeWidgetY = new vtkImagePlaneWidget(); private vtkImagePlaneWidget planeWidgetZ = new vtkImagePlaneWidget(); public void config() { //System.out.println( "config" ); planeWidgetX.GetCurrentRenderer().ResetCamera(); planeWidgetY.GetCurrentRenderer().ResetCamera(); planeWidgetZ.GetCurrentRenderer().ResetCamera(); } public void Run(String dirname) { 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( String f : sorted ) for (int i = 0; i < nfiles; i++) { String f = sorted.get(i); files.InsertNextValue( f ); } vtkGDCMImageReader reader = new vtkGDCMImageReader(); reader.SetFileNames( files ); reader.Update(); // get spacing value double[] spacing = reader.GetOutput().GetSpacing(); vtkImageChangeInformation change = new vtkImageChangeInformation(); change.SetInputConnection( reader.GetOutputPort() ); change.SetOutputSpacing( spacing[0], spacing[1], ippzspacing ); change.Update(); System.out.println( change.GetOutput().toString() ); vtkRenderer ren1 = new vtkRenderer(); ren1.SetViewport(0., 0., 0.333, 1); ren1.SetBackground(0.1,0.2,0.4); vtkRenderer ren2 = new vtkRenderer(); ren2.SetViewport(0.333, 0., 0.667, 1); ren2.SetBackground(0.1,0.2,0.4); vtkRenderer ren3 = new vtkRenderer(); ren3.SetViewport(0.667, 0., 1., 1.); ren3.SetBackground(0.1,0.2,0.4); vtkRenderWindow renWin = new vtkRenderWindow(); renWin.AddRenderer(ren1); renWin.AddRenderer(ren2); renWin.AddRenderer(ren3); vtkRenderWindowInteractor iren = new vtkRenderWindowInteractor(); iren.SetRenderWindow(renWin); vtkInteractorStyleImage style = new vtkInteractorStyleImage(); iren.SetInteractorStyle( style ); vtkCellPicker picker = new vtkCellPicker(); picker.SetTolerance(0.005); vtkProperty ipwProp = new vtkProperty(); //vtkImagePlaneWidget planeWidgetX = new vtkImagePlaneWidget(); planeWidgetX.SetInteractor(iren); planeWidgetX.SetCurrentRenderer(ren1); planeWidgetX.SetDefaultRenderer(ren1); planeWidgetX.RestrictPlaneToVolumeOn(); planeWidgetX.SetTexturePlaneProperty(ipwProp); //planeWidgetX.GetPlaneProperty().SetColor(1,0,0); //planeWidgetX.TextureInterpolateOff(); //planeWidgetX.SetResliceInterpolateToNearestNeighbour(); planeWidgetX.SetInput(change.GetOutput()); planeWidgetX.SetPlaneOrientationToXAxes(); planeWidgetX.SetSliceIndex(62); planeWidgetX.SetPicker(picker); planeWidgetX.SetKeyPressActivationValue('x'); planeWidgetX.On(); planeWidgetX.InteractionOn(); //vtkImagePlaneWidget planeWidgetY = new vtkImagePlaneWidget(); planeWidgetY.SetInteractor(iren); planeWidgetY.SetCurrentRenderer(ren2); planeWidgetY.SetDefaultRenderer(ren2); planeWidgetY.RestrictPlaneToVolumeOn(); planeWidgetY.SetTexturePlaneProperty(ipwProp); //planeWidgetY.GetPlaneProperty().SetColor(1,0,0); //planeWidgetY.TextureInterpolateOff(); //planeWidgetY.SetResliceInterpolateToNearestNeighbour(); planeWidgetY.SetInput(change.GetOutput()); planeWidgetY.SetLookupTable( planeWidgetX.GetLookupTable() ); planeWidgetY.SetPlaneOrientationToYAxes(); planeWidgetY.SetSliceIndex(32); planeWidgetY.SetPicker(picker); planeWidgetY.SetKeyPressActivationValue('y'); planeWidgetY.On(); //vtkImagePlaneWidget planeWidgetZ = new vtkImagePlaneWidget(); planeWidgetZ.SetInteractor(iren); planeWidgetZ.SetCurrentRenderer(ren3); planeWidgetZ.SetDefaultRenderer(ren3); planeWidgetZ.RestrictPlaneToVolumeOn(); planeWidgetZ.SetTexturePlaneProperty(ipwProp); //planeWidgetZ.GetPlaneProperty().SetColor(1,0,0); //planeWidgetZ.TextureInterpolateOff(); //planeWidgetZ.SetResliceInterpolateToNearestNeighbour(); planeWidgetZ.SetInput(change.GetOutput()); planeWidgetZ.SetLookupTable( planeWidgetX.GetLookupTable() ); planeWidgetZ.SetPlaneOrientationToZAxes(); planeWidgetZ.SetSliceIndex(32); planeWidgetZ.SetPicker(picker); planeWidgetZ.SetKeyPressActivationValue('z'); planeWidgetZ.On(); iren.Initialize(); renWin.Render(); AlignCamera(52, planeWidgetX); AlignCamera(32, planeWidgetY); AlignCamera(32, planeWidgetZ); planeWidgetX.GetCurrentRenderer().ResetCamera(); planeWidgetY.GetCurrentRenderer().ResetCamera(); planeWidgetZ.GetCurrentRenderer().ResetCamera(); renWin.Render(); planeWidgetX.AddObserver("StartInteractionEvent", this,"startinterX"); planeWidgetX.AddObserver("InteractionEvent", this,"interX"); planeWidgetX.AddObserver("EndInteractionEvent", this,"endinterX"); planeWidgetY.AddObserver("StartInteractionEvent", this,"startinterY"); planeWidgetY.AddObserver("InteractionEvent", this,"interY"); planeWidgetY.AddObserver("EndInteractionEvent", this,"endinterY"); planeWidgetZ.AddObserver("StartInteractionEvent", this,"startinterZ"); planeWidgetZ.AddObserver("InteractionEvent", this,"interZ"); planeWidgetZ.AddObserver("EndInteractionEvent", this,"endinterZ"); iren.AddObserver("ConfigureEvent", this,"config"); iren.Start(); } public static void main(String[] args) throws Exception { String dirname = args[0]; if( !PosixEmulation.FileIsDirectory( dirname ) ) { return; } MPRViewer2 me = new MPRViewer2(); me.Run( dirname ); } }