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
00019 #include "mitkSlicedData.h"
00020 #include "mitkBaseProcess.h"
00021 #include <itkSmartPointerForwardReference.txx>
00022
00023
00024 mitk::SlicedData::SlicedData() : m_UseLargestPossibleRegion(false)
00025 {
00026 unsigned int i;
00027 for(i=0;i<4;++i)
00028 {
00029 m_LargestPossibleRegion.SetIndex(i, 0);
00030 m_LargestPossibleRegion.SetSize (i, 1);
00031 }
00032 }
00033
00034 mitk::SlicedData::~SlicedData()
00035 {
00036 }
00037
00038 void mitk::SlicedData::UpdateOutputInformation()
00039 {
00040 Superclass::UpdateOutputInformation();
00041
00042 if (this->GetSource() == false)
00043
00044
00045 {
00046 m_UseLargestPossibleRegion = true;
00047 }
00048
00049
00050
00051
00052
00053 if ( ! m_RequestedRegionInitialized)
00054 {
00055 this->SetRequestedRegionToLargestPossibleRegion();
00056 m_RequestedRegionInitialized = true;
00057 }
00058
00059 m_LastRequestedRegionWasOutsideOfTheBufferedRegion = 0;
00060 }
00061
00062 void mitk::SlicedData::PrepareForNewData()
00063 {
00064 if ( GetUpdateMTime() < GetPipelineMTime() || GetDataReleased() )
00065 {
00066 ReleaseData();
00067 }
00068 }
00069
00070 void mitk::SlicedData::SetRequestedRegionToLargestPossibleRegion()
00071 {
00072 m_UseLargestPossibleRegion = true;
00073 if(GetGeometry()==NULL)
00074 return;
00075 unsigned int i;
00076 const RegionType::IndexType & index = GetLargestPossibleRegion().GetIndex();
00077 const RegionType::SizeType & size = GetLargestPossibleRegion().GetSize();
00078 for(i=0;i<RegionDimension;++i)
00079 {
00080 m_RequestedRegion.SetIndex(i, index[i]);
00081 m_RequestedRegion.SetSize(i, size[i]);
00082 }
00083 }
00084
00085 bool mitk::SlicedData::RequestedRegionIsOutsideOfTheBufferedRegion()
00086 {
00087
00088
00089
00090
00091
00092 const IndexType &requestedRegionIndex = m_RequestedRegion.GetIndex();
00093
00094 const SizeType& requestedRegionSize = m_RequestedRegion.GetSize();
00095 const SizeType& largestPossibleRegionSize
00096 = GetLargestPossibleRegion().GetSize();
00097
00098
00099 int c, cEnd;
00100 c=requestedRegionIndex[4];
00101 cEnd=c+static_cast<long>(requestedRegionSize[4]);
00102 if(requestedRegionSize[3] == largestPossibleRegionSize[3])
00103 {
00104 for (; c< cEnd; ++c)
00105 if(IsChannelSet(c)==false) return true;
00106 return false;
00107 }
00108
00109
00110 int t, tEnd;
00111 t=requestedRegionIndex[3];
00112 tEnd=t+static_cast<long>(requestedRegionSize[3]);
00113 if(requestedRegionSize[2] == largestPossibleRegionSize[2])
00114 {
00115 for (; c< cEnd; ++c)
00116 for (; t< tEnd; ++t)
00117 if(IsVolumeSet(t, c)==false) return true;
00118 return false;
00119 }
00120
00121
00122 int s, sEnd;
00123 s=requestedRegionIndex[2];
00124 sEnd=s+static_cast<long>(requestedRegionSize[2]);
00125 for (; c< cEnd; ++c)
00126 for (; t< tEnd; ++t)
00127 for (; s< sEnd; ++s)
00128 if(IsSliceSet(s, t, c)==false) return true;
00129
00130 return false;
00131 }
00132
00133 bool mitk::SlicedData::VerifyRequestedRegion()
00134 {
00135 if(GetTimeSlicedGeometry() == NULL) return false;
00136
00137 unsigned int i;
00138
00139
00140
00141
00142 const IndexType &requestedRegionIndex = m_RequestedRegion.GetIndex();
00143 const IndexType &largestPossibleRegionIndex
00144 = GetLargestPossibleRegion().GetIndex();
00145
00146 const SizeType& requestedRegionSize = m_RequestedRegion.GetSize();
00147 const SizeType& largestPossibleRegionSize
00148 = GetLargestPossibleRegion().GetSize();
00149
00150 for (i=0; i< RegionDimension; ++i)
00151 {
00152 if ( (requestedRegionIndex[i] < largestPossibleRegionIndex[i]) ||
00153 ((requestedRegionIndex[i] + static_cast<long>(requestedRegionSize[i]))
00154 > (largestPossibleRegionIndex[i]+static_cast<long>(largestPossibleRegionSize[i]))))
00155 {
00156 return false;
00157 }
00158 }
00159
00160 return true;
00161 }
00162
00163 void mitk::SlicedData::SetRequestedRegion(itk::DataObject *data)
00164 {
00165 m_UseLargestPossibleRegion=false;
00166
00167 mitk::SlicedData *slicedData;
00168
00169 slicedData = dynamic_cast<mitk::SlicedData*>(data);
00170
00171 if (slicedData)
00172 {
00173 m_RequestedRegion = slicedData->GetRequestedRegion();
00174 m_RequestedRegionInitialized = true;
00175 }
00176 else
00177 {
00178
00179 itkExceptionMacro( << "mitk::SlicedData::SetRequestedRegion(DataObject*) cannot cast " << typeid(data).name() << " to " << typeid(SlicedData*).name() );
00180 }
00181 }
00182
00183 void mitk::SlicedData::SetRequestedRegion(SlicedData::RegionType *region)
00184 {
00185 m_UseLargestPossibleRegion=false;
00186
00187 if(region!=NULL)
00188 {
00189 m_RequestedRegion = *region;
00190 m_RequestedRegionInitialized = true;
00191 }
00192 else
00193 {
00194
00195 itkExceptionMacro( << "mitk::SlicedData::SetRequestedRegion(SlicedData::RegionType*) cannot cast " << typeid(region).name() << " to " << typeid(SlicedData*).name() );
00196 }
00197 }
00198
00199 void mitk::SlicedData::CopyInformation(const itk::DataObject *data)
00200 {
00201
00202 Superclass::CopyInformation(data);
00203
00204 const mitk::SlicedData *slicedData;
00205
00206 slicedData = dynamic_cast<const mitk::SlicedData*>(data);
00207
00208 if (slicedData)
00209 {
00210 m_LargestPossibleRegion = slicedData->GetLargestPossibleRegion();
00211 }
00212 else
00213 {
00214
00215 itkExceptionMacro( << "mitk::SlicedData::CopyInformation(const DataObject *data) cannot cast " << typeid(data).name() << " to " << typeid(SlicedData*).name() );
00216 }
00217 }
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 mitk::SlicedGeometry3D* mitk::SlicedData::GetSlicedGeometry(unsigned int t) const
00229 {
00230 if(GetTimeSlicedGeometry() == NULL)
00231 return NULL;
00232 return dynamic_cast<SlicedGeometry3D*>(GetTimeSlicedGeometry()->GetGeometry3D(t));
00233 }
00234
00235 const mitk::SlicedGeometry3D* mitk::SlicedData::GetUpdatedSlicedGeometry(unsigned int t)
00236 {
00237 SetRequestedRegionToLargestPossibleRegion();
00238
00239 UpdateOutputInformation();
00240
00241 return GetSlicedGeometry(t);
00242 }
00243
00244 void mitk::SlicedData::SetGeometry(Geometry3D* aGeometry3D)
00245 {
00246 if(aGeometry3D!=NULL)
00247 {
00248 TimeSlicedGeometry::Pointer timeSlicedGeometry = dynamic_cast<TimeSlicedGeometry*>(aGeometry3D);
00249 if(timeSlicedGeometry.IsNull())
00250 {
00251 SlicedGeometry3D::Pointer slicedGeometry = dynamic_cast<SlicedGeometry3D*>(aGeometry3D);
00252 if(slicedGeometry.IsNull())
00253 {
00254 Geometry2D* geometry2d = dynamic_cast<Geometry2D*>(aGeometry3D);
00255 if(geometry2d!=NULL)
00256 {
00257 if((GetSlicedGeometry()->GetGeometry2D(0)==geometry2d) && (GetSlicedGeometry()->GetSlices()==1))
00258 return;
00259 slicedGeometry = SlicedGeometry3D::New();
00260 slicedGeometry->InitializeEvenlySpaced(geometry2d, 1);
00261 }
00262 else
00263 {
00264 slicedGeometry = SlicedGeometry3D::New();
00265 PlaneGeometry::Pointer planeGeometry = PlaneGeometry::New();
00266 planeGeometry->InitializeStandardPlane(aGeometry3D);
00267 slicedGeometry->InitializeEvenlySpaced(planeGeometry, (unsigned int)(aGeometry3D->GetExtent(2)));
00268 }
00269 }
00270 assert(slicedGeometry.IsNotNull());
00271
00272 timeSlicedGeometry = TimeSlicedGeometry::New();
00273 timeSlicedGeometry->InitializeEvenlyTimed(slicedGeometry, 1);
00274 }
00275 Superclass::SetGeometry(timeSlicedGeometry);
00276 }
00277 else
00278 {
00279 if(GetGeometry()==NULL)
00280 return;
00281 Superclass::SetGeometry(NULL);
00282 }
00283 }
00284
00285 void mitk::SlicedData::SetSpacing(const float aSpacing[3])
00286 {
00287 this->SetSpacing((mitk::Vector3D)aSpacing);
00288 }
00289
00290 void mitk::SlicedData::SetOrigin(const mitk::Point3D& origin)
00291 {
00292 mitk::TimeSlicedGeometry* timeSlicedGeometry = GetTimeSlicedGeometry();
00293
00294 assert(timeSlicedGeometry!=NULL);
00295
00296 mitk::SlicedGeometry3D* slicedGeometry;
00297
00298 unsigned int steps = timeSlicedGeometry->GetTimeSteps();
00299
00300 for(unsigned int timestep = 0; timestep < steps; ++timestep)
00301 {
00302 slicedGeometry = GetSlicedGeometry(timestep);
00303 if(slicedGeometry != NULL)
00304 {
00305 slicedGeometry->SetOrigin(origin);
00306 if(slicedGeometry->GetEvenlySpaced())
00307 {
00308 mitk::Geometry2D* geometry2D = slicedGeometry->GetGeometry2D(0);
00309 geometry2D->SetOrigin(origin);
00310 slicedGeometry->InitializeEvenlySpaced(geometry2D, slicedGeometry->GetSlices());
00311 }
00312 }
00313 if(GetTimeSlicedGeometry()->GetEvenlyTimed())
00314 {
00315 GetTimeSlicedGeometry()->InitializeEvenlyTimed(slicedGeometry, steps);
00316 break;
00317 }
00318 }
00319 }
00320
00321 void mitk::SlicedData::SetSpacing(mitk::Vector3D aSpacing)
00322 {
00323 mitk::TimeSlicedGeometry* timeSlicedGeometry = GetTimeSlicedGeometry();
00324
00325 assert(timeSlicedGeometry!=NULL);
00326
00327 mitk::SlicedGeometry3D* slicedGeometry;
00328
00329 unsigned int steps = timeSlicedGeometry->GetTimeSteps();
00330
00331 for(unsigned int timestep = 0; timestep < steps; ++timestep)
00332 {
00333 slicedGeometry = GetSlicedGeometry(timestep);
00334 if(slicedGeometry != NULL)
00335 {
00336 slicedGeometry->SetSpacing(aSpacing);
00337 }
00338 if(GetTimeSlicedGeometry()->GetEvenlyTimed())
00339 {
00340 GetTimeSlicedGeometry()->InitializeEvenlyTimed(slicedGeometry, steps);
00341 break;
00342 }
00343 }
00344 }
00345
00346