1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
3 Main authors : XX XX XX
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
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.
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
18 =========================================================================*/
25 #include "clitkImage2DicomRTStructFilter.h"
26 #include "clitkBinaryImageToMeshFilter.h"
27 #include "clitkImageCommon.h"
28 #include "vvFromITK.h"
31 #include <vtkPolyDataToImageStencil.h>
32 #include <vtkSmartPointer.h>
33 #include <vtkImageStencil.h>
34 #include <vtkLinearExtrusionFilter.h>
35 #include <vtkMetaImageWriter.h>
36 #include <vtkImageData.h>
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"
51 #include <itkVTKImageToImageFilter.h>
54 #include <vtkGDCMPolyDataWriter.h>
56 //--------------------------------------------------------------------
57 template<class PixelType>
58 clitk::Image2DicomRTStructFilter<PixelType>::Image2DicomRTStructFilter()
60 m_StructureSetFilename = "";
62 m_OutputFilename = "default-output.dcm";
63 m_ThresholdValue = 0.5;
65 //--------------------------------------------------------------------
68 //--------------------------------------------------------------------
69 template<class PixelType>
70 clitk::Image2DicomRTStructFilter<PixelType>::~Image2DicomRTStructFilter()
73 //--------------------------------------------------------------------
76 //--------------------------------------------------------------------
77 template<class PixelType>
79 clitk::Image2DicomRTStructFilter<PixelType>::SetROIName(std::string name, std::string type)
84 //--------------------------------------------------------------------
87 //--------------------------------------------------------------------
88 template<class PixelType>
89 void clitk::Image2DicomRTStructFilter<PixelType>::Update()
92 vtkSmartPointer<vtkGDCMPolyDataReader> reader = vtkGDCMPolyDataReader::New();
93 reader->SetFileName(m_StructureSetFilename.c_str());
97 vtkRTStructSetProperties * p = reader->GetRTStructSetProperties();
98 if (GetVerboseFlag()) {
99 std::cout << "Number of structures in the dicom-rt-struct : "
100 << p->GetNumberOfStructureSetROIs() << std::endl;
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());
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);
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);
124 vtkPolyData* mesh = convert->GetOutputMesh();
125 if (GetVerboseFlag()) {
126 std::cout << "Mesh has " << mesh->GetNumberOfLines() << " lines." << std::endl;
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);
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);
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();
157 vtkRenderer *renderer = vtkRenderer::New();
158 vtkRenderWindow *renWin = vtkRenderWindow::New();
159 renWin->AddRenderer(renderer);
161 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
162 iren->SetRenderWindow(renWin);
164 renderer->AddActor(cubeActor);
165 renderer->ResetCamera();
166 renderer->SetBackground(1,1,1);
168 renWin->SetSize(300,300);
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;
182 writer->InitializeRTStructSet(m_DicomFolder,
183 reader->GetRTStructSetProperties()->GetStructureSetLabel(),
184 reader->GetRTStructSetProperties()->GetStructureSetName(),
185 roiNames, roiAlgorithms, roiTypes);
190 roiAlgorithms->Delete();
193 //--------------------------------------------------------------------