IGSTK
|
00001 /*========================================================================= 00002 00003 Program: Image Guided Surgery Software Toolkit 00004 Module: $RCSfile: igstkDICOMImageReader.h,v $ 00005 Language: C++ 00006 Date: $Date: 2009-06-15 19:54:58 $ 00007 Version: $Revision: 1.18 $ 00008 00009 Copyright (c) ISC Insight Software Consortium. All rights reserved. 00010 See IGSTKCopyright.txt or http://www.igstk.org/copyright.htm for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 #ifndef __igstkDICOMImageReader_h 00018 #define __igstkDICOMImageReader_h 00019 00020 #include "igstkImageReader.h" 00021 00022 #include "igstkEvents.h" 00023 00024 #include "itkImageSeriesReader.h" 00025 #include "itkEventObject.h" 00026 #include "itkGDCMImageIO.h" 00027 #include "itkGDCMSeriesFileNames.h" 00028 00029 00030 namespace igstk 00031 { 00032 00033 #define igstkUnsafeGetMacro(name,type) \ 00034 virtual const type & Get##name () const \ 00035 { \ 00036 igstkLogMacro( CRITICAL, \ 00037 "igstk::DICOMImageReader::Get" #name " unsafe method called...\n"); \ 00038 return this->m_##name; \ 00039 } 00040 00041 00042 igstkEventMacro( DICOMModalityEvent, StringEvent); 00043 igstkEventMacro( DICOMPatientNameEvent, StringEvent); 00044 igstkEventMacro( DICOMImageReaderEvent, StringEvent); 00045 00046 // Invalid request error event 00047 igstkEventMacro( DICOMImageReaderErrorEvent, IGSTKErrorWithStringEvent ); 00048 igstkEventMacro( DICOMInvalidRequestErrorEvent, 00049 DICOMImageReaderErrorEvent ); 00050 00051 // Events to handle errors with the ImageDirectory name 00052 igstkEventMacro(DICOMImageDirectoryEmptyErrorEvent, 00053 DICOMImageReaderErrorEvent ); 00054 igstkEventMacro(DICOMImageDirectoryDoesNotExistErrorEvent, 00055 DICOMImageReaderErrorEvent ); 00056 igstkEventMacro(DICOMImageDirectoryIsNotDirectoryErrorEvent, 00057 DICOMImageReaderErrorEvent ); 00058 igstkEventMacro(DICOMImageDirectoryDoesNotHaveEnoughFilesErrorEvent, 00059 DICOMImageReaderErrorEvent ); 00060 00061 // Image series filename generation error event 00062 igstkEventMacro(DICOMImageSeriesFileNamesGeneratingErrorEvent, 00063 DICOMImageReaderErrorEvent ); 00064 00065 //Image reading error 00066 igstkEventMacro(DICOMImageReadingErrorEvent, 00067 DICOMImageReaderErrorEvent ); 00068 00069 00084 template <class TImageSpatialObject> 00085 class DICOMImageReader : public ImageReader< TImageSpatialObject > 00086 { 00087 00088 public: 00089 00091 igstkStandardTemplatedAbstractClassTraitsMacro( DICOMImageReader, \ 00092 ImageReader< TImageSpatialObject> ) 00093 00094 public: 00095 00098 typedef std::string DirectoryNameType; 00099 00101 void RequestSetDirectory( const DirectoryNameType & directory ); 00102 00103 void RequestSetProgressCallback(itk::Command *progressCallback) 00104 { 00105 m_ImageSeriesReader->AddObserver(itk::ProgressEvent(),progressCallback); 00106 } 00107 00108 void RequestSetAbortCallback(itk::Command *abortCallback) 00109 { 00110 m_ImageSeriesReader->AddObserver(itk::AbortEvent(),abortCallback); 00111 } 00112 00114 void RequestReadImage(); 00115 00117 void RequestGetModalityInformation(); 00118 00120 void RequestGetPatientNameInformation(); 00121 00123 typedef std::string DICOMInformationType; 00124 00129 bool FileSuccessfullyRead() const { return m_FileSuccessfullyRead; } 00130 00137 igstkUnsafeGetMacro( PatientName, DICOMInformationType ); 00138 00145 igstkUnsafeGetMacro( PatientID, DICOMInformationType ); 00146 00153 igstkUnsafeGetMacro( Modality, DICOMInformationType ); 00154 00156 void RequestGetImage(); 00157 00159 igstkLoadedTemplatedObjectEventMacro( ImageModifiedEvent, IGSTKEvent, 00160 TImageSpatialObject); 00161 00163 igstkLoggerMacro(); 00164 00165 protected: 00166 00167 DICOMImageReader( void ); 00168 ~DICOMImageReader( void ); 00169 00171 itk::GDCMSeriesFileNames::Pointer m_FileNames; 00172 itk::GDCMImageIO::Pointer m_ImageIO; 00173 00174 typedef typename Superclass::ImageType ImageType; 00175 00176 typedef itk::ImageSeriesReader< ImageType > ImageSeriesReaderType; 00177 typedef itk::ImageFileReader< ImageType > ImageReaderType; 00178 00180 typename ImageSeriesReaderType::Pointer m_ImageSeriesReader; 00181 typename ImageReaderType::Pointer m_ImageFileReader; 00182 00184 void PrintSelf( std::ostream& os, itk::Indent indent ) const; 00185 00188 virtual const ImageType * GetITKImage() const; 00189 00190 private: 00191 00194 DICOMImageReader(const Self&); //purposely not implemented 00195 void operator=(const Self&); //purposely not implemented 00196 00197 00198 DirectoryNameType m_ImageDirectoryName; 00199 DirectoryNameType m_ImageDirectoryNameToBeSet; 00200 00202 igstkDeclareStateMacro( Idle ); 00203 igstkDeclareStateMacro( ImageDirectoryNameRead ); 00204 igstkDeclareStateMacro( AttemptingToReadImage ); 00205 igstkDeclareStateMacro( ImageSeriesFileNamesGenerated ); 00206 igstkDeclareStateMacro( ImageRead ); 00207 00209 igstkDeclareInputMacro( ReadImage ); 00210 igstkDeclareInputMacro( ImageDirectoryNameValid ); 00211 igstkDeclareInputMacro( ImageReadingSuccess ); 00212 igstkDeclareInputMacro( ImageSeriesFileNamesGeneratingSuccess ); 00213 igstkDeclareInputMacro( ResetReader ); 00214 igstkDeclareInputMacro( GetImage ); 00215 00217 igstkDeclareInputMacro( ImageReadingError ); 00218 igstkDeclareInputMacro( ImageDirectoryNameIsEmpty ); 00219 igstkDeclareInputMacro( ImageDirectoryNameDoesNotExist ); 00220 igstkDeclareInputMacro( ImageDirectoryNameIsNotDirectory ); 00221 igstkDeclareInputMacro( ImageDirectoryNameDoesNotHaveEnoughFiles ); 00222 igstkDeclareInputMacro( ImageSeriesFileNamesGeneratingError ); 00223 00229 virtual bool CheckModalityType( DICOMInformationType modality ); 00230 00232 igstkDeclareInputMacro( GetModalityInformation ); 00233 igstkDeclareInputMacro( GetPatientNameInformation ); 00234 00236 void SetDirectoryNameProcessing(); 00237 00240 void ReadDirectoryFileNamesProcessing(); 00241 00243 void AttemptReadImageProcessing(); 00244 00247 void ReportInvalidRequestProcessing(); 00248 00250 void ReportImageDirectoryEmptyErrorProcessing(); 00251 00253 void ReportImageDirectoryDoesNotExistErrorProcessing(); 00254 00257 void ReportImageDirectoryDoesNotHaveEnoughFilesErrorProcessing(); 00258 00261 void ReportImageSeriesFileNamesGeneratingErrorProcessing(); 00262 00265 void ReportImageSeriesFileNamesGeneratingSuccessProcessing(); 00266 00268 void ReportImageReadingErrorProcessing(); 00269 00271 void ReportImageReadingSuccessProcessing(); 00272 00274 void ReportImageProcessing(); 00275 00277 void ResetReaderProcessing(); 00278 00281 void ReportImageDirectoryIsNotDirectoryErrorProcessing(); 00282 00285 void GetModalityInformationProcessing(); 00286 00289 void GetPatientNameInformationProcessing(); 00290 00292 bool m_FileSuccessfullyRead; 00293 00295 DICOMInformationType m_PatientID; 00296 DICOMInformationType m_PatientName; 00297 DICOMInformationType m_Modality; 00298 DICOMInformationType m_GantryTilt; 00299 00301 std::string m_ImageReadingErrorInformation; 00302 }; 00303 00304 } // end namespace igstk 00305 00306 #ifndef IGSTK_MANUAL_INSTANTIATION 00307 #include "igstkDICOMImageReader.txx" 00308 #endif 00309 00310 #endif // __igstkDICOMImageReader_h