Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkGeometryDataReaderService.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 
13 // MITK
15 #include "mitkGeometry3DToXML.h"
16 #include "mitkIOMimeTypes.h"
18 
19 // STL
20 #include <mitkLocaleSwitch.h>
21 
22 #include <tinyxml.h>
23 
25  : AbstractFileReader(IOMimeTypes::GEOMETRY_DATA_MIMETYPE(), "MITK Geometry Data Reader")
26 {
28 }
29 
31 {
32 }
33 
34 std::vector<itk::SmartPointer<mitk::BaseData>> mitk::GeometryDataReaderService::Read()
35 {
36  // Switch the current locale to "C"
37  LocaleSwitch localeSwitch("C");
38 
39  std::vector<itk::SmartPointer<BaseData>> result;
40 
41  InputStream stream(this);
42 
43  TiXmlDocument doc;
44  stream >> doc;
45  if (!doc.Error())
46  {
47  TiXmlHandle docHandle(&doc);
48 
49  for (TiXmlElement *geomDataElement = docHandle.FirstChildElement("GeometryData").ToElement();
50  geomDataElement != nullptr;
51  geomDataElement = geomDataElement->NextSiblingElement())
52  {
53  for (TiXmlElement *currentElement = geomDataElement->FirstChildElement(); currentElement != nullptr;
54  currentElement = currentElement->NextSiblingElement())
55  {
56  // different geometries could have been serialized from a GeometryData
57  // object:
58  std::string tagName = currentElement->Value();
59  if (tagName == "Geometry3D")
60  {
61  Geometry3D::Pointer restoredGeometry = Geometry3DToXML::FromXML(currentElement);
62  if (restoredGeometry.IsNotNull())
63  {
64  GeometryData::Pointer newGeometryData = GeometryData::New();
65  newGeometryData->SetGeometry(restoredGeometry);
66  result.push_back(newGeometryData.GetPointer());
67  }
68  else
69  {
70  MITK_ERROR << "Invalid <Geometry3D> tag encountered. Skipping.";
71  }
72  }
73  else if (tagName == "ProportionalTimeGeometry")
74  {
75  ProportionalTimeGeometry::Pointer restoredTimeGeometry =
77  if (restoredTimeGeometry.IsNotNull())
78  {
79  GeometryData::Pointer newGeometryData = GeometryData::New();
80  newGeometryData->SetTimeGeometry(restoredTimeGeometry);
81  result.push_back(newGeometryData.GetPointer());
82  }
83  else
84  {
85  MITK_ERROR << "Invalid <ProportionalTimeGeometry> tag encountered. Skipping.";
86  }
87  }
88  } // for child of <GeometryData>
89  } // for <GeometryData>
90  }
91  else
92  {
93  mitkThrow() << "Parsing error at line " << doc.ErrorRow() << ", col " << doc.ErrorCol() << ": " << doc.ErrorDesc();
94  }
95 
96  if (result.empty())
97  {
98  mitkThrow() << "Did not read a single GeometryData object from input.";
99  }
100 
101  return result;
102 }
103 
105  : mitk::AbstractFileReader(other)
106 {
107 }
108 
109 mitk::GeometryDataReaderService *mitk::GeometryDataReaderService::Clone() const
110 {
111  return new GeometryDataReaderService(*this);
112 }
The IOMimeTypes class.
#define MITK_ERROR
Definition: mitkLogMacros.h:20
static Geometry3D::Pointer FromXML(TiXmlElement *node)
Create a Geometry3D from XML. Interprets only the format created by ToXML().
us::ServiceRegistration< IFileReader > RegisterService(us::ModuleContext *context=us::GetModuleContext())
Convenience class to temporarily change the current locale.
#define mitkThrow()
static Pointer New()
std::vector< itk::SmartPointer< BaseData > > Read() override
Reads a path or stream and creates a list of BaseData objects.
Base class for creating mitk::BaseData objects from files or streams.
static ProportionalTimeGeometry::Pointer FromXML(TiXmlElement *node)
Create a ProportionalTimeGeometry from XML. Interprets only the format created by ToXML()...