Orfeo Toolbox  3.16
itkMetaSceneConverter.txx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Insight Segmentation & Registration Toolkit
4  Module: $RCSfile: itkMetaSceneConverter.txx,v $
5  Language: C++
6  Date: $Date: 2009-01-28 20:10:27 $
7  Version: $Revision: 1.26 $
8 
9  Copyright (c) Insight Software Consortium. All rights reserved.
10  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
11 
12  This software is distributed WITHOUT ANY WARRANTY; without even
13  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14  PURPOSE. See the above copyright notices for more information.
15 
16 =========================================================================*/
17 #ifndef __itkMetaSceneConverter_txx
18 #define __itkMetaSceneConverter_txx
19 
20 #include "itkMetaSceneConverter.h"
22 #include "itkMetaTubeConverter.h"
25 #include "itkMetaGroupConverter.h"
26 #include "itkMetaImageConverter.h"
27 #include "itkMetaBlobConverter.h"
28 #include "itkMetaMeshConverter.h"
30 #include "itkMetaLineConverter.h"
33 #include "itkMetaArrowConverter.h"
35 
36 #include "itkSceneSpatialObject.h"
38 #include "itkTubeSpatialObject.h"
39 #include "itkGroupSpatialObject.h"
40 #include "itkImageSpatialObject.h"
41 #include "itkBlobSpatialObject.h"
43 #include "itkLineSpatialObject.h"
46 #include "itkMeshSpatialObject.h"
47 #include "itkArrowSpatialObject.h"
50 
51 #include <algorithm>
52 
53 
54 namespace itk
55 {
56 
58 template <unsigned int NDimensions, typename PixelType, typename TMeshTraits>
61 {
62  // default behaviour of scene converter is not to save transform
63  // with each spatial object.
64  m_Event = NULL;
65  m_BinaryPoints = false;
66  m_TransformPrecision = 6;
67  m_WriteImagesInSeparateFile = false;
68 }
69 
71 template <unsigned int NDimensions, typename PixelType, typename TMeshTraits>
74 {
75 }
76 
77 template <unsigned int NDimensions, typename PixelType, typename TMeshTraits>
78 void
80 ::SetTransform(MetaObject* obj, TransformType* transform)
81 {
82  typename SpatialObjectType::TransformType::InputPointType center =
83  transform->GetCenter();
85  transform->GetMatrix();
87  transform->GetOffset();
88 
89  unsigned int p = 0;
90  for ( unsigned int row = 0; row<NDimensions; row++)
91  {
92  for( unsigned int col = 0; col<NDimensions; col++)
93  {
94  m_Orientation[p++] = matrix[row][col];
95  }
96  }
97 
98  for ( unsigned int i = 0; i<NDimensions; i++)
99  {
100  m_Position[i] = offset[i];
101  m_CenterOfRotation[i] = center[i];
102  }
103 
104  obj->CenterOfRotation(m_CenterOfRotation);
105  obj->TransformMatrix(m_Orientation);
106  obj->Offset(m_Position);
107  obj->SetDoublePrecision(m_TransformPrecision);
108 }
109 
110 template <unsigned int NDimensions, typename PixelType, typename TMeshTraits>
111 void
113 ::SetTransform(SpatialObjectType* so, MetaObject* meta)
114 {
115  typename SpatialObjectType::TransformType::Pointer transform =
116  SpatialObjectType::TransformType::New();
117 
118  typename SpatialObjectType::TransformType::InputPointType center;
121 
122  unsigned int p = 0;
123  for ( unsigned int row = 0; row<NDimensions; row++)
124  {
125  for( unsigned int col = 0; col<NDimensions; col++)
126  {
127  matrix[row][col] = (meta->Orientation())[p++];
128  }
129  }
130 
131  for ( unsigned int i = 0; i<NDimensions; i++)
132  {
133  offset[i] = (meta->Position())[i];
134  center[i] = (meta->CenterOfRotation())[i];
135  }
136 
137  so->GetObjectToParentTransform()->SetCenter(center);
138  so->GetObjectToParentTransform()->SetMatrix(matrix);
139  so->GetObjectToParentTransform()->SetOffset(offset);
140 }
141 
144 template <unsigned int NDimensions, typename PixelType, typename TMeshTraits>
147 ::CreateSpatialObjectScene(MetaScene * mScene)
148 {
149  ScenePointer soScene = SceneType::New();
150 
151  MetaScene::ObjectListType * list = mScene->GetObjectList();
152  MetaScene::ObjectListType::iterator it = list->begin();
153  MetaScene::ObjectListType::iterator itEnd = list->end();
154 
155  while(it != itEnd)
156  {
158  if(!strncmp((*it)->ObjectTypeName(),"Tube",4))
159  {
160  // If there is the subtype is a vessel
161  if(!strncmp((*it)->ObjectSubTypeName(),"Vessel",6))
162  {
166  (MetaVesselTube*)*it);
167  this->SetTransform(so, *it);
168  soScene->AddSpatialObject(so);
169  }
170  else if(!strncmp((*it)->ObjectSubTypeName(),"DTI",3))
171  {
172  MetaDTITubeConverter<NDimensions> tubeConverter;
174  tubeConverter.MetaDTITubeToDTITubeSpatialObject(
175  (MetaDTITube*)*it);
176  this->SetTransform(so, *it);
177  soScene->AddSpatialObject(so);
178  }
179  else
180  {
181  MetaTubeConverter<NDimensions> tubeConverter;
183  tubeConverter.MetaTubeToTubeSpatialObject((MetaTube*)*it);
184  this->SetTransform(so, *it);
185  soScene->AddSpatialObject(so);
186  }
187  }
188 
189  if(!strncmp((*it)->ObjectTypeName(),"Group",5) ||
190  !strncmp((*it)->ObjectTypeName(),"AffineTransform",15))
191  {
192  MetaGroupConverter<NDimensions> groupConverter;
194  groupConverter.MetaGroupToGroupSpatialObject((MetaGroup*)*it);
195  this->SetTransform(so, *it);
196  soScene->AddSpatialObject(so);
197  }
198 
199  if(!strncmp((*it)->ObjectTypeName(),"Ellipse",7))
200  {
201  MetaEllipseConverter<NDimensions> ellipseConverter;
203  ellipseConverter.MetaEllipseToEllipseSpatialObject((MetaEllipse*)*it);
204  this->SetTransform(so, *it);
205  soScene->AddSpatialObject( so);
206  }
207 
208  if(!strncmp((*it)->ObjectTypeName(),"Arrow",5))
209  {
210  MetaArrowConverter<NDimensions> arrowConverter;
212  arrowConverter.MetaArrowToArrowSpatialObject((MetaArrow*)*it);
213  this->SetTransform(so, *it);
214  soScene->AddSpatialObject( so);
215  }
216 
217  if(!strncmp((*it)->ObjectTypeName(),"Image",5))
218  {
219  // If there is the subtype is a mask
220  if(!strncmp((*it)->ObjectSubTypeName(),"Mask",6))
221  {
224  imageConverter.MetaImageToImageMaskSpatialObject((MetaImage*)*it);
225  this->SetTransform(so, *it);
226  soScene->AddSpatialObject(so);
227  }
228  else
229  {
232  imageConverter.MetaImageToImageSpatialObject((MetaImage*)*it);
233  this->SetTransform(so, *it);
234  soScene->AddSpatialObject(so);
235  }
236  }
237 
238  if(!strncmp((*it)->ObjectTypeName(),"Blob",4))
239  {
240  MetaBlobConverter<NDimensions> blobConverter;
242  so = blobConverter.MetaBlobToBlobSpatialObject((MetaBlob*)*it);
243  this->SetTransform(so, *it);
244  soScene->AddSpatialObject((SpatialObjectType*) so.GetPointer());
245  }
246 
247  if(!strncmp((*it)->ObjectTypeName(),"Landmark",8))
248  {
249  MetaLandmarkConverter<NDimensions> landmarkConverter;
251  so = landmarkConverter.MetaLandmarkToLandmarkSpatialObject(
252  (MetaLandmark*)*it);
253  soScene->AddSpatialObject((SpatialObjectType*) so.GetPointer());
254  }
255 
256  if(!strncmp((*it)->ObjectTypeName(),"Surface",7))
257  {
258  MetaSurfaceConverter<NDimensions> surfaceConverter;
260  surfaceConverter.MetaSurfaceToSurfaceSpatialObject((MetaSurface*)*it);
261  this->SetTransform(so, *it);
262  soScene->AddSpatialObject( so);
263  }
264 
265  if(!strncmp((*it)->ObjectTypeName(),"Line",4))
266  {
267  MetaLineConverter<NDimensions> lineConverter;
269  lineConverter.MetaLineToLineSpatialObject((MetaLine*)*it);
270  this->SetTransform(so, *it);
271  soScene->AddSpatialObject( so);
272  }
273 
274  if(!strncmp((*it)->ObjectTypeName(),"Mesh",4))
275  {
279  meshConverter.MetaMeshToMeshSpatialObject((MetaMesh*)*it);
280  this->SetTransform(so, *it);
281  soScene->AddSpatialObject( so);
282  }
283 
284  if(!strncmp((*it)->ObjectTypeName(),"Contour",7))
285  {
286  MetaContourConverter<NDimensions> contourConverter;
288  so = contourConverter.MetaContourToContourSpatialObject(
289  (MetaContour*)*it);
290  soScene->AddSpatialObject((SpatialObjectType*) so.GetPointer());
291  }
292 
293  it++;
294  }
295 
296  soScene->FixHierarchy();
297 
298  return soScene;
299 }
300 
301 
303 template <unsigned int NDimensions, typename PixelType, typename TMeshTraits>
306 ::ReadMeta(const char* name)
307 {
308  MetaScene* mScene = new MetaScene;
309  if(m_Event)
310  {
311  mScene->SetEvent(m_Event);
312  }
313  mScene->Read(name);
314  ScenePointer soScene = CreateSpatialObjectScene(mScene);
315  delete mScene;
316  return soScene;
317 }
318 
319 
321 template <unsigned int NDimensions, typename PixelType, typename TMeshTraits>
322 MetaScene *
324 ::CreateMetaScene(SceneType * scene, unsigned int depth, char * name)
325 {
326  MetaScene * metaScene = new MetaScene(NDimensions);
327 
328  metaScene->BinaryData(m_BinaryPoints);
329 
330  float* spacing = new float[NDimensions];
331  for(unsigned int i=0;i<NDimensions;i++)
332  {
333  spacing[i]=1;
334  }
335  metaScene->ElementSpacing(spacing);
336  delete []spacing;
337 
338  typedef typename SceneType::ObjectListType ListType;
339 
340  ListType * childrenList = scene->GetObjects(depth, name);
341  typename ListType::iterator it = childrenList->begin();
342  typename ListType::iterator itEnd = childrenList->end();
343 
344  while(it != itEnd)
345  {
346  if(!strncmp((*it)->GetTypeName(),"GroupSpatialObject",18) ||
347  !strncmp((*it)->GetTypeName(),"AffineTransformSpatialObject",28))
348  {
350  MetaGroup* group = converter.GroupSpatialObjectToMetaGroup(
352  (*it).GetPointer()));
353  if((*it)->GetParent())
354  {
355  group->ParentID((*it)->GetParent()->GetId());
356  }
357  group->Name((*it)->GetProperty()->GetName().c_str());
358  this->SetTransform(group, (*it)->GetObjectToParentTransform());
359  metaScene->AddObject(group);
360  }
361  if(!strncmp((*it)->GetTypeName(),"TubeSpatialObject",17))
362  {
364  MetaTube* tube = converter.TubeSpatialObjectToMetaTube(
366  (*it).GetPointer()));
367  if((*it)->GetParent())
368  {
369  tube->ParentID((*it)->GetParent()->GetId());
370  }
371  tube->Name((*it)->GetProperty()->GetName().c_str());
372  this->SetTransform(tube, (*it)->GetObjectToParentTransform());
373  metaScene->AddObject(tube);
374  }
375 
376  if(!strncmp((*it)->GetTypeName(),"VesselTubeSpatialObject",23))
377  {
379  MetaVesselTube* tube = converter.VesselTubeSpatialObjectToMetaVesselTube(
381  (*it).GetPointer()));
382  if((*it)->GetParent())
383  {
384  tube->ParentID((*it)->GetParent()->GetId());
385  }
386  tube->Name((*it)->GetProperty()->GetName().c_str());
387  this->SetTransform(tube, (*it)->GetObjectToParentTransform());
388  metaScene->AddObject(tube);
389  }
390 
391  if(!strncmp((*it)->GetTypeName(),"DTITubeSpatialObject",20))
392  {
394  MetaDTITube* tube = converter.DTITubeSpatialObjectToMetaDTITube(
396  (*it).GetPointer()));
397  if((*it)->GetParent())
398  {
399  tube->ParentID((*it)->GetParent()->GetId());
400  }
401  tube->Name((*it)->GetProperty()->GetName().c_str());
402  this->SetTransform(tube, (*it)->GetObjectToParentTransform());
403  metaScene->AddObject(tube);
404  }
405 
406  if(!strncmp((*it)->GetTypeName(),"EllipseSpatialObject",20))
407  {
409  MetaEllipse* ellipse = converter.EllipseSpatialObjectToMetaEllipse(
411  (*it).GetPointer()));
412 
413  if((*it)->GetParent())
414  {
415  ellipse->ParentID((*it)->GetParent()->GetId());
416  }
417  ellipse->Name((*it)->GetProperty()->GetName().c_str());
418  this->SetTransform(ellipse, (*it)->GetObjectToParentTransform());
419  metaScene->AddObject(ellipse);
420  }
421 
422 
423  if(!strncmp((*it)->GetTypeName(),"ArrowSpatialObject",18))
424  {
426  MetaArrow* arrow = converter.ArrowSpatialObjectToMetaArrow(
428  (*it).GetPointer()));
429 
430  if((*it)->GetParent())
431  {
432  arrow->ParentID((*it)->GetParent()->GetId());
433  }
434  arrow->Name((*it)->GetProperty()->GetName().c_str());
435  this->SetTransform(arrow, (*it)->GetObjectToParentTransform());
436  metaScene->AddObject(arrow);
437  }
438 
439  if(!strncmp((*it)->GetTypeName(),"ImageSpatialObject",17)
440  || !strncmp((*it)->GetTypeName(),"ImageMaskSpatialObject",21))
441  {
442  MetaImage* image;
443  if(!strncmp((*it)->GetTypeName(),"ImageMaskSpatialObject",21))
444  {
446  image = converter.ImageSpatialObjectToMetaImage(
448  (*it).GetPointer()));
449  image->ObjectSubTypeName("Mask");
450  }
451  else
452  {
454  image = converter.ImageSpatialObjectToMetaImage(
456  (*it).GetPointer()));
457  }
458 
459  if((*it)->GetParent())
460  {
461  image->ParentID((*it)->GetParent()->GetId());
462  }
463 
464  if(m_WriteImagesInSeparateFile)
465  {
466  if((*it)->GetProperty()->GetName().size() == 0)
467  {
468  std::cout << "Error: you should set the image name when using"
469  << " WriteImagesInSeparateFile." << std::endl;
470  std::cout << "The image will be written locally." << std::endl;
471  image->ElementDataFileName("LOCAL");
472  }
473  else
474  {
475  std::string filename = (*it)->GetProperty()->GetName();
476  filename += ".raw";
477  image->ElementDataFileName(filename.c_str());
478  }
479  }
480  else
481  {
482  image->ElementDataFileName("LOCAL");
483  }
484 
485  image->BinaryData(true);
486  image->Name((*it)->GetProperty()->GetName().c_str());
487  this->SetTransform(image, (*it)->GetObjectToParentTransform());
488  metaScene->AddObject(image);
489  }
490 
491  if(!strncmp((*it)->GetTypeName(),"BlobSpatialObject",17))
492  {
494  MetaBlob* blob = converter.BlobSpatialObjectToMetaBlob(
496  (*it).GetPointer()));
497  if((*it)->GetParent())
498  {
499  blob->ParentID((*it)->GetParent()->GetId());
500  }
501  blob->BinaryData(true);
502  blob->Name((*it)->GetProperty()->GetName().c_str());
503  this->SetTransform(blob, (*it)->GetObjectToParentTransform());
504  metaScene->AddObject(blob);
505  }
506 
507  if(!strncmp((*it)->GetTypeName(),"LandmarkSpatialObject",20))
508  {
510  MetaLandmark* landmark = converter.LandmarkSpatialObjectToMetaLandmark(
512  (*it).GetPointer()));
513  if((*it)->GetParent())
514  {
515  landmark->ParentID((*it)->GetParent()->GetId());
516  }
517  landmark->BinaryData(true);
518  landmark->Name((*it)->GetProperty()->GetName().c_str());
519  metaScene->AddObject(landmark);
520  }
521 
522  if(!strncmp((*it)->GetTypeName(),"ContourSpatialObject",20))
523  {
525  MetaContour* contour = converter.ContourSpatialObjectToMetaContour(
527  (*it).GetPointer()));
528  if((*it)->GetParent())
529  {
530  contour->ParentID((*it)->GetParent()->GetId());
531  }
532  contour->BinaryData(true);
533  contour->Name((*it)->GetProperty()->GetName().c_str());
534  metaScene->AddObject(contour);
535  }
536 
537  if(!strncmp((*it)->GetTypeName(),"SurfaceSpatialObject",20))
538  {
540  MetaSurface* surface = converter.SurfaceSpatialObjectToMetaSurface(
542  (*it).GetPointer()));
543  if((*it)->GetParent())
544  {
545  surface->ParentID((*it)->GetParent()->GetId());
546  }
547  surface->Name((*it)->GetProperty()->GetName().c_str());
548  this->SetTransform(surface, (*it)->GetObjectToParentTransform());
549  metaScene->AddObject(surface);
550  }
551 
552  if(!strncmp((*it)->GetTypeName(),"LineSpatialObject",17))
553  {
555  MetaLine* line = converter.LineSpatialObjectToMetaLine(
557  (*it).GetPointer()));
558  if((*it)->GetParent())
559  {
560  line->ParentID((*it)->GetParent()->GetId());
561  }
562  line->Name((*it)->GetProperty()->GetName().c_str());
563  this->SetTransform(line, (*it)->GetObjectToParentTransform());
564  metaScene->AddObject(line);
565  }
566 
567  if(!strncmp((*it)->GetTypeName(),"MeshSpatialObject",17))
568  {
571  MetaMesh* mesh = converter.MeshSpatialObjectToMetaMesh(
572  dynamic_cast<itk::MeshSpatialObject<MeshType>*>((*it).GetPointer()));
573  if((*it)->GetParent())
574  {
575  mesh->ParentID((*it)->GetParent()->GetId());
576  }
577  mesh->Name((*it)->GetProperty()->GetName().c_str());
578  this->SetTransform(mesh, (*it)->GetObjectToParentTransform());
579  metaScene->AddObject(mesh);
580  }
581 
582 
583  it++;
584  }
585 
586  delete childrenList;
587 
588  return metaScene;
589 }
590 
591 
593 template <unsigned int NDimensions, typename PixelType, typename TMeshTraits>
594 bool
596 ::WriteMeta(SceneType * scene, const char* fileName,
597  unsigned int depth, char * soName)
598 {
599  MetaScene * metaScene = this->CreateMetaScene(scene, depth, soName);
600 
601  metaScene->Write(fileName);
602 
603  delete metaScene;
604 
605  return true;
606 }
607 
608 } // end namespace itk
609 
610 
611 #endif

Generated at Sat Feb 2 2013 23:52:46 for Orfeo Toolbox with doxygen 1.8.1.1