Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "mitkSTLFileReader.h"
00018 #include <mitkSurface.h>
00019 #include <vtkSmartPointer.h>
00020 #include <vtkSTLReader.h>
00021 #include <vtkPolyData.h>
00022 #include <vtkPolyDataNormals.h>
00023 #include <vtkCleanPolyData.h>
00024
00025
00026 mitk::STLFileReader::STLFileReader() : mitk::SurfaceSource(), m_FileName("")
00027 {
00028 }
00029
00030 mitk::STLFileReader::~STLFileReader()
00031 {
00032 }
00033
00034 void mitk::STLFileReader::GenerateData()
00035 {
00036 mitk::Surface::Pointer output = this->GetOutput();
00037
00038 if( m_FileName != "")
00039 {
00040 MITK_INFO << "Loading " << m_FileName << " as stl..." << std::endl;
00041 vtkSmartPointer<vtkSTLReader> stlReader = vtkSmartPointer<vtkSTLReader>::New();
00042 stlReader->SetFileName( m_FileName.c_str() );
00043
00044 vtkSmartPointer<vtkPolyDataNormals> normalsGenerator = vtkSmartPointer<vtkPolyDataNormals>::New();
00045 normalsGenerator->SetInput( stlReader->GetOutput() );
00046
00047 vtkSmartPointer<vtkCleanPolyData> cleanPolyDataFilter = vtkSmartPointer<vtkCleanPolyData>::New();
00048 cleanPolyDataFilter->SetInput(normalsGenerator->GetOutput());
00049 cleanPolyDataFilter->PieceInvariantOff();
00050 cleanPolyDataFilter->ConvertLinesToPointsOff();
00051 cleanPolyDataFilter->ConvertPolysToLinesOff();
00052 cleanPolyDataFilter->ConvertStripsToPolysOff();
00053 cleanPolyDataFilter->PointMergingOn();
00054 cleanPolyDataFilter->Update();
00055
00056 if ( ( stlReader->GetOutput() != NULL ) && ( cleanPolyDataFilter->GetOutput() != NULL ) )
00057 {
00058 vtkSmartPointer<vtkPolyData> surfaceWithNormals = cleanPolyDataFilter->GetOutput();
00059 output->SetVtkPolyData( surfaceWithNormals );
00060 }
00061 }
00062 }
00063
00064 bool mitk::STLFileReader::CanReadFile(const std::string filename, const std::string , const std::string )
00065 {
00066
00067 if( filename == "" )
00068 {
00069
00070 return false;
00071 }
00072
00073 bool extensionFound = false;
00074 std::string::size_type STLPos = filename.rfind(".stl");
00075 if ((STLPos != std::string::npos)
00076 && (STLPos == filename.length() - 4))
00077 {
00078 extensionFound = true;
00079 }
00080
00081 STLPos = filename.rfind(".STL");
00082 if ((STLPos != std::string::npos)
00083 && (STLPos == filename.length() - 4))
00084 {
00085 extensionFound = true;
00086 }
00087
00088 if( !extensionFound )
00089 {
00090
00091 return false;
00092 }
00093
00094 return true;
00095 }