]> Creatis software - clitk.git/blob - common/clitkImage2DicomRTStructFilter.txx
First version to convert image to dicomrtstruct
[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   DD("Image2DicomRTStructFilter Const");
61 }
62 //--------------------------------------------------------------------
63
64
65 //--------------------------------------------------------------------
66 template<class PixelType>
67 clitk::Image2DicomRTStructFilter<PixelType>::~Image2DicomRTStructFilter()
68 {
69   DD("Image2DicomRTStructFilter Destructor");
70 }
71 //--------------------------------------------------------------------
72
73
74 //--------------------------------------------------------------------
75 template<class PixelType>
76 void clitk::Image2DicomRTStructFilter<PixelType>::Update() 
77 {
78   DD("Image2DicomRTStructFilter::GenerateData");
79
80   // Read rt struct
81   vtkSmartPointer<vtkGDCMPolyDataReader> reader = vtkGDCMPolyDataReader::New();
82   reader->SetFileName(m_StructureSetFilename.c_str());
83   reader->Update();
84   DD("reader done");
85
86   // Get properties
87   vtkRTStructSetProperties * p = reader->GetRTStructSetProperties();
88   DD(p->GetNumberOfStructureSetROIs());
89   DD(p->GetStructureSetROIName(0));
90   DD(p->GetStructureSetROINumber(0));  
91   
92   // Init writer
93   vtkGDCMPolyDataWriter * writer = vtkGDCMPolyDataWriter::New();
94   int numMasks = reader->GetNumberOfOutputPorts() + 1;//add one more
95   DD(numMasks);
96   
97   // numMasks = 3; //FIXME temporary
98
99   writer->SetNumberOfInputPorts(numMasks);    
100   writer->SetFileName(m_OutputFilename.c_str());
101   writer->SetMedicalImageProperties(reader->GetMedicalImageProperties());
102
103   // List of already present rois
104   vtkStringArray* roiNames = vtkStringArray::New();
105   vtkStringArray* roiAlgorithms = vtkStringArray::New();
106   vtkStringArray* roiTypes = vtkStringArray::New();
107   roiNames->SetNumberOfValues(numMasks);
108   roiAlgorithms->SetNumberOfValues(numMasks);
109   roiTypes->SetNumberOfValues(numMasks);
110   
111   typedef clitk::BinaryImageToMeshFilter<ImageType> BinaryImageToMeshFilterType;
112   typename BinaryImageToMeshFilterType::Pointer convert = BinaryImageToMeshFilterType::New();
113   convert->SetInput(m_Input);
114   DD("Update");
115   convert->Update();
116   DD("here");
117   DD("end update");
118   vtkPolyData* mesh = convert->GetOutputMesh();
119   DD(mesh->GetNumberOfVerts());
120   DD(mesh->GetNumberOfLines());
121   DD(mesh->GetNumberOfPolys());
122   DD(mesh->GetNumberOfStrips());
123
124   // Add on (FIXME) to replace with binary image
125   // vtkPolyData* blank = vtkPolyData::New();
126   // writer->SetInput(0, blank);
127   writer->SetInput(0, mesh);
128   roiNames->InsertValue(0, "blank");
129   roiAlgorithms->InsertValue(0, "blank");
130   roiTypes->InsertValue(0, "ORGAN");
131
132   for (unsigned int i = 1; i < numMasks; ++i) {
133     // DD(i);
134     writer->SetInput(i, reader->GetOutput(i-1));
135     std::string theString = reader->GetRTStructSetProperties()->GetStructureSetROIName(i-1);
136     roiNames->InsertValue(i, theString);
137     theString = reader->GetRTStructSetProperties()->GetStructureSetROIGenerationAlgorithm(i-1);
138     roiAlgorithms->InsertValue(i, theString);
139     theString = reader->GetRTStructSetProperties()->GetStructureSetRTROIInterpretedType(i-1);
140     roiTypes->InsertValue(i, theString);
141   }
142   
143
144   /*
145   //  Visu
146   vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
147   cubeMapper->SetInput( mesh );
148   cubeMapper->SetScalarRange(0,7);
149   vtkActor *cubeActor = vtkActor::New();
150   cubeActor->SetMapper(cubeMapper);
151   vtkProperty * property = cubeActor->GetProperty();
152   property->SetRepresentationToWireframe();
153
154   vtkRenderer *renderer = vtkRenderer::New();
155   vtkRenderWindow *renWin = vtkRenderWindow::New();
156   renWin->AddRenderer(renderer);
157
158   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
159   iren->SetRenderWindow(renWin);
160
161   renderer->AddActor(cubeActor);
162   renderer->ResetCamera();
163   renderer->SetBackground(1,1,1);
164
165   renWin->SetSize(300,300);
166
167   renWin->Render();
168   iren->Start();
169   */
170   
171
172   // End visu
173
174
175   vtkRTStructSetProperties* theProperties = vtkRTStructSetProperties::New();
176   DD(p->GetStudyInstanceUID());
177   writer->SetRTStructSetProperties(theProperties);
178   /*writer->InitializeRTStructSet2(p,"./",
179                                  reader->GetRTStructSetProperties()->GetStructureSetLabel(),
180                                  reader->GetRTStructSetProperties()->GetStructureSetName(),
181                                  roiNames, roiAlgorithms, roiTypes);*/  
182   writer->InitializeRTStructSet(m_DicomFolder,
183                                 reader->GetRTStructSetProperties()->GetStructureSetLabel(),
184                                 reader->GetRTStructSetProperties()->GetStructureSetName(),
185                                 roiNames, roiAlgorithms, roiTypes);
186   
187   DD("after init");
188   writer->Write();
189   DD("write done");
190
191   reader->Delete();
192   roiNames->Delete();
193   roiTypes->Delete();
194   //theProperties->Delete();
195   roiAlgorithms->Delete();
196   //blank->Delete();
197   writer->Delete();
198   
199   ////////////////////
200   
201
202   /*
203
204   // DicomRTStruct
205   DD(m_StructureSet->GetName());
206   clitk::DicomRT_ROI * roi = m_StructureSet->GetROIFromROINumber(1); // Aorta
207   DD(roi->GetName());
208   DD(roi->GetROINumber());
209
210
211   // Get 
212   
213
214
215
216   // Add an image to the roi
217   vvImage::Pointer im = vvImageFromITK<3, PixelType>(m_Input);
218   roi->SetImage(im);
219
220   // Get one contour
221   DD("Compute Mesh");
222   roi->ComputeContoursFromImage(); // FIXME do the set mesh for the moment (to change)
223   // roi->ComputeMeshFromContour();
224   vtkSmartPointer<vtkPolyData> mesh = roi->GetMesh();
225   DD("done");
226   
227   // Change the mesh (shift by 10);
228   // const vtkSmartPointer<vtkPoints> & points = mesh->GetPoints();
229   // for(uint i=0; i<mesh->GetNumberOfVerts (); i++) {
230   //   DD(i);
231   //   double * p = points->GetPoint(i);
232   //   p[0] += 30;
233   //   points->SetPoint(i, p);
234   // }
235   roi->SetName("TOTO");
236   roi->SetDicomUptodateFlag(true); // indicate that dicom info must be updated from the mesh.
237     
238   // Convert to dicom ?
239   DD("TODO");
240   
241   // Write
242   structset->Write("toto.dcm");
243   */
244 }
245 //--------------------------------------------------------------------
246
247
248
249