]> Creatis software - clitk.git/blob - common/clitkImage2DicomRTStructFilter.txx
Merge branch 'master' of git.creatis.insa-lyon.fr:clitk
[clitk.git] / common / clitkImage2DicomRTStructFilter.txx
1 /*=========================================================================
2   Program:         vv http://www.creatis.insa-lyon.fr/rio/vv
3   Main authors :   XX XX XX
4
5   Authors belongs to:
6   - University of LYON           http://www.universite-lyon.fr/
7   - Léon Bérard cancer center    http://www.centreleonberard.fr
8   - CREATIS CNRS laboratory      http://www.creatis.insa-lyon.fr
9
10   This software is distributed WITHOUT ANY WARRANTY; without even
11   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12   PURPOSE.  See the copyright notices for more information.
13
14   It is distributed under dual licence
15   - BSD       http://www.opensource.org/licenses/bsd-license.php
16   - CeCILL-B  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17
18   =========================================================================*/
19
20 // std
21 #include <iterator>
22 #include <algorithm>
23
24 // clitk
25 #include "clitkImage2DicomRTStructFilter.h"
26 #include "clitkBinaryImageToMeshFilter.h"
27 #include "clitkImageCommon.h"
28 #include "vvFromITK.h"
29
30 // vtk
31 #include <vtkPolyDataToImageStencil.h>
32 #include <vtkSmartPointer.h>
33 #include <vtkImageStencil.h>
34 #include <vtkLinearExtrusionFilter.h>
35 #include <vtkMetaImageWriter.h>
36 #include <vtkImageData.h>
37
38 // FIXME to remove
39 #include "vtkPolyDataMapper.h"
40 #include "vtkPolyDataMapper2D.h"
41 #include "vtkRenderWindowInteractor.h"
42 #include "vtkPolyDataReader.h"
43 #include "vtkRenderWindow.h"
44 #include "vtkRenderer.h"
45 #include "vtkCamera.h"
46 #include "vtkProperty.h"
47 #include "vtkProperty2D.h"
48
49 // itk
50 #include <itkImage.h>
51 #include <itkVTKImageToImageFilter.h>
52
53 // gdcm
54 #include <vtkGDCMPolyDataWriter.h>
55
56 //--------------------------------------------------------------------
57 template<class PixelType>
58 clitk::Image2DicomRTStructFilter<PixelType>::Image2DicomRTStructFilter()
59 {
60   m_StructureSetFilename = "";
61   m_DicomFolder = "";
62   m_OutputFilename = "default-output.dcm";
63   m_ThresholdValue = 0.5;
64 }
65 //--------------------------------------------------------------------
66
67
68 //--------------------------------------------------------------------
69 template<class PixelType>
70 clitk::Image2DicomRTStructFilter<PixelType>::~Image2DicomRTStructFilter()
71 {
72 }
73 //--------------------------------------------------------------------
74
75
76 //--------------------------------------------------------------------
77 template<class PixelType>
78 void
79 clitk::Image2DicomRTStructFilter<PixelType>::SetROIName(std::string name, std::string type)
80 {
81   m_ROIName = name;
82   m_ROIType = type;
83 }
84 //--------------------------------------------------------------------
85
86
87 //--------------------------------------------------------------------
88 template<class PixelType>
89 void clitk::Image2DicomRTStructFilter<PixelType>::Update() 
90 {
91   // Check this is a RT-Struct
92   gdcm::Reader gdcm_reader;
93   gdcm_reader.SetFileName(m_StructureSetFilename.c_str());
94   if (!gdcm_reader.Read()) {
95     clitkExceptionMacro("Error could not open the file '" << m_StructureSetFilename << std::endl);
96   }
97   gdcm::MediaStorage ms;
98   ms.SetFromFile(gdcm_reader.GetFile());
99   if (ms != gdcm::MediaStorage::RTStructureSetStorage) {
100     clitkExceptionMacro("File '" << m_StructureSetFilename << "' is not a DICOM-RT-Struct file." << std::endl);
101   }
102
103   // Read rt struct
104   vtkSmartPointer<vtkGDCMPolyDataReader> reader = vtkGDCMPolyDataReader::New();
105   reader->SetFileName(m_StructureSetFilename.c_str());
106   reader->Update();  
107
108   // Get properties
109   vtkRTStructSetProperties * p = reader->GetRTStructSetProperties();
110   if (GetVerboseFlag()) {
111     std::cout << "Number of structures in the dicom-rt-struct : " 
112               << p->GetNumberOfStructureSetROIs() << std::endl;
113   }
114   
115   // Init writer
116   vtkGDCMPolyDataWriter * writer = vtkGDCMPolyDataWriter::New();
117   int numMasks = reader->GetNumberOfOutputPorts() + 1;//add one more
118   writer->SetNumberOfInputPorts(numMasks);    
119   writer->SetFileName(m_OutputFilename.c_str());
120   writer->SetMedicalImageProperties(reader->GetMedicalImageProperties());
121
122   // List of already present rois
123   vtkStringArray* roiNames = vtkStringArray::New();
124   vtkStringArray* roiAlgorithms = vtkStringArray::New();
125   vtkStringArray* roiTypes = vtkStringArray::New();
126   roiNames->SetNumberOfValues(numMasks);
127   roiAlgorithms->SetNumberOfValues(numMasks);
128   roiTypes->SetNumberOfValues(numMasks);
129   
130   // Convert the image into a mesh
131   typedef clitk::BinaryImageToMeshFilter<ImageType> BinaryImageToMeshFilterType;
132   typename BinaryImageToMeshFilterType::Pointer convert = BinaryImageToMeshFilterType::New();
133   convert->SetThresholdValue(m_ThresholdValue);
134   convert->SetInput(m_Input);
135   convert->Update();
136   vtkPolyData* mesh = convert->GetOutputMesh();
137   if (GetVerboseFlag()) {
138     std::cout << "Mesh has " << mesh->GetNumberOfLines() << " lines." << std::endl;
139   }
140
141   // Copy previous contours
142   for (unsigned int i = 0; i < numMasks-1; ++i) {
143     writer->SetInput(i, reader->GetOutput(i));
144     std::string theString = reader->GetRTStructSetProperties()->GetStructureSetROIName(i);
145     roiNames->InsertValue(i, theString);
146     theString = reader->GetRTStructSetProperties()->GetStructureSetROIGenerationAlgorithm(i);
147     roiAlgorithms->InsertValue(i, theString);
148     theString = reader->GetRTStructSetProperties()->GetStructureSetRTROIInterpretedType(i);
149     roiTypes->InsertValue(i, theString);
150   }  
151
152   // Add new one
153   int last = numMasks-1;
154   writer->SetInput(last, mesh);
155   roiNames->InsertValue(last, m_ROIName);
156   roiAlgorithms->InsertValue(last, "CLITK_CREATED");
157   roiTypes->InsertValue(last, m_ROIType);
158
159   /*
160   //  Visu DEBUG
161   vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
162   cubeMapper->SetInput( mesh );
163   cubeMapper->SetScalarRange(0,7);
164   vtkActor *cubeActor = vtkActor::New();
165   cubeActor->SetMapper(cubeMapper);
166   vtkProperty * property = cubeActor->GetProperty();
167   property->SetRepresentationToWireframe();
168
169   vtkRenderer *renderer = vtkRenderer::New();
170   vtkRenderWindow *renWin = vtkRenderWindow::New();
171   renWin->AddRenderer(renderer);
172
173   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
174   iren->SetRenderWindow(renWin);
175
176   renderer->AddActor(cubeActor);
177   renderer->ResetCamera();
178   renderer->SetBackground(1,1,1);
179
180   renWin->SetSize(300,300);
181
182   renWin->Render();
183   iren->Start();
184   */
185   // End visu
186
187   // Write (need to read dicom for slice id)
188   vtkRTStructSetProperties* theProperties = vtkRTStructSetProperties::New();
189   writer->SetRTStructSetProperties(theProperties);
190   if (GetVerboseFlag()) {
191     std::cout << "Looking for dicom info, study instance "
192               << p->GetStudyInstanceUID() << std::endl;
193   }
194   writer->InitializeRTStructSet(m_DicomFolder,
195                                 reader->GetRTStructSetProperties()->GetStructureSetLabel(),
196                                 reader->GetRTStructSetProperties()->GetStructureSetName(),
197                                 roiNames, roiAlgorithms, roiTypes);  
198   writer->Write();
199   reader->Delete();
200   roiNames->Delete();
201   roiTypes->Delete();
202   roiAlgorithms->Delete();
203   writer->Delete();
204 }
205 //--------------------------------------------------------------------
206
207
208
209