]> Creatis software - gdcm.git/blob - vtk/vtkgdcmViewer.cxx
* Added documentation of vtkgdcmReader on Website:
[gdcm.git] / vtk / vtkgdcmViewer.cxx
1 // This example illustrates how the vtkGdcmReader vtk class can be
2 // used in order to:
3 //  * produce a simple (vtk based) Dicom image STACK VIEWER.
4 //  * dump the stack considered as a volume in a vtkStructuredPoints
5 //    vtk file: the vtk gdcm wrappers can be seen as a simple way to convert
6 //    a stack of Dicom images into a native vtk volume.
7 //
8 // Usage:
9 //  * the filenames of the Dicom images constituting the stack should be
10 //    given as command line arguments,
11 //  * you can navigate through the stack by hitting any character key,
12 //  * the produced vtk file is named "foo.vtk" (in the invocation directory).
13 // 
14 //----------------------------------------------------------------------------
15 #include <iostream>
16
17 #include <vtkRenderWindowInteractor.h>
18 #include <vtkImageViewer2.h>
19 #include <vtkStructuredPoints.h>
20 #include <vtkStructuredPointsWriter.h>
21 #include <vtkCommand.h>
22 #include <vtkRenderer.h>
23 #include <vtkImageMapToColors.h>
24 #include <vtkLookupTable.h>
25
26 #include "vtkGdcmReader.h"
27
28 #ifndef vtkFloatingPointType
29 #define vtkFloatingPointType float
30 #endif
31
32 //----------------------------------------------------------------------------
33 // Callback for the interaction
34 class vtkgdcmObserver : public vtkCommand
35 {
36   public:
37   virtual char const *GetClassName() const { return "vtkgdcmObserver";}
38   static vtkgdcmObserver *New() 
39     { return new vtkgdcmObserver; }
40   vtkgdcmObserver()
41     {
42       this->ImageViewer = NULL;
43     }
44   virtual void Execute(vtkObject *, unsigned long event, void* )
45     {
46       if ( this->ImageViewer )
47         {
48           if ( event == vtkCommand::CharEvent )
49           {
50             int max = ImageViewer->GetWholeZMax();
51             int slice = (ImageViewer->GetZSlice() + 1 ) % ++max;
52             ImageViewer->SetZSlice( slice );
53             ImageViewer->GetRenderer()->ResetCameraClippingRange();
54             ImageViewer->Render();
55           }
56         }
57     }
58     vtkImageViewer2 *ImageViewer;
59 };
60
61
62 int main(int argc, char *argv[])
63 {
64   if( argc < 2 )
65     return 0;
66   
67   vtkGdcmReader *reader = vtkGdcmReader::New();
68   reader->AllowLookupTableOff();
69
70   if( argc == 2 )
71     reader->SetFileName( argv[1] );
72   else
73     for(int i=1; i< argc; i++)
74       reader->AddFileName( argv[i] );
75
76   reader->DebugOn();
77   reader->Update();
78   
79   //print debug info:
80   reader->GetOutput()->Print( cout );
81         
82   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
83
84   vtkImageViewer2 *viewer = vtkImageViewer2::New();
85   
86   if( reader->GetLookupTable() )
87   {
88     //convert to color:
89     vtkImageMapToColors *map = vtkImageMapToColors::New ();
90     map->SetInput (reader->GetOutput());
91     map->SetLookupTable (reader->GetLookupTable());
92     map->SetOutputFormatToRGB();
93     viewer->SetInput ( map->GetOutput() );
94     map->Delete();
95   }
96   else
97   {
98     viewer->SetInput ( reader->GetOutput() );
99   }
100   viewer->SetupInteractor (iren);
101   
102   //vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange();
103   //viewer->SetColorWindow (range[1] - range[0]);
104   //viewer->SetColorLevel (0.5 * (range[1] + range[0]));
105
106   // Here is where we setup the observer, 
107   vtkgdcmObserver *obs = vtkgdcmObserver::New();
108   obs->ImageViewer = viewer;
109   iren->AddObserver(vtkCommand::CharEvent,obs);
110   obs->Delete();
111
112   iren->Initialize();
113   iren->Start();
114
115   //if you wish you can export dicom to a vtk file  
116   vtkStructuredPointsWriter *writer = vtkStructuredPointsWriter::New();
117   writer->SetInput( reader->GetOutput());
118   writer->SetFileName( "foo.vtk" );
119   writer->SetFileTypeToBinary();
120   writer->Write();
121
122   reader->Delete();
123   iren->Delete();
124   viewer->Delete();
125   writer->Delete();
126   
127   return 0;
128 }