/*========================================================================= 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. =========================================================================*/ #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[] ) { if( argc < 2 ) return 1; vtkGDCMImageReader *reader = vtkGDCMImageReader::New(); reader->SetFileName( argv[1] ); //reader->FileLowerLeftOn(); reader->Update(); vtkImageFlip *flip = vtkImageFlip::New(); #if (VTK_MAJOR_VERSION >= 6) flip->SetInputConnection(reader->GetOutputPort()); #else flip->SetInput(reader->GetOutput()); #endif flip->SetFilteredAxis(0); flip->Update(); vtkImageReslice *reslice = vtkImageReslice::New(); //reslice->SetInput(reader->GetOutput()); #if (VTK_MAJOR_VERSION >= 6) reslice->SetInputConnection(flip->GetOutputPort()); #else reslice->SetInput(flip->GetOutput()); #endif //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(); #if (VTK_MAJOR_VERSION >= 6) texture->SetInputData(ima); #else texture->SetInput(ima); #endif texture->InterpolateOn(); texture->SetLookupTable(table); // PlaneSource vtkPlaneSource* plane = vtkPlaneSource::New(); // PolyDataMapper vtkPolyDataMapper *planeMapper = vtkPolyDataMapper::New(); #if (VTK_MAJOR_VERSION >= 6) planeMapper->SetInputConnection(plane->GetOutputPort()); #else planeMapper->SetInput(plane->GetOutput()); #endif // 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; }