Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkImageTimeSelector.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 #include "mitkImageTimeSelector.h"
14 
15 mitk::ImageTimeSelector::ImageTimeSelector() : m_TimeNr(0), m_ChannelNr(0)
16 {
17 }
18 
20 {
21 }
22 
24 {
25  Image::ConstPointer input = this->GetInput();
26  Image::Pointer output = this->GetOutput();
27 
28  itkDebugMacro(<< "GenerateOutputInformation()");
29 
30  int dim = (input->GetDimension() < 3 ? input->GetDimension() : 3);
31  output->Initialize(input->GetPixelType(), dim, input->GetDimensions());
32 
33  if ((unsigned int)m_TimeNr >= input->GetDimension(3))
34  {
35  m_TimeNr = input->GetDimension(3) - 1;
36  }
37 
38  // initialize geometry
39  mitk::SlicedGeometry3D::Pointer sliced_geo = input->GetSlicedGeometry(m_TimeNr);
40  if (sliced_geo.IsNull())
41  {
42  mitkThrow() << "Failed to retrieve SlicedGeometry from input at timestep " << m_TimeNr;
43  }
44 
45  mitk::SlicedGeometry3D::Pointer sliced_geo_clone = sliced_geo->Clone();
46  if (sliced_geo_clone.IsNull())
47  {
48  mitkThrow() << "Failed to clone the retrieved sliced geometry.";
49  }
50 
51  mitk::BaseGeometry::Pointer geom_3d = dynamic_cast<BaseGeometry *>(sliced_geo_clone.GetPointer());
52  if (geom_3d.IsNotNull())
53  {
54  output->SetGeometry(geom_3d.GetPointer());
55  }
56  else
57  {
58  mitkThrow() << "Failed to cast the retrieved SlicedGeometry to a Geometry3D object.";
59  }
60 
61  output->SetPropertyList(input->GetPropertyList()->Clone());
62 }
63 
65 {
66  const Image::RegionType &requestedRegion = this->GetOutput()->GetRequestedRegion();
67 
68  // do we really need a complete volume at a time?
69  if (requestedRegion.GetSize(2) > 1)
70  {
72  im->SetTimestep(0);
73  im->SetManageMemory(false);
74  this->SetVolumeItem(im, 0);
75  }
76  else
77  // no, so take just a slice!
78  this->SetSliceItem(
79  this->GetSliceData(requestedRegion.GetIndex(2), m_TimeNr, m_ChannelNr), requestedRegion.GetIndex(2), 0);
80 }
81 
83 {
85 
87  Image::Pointer output = this->GetOutput();
88 
89  Image::RegionType requestedRegion;
90  requestedRegion = output->GetRequestedRegion();
91  requestedRegion.SetIndex(3, m_TimeNr);
92  requestedRegion.SetIndex(4, m_ChannelNr);
93  requestedRegion.SetSize(3, 1);
94  requestedRegion.SetSize(4, 1);
95 
96  input->SetRequestedRegion(&requestedRegion);
97 }
void GenerateOutputInformation() override
mitk::Image::ImageDataItemPointer GetVolumeData(int t=0, int n=0)
void GenerateInputRequestedRegion() override
mitk::Image::ImageDataItemPointer GetSliceData(int s=0, int t=0, int n=0)
void SetSliceItem(mitk::Image::ImageDataItemPointer dataItem, int s=0, int t=0, int n=0)
itk::ImageRegion< RegionDimension > RegionType
#define mitkThrow()
void SetVolumeItem(mitk::Image::ImageDataItemPointer dataItem, int t=0, int n=0)
InputImageType * GetInput(void)
OutputType * GetOutput()
Get the output data of this image source object.
void GenerateInputRequestedRegion() override
BaseGeometry Describes the geometry of a data object.