]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/kernel/vtkSTLExtractor.cpp
7d8720df4353372c57f7e05020287154cebd2d15
[creaMaracasVisu.git] / lib / maracasVisuLib / src / kernel / vtkSTLExtractor.cpp
1
2 #include "vtkSTLExtractor.h"
3 #include <vtkImageGaussianSmooth.h>
4 #include <vtkMarchingCubes.h>
5 #include <vtkCleanPolyData.h>
6 #include <vtkTriangleFilter.h>
7 #include <vtkImageContinuousDilate3D.h>
8
9
10 vtkSTLExtractor::vtkSTLExtractor(){
11         innerSurface = vtkPolyData::New();
12         outerSurface = vtkPolyData::New();
13         marchingCubesLevel = 128.0;
14         sigmaLevel = 100.0;
15 }
16
17 vtkSTLExtractor::~vtkSTLExtractor(){
18         innerSurface->Delete();
19         outerSurface->Delete();
20 }
21
22 void vtkSTLExtractor::setVolume(vtkImageData *volume){
23         this->volume = volume;
24 }
25
26
27 void vtkSTLExtractor::setMarchingCubesLevel(double level){
28         this->marchingCubesLevel = level;
29 }
30
31 void vtkSTLExtractor::setSigmaLevel(double level){
32         this->sigmaLevel = level;
33 }
34
35
36 double vtkSTLExtractor::getMarchingCubesLevel(){
37         return marchingCubesLevel;
38 }
39
40 double vtkSTLExtractor::getSigmaLevel(){
41         return sigmaLevel;
42 }
43
44
45 vtkPolyData* vtkSTLExtractor::getInnerSurface(){
46         return innerSurface;
47 }
48
49
50 vtkPolyData* vtkSTLExtractor::getOuterSurface(){
51         return outerSurface;
52 }
53
54
55
56 void vtkSTLExtractor::calculate(){
57
58         // ------------------------------------------------------------------------
59                 //  1. CALCULATING THE INNER SURFACE
60                 // ------------------------------------------------------------------------
61             vtkImageGaussianSmooth *gaussFilter = vtkImageGaussianSmooth::New();
62         gaussFilter->SetInput(volume);
63         gaussFilter->SetDimensionality(3);
64         gaussFilter->SetStandardDeviation(sigmaLevel);
65     
66         vtkMarchingCubes *cubesFilter = vtkMarchingCubes::New();
67         cubesFilter->SetInput(gaussFilter->GetOutput());
68         cubesFilter->SetValue(0,marchingCubesLevel);
69                 cubesFilter->ComputeGradientsOn ();
70         cubesFilter->ComputeScalarsOn ();
71                 cubesFilter->SetNumberOfContours( 1 );
72             
73                 // Unir puntos duplicados y remover primitivas degeneradas
74                 vtkCleanPolyData *cleanFilter = vtkCleanPolyData::New();
75         cleanFilter->SetInput ( cubesFilter->GetOutput() );
76                 
77                 // crea poligonos triangulares
78         vtkTriangleFilter *triangleFilter = vtkTriangleFilter::New();
79         triangleFilter->SetInput( cleanFilter->GetOutput() );
80         triangleFilter->Update();
81
82                 innerSurface->DeepCopy(triangleFilter->GetOutput());
83
84
85                 // ------------------------------------------------------------------------
86                 //  2. CALCULATING THE OUTER SURFACE
87                 // ------------------------------------------------------------------------
88                 vtkImageContinuousDilate3D *dilateFilter = vtkImageContinuousDilate3D ::New();
89         dilateFilter->SetInput (volume);
90                 dilateFilter->SetKernelSize (3, 3, 3);
91                 gaussFilter->SetInput( dilateFilter->GetOutput());
92         triangleFilter->Update();
93                 
94             outerSurface->DeepCopy(triangleFilter->GetOutput());
95
96                 // ------------------------------------------------------------------------
97                 //  3. CLEANING UP
98                 // ------------------------------------------------------------------------
99
100                 gaussFilter->Delete();
101                 cubesFilter->Delete();
102                 cleanFilter->Delete();
103             triangleFilter->Delete();
104         dilateFilter->Delete();
105 }