]> Creatis software - gdcm.git/blob - vtk/vtkgdcmViewer.cxx
* Test/ShowDicom.cxx : now can be used with an off-screen rendering to
[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 
38    { 
39       return "vtkgdcmObserver";
40    }
41    static vtkgdcmObserver *New() 
42    { 
43       return new vtkgdcmObserver; 
44    }
45    vtkgdcmObserver()
46    {
47       this->ImageViewer = NULL;
48    }
49    virtual void Execute(vtkObject *, unsigned long event, void* )
50    {
51       if ( this->ImageViewer )
52       {
53          if ( event == vtkCommand::CharEvent )
54          {
55             int max = ImageViewer->GetWholeZMax();
56             int slice = (ImageViewer->GetZSlice() + 1 ) % ++max;
57             ImageViewer->SetZSlice( slice );
58             ImageViewer->GetRenderer()->ResetCameraClippingRange();
59             ImageViewer->Render();
60          }
61       }
62    }
63    vtkImageViewer2 *ImageViewer;
64 };
65
66
67 int main(int argc, char *argv[])
68 {
69    if( argc < 2 )
70       return 0;
71   
72    vtkGdcmReader *reader = vtkGdcmReader::New();
73    reader->AllowLookupTableOff();
74
75    if( argc == 2 )
76       reader->SetFileName( argv[1] );
77    else
78       for(int i=1; i< argc; i++)
79          reader->AddFileName( argv[i] );
80
81    reader->Update();
82
83    //print debug info:
84    reader->GetOutput()->Print( cout );
85
86    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
87
88    vtkImageViewer2 *viewer = vtkImageViewer2::New();
89
90    if( reader->GetLookupTable() )
91    {
92       //convert to color:
93       vtkImageMapToColors *map = vtkImageMapToColors::New ();
94       map->SetInput (reader->GetOutput());
95       map->SetLookupTable (reader->GetLookupTable());
96       map->SetOutputFormatToRGB();
97       viewer->SetInput ( map->GetOutput() );
98       map->Delete();
99    }
100    else
101    {
102       double *range = reader->GetOutput()->GetScalarRange();
103       viewer->SetColorLevel (0.5 * (range[1] + range[0]));
104       viewer->SetColorWindow (range[1] - range[0]);
105
106       viewer->SetInput ( reader->GetOutput() );
107    }
108    viewer->SetupInteractor (iren);
109   
110    //vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange();
111    //viewer->SetColorWindow (range[1] - range[0]);
112    //viewer->SetColorLevel (0.5 * (range[1] + range[0]));
113
114    // Here is where we setup the observer, 
115    vtkgdcmObserver *obs = vtkgdcmObserver::New();
116    obs->ImageViewer = viewer;
117    iren->AddObserver(vtkCommand::CharEvent,obs);
118    obs->Delete();
119
120    iren->Initialize();
121    iren->Start();
122
123    //if you wish you can export dicom to a vtk file  
124    vtkStructuredPointsWriter *writer = vtkStructuredPointsWriter::New();
125    writer->SetInput( reader->GetOutput());
126    writer->SetFileName( "foo.vtk" );
127    writer->SetFileTypeToBinary();
128    writer->Write();
129
130    reader->Delete();
131    iren->Delete();
132    viewer->Delete();
133    writer->Delete();
134
135    return 0;
136 }