]> Creatis software - gdcm.git/blob - vtk/vtkgdcmViewer.cxx
2004-04-22 Jean-Pierre Roux
[gdcm.git] / vtk / vtkgdcmViewer.cxx
1 #include <iostream>
2
3 #include <vtkRenderWindowInteractor.h>
4 #include <vtkImageViewer2.h>
5 #include <vtkStructuredPoints.h>
6 #include <vtkStructuredPointsWriter.h>
7 #include <vtkCommand.h>
8 #include <vtkRenderer.h>
9 #include <vtkImageMapToColors.h>
10 #include <vtkLookupTable.h>
11
12 #include "vtkGdcmReader.h"
13
14 #ifndef vtkFloatingPointType
15 #define vtkFloatingPointType float
16 #endif
17
18 //----------------------------------------------------------------------------
19 // Callback for the interaction
20 class vtkgdcmObserver : public vtkCommand
21 {
22   public:
23   virtual char const *GetClassName() const { return "vtkgdcmObserver";}
24   static vtkgdcmObserver *New() 
25     { return new vtkgdcmObserver; }
26   vtkgdcmObserver()
27     {
28       this->ImageViewer = NULL;
29     }
30   virtual void Execute(vtkObject *wdg, unsigned long event, void* calldata)
31     {
32       if ( this->ImageViewer )
33         {
34           if ( event == vtkCommand::CharEvent )
35           {
36             int max = ImageViewer->GetWholeZMax();
37             int slice = (ImageViewer->GetZSlice() + 1 ) % ++max;
38             ImageViewer->SetZSlice( slice );
39             ImageViewer->GetRenderer()->ResetCameraClippingRange();
40             ImageViewer->Render();
41           }
42         }
43     }
44     vtkImageViewer2 *ImageViewer;
45 };
46
47
48 int main(int argc, char *argv[])
49 {
50   if( argc < 2 )
51     return 0;
52   
53   vtkGdcmReader *reader = vtkGdcmReader::New();
54
55   if( argc == 2 )
56     reader->SetFileName( argv[1] );
57   else
58     for(int i=1; i< argc; i++)
59       reader->AddFileName( argv[i] );
60
61   reader->DebugOn();
62   reader->Update();
63   
64   //print debug info:
65   reader->GetOutput()->Print( std::cout );
66         
67   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
68
69   vtkImageViewer2 *viewer = vtkImageViewer2::New();
70   
71   if( reader->GetLookupTable() )
72   {
73     //convert to color:
74     vtkImageMapToColors *map = vtkImageMapToColors::New ();
75     map->SetInput (reader->GetOutput());
76     map->SetLookupTable (reader->GetLookupTable());
77     map->SetOutputFormatToRGB();
78     viewer->SetInput ( map->GetOutput() );
79     map->Delete();
80   }
81   else
82   
83   {
84     viewer->SetInput ( reader->GetOutput() );
85   }
86   viewer->SetupInteractor (iren);
87   
88   vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange();
89   viewer->SetColorWindow (range[1] - range[0]);
90   viewer->SetColorLevel (0.5 * (range[1] + range[0]));
91
92   // Here is where we setup the observer, 
93   vtkgdcmObserver *obs = vtkgdcmObserver::New();
94   obs->ImageViewer = viewer;
95   iren->AddObserver(vtkCommand::CharEvent,obs);
96   obs->Delete();
97
98   iren->Initialize();
99   iren->Start();
100
101   //if you wish you can export dicom to a vtk file  
102   vtkStructuredPointsWriter *writer = vtkStructuredPointsWriter::New();
103   writer->SetInput( reader->GetOutput());
104   writer->SetFileName( "foo.vtk" );
105   writer->SetFileTypeToBinary();
106   writer->Write();
107
108   reader->Delete();
109   iren->Delete();
110   viewer->Delete();
111   writer->Delete();
112   
113   return 0;
114 }