Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkSTLFileReader.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 #include "mitkSTLFileReader.h"
13 #include <mitkSurface.h>
14 #include <vtkCleanPolyData.h>
15 #include <vtkPolyData.h>
16 #include <vtkPolyDataNormals.h>
17 #include <vtkSTLReader.h>
18 #include <vtkSmartPointer.h>
19 
21 {
22 }
23 
25 {
26 }
27 
29 {
30  mitk::Surface::Pointer output = this->GetOutput();
31 
32  if (m_FileName != "")
33  {
34  MITK_INFO("mitkSTLFileReader") << "Loading " << m_FileName << " as stl..." << std::endl;
35  vtkSmartPointer<vtkSTLReader> stlReader = vtkSmartPointer<vtkSTLReader>::New();
36  stlReader->SetFileName(m_FileName.c_str());
37 
38  vtkSmartPointer<vtkPolyDataNormals> normalsGenerator = vtkSmartPointer<vtkPolyDataNormals>::New();
39  normalsGenerator->SetInputConnection(stlReader->GetOutputPort());
40 
41  vtkSmartPointer<vtkCleanPolyData> cleanPolyDataFilter = vtkSmartPointer<vtkCleanPolyData>::New();
42  cleanPolyDataFilter->SetInputConnection(normalsGenerator->GetOutputPort());
43  cleanPolyDataFilter->PieceInvariantOff();
44  cleanPolyDataFilter->ConvertLinesToPointsOff();
45  cleanPolyDataFilter->ConvertPolysToLinesOff();
46  cleanPolyDataFilter->ConvertStripsToPolysOff();
47  cleanPolyDataFilter->PointMergingOn();
48  cleanPolyDataFilter->Update();
49 
50  if ((stlReader->GetOutput() != nullptr) && (cleanPolyDataFilter->GetOutput() != nullptr))
51  {
52  vtkSmartPointer<vtkPolyData> surfaceWithNormals = cleanPolyDataFilter->GetOutput();
53  output->SetVtkPolyData(surfaceWithNormals);
54  }
55  }
56 }
57 
58 bool mitk::STLFileReader::CanReadFile(const std::string filename,
59  const std::string /*filePrefix*/,
60  const std::string /*filePattern*/)
61 {
62  // First check the extension
63  if (filename == "")
64  {
65  // MITK_INFO<<"No filename specified."<<std::endl;
66  return false;
67  }
68 
69  bool extensionFound = false;
70  std::string::size_type STLPos = filename.rfind(".stl");
71  if ((STLPos != std::string::npos) && (STLPos == filename.length() - 4))
72  {
73  extensionFound = true;
74  }
75 
76  STLPos = filename.rfind(".STL");
77  if ((STLPos != std::string::npos) && (STLPos == filename.length() - 4))
78  {
79  extensionFound = true;
80  }
81 
82  if (!extensionFound)
83  {
84  // MITK_INFO<<"The filename extension is not recognized."<<std::endl;
85  return false;
86  }
87 
88  return true;
89 }
Superclass of all classes generating surfaces (instances of class Surface) as output.
#define MITK_INFO
Definition: mitkLogMacros.h:18
OutputType * GetOutput()
DataCollection - Class to facilitate loading/accessing structured data.
void GenerateData() override
static bool CanReadFile(const std::string filename, const std::string filePrefix, const std::string filePattern)