# gdcmreslice.cxx

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

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2010 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.

    =========================================================================*/
    #include "vtkGDCMImageReader.h"

    #include "vtkRenderer.h"
    #include "vtkAssembly.h"
    #include "vtkImageFlip.h"
    #include "vtkImageReslice.h"
    #include "vtkRenderWindow.h"
    #include "vtkAnnotatedCubeActor.h"
    #include "vtkTransform.h"
    #include "vtkAxesActor.h"
    #include "vtkTextProperty.h"
    #include "vtkCaptionActor2D.h"
    #include "vtkPropAssembly.h"
    #include "vtkOrientationMarkerWidget.h"
    #include "vtkRenderWindowInteractor.h"
    #include "vtkPolyDataMapper.h"
    #include "vtkActor.h"
    #include "vtkImageData.h"
    #include "vtkLookupTable.h"
    #include "vtkTexture.h"
    #include "vtkPlaneSource.h"

    int main( int argc, char *argv[] )
    {
      vtkGDCMImageReader *reader = vtkGDCMImageReader::New();
      reader->SetFileName( argv[1] );
      //reader->FileLowerLeftOn();
      reader->Update();

      vtkImageFlip *flip = vtkImageFlip::New();
      flip->SetInput(reader->GetOutput());
      flip->SetFilteredAxis(0);
      flip->Update();

      vtkImageReslice *reslice = vtkImageReslice::New();
      //reslice->SetInput(reader->GetOutput());
      reslice->SetInput(flip->GetOutput());
      //reslice->SetResliceAxesDirectionCosines()
      reader->GetDirectionCosines()->Print(std::cout);
      vtkMatrix4x4 *invert = vtkMatrix4x4::New();
      invert->DeepCopy( reader->GetDirectionCosines() );
      invert->Invert();

      //reslice->SetResliceAxes( reader->GetDirectionCosines() );
      reslice->SetResliceAxes( invert );
      reslice->Update();
      vtkImageData* ima = reslice->GetOutput();

      vtkLookupTable* table = vtkLookupTable::New();
      table->SetNumberOfColors(1000);
      table->SetTableRange(0,1000);
      table->SetSaturationRange(0,0);
      table->SetHueRange(0,1);
      table->SetValueRange(0,1);
      table->SetAlphaRange(1,1);
      table->Build();

      // Texture
      vtkTexture* texture = vtkTexture::New();
      texture->SetInput(ima);
      texture->InterpolateOn();
      texture->SetLookupTable(table);

      // PlaneSource
      vtkPlaneSource* plane = vtkPlaneSource::New();

      // PolyDataMapper
      vtkPolyDataMapper *planeMapper = vtkPolyDataMapper::New();
      planeMapper->SetInput(plane->GetOutput());

      // Actor
      vtkActor* planeActor = vtkActor::New();
      planeActor->SetTexture(texture);
      planeActor->SetMapper(planeMapper);
      planeActor->PickableOn();

      // Final rendering with simple interactor:
      vtkRenderer        *ren = vtkRenderer::New();
      vtkRenderWindow *renwin = vtkRenderWindow::New();
      renwin->AddRenderer(ren);
      vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
      iren->SetRenderWindow(renwin);
      ren->AddActor(planeActor);
      ren->SetBackground(0,0,0.5);

      // DICOM is RAH:
      vtkAnnotatedCubeActor* cube = vtkAnnotatedCubeActor::New();
      cube->SetXPlusFaceText ( "R" );
      cube->SetXMinusFaceText( "L" );
      cube->SetYPlusFaceText ( "A" );
      cube->SetYMinusFaceText( "P" );
      cube->SetZPlusFaceText ( "H" );
      cube->SetZMinusFaceText( "F" );

      vtkAxesActor* axes2 = vtkAxesActor::New();

      vtkTransform *transform = vtkTransform::New();
      transform->Identity();
      //reader->GetDirectionCosines()->Print(std::cout);
      transform->Concatenate(invert);
      //axes2->SetShaftTypeToCylinder();
      axes2->SetUserTransform( transform );
      cube->GetAssembly()->SetUserTransform( transform ); // cant get it to work

      vtkPropAssembly* assembly = vtkPropAssembly::New();
      assembly->AddPart( axes2 );
      assembly->AddPart( cube );

      vtkOrientationMarkerWidget* widget = vtkOrientationMarkerWidget::New();
      widget->SetOrientationMarker( assembly );
      widget->SetInteractor( iren );
      widget->SetEnabled( 1 );
      widget->InteractiveOff();
      widget->InteractiveOn();

      renwin->Render();
      iren->Start();

      // Clean up:
      reader->Delete();
      table->Delete();
      texture->Delete();
      plane->Delete();
      planeMapper->Delete();
      planeActor->Delete();
      ren->Delete();
      renwin->Delete();
      iren->Delete();

      return 0;
    }