41 std::vector<itk::SmartPointer<mitk::BaseData>> result;
49 TiXmlHandle docHandle(&doc);
51 for (TiXmlElement *currentPointSetElement =
52 docHandle.FirstChildElement(
"point_set_file").FirstChildElement(
"point_set").ToElement();
53 currentPointSetElement !=
nullptr;
54 currentPointSetElement = currentPointSetElement->NextSiblingElement())
62 if (currentPointSetElement->FirstChildElement(
"time_series") !=
nullptr)
64 for (TiXmlElement *currentTimeSeries = currentPointSetElement->FirstChildElement(
"time_series")->ToElement();
65 currentTimeSeries !=
nullptr;
66 currentTimeSeries = currentTimeSeries->NextSiblingElement())
68 unsigned int currentTimeStep(0);
69 TiXmlElement *currentTimeSeriesID = currentTimeSeries->FirstChildElement(
"time_series_id");
71 currentTimeStep = atoi(currentTimeSeriesID->GetText());
73 timeGeometry->Expand(currentTimeStep + 1);
74 TiXmlElement *geometryElem = currentTimeSeries->FirstChildElement(
"Geometry3D");
78 if (geometry.IsNotNull())
80 timeGeometry->SetTimeStepGeometry(geometry, currentTimeStep);
84 MITK_ERROR <<
"Could not deserialize Geometry3D element.";
89 MITK_WARN <<
"Fallback to legacy behavior: defining PointSet geometry as identity";
92 newPointSet = this->ReadPoints(newPointSet, currentTimeSeries, currentTimeStep);
97 newPointSet = this->ReadPoints(newPointSet, currentPointSetElement, 0);
100 newPointSet->SetTimeGeometry(timeGeometry);
102 result.push_back(newPointSet.GetPointer());
107 mitkThrow() <<
"Parsing error at line " << doc.ErrorRow() <<
", col " << doc.ErrorCol() <<
": " << doc.ErrorDesc();
115 TiXmlElement *geometryElem = parentElement->FirstChildElement(
"geometry3d");
120 AffineTransform3D::MatrixType matrix;
121 AffineTransform3D::OffsetType
offset;
122 bool isImageGeometry(
false);
123 unsigned int frameOfReferenceID(0);
126 bool somethingMissing(
false);
129 TiXmlElement *imageGeometryElem = geometryElem->FirstChildElement(
"image_geometry");
130 if (imageGeometryElem)
132 std::string igs = imageGeometryElem->GetText();
133 isImageGeometry = igs ==
"true" || igs ==
"TRUE" || igs ==
"1";
136 somethingMissing =
true;
138 TiXmlElement *frameOfReferenceElem = geometryElem->FirstChildElement(
"frame_of_reference_id");
139 if (frameOfReferenceElem)
141 frameOfReferenceID = atoi(frameOfReferenceElem->GetText());
144 somethingMissing =
true;
146 TiXmlElement *indexToWorldElem = geometryElem->FirstChildElement(
"index_to_world");
147 if (indexToWorldElem)
149 TiXmlElement *matrixElem = indexToWorldElem->FirstChildElement(
"matrix3x3");
150 TiXmlElement *offsetElem = indexToWorldElem->FirstChildElement(
"offset");
151 if (indexToWorldElem && offsetElem)
153 TiXmlElement *col0 = matrixElem->FirstChildElement(
"column_0");
154 TiXmlElement *col1 = matrixElem->FirstChildElement(
"column_1");
155 TiXmlElement *col2 = matrixElem->FirstChildElement(
"column_2");
157 if (col0 && col1 && col2)
159 somethingMissing |= TIXML_SUCCESS != col0->QueryDoubleAttribute(
"x", &matrix[0][0]);
160 somethingMissing |= TIXML_SUCCESS != col0->QueryDoubleAttribute(
"y", &matrix[1][0]);
161 somethingMissing |= TIXML_SUCCESS != col0->QueryDoubleAttribute(
"z", &matrix[2][0]);
163 somethingMissing |= TIXML_SUCCESS != col1->QueryDoubleAttribute(
"x", &matrix[0][1]);
164 somethingMissing |= TIXML_SUCCESS != col1->QueryDoubleAttribute(
"y", &matrix[1][1]);
165 somethingMissing |= TIXML_SUCCESS != col1->QueryDoubleAttribute(
"z", &matrix[2][1]);
167 somethingMissing |= TIXML_SUCCESS != col2->QueryDoubleAttribute(
"x", &matrix[0][2]);
168 somethingMissing |= TIXML_SUCCESS != col2->QueryDoubleAttribute(
"y", &matrix[1][2]);
169 somethingMissing |= TIXML_SUCCESS != col2->QueryDoubleAttribute(
"z", &matrix[2][2]);
172 somethingMissing =
true;
174 somethingMissing |= TIXML_SUCCESS != offsetElem->QueryDoubleAttribute(
"x", &offset[0]);
175 somethingMissing |= TIXML_SUCCESS != offsetElem->QueryDoubleAttribute(
"y", &offset[1]);
176 somethingMissing |= TIXML_SUCCESS != offsetElem->QueryDoubleAttribute(
"z", &offset[2]);
179 somethingMissing =
true;
181 TiXmlElement *boundsElem = geometryElem->FirstChildElement(
"bounds");
184 TiXmlElement *minBoundsElem = boundsElem->FirstChildElement(
"min");
185 TiXmlElement *maxBoundsElem = boundsElem->FirstChildElement(
"max");
187 if (minBoundsElem && maxBoundsElem)
189 somethingMissing |= TIXML_SUCCESS != minBoundsElem->QueryDoubleAttribute(
"x", &bounds[0]);
190 somethingMissing |= TIXML_SUCCESS != minBoundsElem->QueryDoubleAttribute(
"y", &bounds[2]);
191 somethingMissing |= TIXML_SUCCESS != minBoundsElem->QueryDoubleAttribute(
"z", &bounds[4]);
193 somethingMissing |= TIXML_SUCCESS != maxBoundsElem->QueryDoubleAttribute(
"x", &bounds[1]);
194 somethingMissing |= TIXML_SUCCESS != maxBoundsElem->QueryDoubleAttribute(
"y", &bounds[3]);
195 somethingMissing |= TIXML_SUCCESS != maxBoundsElem->QueryDoubleAttribute(
"z", &bounds[5]);
198 somethingMissing =
true;
201 somethingMissing =
true;
204 somethingMissing =
true;
206 if (somethingMissing)
208 MITK_ERROR <<
"XML structure of geometry inside a PointSet file broken. Refusing to build Geometry3D";
214 g->SetImageGeometry(isImageGeometry);
215 g->SetFrameOfReferenceID(frameOfReferenceID);
216 g->SetBounds(bounds);
218 AffineTransform3D::Pointer transform = AffineTransform3D::New();
219 transform->SetMatrix(matrix);
220 transform->SetOffset(offset);
222 g->SetIndexToWorldTransform(transform);
224 return g.GetPointer();
229 TiXmlElement *currentTimeSeries,
230 unsigned int currentTimeStep)
232 if (currentTimeSeries->FirstChildElement(
"point") !=
nullptr)
234 for (TiXmlElement *currentPoint = currentTimeSeries->FirstChildElement(
"point")->ToElement(); currentPoint !=
nullptr;
235 currentPoint = currentPoint->NextSiblingElement())
243 id = atoi(currentPoint->FirstChildElement(
"id")->GetText());
244 if (currentPoint->FirstChildElement(
"specification") !=
nullptr)
248 x = atof(currentPoint->FirstChildElement(
"x")->GetText());
249 y = atof(currentPoint->FirstChildElement(
"y")->GetText());
250 z = atof(currentPoint->FirstChildElement(
"z")->GetText());
254 newPointSet->SetPoint(
id, point, spec, currentTimeStep);
259 if (currentTimeStep != newPointSet->GetTimeSteps() + 1)
261 newPointSet->Expand(currentTimeStep + 1);
BoundingBoxType::BoundsArrayType BoundsArrayType
static Geometry3D::Pointer FromXML(TiXmlElement *node)
Create a Geometry3D from XML. Interprets only the format created by ToXML().
void FillVector3D(Tout &out, mitk::ScalarType x, mitk::ScalarType y, mitk::ScalarType z)
The CustomMimeType class represents a custom mime-type which may be registered as a service object...
~PointSetReaderService() override
us::ServiceRegistration< IFileReader > RegisterService(us::ModuleContext *context=us::GetModuleContext())
Convenience class to temporarily change the current locale.
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.
PointSpecificationType
enumeration of the type a point can be