2 #include "vtkSTLExtractor.h"
3 #include <vtkImageGaussianSmooth.h>
4 #include <vtkMarchingCubes.h>
5 #include <vtkCleanPolyData.h>
6 #include <vtkTriangleFilter.h>
7 #include <vtkImageContinuousDilate3D.h>
10 vtkSTLExtractor::vtkSTLExtractor(){
11 innerSurface = vtkPolyData::New();
12 outerSurface = vtkPolyData::New();
13 marchingCubesLevel = 128.0;
17 vtkSTLExtractor::~vtkSTLExtractor(){
18 innerSurface->Delete();
19 outerSurface->Delete();
22 void vtkSTLExtractor::setVolume(vtkImageData *volume){
23 this->volume = volume;
27 void vtkSTLExtractor::setMarchingCubesLevel(double level){
28 this->marchingCubesLevel = level;
31 void vtkSTLExtractor::setSigmaLevel(double level){
32 this->sigmaLevel = level;
36 double vtkSTLExtractor::getMarchingCubesLevel(){
37 return marchingCubesLevel;
40 double vtkSTLExtractor::getSigmaLevel(){
45 vtkPolyData* vtkSTLExtractor::getInnerSurface(){
50 vtkPolyData* vtkSTLExtractor::getOuterSurface(){
56 void vtkSTLExtractor::calculate(){
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);
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 );
73 // Unir puntos duplicados y remover primitivas degeneradas
74 vtkCleanPolyData *cleanFilter = vtkCleanPolyData::New();
75 cleanFilter->SetInput ( cubesFilter->GetOutput() );
77 // crea poligonos triangulares
78 vtkTriangleFilter *triangleFilter = vtkTriangleFilter::New();
79 triangleFilter->SetInput( cleanFilter->GetOutput() );
80 triangleFilter->Update();
82 innerSurface->DeepCopy(triangleFilter->GetOutput());
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();
94 outerSurface->DeepCopy(triangleFilter->GetOutput());
96 // ------------------------------------------------------------------------
98 // ------------------------------------------------------------------------
100 gaussFilter->Delete();
101 cubesFilter->Delete();
102 cleanFilter->Delete();
103 triangleFilter->Delete();
104 dilateFilter->Delete();