Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkProbeFilter.h"
00019 #include "mitkSurface.h"
00020 #include "mitkImage.h"
00021 #include "mitkTimeSlicedGeometry.h"
00022
00023 #include <vtkPolyDataSource.h>
00024 #include <vtkProbeFilter.h>
00025 #include <itkImageRegion.h>
00026 #include <vtkDataSet.h>
00027 #include <vtkPolyData.h>
00028 #include <vtkImageData.h>
00029
00030 #include <itkSmartPointerForwardReference.txx>
00031
00032
00033 mitk::ProbeFilter::ProbeFilter()
00034 {
00035
00036 }
00037
00038 mitk::ProbeFilter::~ProbeFilter()
00039 {
00040
00041 }
00042
00043 const mitk::Surface *mitk::ProbeFilter::GetInput(void)
00044 {
00045 if (this->GetNumberOfInputs() < 1)
00046 {
00047 return 0;
00048 }
00049 return static_cast< const mitk::Surface * >(this->ProcessObject::GetInput(0) );
00050 }
00051
00052 const mitk::Image *mitk::ProbeFilter::GetSource(void)
00053 {
00054 return static_cast< const mitk::Image * >(this->ProcessObject::GetInput(1));
00055 }
00056
00057 void mitk::ProbeFilter::SetInput(const mitk::Surface *input)
00058 {
00059 this->ProcessObject::SetNthInput( 0, const_cast< mitk::Surface * >( input ) );
00060 }
00061
00062 void mitk::ProbeFilter::SetSource(const mitk::Image *source)
00063 {
00064 this->ProcessObject::SetNthInput( 1, const_cast< mitk::Image * >( source ) );
00065 }
00066
00067 void mitk::ProbeFilter::GenerateOutputInformation()
00068 {
00069 mitk::Surface::ConstPointer input = this->GetInput();
00070 mitk::Image::ConstPointer source = this->GetSource();
00071 mitk::Surface::Pointer output = this->GetOutput();
00072
00073 if(input.IsNull()) return;
00074 if(source.IsNull()) return;
00075
00076 if(input->GetGeometry()==NULL) return;
00077 if(source->GetGeometry()==NULL) return;
00078
00079 if( (input->GetTimeSlicedGeometry()->GetTimeSteps()==1) && (source->GetTimeSlicedGeometry()->GetTimeSteps()>1) )
00080 {
00081 Geometry3D::Pointer geometry3D = Geometry3D::New();
00082 geometry3D->Initialize();
00083 geometry3D->SetBounds(source->GetTimeSlicedGeometry()->GetBounds());
00084 geometry3D->SetTimeBounds(source->GetTimeSlicedGeometry()->GetGeometry3D(0)->GetTimeBounds());
00085
00086 TimeSlicedGeometry::Pointer outputTimeSlicedGeometry = TimeSlicedGeometry::New();
00087 outputTimeSlicedGeometry->InitializeEvenlyTimed(geometry3D, source->GetTimeSlicedGeometry()->GetTimeSteps());
00088
00089 output->Expand(outputTimeSlicedGeometry->GetTimeSteps());
00090 output->SetGeometry( outputTimeSlicedGeometry );
00091 }
00092 else
00093 output->SetGeometry( static_cast<Geometry3D*>(input->GetGeometry()->Clone().GetPointer()) );
00094
00095 itkDebugMacro(<<"GenerateOutputInformation()");
00096 }
00097
00098 void mitk::ProbeFilter::GenerateData()
00099 {
00100 mitk::Surface *input = const_cast< mitk::Surface * >(this->GetInput());
00101 mitk::Image *source = const_cast< mitk::Image * >(this->GetSource());
00102 mitk::Surface::Pointer output = this->GetOutput();
00103
00104 itkDebugMacro(<<"Generating Data");
00105
00106 if(output.IsNull())
00107 {
00108 itkDebugMacro(<<"Output is NULL.");
00109 return;
00110 }
00111
00112 mitk::Surface::RegionType outputRegion = output->GetRequestedRegion();
00113 const mitk::TimeSlicedGeometry *outputTimeGeometry = output->GetTimeSlicedGeometry();
00114 const mitk::TimeSlicedGeometry *inputTimeGeometry = input->GetTimeSlicedGeometry();
00115 const mitk::TimeSlicedGeometry *sourceTimeGeometry = source->GetTimeSlicedGeometry();
00116 ScalarType timeInMS;
00117 int timestep=0;
00118
00119 int tstart, tmax;
00120
00121 tstart=outputRegion.GetIndex(3);
00122 tmax=tstart+outputRegion.GetSize(3);
00123
00124 int t;
00125 for(t=tstart;t<tmax;++t)
00126 {
00127 timeInMS = outputTimeGeometry->TimeStepToMS( t );
00128
00129 vtkProbeFilter* probe = vtkProbeFilter::New();
00130
00131 timestep = inputTimeGeometry->MSToTimeStep( timeInMS );
00132 probe->SetInput( input->GetVtkPolyData(timestep) );
00133
00134 timestep = sourceTimeGeometry->MSToTimeStep( timeInMS );
00135 probe->SetSource( source->GetVtkImageData(timestep) );
00136
00137 output->SetVtkPolyData( probe->GetPolyDataOutput(), t );
00138
00139 probe->Update();
00140 probe->Delete();
00141 }
00142 }
00143
00144 void mitk::ProbeFilter::GenerateInputRequestedRegion()
00145 {
00146 Superclass::GenerateInputRequestedRegion();
00147
00148 mitk::Surface *input = const_cast< mitk::Surface * >( this->GetInput() );
00149 mitk::Image *source = const_cast< mitk::Image * >( this->GetSource() );
00150
00151 if(input==NULL) return;
00152 if(source==NULL) return;
00153
00154 mitk::Surface::Pointer output = this->GetOutput();
00155 mitk::Surface::RegionType outputRegion = output->GetRequestedRegion();
00156 const mitk::TimeSlicedGeometry *outputTimeGeometry = output->GetTimeSlicedGeometry();
00157
00158 mitk::Surface::RegionType inputSurfaceRegion = outputRegion;
00159 Image::RegionType sourceImageRegion = source->GetLargestPossibleRegion();
00160
00161 if(outputRegion.GetSize(3)<1)
00162 {
00163 mitk::Surface::RegionType::SizeType surfacesize;
00164 surfacesize.Fill(0);
00165 inputSurfaceRegion.SetSize(surfacesize);
00166 input->SetRequestedRegion( &inputSurfaceRegion );
00167 mitk::Image::RegionType::SizeType imagesize;
00168 imagesize.Fill(0);
00169 sourceImageRegion.SetSize(imagesize);
00170 source->SetRequestedRegion( &sourceImageRegion );
00171 return;
00172 }
00173
00174
00175 const mitk::TimeSlicedGeometry *inputTimeGeometry = input->GetTimeSlicedGeometry();
00176
00177 ScalarType timeInMS;
00178 int timestep=0;
00179
00180
00181 timeInMS = outputTimeGeometry->TimeStepToMS(outputRegion.GetIndex(3));
00182 timestep = inputTimeGeometry->MSToTimeStep( timeInMS );
00183 if( ( timeInMS > ScalarTypeNumericTraits::NonpositiveMin() ) && ( inputTimeGeometry->IsValidTime( timestep ) ) )
00184 inputSurfaceRegion.SetIndex( 3, timestep );
00185 else
00186 inputSurfaceRegion.SetIndex( 3, 0 );
00187
00188 timeInMS = outputTimeGeometry->TimeStepToMS(outputRegion.GetIndex(3)+outputRegion.GetSize(3)-1);
00189 timestep = inputTimeGeometry->MSToTimeStep( timeInMS );
00190 if( ( timeInMS > ScalarTypeNumericTraits::NonpositiveMin() ) && ( outputTimeGeometry->IsValidTime( timestep ) ) )
00191 inputSurfaceRegion.SetSize( 3, timestep - inputSurfaceRegion.GetIndex(3) + 1 );
00192 else
00193 inputSurfaceRegion.SetSize( 3, 1 );
00194
00195 input->SetRequestedRegion( &inputSurfaceRegion );
00196
00197
00198 const mitk::TimeSlicedGeometry *sourceTimeGeometry = source->GetTimeSlicedGeometry();
00199
00200
00201 timeInMS = outputTimeGeometry->TimeStepToMS(outputRegion.GetIndex(3));
00202 timestep = sourceTimeGeometry->MSToTimeStep( timeInMS );
00203 if( ( timeInMS > ScalarTypeNumericTraits::NonpositiveMin() ) && ( sourceTimeGeometry->IsValidTime( timestep ) ) )
00204 sourceImageRegion.SetIndex( 3, timestep );
00205 else
00206 sourceImageRegion.SetIndex( 3, 0 );
00207
00208 timeInMS = outputTimeGeometry->TimeStepToMS(outputRegion.GetIndex(3)+outputRegion.GetSize(3)-1);
00209 timestep = sourceTimeGeometry->MSToTimeStep( timeInMS );
00210 if( ( timeInMS > ScalarTypeNumericTraits::NonpositiveMin() ) && ( outputTimeGeometry->IsValidTime( timestep ) ) )
00211 sourceImageRegion.SetSize( 3, timestep - sourceImageRegion.GetIndex(3) + 1 );
00212 else
00213 sourceImageRegion.SetSize( 3, 1 );
00214
00215 sourceImageRegion.SetIndex( 4, 0 );
00216 sourceImageRegion.SetSize( 4, 1 );
00217
00218 source->SetRequestedRegion( &sourceImageRegion );
00219 }