]> Creatis software - clitk.git/blob - common/clitkImage2DicomRTStructFilter.txx
First working version (allow to write rt-struct)
[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   // Read rt struct
92   vtkSmartPointer<vtkGDCMPolyDataReader> reader = vtkGDCMPolyDataReader::New();
93   reader->SetFileName(m_StructureSetFilename.c_str());
94   reader->Update();
95
96   // Get properties
97   vtkRTStructSetProperties * p = reader->GetRTStructSetProperties();
98   if (GetVerboseFlag()) {
99     std::cout << "Number of structures in the dicom-rt-struct : " 
100               << p->GetNumberOfStructureSetROIs() << std::endl;
101   }
102   
103   // Init writer
104   vtkGDCMPolyDataWriter * writer = vtkGDCMPolyDataWriter::New();
105   int numMasks = reader->GetNumberOfOutputPorts() + 1;//add one more
106   writer->SetNumberOfInputPorts(numMasks);    
107   writer->SetFileName(m_OutputFilename.c_str());
108   writer->SetMedicalImageProperties(reader->GetMedicalImageProperties());
109
110   // List of already present rois
111   vtkStringArray* roiNames = vtkStringArray::New();
112   vtkStringArray* roiAlgorithms = vtkStringArray::New();
113   vtkStringArray* roiTypes = vtkStringArray::New();
114   roiNames->SetNumberOfValues(numMasks);
115   roiAlgorithms->SetNumberOfValues(numMasks);
116   roiTypes->SetNumberOfValues(numMasks);
117   
118   // Convert the image into a mesh
119   typedef clitk::BinaryImageToMeshFilter<ImageType> BinaryImageToMeshFilterType;
120   typename BinaryImageToMeshFilterType::Pointer convert = BinaryImageToMeshFilterType::New();
121   convert->SetThresholdValue(m_ThresholdValue);
122   convert->SetInput(m_Input);
123   convert->Update();
124   vtkPolyData* mesh = convert->GetOutputMesh();
125   if (GetVerboseFlag()) {
126     std::cout << "Mesh has " << mesh->GetNumberOfLines() << " lines." << std::endl;
127   }
128
129   // Copy previous contours
130   for (unsigned int i = 0; i < numMasks-1; ++i) {
131     writer->SetInput(i, reader->GetOutput(i));
132     std::string theString = reader->GetRTStructSetProperties()->GetStructureSetROIName(i);
133     roiNames->InsertValue(i, theString);
134     theString = reader->GetRTStructSetProperties()->GetStructureSetROIGenerationAlgorithm(i);
135     roiAlgorithms->InsertValue(i, theString);
136     theString = reader->GetRTStructSetProperties()->GetStructureSetRTROIInterpretedType(i);
137     roiTypes->InsertValue(i, theString);
138   }  
139
140   // Add new one
141   int last = numMasks-1;
142   writer->SetInput(last, mesh);
143   roiNames->InsertValue(last, m_ROIName);
144   roiAlgorithms->InsertValue(last, "CLITK_CREATED");
145   roiTypes->InsertValue(last, m_ROIType);
146
147   /*
148   //  Visu DEBUG
149   vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
150   cubeMapper->SetInput( mesh );
151   cubeMapper->SetScalarRange(0,7);
152   vtkActor *cubeActor = vtkActor::New();
153   cubeActor->SetMapper(cubeMapper);
154   vtkProperty * property = cubeActor->GetProperty();
155   property->SetRepresentationToWireframe();
156
157   vtkRenderer *renderer = vtkRenderer::New();
158   vtkRenderWindow *renWin = vtkRenderWindow::New();
159   renWin->AddRenderer(renderer);
160
161   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
162   iren->SetRenderWindow(renWin);
163
164   renderer->AddActor(cubeActor);
165   renderer->ResetCamera();
166   renderer->SetBackground(1,1,1);
167
168   renWin->SetSize(300,300);
169
170   renWin->Render();
171   iren->Start();
172   */
173   // End visu
174
175   // Write (need to read dicom for slice id)
176   vtkRTStructSetProperties* theProperties = vtkRTStructSetProperties::New();
177   writer->SetRTStructSetProperties(theProperties);
178   if (GetVerboseFlag()) {
179     std::cout << "Looking for dicom info, study instance "
180               << p->GetStudyInstanceUID() << std::endl;
181   }
182   writer->InitializeRTStructSet(m_DicomFolder,
183                                 reader->GetRTStructSetProperties()->GetStructureSetLabel(),
184                                 reader->GetRTStructSetProperties()->GetStructureSetName(),
185                                 roiNames, roiAlgorithms, roiTypes);  
186   writer->Write();
187   reader->Delete();
188   roiNames->Delete();
189   roiTypes->Delete();
190   roiAlgorithms->Delete();
191   writer->Delete();
192 }
193 //--------------------------------------------------------------------
194
195
196
197