GDCM 2.2.0

- Main Page
- Related Pages
- Namespaces
- Classes
- Files
- Directories
- Examples

MPRViewer2.java

    /*=========================================================================

      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 );
        }
    }