Index: mitkDicomSeriesReader.cpp =================================================================== --- mitkDicomSeriesReader.cpp (revision 25204) +++ mitkDicomSeriesReader.cpp (working copy) @@ -28,11 +28,11 @@ typedef itk::GDCMSeriesFileNames DcmFileNamesGeneratorType; -DataNode::Pointer DicomSeriesReader::LoadDicomSeries(const StringContainer &filenames) +DataNode::Pointer DicomSeriesReader::LoadDicomSeries(const StringContainer &filenames, UpdateCallBackMethod callback) { DataNode::Pointer node = DataNode::New(); - if (DicomSeriesReader::LoadDicomSeries(filenames, *node)) + if (DicomSeriesReader::LoadDicomSeries(filenames, *node, callback)) { return node; } @@ -42,7 +42,7 @@ } } -bool DicomSeriesReader::LoadDicomSeries(const StringContainer &filenames, DataNode &node) +bool DicomSeriesReader::LoadDicomSeries(const StringContainer &filenames, DataNode &node, UpdateCallBackMethod callback) { DcmIoType::Pointer io = DcmIoType::New(); @@ -56,34 +56,34 @@ switch (io->GetComponentType()) { case DcmIoType::UCHAR: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::CHAR: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::USHORT: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::SHORT: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::UINT: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::INT: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::ULONG: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::LONG: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::FLOAT: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; case DcmIoType::DOUBLE: - DicomSeriesReader::LoadDicom(filenames, node); + DicomSeriesReader::LoadDicom(filenames, node, callback); return true; default: MITK_ERROR << "Unknown pixel type!"; Index: mitkDicomSeriesReader.h =================================================================== --- mitkDicomSeriesReader.h (revision 25204) +++ mitkDicomSeriesReader.h (working copy) @@ -33,6 +33,8 @@ #include #endif +#include + namespace mitk { @@ -49,16 +51,19 @@ public: typedef std::vector StringContainer; typedef std::map UidFileNamesMap; + typedef void (*UpdateCallBackMethod)(float); /** * Loads a DICOM series composed by the file names enumerated in the file names container. + * If a callback method is supplied, it will be called after every progress update with a progress value in [0,1]. */ - static DataNode::Pointer LoadDicomSeries(const StringContainer &filenames); + static DataNode::Pointer LoadDicomSeries(const StringContainer &filenames, UpdateCallBackMethod callback = 0); /** * Loads a DICOM series composed by the file names enumerated in the file names container. + * If a callback method is supplied, it will be called after every progress update with a progress value in [0,1]. */ - static bool LoadDicomSeries(const StringContainer &filenames, DataNode &node); + static bool LoadDicomSeries(const StringContainer &filenames, DataNode &node, UpdateCallBackMethod callback = 0); /** * Checks if a specific file is a DICOM. @@ -95,11 +100,31 @@ typedef itk::DICOMImageIO2 DcmIoType; #endif + class CallbackCommand : public itk::Command + { + public: + inline CallbackCommand(UpdateCallBackMethod callback) + : m_Callback(callback) + {} + + inline void Execute(const itk::Object *caller, const itk::EventObject&) + { + (*this->m_Callback)(static_cast(caller)->GetProgress()); + } + + inline void Execute(itk::Object *caller, const itk::EventObject&) + { + (*this->m_Callback)(static_cast(caller)->GetProgress()); + } + protected: + UpdateCallBackMethod m_Callback; + }; + /** * Performs the loading of a series and creates an image having the specified pixel type. */ template - static void LoadDicom(const StringContainer &filenames, DataNode &node); + static void LoadDicom(const StringContainer &filenames, DataNode &node, UpdateCallBackMethod callback); #if GDCM_MAJOR_VERSION >= 2 /* Index: mitkDicomSeriesReader.txx =================================================================== --- mitkDicomSeriesReader.txx (revision 25204) +++ mitkDicomSeriesReader.txx (working copy) @@ -31,9 +31,10 @@ { template -void DicomSeriesReader::LoadDicom(const StringContainer &filenames, DataNode &node) +void DicomSeriesReader::LoadDicom(const StringContainer &filenames, DataNode &node, UpdateCallBackMethod callback) { mitk::Image::Pointer image = mitk::Image::New(); + CallbackCommand *command = callback ? new CallbackCommand(callback) : 0; #if GDCM_MAJOR_VERSION >= 2 @@ -83,6 +84,11 @@ reader->SetImageIO(io); reader->ReverseOrderOff(); + if (command) + { + reader->AddObserver(itk::ProgressEvent(), command); + } + const std::list::const_iterator df_end = decomposed_filenames.end(); unsigned int act_volume = 1u; @@ -111,6 +117,11 @@ reader->SetImageIO(io); reader->ReverseOrderOff(); + if (command) + { + reader->AddObserver(itk::ProgressEvent(), command); + } + reader->SetFileNames(filenames); reader->Update(); image->InitializeByItk(reader->GetOutput()); @@ -129,6 +140,11 @@ reader->SetImageIO(io); reader->ReverseOrderOff(); + if (command) + { + reader->AddObserver(itk::ProgressEvent(), command); + } + reader->SetFileNames(filenames); reader->Update(); image->InitializeByItk(reader->GetOutput());