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 DD("Image2DicomRTStructFilter Const");
62 //--------------------------------------------------------------------
65 //--------------------------------------------------------------------
66 template<class PixelType>
67 clitk::Image2DicomRTStructFilter<PixelType>::~Image2DicomRTStructFilter()
69 DD("Image2DicomRTStructFilter Destructor");
71 //--------------------------------------------------------------------
74 //--------------------------------------------------------------------
75 template<class PixelType>
76 void clitk::Image2DicomRTStructFilter<PixelType>::Update()
78 DD("Image2DicomRTStructFilter::GenerateData");
81 vtkSmartPointer<vtkGDCMPolyDataReader> reader = vtkGDCMPolyDataReader::New();
82 reader->SetFileName(m_StructureSetFilename.c_str());
87 vtkRTStructSetProperties * p = reader->GetRTStructSetProperties();
88 DD(p->GetNumberOfStructureSetROIs());
89 DD(p->GetStructureSetROIName(0));
90 DD(p->GetStructureSetROINumber(0));
93 vtkGDCMPolyDataWriter * writer = vtkGDCMPolyDataWriter::New();
94 int numMasks = reader->GetNumberOfOutputPorts() + 1;//add one more
97 // numMasks = 3; //FIXME temporary
99 writer->SetNumberOfInputPorts(numMasks);
100 writer->SetFileName(m_OutputFilename.c_str());
101 writer->SetMedicalImageProperties(reader->GetMedicalImageProperties());
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);
111 typedef clitk::BinaryImageToMeshFilter<ImageType> BinaryImageToMeshFilterType;
112 typename BinaryImageToMeshFilterType::Pointer convert = BinaryImageToMeshFilterType::New();
113 convert->SetInput(m_Input);
118 vtkPolyData* mesh = convert->GetOutputMesh();
119 DD(mesh->GetNumberOfVerts());
120 DD(mesh->GetNumberOfLines());
121 DD(mesh->GetNumberOfPolys());
122 DD(mesh->GetNumberOfStrips());
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");
132 for (unsigned int i = 1; i < numMasks; ++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);
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();
154 vtkRenderer *renderer = vtkRenderer::New();
155 vtkRenderWindow *renWin = vtkRenderWindow::New();
156 renWin->AddRenderer(renderer);
158 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
159 iren->SetRenderWindow(renWin);
161 renderer->AddActor(cubeActor);
162 renderer->ResetCamera();
163 renderer->SetBackground(1,1,1);
165 renWin->SetSize(300,300);
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);
194 //theProperties->Delete();
195 roiAlgorithms->Delete();
205 DD(m_StructureSet->GetName());
206 clitk::DicomRT_ROI * roi = m_StructureSet->GetROIFromROINumber(1); // Aorta
208 DD(roi->GetROINumber());
216 // Add an image to the roi
217 vvImage::Pointer im = vvImageFromITK<3, PixelType>(m_Input);
222 roi->ComputeContoursFromImage(); // FIXME do the set mesh for the moment (to change)
223 // roi->ComputeMeshFromContour();
224 vtkSmartPointer<vtkPolyData> mesh = roi->GetMesh();
227 // Change the mesh (shift by 10);
228 // const vtkSmartPointer<vtkPoints> & points = mesh->GetPoints();
229 // for(uint i=0; i<mesh->GetNumberOfVerts (); i++) {
231 // double * p = points->GetPoint(i);
233 // points->SetPoint(i, p);
235 roi->SetName("TOTO");
236 roi->SetDicomUptodateFlag(true); // indicate that dicom info must be updated from the mesh.
238 // Convert to dicom ?
242 structset->Write("toto.dcm");
245 //--------------------------------------------------------------------