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 }