Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkSceneIOTestScenarioProvider.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 
14 
15 #include "mitkGeometryData.h"
16 #include "mitkImage.h"
17 #include "mitkImageGenerator.h"
18 #include "mitkPointSet.h"
19 #include "mitkProperties.h"
20 #include "mitkSurface.h"
21 
22 #include <vtkCellArray.h>
23 #include <vtkPolyData.h>
24 #include <vtkPolygon.h>
25 
26 namespace
27 {
28  std::string VeryLongText =
29  "Lorem ipsum dolor sit amet, consectetur adipiscing elit.Donec a diam lectus.Sed sit amet ipsum mauris.Maecenas "
30  "congue ligula ac quam viverra nec consectetur ante hendrerit.Donec et mollis dolor.Praesent et diam eget libero "
31  "egestas mattis sit amet vitae augue.Nam tincidunt congue enim, ut porta lorem lacinia consectetur.Donec ut libero "
32  "sed arcu vehicula ultricies a non tortor.Lorem ipsum dolor sit amet, consectetur adipiscing elit.Aenean ut "
33  "gravida lorem.Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.Pellentesque auctor nisi id magna "
34  "consequat sagittis.Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet.Ut convallis "
35  "libero in urna ultrices accumsan.Donec sed odio eros.Donec viverra mi quis quam pulvinar at malesuada arcu "
36  "rhoncus.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.In rutrum accumsan "
37  "ultricies.Mauris vitae nisi at sem facilisis semper ac in est.\n"
38  "Vivamus fermentum semper porta.Nunc diam velit, adipiscing ut tristique vitae, sagittis vel odio.Maecenas "
39  "convallis ullamcorper ultricies.Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, id "
40  "fringilla sem nunc vel mi.Nam dictum, odio nec pretium volutpat, arcu ante placerat erat, non tristique elit urna "
41  "et turpis.Quisque mi metus, ornare sit amet fermentum et, tincidunt et orci.Fusce eget orci a orci congue "
42  "vestibulum.Ut dolor diam, elementum et vestibulum eu, porttitor vel elit.Curabitur venenatis pulvinar tellus "
43  "gravida ornare.Sed et erat faucibus nunc euismod ultricies ut id justo.Nullam cursus suscipit nisi, et ultrices "
44  "justo sodales nec.Fusce venenatis facilisis lectus ac semper.Aliquam at massa ipsum.Quisque bibendum purus "
45  "convallis nulla ultrices ultricies.Nullam aliquam, mi eu aliquam tincidunt, purus velit laoreet tortor, viverra "
46  "pretium nisi quam vitae mi.Fusce vel volutpat elit.Nam sagittis nisi dui.\r\n"
47  "Suspendisse lectus leo, consectetur in tempor sit amet, placerat quis neque.Etiam luctus porttitor lorem, sed "
48  "suscipit est rutrum non.Curabitur lobortis nisl a enim congue semper.Aenean commodo ultrices imperdiet.Vestibulum "
49  "ut justo vel sapien venenatis tincidunt.Phasellus eget dolor sit amet ipsum dapibus condimentum vitae quis "
50  "lectus.Aliquam ut massa in turpis dapibus convallis.Praesent elit lacus, vestibulum at malesuada et, ornare et "
51  "est.Ut augue nunc, sodales ut euismod non, adipiscing vitae orci.Mauris ut placerat justo.Mauris in ultricies "
52  "enim.Quisque nec est eleifend nulla ultrices egestas quis ut quam.Donec sollicitudin lectus a mauris pulvinar id "
53  "aliquam urna cursus.Cras quis ligula sem, vel elementum mi.Phasellus non ullamcorper urna.\t\n"
54  "Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.In euismod ultrices "
55  "facilisis.Vestibulum porta sapien adipiscing augue congue id pretium lectus molestie.Proin quis dictum nisl.Morbi "
56  "id quam sapien, sed vestibulum sem.Duis elementum rutrum mauris sed convallis.Proin vestibulum magna mi.Aenean "
57  "tristique hendrerit magna, ac facilisis nulla hendrerit ut.Sed non tortor sodales quam auctor elementum.Donec "
58  "hendrerit nunc eget elit pharetra pulvinar.Suspendisse id tempus tortor.Aenean luctus, elit commodo laoreet "
59  "commodo, justo nisi consequat massa, sed vulputate quam urna quis eros.Donec vel.";
60 }
61 
62 // --------------- SceneIOTestScenarioProvider::Scenario ---------------
63 
65 {
66  return (*m_ScenarioProvider.*m_ProviderMethod)(); // calls function
67 }
68 
70  const SceneIOTestScenarioProvider *_scenarioProvider,
72  bool _isSerializable,
73  const std::string &_referenceArchiveFilename,
74  bool _isReferenceLoadable,
75  double _comparisonPrecision)
76  : key(_key),
77  serializable(_isSerializable),
78  referenceArchiveFilename(_referenceArchiveFilename),
79  referenceArchiveLoadable(_isReferenceLoadable),
80  comparisonPrecision(_comparisonPrecision),
81  m_ScenarioProvider(_scenarioProvider),
82  m_ProviderMethod(_providerMethod)
83 {
84 }
85 
86 // --------------- SceneIOTestScenarioProvider ---------------
87 
89 {
90  return m_Scenarios;
91 }
92 
93 void mitk::SceneIOTestScenarioProvider::AddScenario(const std::string &key,
94  BuilderMethodPointer creator,
95  bool isSerializable,
96  const std::string &referenceArchiveFilename,
97  bool isReferenceLoadable,
98  double comparisonPrecision)
99 {
100  Scenario newScenario(
101  key, this, creator, isSerializable, referenceArchiveFilename, isReferenceLoadable, comparisonPrecision);
102  m_Scenarios.push_back(newScenario);
103 }
104 
105 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::EmptyStorage() const
106 {
108  return storage;
109 }
110 
111 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::OneEmptyNode() const
112 {
114 
116  storage->Add(node);
117 
118  return storage;
119 }
120 
121 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::OneEmptyNamedNode() const
122 {
124 
126  node->SetName("Urmel");
127  storage->Add(node);
128 
129  return storage;
130 }
131 
132 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::ManyTopLevelNodes() const
133 {
135 
136  for (auto i = 0; i < m_HowMuchIsMany; ++i)
137  {
139  std::stringstream s;
140  s << "Node #" << i;
141  node->SetName(s.str());
142  storage->Add(node);
143  }
144 
145  return storage;
146 }
147 
148 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::LineOfManyOnlyChildren() const
149 {
151 
153  for (auto i = 0; i < m_HowMuchIsMany; ++i)
154  {
156  std::stringstream s;
157  s << "Node #" << i;
158  node->SetName(s.str());
159  storage->Add(node, parent);
160  parent = node;
161  }
162 
163  return storage;
164 }
165 
166 #define AddNode(name) storage->Add(name);
167 
168 #define DefineNode(name) \
169  mitk::DataNode::Pointer name = mitk::DataNode::New(); \
170  name->SetName(#name);
171 
172 #define DefNode0(name) DefineNode(name) AddNode(name)
173 
174 #define DefNode1(source, name) DefineNode(name) storage->Add(name, source);
175 
176 #define DefNode2(source1, source2, name) \
177  DefineNode(name) \
178  { \
179  mitk::DataStorage::SetOfObjects::Pointer sources = mitk::DataStorage::SetOfObjects::New(); \
180  sources->push_back(source1); \
181  sources->push_back(source2); \
182  storage->Add(name, sources); \
183  }
184 
185 #define DefNode3(source1, source2, source3, name) \
186  DefineNode(name) \
187  { \
188  mitk::DataStorage::SetOfObjects::Pointer sources = mitk::DataStorage::SetOfObjects::New(); \
189  sources->push_back(source1); \
190  sources->push_back(source2); \
191  sources->push_back(source3); \
192  storage->Add(name, sources); \
193  }
194 
195 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::ComplicatedFamilySituation() const
196 {
198 
199  // constructing a hierarchy with multiple levels
200  // and a couple of multiple parent relations.
201 
202  // Anybody, feel free to make this something
203  // meaningful and/or visualize it :-)
204 
205  DefNode0(Color) DefNode0(White)
206 
207  DefNode1(Color, Green) DefNode1(Color, Election) DefNode1(Color, Red)
208 
209  DefNode1(Green, Yellow)
210 
211  DefNode1(Election, Looser) DefNode1(Election, FreeBeer) DefNode1(Election, Winner)
212 
213  DefNode1(Looser, Tears) DefNode1(Looser, Anger)
214 
215  DefNode1(FreeBeer, OpenSource);
216 
217  DefNode1(White, Sweet)
218 
219  DefNode2(White, Sweet, Sugar) DefNode2(Red, Sweet, Tomatoe) DefNode2(Tomatoe, Sugar, Ketchup)
220 
221  DefNode1(Ketchup, BBQSauce) DefNode1(Tomatoe, ATLAS)
222 
223  DefNode0(Fish) DefNode0(OperatingSystem) DefNode1(Fish, Bird) DefNode1(Bird, Penguin)
224 
225  DefNode3(Penguin, OperatingSystem, OpenSource, Linux)
226 
227  return storage;
228 }
229 
230 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::Image() const
231 {
233 
234  { // Image of ints
235  mitk::Image::Pointer image3Dints = mitk::ImageGenerator::GenerateRandomImage<int>(10,
236  5,
237  7, // dim
238  1,
239  0.5,
240  0.5, // spacing
241  1, // time steps
242  3000,
243  -1000); // random max / min
245  node->SetName("Image-Int");
246  node->SetData(image3Dints);
247  storage->Add(node);
248  }
249 
250  { // Image of doubles
251  mitk::Image::Pointer image3Ddouble = mitk::ImageGenerator::GenerateRandomImage<double>(5,
252  10,
253  8, // dim
254  1,
255  0.5,
256  0.5, // spacing
257  2, // time steps
258  3000,
259  -1000); // random max / min
261  node->SetName("Image-Double");
262  node->SetData(image3Ddouble);
263  storage->Add(node);
264  }
265 
266  return storage;
267 }
268 
269 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::Surface() const
270 {
272 
273  { // Surface
274  vtkSmartPointer<vtkPoints> points1 = vtkSmartPointer<vtkPoints>::New();
275  points1->InsertNextPoint(0.0, 0.0, 0.0);
276  points1->InsertNextPoint(1.0, 0.0, 0.0);
277  points1->InsertNextPoint(0.0, 1.0, 0.0);
278  points1->InsertNextPoint(1.0, 1.0, 0.0);
279 
280  vtkSmartPointer<vtkPolygon> polygon1 = vtkSmartPointer<vtkPolygon>::New();
281  polygon1->GetPointIds()->SetNumberOfIds(4);
282  polygon1->GetPointIds()->SetId(0, 0);
283  polygon1->GetPointIds()->SetId(1, 1);
284  polygon1->GetPointIds()->SetId(2, 2);
285  polygon1->GetPointIds()->SetId(3, 3);
286 
287  vtkSmartPointer<vtkPolygon> polygon2 = vtkSmartPointer<vtkPolygon>::New();
288  polygon2->GetPointIds()->SetNumberOfIds(4);
289  polygon2->GetPointIds()->SetId(0, 3);
290  polygon2->GetPointIds()->SetId(1, 2);
291  polygon2->GetPointIds()->SetId(2, 0);
292  polygon2->GetPointIds()->SetId(3, 1);
293 
294  // generate polydatas
295  vtkSmartPointer<vtkCellArray> polygonArray1 = vtkSmartPointer<vtkCellArray>::New();
296  polygonArray1->InsertNextCell(polygon1);
297 
298  vtkSmartPointer<vtkPolyData> polydata1 = vtkSmartPointer<vtkPolyData>::New();
299  polydata1->SetPoints(points1);
300  polydata1->SetPolys(polygonArray1);
301 
302  vtkSmartPointer<vtkCellArray> polygonArray2 = vtkSmartPointer<vtkCellArray>::New();
303  polygonArray2->InsertNextCell(polygon2);
304 
305  vtkSmartPointer<vtkPolyData> polyDataTwo = vtkSmartPointer<vtkPolyData>::New();
306  polyDataTwo->SetPoints(points1);
307  polyDataTwo->SetPolys(polygonArray2);
308 
309  // generate surfaces
311  surface->SetVtkPolyData(polydata1);
312 
314  node->SetName("Surface");
315  node->SetData(surface);
316  storage->Add(node);
317  }
318 
319  return storage;
320 }
321 
322 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::PointSet() const
323 {
325 
326  { // PointSet
329  mitk::FillVector3D(p, 1.0, -2.0, 33.0);
330  ps->SetPoint(0, p);
331  mitk::FillVector3D(p, 100.0, -200.0, 3300.0);
332  ps->SetPoint(1, p);
333  mitk::FillVector3D(p, 2.0, -3.0, 22.0);
334  ps->SetPoint(2, p, mitk::PTCORNER); // add point spec
335 
337  node->SetName("PointSet");
338  node->SetData(ps);
339  storage->Add(node);
340  }
341 
342  return storage;
343 }
344 
345 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::GeometryData() const
346 {
348 
349  { // GeometryData
351 
352  // define Geometry3D parameters
353  mitk::AffineTransform3D::MatrixType matrix;
354  matrix[0][0] = 1.1;
355  matrix[1][1] = 2.2;
356  matrix[2][2] = 3.3;
357  mitk::AffineTransform3D::OffsetType offset;
358  mitk::FillVector3D(offset, 0.1, 0.2, 0.3);
359  bool isImageGeometry(false);
360  unsigned int frameOfReferenceID(47);
361 
364  bounds[1] = -52.723;
365  bounds[2] = -0.002;
366  bounds[3] = 918273645.18293746;
367  bounds[4] = -0.002;
368  bounds[5] = +52.723;
369 
370  mitk::Point3D origin;
371  mitk::FillVector3D(origin, 5.1, 5.2, 5.3);
372  mitk::Vector3D spacing;
373  mitk::FillVector3D(spacing, 2.1, 2.2, 2.3);
374 
375  // build GeometryData from matrix/offset/etc.
376  mitk::AffineTransform3D::Pointer newTransform = mitk::AffineTransform3D::New();
377  newTransform->SetMatrix(matrix);
378  newTransform->SetOffset(offset);
379 
381  newGeometry->SetFrameOfReferenceID(frameOfReferenceID);
382  newGeometry->SetImageGeometry(isImageGeometry);
383 
384  newGeometry->SetIndexToWorldTransform(newTransform);
385 
386  newGeometry->SetBounds(bounds);
387  newGeometry->SetOrigin(origin);
388  newGeometry->SetSpacing(spacing);
389 
391  geometryData->SetGeometry(newGeometry);
392 
394  node->SetName("GeometryData");
395  node->SetData(geometryData);
396  storage->Add(node);
397  }
398 
399  return storage;
400 }
401 
402 mitk::DataStorage::Pointer mitk::SceneIOTestScenarioProvider::SpecialProperties() const
403 {
405 
407  node->SetName("Camion");
408 
409  node->SetProperty("Livre", StringProperty::New(VeryLongText)); // defined at the top of this file
410  node->SetProperty(VeryLongText.c_str(), StringProperty::New("Shorty"));
411 
412  node->GetPropertyList("Chapitre1")->SetProperty("Page 1", StringProperty::New(VeryLongText));
413  node->GetPropertyList("Chapitre1")->SetProperty("Page 2", StringProperty::New(VeryLongText));
414  node->GetPropertyList("Chapitre 2")->SetProperty("Page", StringProperty::New(VeryLongText));
415  node->GetPropertyList("Chapitre 3")->SetProperty("Page", StringProperty::New(VeryLongText));
416  node->GetPropertyList(VeryLongText)->SetProperty("Page", StringProperty::New(VeryLongText));
417 
418  // not working (NaN etc.)
419  // node->SetProperty("NotAFloat", FloatProperty::New( sqrt(-1.0) ) );
420  node->SetProperty("sqrt(2)", FloatProperty::New(-sqrt(2.0)));
421  node->SetProperty("sqrt(3)", FloatProperty::New(sqrt(3.0)));
422 
423  // most values work fine, just min/max double produces serialization precision errors
424  node->SetProperty("sqrt(4)", DoubleProperty::New(-sqrt(4.0)));
425  node->SetProperty("sqrt(5)", DoubleProperty::New(sqrt(5.0)));
426  // node->SetProperty("maxd", DoubleProperty::New( std::numeric_limits<double>::max() ) );
427  node->SetProperty("zero", DoubleProperty::New(0.0));
428  node->SetProperty("minzero", DoubleProperty::New(-0.0));
429  // node->SetProperty("mind", DoubleProperty::New( std::numeric_limits<double>::min() ) );
430 
431  storage->Add(node);
432 
433  return storage;
434 }
std::string referenceArchiveFilename
Absolute filename with a reference .mitk file.
static Pointer New()
BoundingBoxType::BoundsArrayType BoundsArrayType
#define DefNode2(source1, source2, name)
static Pointer New()
bool referenceArchiveLoadable
Do we expect that the reference can be loaded without errors?
ScenarioList GetAllScenarios() const
Returns all registered scenarios.
static Pointer New()
void FillVector3D(Tout &out, mitk::ScalarType x, mitk::ScalarType y, mitk::ScalarType z)
Definition: mitkArray.h:106
double comparisonPrecision
Precision used for floating point comparisons after save/load cycle (eps).
static Vector3D offset
static Pointer New()
#define DefNode3(source1, source2, source3, name)
static Pointer New()
#define DefNode1(source, name)
itk::RGBPixel< float > Color
Color Standard RGB color typedef (float)
DataStorage::Pointer(SceneIOTestScenarioProvider::* BuilderMethodPointer)() const
Typedef for type BuilderMethodPointer which is function pointer to member of SceneIOTestScenarioProvi...
static Pointer New()
Scenario(const std::string &_key, const SceneIOTestScenarioProvider *_scenarioProvider, SceneIOTestScenarioProvider::BuilderMethodPointer _providerMethod, bool _isSerializable, const std::string &_referenceArchiveFilename, bool _isReferenceLoadable, double _comparisonPrecision)
static T min(T x, T y)
Definition: svm.cpp:53
bool serializable
Do we expect that this can be stored in a .mitk file?
Provides DataStorages that serve as test scenarios.
std::vector< Scenario > ScenarioList
List of Scenarios.
DataStorage::Pointer BuildDataStorage() const
Construct the DataStorage for this scenario.
#define DefNode0(name)
static Pointer New()
static Pointer New()