vtkSTLExtractor.cpp

Go to the documentation of this file.
00001 
00002 #include "vtkSTLExtractor.h"
00003 #include <vtkImageGaussianSmooth.h>
00004 #include <vtkMarchingCubes.h>
00005 #include <vtkCleanPolyData.h>
00006 #include <vtkTriangleFilter.h>
00007 #include <vtkImageContinuousDilate3D.h>
00008 
00009 
00010 vtkSTLExtractor::vtkSTLExtractor(){
00011         innerSurface = vtkPolyData::New();
00012         outerSurface = vtkPolyData::New();
00013         marchingCubesLevel = 128.0;
00014         sigmaLevel = 100.0;
00015 }
00016 
00017 vtkSTLExtractor::~vtkSTLExtractor(){
00018         innerSurface->Delete();
00019         outerSurface->Delete();
00020 }
00021 
00022 void vtkSTLExtractor::setVolume(vtkImageData *volume){
00023         this->volume = volume;
00024 }
00025 
00026 
00027 void vtkSTLExtractor::setMarchingCubesLevel(double level){
00028         this->marchingCubesLevel = level;
00029 }
00030 
00031 void vtkSTLExtractor::setSigmaLevel(double level){
00032         this->sigmaLevel = level;
00033 }
00034 
00035 
00036 double vtkSTLExtractor::getMarchingCubesLevel(){
00037         return marchingCubesLevel;
00038 }
00039 
00040 double vtkSTLExtractor::getSigmaLevel(){
00041         return sigmaLevel;
00042 }
00043 
00044 
00045 vtkPolyData* vtkSTLExtractor::getInnerSurface(){
00046         return innerSurface;
00047 }
00048 
00049 
00050 vtkPolyData* vtkSTLExtractor::getOuterSurface(){
00051         return outerSurface;
00052 }
00053 
00054 
00055 
00056 void vtkSTLExtractor::calculate(){
00057 
00058         // ------------------------------------------------------------------------
00059                 //  1. CALCULATING THE INNER SURFACE
00060                 // ------------------------------------------------------------------------
00061             vtkImageGaussianSmooth *gaussFilter = vtkImageGaussianSmooth::New();
00062         gaussFilter->SetInput(volume);
00063         gaussFilter->SetDimensionality(3);
00064         gaussFilter->SetStandardDeviation(sigmaLevel);
00065     
00066         vtkMarchingCubes *cubesFilter = vtkMarchingCubes::New();
00067         cubesFilter->SetInput(gaussFilter->GetOutput());
00068         cubesFilter->SetValue(0,marchingCubesLevel);
00069                 cubesFilter->ComputeGradientsOn ();
00070         cubesFilter->ComputeScalarsOn ();
00071                 cubesFilter->SetNumberOfContours( 1 );
00072             
00073                 // Unir puntos duplicados y remover primitivas degeneradas
00074                 vtkCleanPolyData *cleanFilter = vtkCleanPolyData::New();
00075         cleanFilter->SetInput ( cubesFilter->GetOutput() );
00076                 
00077                 // crea poligonos triangulares
00078         vtkTriangleFilter *triangleFilter = vtkTriangleFilter::New();
00079         triangleFilter->SetInput( cleanFilter->GetOutput() );
00080         triangleFilter->Update();
00081 
00082                 innerSurface->DeepCopy(triangleFilter->GetOutput());
00083 
00084 
00085                 // ------------------------------------------------------------------------
00086                 //  2. CALCULATING THE OUTER SURFACE
00087                 // ------------------------------------------------------------------------
00088                 vtkImageContinuousDilate3D *dilateFilter = vtkImageContinuousDilate3D ::New();
00089         dilateFilter->SetInput (volume);
00090                 dilateFilter->SetKernelSize (3, 3, 3);
00091                 gaussFilter->SetInput( dilateFilter->GetOutput());
00092         triangleFilter->Update();
00093                 
00094             outerSurface->DeepCopy(triangleFilter->GetOutput());
00095 
00096                 // ------------------------------------------------------------------------
00097                 //  3. CLEANING UP
00098                 // ------------------------------------------------------------------------
00099 
00100                 gaussFilter->Delete();
00101                 cubesFilter->Delete();
00102                 cleanFilter->Delete();
00103             triangleFilter->Delete();
00104         dilateFilter->Delete();
00105 }

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1