diff --git a/Core/Code/Algorithms/mitkImageTimeSelector.cpp b/Core/Code/Algorithms/mitkImageTimeSelector.cpp index 7fa5352ae7..57a8952a17 100644 --- a/Core/Code/Algorithms/mitkImageTimeSelector.cpp +++ b/Core/Code/Algorithms/mitkImageTimeSelector.cpp @@ -1,78 +1,99 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkImageTimeSelector.h" mitk::ImageTimeSelector::ImageTimeSelector() : m_TimeNr(0), m_ChannelNr(0) { } mitk::ImageTimeSelector::~ImageTimeSelector() { } void mitk::ImageTimeSelector::GenerateOutputInformation() { Image::ConstPointer input = this->GetInput(); Image::Pointer output = this->GetOutput(); itkDebugMacro(<<"GenerateOutputInformation()"); int dim=(input->GetDimension()<3?input->GetDimension():3); output->Initialize(input->GetPixelType(), dim, input->GetDimensions()); if( (unsigned int) m_TimeNr >= input->GetDimension(3) ) { m_TimeNr = input->GetDimension(3)-1; } // initialize geometry - output->SetGeometry(dynamic_cast(input->GetSlicedGeometry(m_TimeNr)->Clone().GetPointer())); + mitk::SlicedGeometry3D::Pointer sliced_geo = input->GetSlicedGeometry(m_TimeNr); + if( sliced_geo.IsNull() ) + { + mitkThrow() << "Failed to retrieve SlicedGeometry from input at timestep " << m_TimeNr; + } + + mitk::SlicedGeometry3D::Pointer sliced_geo_clone = sliced_geo->Clone(); + if( sliced_geo_clone.IsNull() ) + { + mitkThrow() << "Failed to clone the retrieved sliced geometry."; + } + + mitk::Geometry3D::Pointer geom_3d = dynamic_cast(sliced_geo_clone.GetPointer()); + if( geom_3d.IsNotNull() ) + { + output->SetGeometry(geom_3d.GetPointer() ); + } + else + { + mitkThrow() << "Failed to cast the retrieved SlicedGeometry to a Geometry3D object."; + } + output->SetPropertyList(input->GetPropertyList()->Clone()); } void mitk::ImageTimeSelector::GenerateData() { const Image::RegionType& requestedRegion = this->GetOutput()->GetRequestedRegion(); //do we really need a complete volume at a time? if(requestedRegion.GetSize(2)>1) this->SetVolumeItem( this->GetVolumeData(m_TimeNr, m_ChannelNr), 0 ); else //no, so take just a slice! this->SetSliceItem( this->GetSliceData(requestedRegion.GetIndex(2), m_TimeNr, m_ChannelNr), requestedRegion.GetIndex(2), 0 ); } void mitk::ImageTimeSelector::GenerateInputRequestedRegion() { Superclass::GenerateInputRequestedRegion(); ImageToImageFilter::InputImagePointer input = const_cast< mitk::ImageToImageFilter::InputImageType * > ( this->GetInput() ); Image::Pointer output = this->GetOutput(); Image::RegionType requestedRegion; requestedRegion = output->GetRequestedRegion(); requestedRegion.SetIndex(3, m_TimeNr); requestedRegion.SetIndex(4, m_ChannelNr); requestedRegion.SetSize(3, 1); requestedRegion.SetSize(4, 1); input->SetRequestedRegion( & requestedRegion ); } diff --git a/Core/Code/Testing/mitkImageTimeSelectorTest.cpp b/Core/Code/Testing/mitkImageTimeSelectorTest.cpp index 55bbdefde8..249c9a3514 100644 --- a/Core/Code/Testing/mitkImageTimeSelectorTest.cpp +++ b/Core/Code/Testing/mitkImageTimeSelectorTest.cpp @@ -1,90 +1,120 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkImage.h" #include "mitkDataNodeFactory.h" #include "mitkImageTimeSelector.h" +#include "mitkImageGenerator.h" + +#include "mitkTesting.h" +#include "mitkTestingMacros.h" + +#include "mitkIOUtil.h" #include #include -int mitkImageTimeSelectorTest(int argc, char* argv[]) + + +/** Global members common for all subtests */ +namespace { + std::string m_Filename; + mitk::Image::Pointer m_Image; +} // end of anonymous namespace - std::cout << "Loading file: "; - if(argc==0) - { - std::cout<<"no file specified [FAILED]"<SetFileName( argv[1] ); - factory->Update(); - - if(factory->GetNumberOfOutputs()<1) - { - std::cout<<"file could not be loaded [FAILED]"<GetOutput( 0 ); - image = dynamic_cast(node->GetData()); - if(image.IsNull()) - { - std::cout<<"file not an image - test will not be applied [PASSED]"<SetInput(image); - timeSelector->SetTimeNr( 0 ); - timeSelector->UpdateLargestPossibleRegion(); - mitk::Image::Pointer result = timeSelector->GetOutput(); + timeSelector->SetInput(m_Image); - std::cout << "Testing IsInitialized(): "; - if(result->IsInitialized()==false) + // test all timesteps + const unsigned int maxTimeStep = m_Image->GetTimeSteps(); + for( unsigned int t=0; tSetTimeNr(t); + timeSelector->Update(); + + mitk::Image::Pointer currentTimestepImage = timeSelector->GetOutput(); + + std::stringstream ss; + ss << " : Valid image in timestep " << t ; + + MITK_TEST_CONDITION_REQUIRED( currentTimestepImage.IsNotNull() + , ss.str().c_str() ); } - std::cout<<"[PASSED]"<DisconnectPipeline(); - //timeSelector = NULL; - if( result->IsVolumeSet(0) == false) +} + +static void Valid_ImageExpandedByTimestep_ReturnsTrue() +{ + Setup(); + + mitk::ImageTimeSelector::Pointer timeSelector = mitk::ImageTimeSelector::New(); + + const unsigned int maxTimeStep = m_Image->GetTimeSteps(); + mitk::TimeGeometry* tsg = m_Image->GetTimeGeometry(); + mitk::ProportionalTimeGeometry* ptg = dynamic_cast(tsg); + ptg->Expand(maxTimeStep+1); + ptg->SetTimeStepGeometry( ptg->GetGeometryForTimeStep(0), maxTimeStep ); + + mitk::Image::Pointer expandedImage = mitk::Image::New(); + expandedImage->Initialize( m_Image->GetPixelType(0), *tsg ); + + timeSelector->SetInput(expandedImage); + + for( unsigned int t=0; tSetTimeNr(t); + timeSelector->Update(); + + mitk::Image::Pointer currentTimestepImage = timeSelector->GetOutput(); + + std::stringstream ss; + ss << " : Valid image in timestep " << t ; + + MITK_TEST_CONDITION_REQUIRED( currentTimestepImage.IsNotNull() + , ss.str().c_str() ); } - std::cout<<"[PASSED]"<