diff --git a/Modules/DICOMReaderServices/files.cmake b/Modules/DICOMReaderServices/files.cmake index c16bb0e0c0..a71695bdc3 100644 --- a/Modules/DICOMReaderServices/files.cmake +++ b/Modules/DICOMReaderServices/files.cmake @@ -1,7 +1,9 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES + mitkBaseDICOMReaderService.cpp mitkAutoSelectingDICOMReaderService.cpp + mitkClassicDICOMSeriesReaderService.cpp mitkDICOMReaderServicesActivator.cpp mitkDICOMFilesHelper.cpp ) diff --git a/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h b/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h index 6b67339cc5..9604cf407c 100644 --- a/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h +++ b/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h @@ -1,43 +1,45 @@ /*=================================================================== 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. ===================================================================*/ #ifndef MITKAUTOSELECTINGDICOMREADERSERVICE_H #define MITKAUTOSELECTINGDICOMREADERSERVICE_H -#include <mitkAbstractFileReader.h> +#include <mitkBaseDICOMReaderService.h> namespace mitk { /** Service wrapper that auto selects (using the mitk::DICOMFileReaderSelector) the best DICOMFileReader from the DICOMReader module. */ -class AutoSelectingDICOMReaderService : public AbstractFileReader +class AutoSelectingDICOMReaderService : public BaseDICOMReaderService { public: AutoSelectingDICOMReaderService(); - using AbstractFileReader::Read; - virtual std::vector<itk::SmartPointer<BaseData> > Read() override; +protected: + /** Returns the reader instance that should be used. The descission may be based + * one the passed relevant file list.*/ + virtual mitk::DICOMFileReader::Pointer GetReader(const mitk::StringList& relevantFiles) const override; private: virtual AutoSelectingDICOMReaderService* Clone() const override; }; } #endif // MITKDICOMSERIESREADERSERVICE_H diff --git a/Modules/DICOMReaderServices/include/mitkBaseDICOMReaderService.h b/Modules/DICOMReaderServices/include/mitkBaseDICOMReaderService.h new file mode 100644 index 0000000000..f99a76d50e --- /dev/null +++ b/Modules/DICOMReaderServices/include/mitkBaseDICOMReaderService.h @@ -0,0 +1,52 @@ +/*=================================================================== + +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. + +===================================================================*/ + +#ifndef MITKBASEDICOMREADERSERVICE_H +#define MITKBASEDICOMREADERSERVICE_H + +#include <mitkAbstractFileReader.h> +#include <mitkDICOMFileReader.h> + +namespace mitk { + + /** + Base class for service wrappers that make DICOMFileReader from + the DICOMReader module usable. + */ +class BaseDICOMReaderService : public AbstractFileReader +{ +public: + BaseDICOMReaderService(const std::string& description); + + using AbstractFileReader::Read; + + /** Uses this->GetRelevantFile() and this->GetReader to load the image. + * data and puts it into base data instances-*/ + virtual std::vector<itk::SmartPointer<BaseData> > Read() override; + +protected: + /** Returns the list of all DCM files that are in the same directory + * like this->GetLocalFileName().*/ + mitk::StringList GetRelevantFiles() const; + + /** Returns the reader instance that should be used. The descission may be based + * one the passed relevant file list.*/ + virtual mitk::DICOMFileReader::Pointer GetReader(const mitk::StringList& relevantFiles) const = 0; +}; + +} + +#endif // MITKBASEDICOMREADERSERVICE_H diff --git a/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h b/Modules/DICOMReaderServices/include/mitkClassicDICOMSeriesReaderService.h similarity index 54% copy from Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h copy to Modules/DICOMReaderServices/include/mitkClassicDICOMSeriesReaderService.h index 6b67339cc5..aabc3a73ac 100644 --- a/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h +++ b/Modules/DICOMReaderServices/include/mitkClassicDICOMSeriesReaderService.h @@ -1,43 +1,45 @@ /*=================================================================== 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. ===================================================================*/ -#ifndef MITKAUTOSELECTINGDICOMREADERSERVICE_H -#define MITKAUTOSELECTINGDICOMREADERSERVICE_H +#ifndef MITKCLASSICDICOMSERIESREADERSERVICE_H +#define MITKCLASSICDICOMSERIESREADERSERVICE_H -#include <mitkAbstractFileReader.h> +#include <mitkBaseDICOMReaderService.h> namespace mitk { /** Service wrapper that auto selects (using the mitk::DICOMFileReaderSelector) the best DICOMFileReader from the DICOMReader module. */ -class AutoSelectingDICOMReaderService : public AbstractFileReader +class ClassicDICOMSeriesReaderService : public BaseDICOMReaderService { public: - AutoSelectingDICOMReaderService(); + ClassicDICOMSeriesReaderService(); - using AbstractFileReader::Read; - virtual std::vector<itk::SmartPointer<BaseData> > Read() override; +protected: + /** Returns the reader instance that should be used. The descission may be based + * one the passed relevant file list.*/ + virtual mitk::DICOMFileReader::Pointer GetReader(const mitk::StringList& relevantFiles) const override; private: + virtual ClassicDICOMSeriesReaderService* Clone() const override; - virtual AutoSelectingDICOMReaderService* Clone() const override; }; } -#endif // MITKDICOMSERIESREADERSERVICE_H +#endif // MITKCLASSICDICOMSERIESREADERSERVICE_H diff --git a/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp b/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp index 299656c432..fd3a88ccb6 100644 --- a/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp +++ b/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp @@ -1,92 +1,46 @@ /*=================================================================== 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 "mitkAutoSelectingDICOMReaderService.h" -#include <mitkCustomMimeType.h> -#include <mitkIOMimeTypes.h> #include <mitkDICOMFileReaderSelector.h> -#include <mitkImage.h> -#include <mitkDICOMFilesHelper.h> - -#include <iostream> namespace mitk { AutoSelectingDICOMReaderService::AutoSelectingDICOMReaderService() - : AbstractFileReader(CustomMimeType(IOMimeTypes::DICOM_MIMETYPE()), "MITK DICOM Reader (auto)") + : BaseDICOMReaderService("MITK DICOM Reader (auto)") { this->RegisterService(); } -std::vector<itk::SmartPointer<BaseData> > AutoSelectingDICOMReaderService::Read() +DICOMFileReader::Pointer AutoSelectingDICOMReaderService::GetReader(const mitk::StringList& relevantFiles) const { - std::vector<BaseData::Pointer> result; - std::string fileName = this->GetLocalFileName(); - - mitk::StringList relevantFiles = mitk::GetDICOMFilesInSameDirectory(fileName); - mitk::DICOMFileReaderSelector::Pointer selector = mitk::DICOMFileReaderSelector::New(); selector->LoadBuiltIn3DConfigs(); selector->LoadBuiltIn3DnTConfigs(); selector->SetInputFiles(relevantFiles); mitk::DICOMFileReader::Pointer reader = selector->GetFirstReaderWithMinimumNumberOfOutputImages(); - - reader->SetInputFiles(relevantFiles); - reader->AnalyzeInputFiles(); - reader->LoadImages(); - - for (unsigned int i = 0; i < reader->GetNumberOfOutputs(); ++i) - { - const mitk::DICOMImageBlockDescriptor& desc = reader->GetOutput(i); - mitk::BaseData::Pointer data = desc.GetMitkImage(); - - std::string nodeName = "Unnamed_DICOM"; - - std::string studyDescription = desc.GetPropertyAsString("studyDescription"); - std::string seriesDescription = desc.GetPropertyAsString("seriesDescription"); - - if (!studyDescription.empty()) - { - nodeName = studyDescription; - } - - if (!seriesDescription.empty()) - { - if (!studyDescription.empty()) - { - nodeName += "/"; - } - nodeName += seriesDescription; - } - - StringProperty::Pointer nameProp = StringProperty::New(nodeName); - data->SetProperty("name", nameProp); - - result.push_back(data); - } - - return result; -} + return reader; +}; AutoSelectingDICOMReaderService* AutoSelectingDICOMReaderService::Clone() const { return new AutoSelectingDICOMReaderService(*this); } } diff --git a/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp b/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp similarity index 70% copy from Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp copy to Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp index 299656c432..8ed3f0267e 100644 --- a/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp +++ b/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp @@ -1,92 +1,88 @@ /*=================================================================== 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 "mitkAutoSelectingDICOMReaderService.h" +#include "mitkBaseDICOMReaderService.h" #include <mitkCustomMimeType.h> #include <mitkIOMimeTypes.h> #include <mitkDICOMFileReaderSelector.h> #include <mitkImage.h> #include <mitkDICOMFilesHelper.h> #include <iostream> namespace mitk { -AutoSelectingDICOMReaderService::AutoSelectingDICOMReaderService() - : AbstractFileReader(CustomMimeType(IOMimeTypes::DICOM_MIMETYPE()), "MITK DICOM Reader (auto)") + BaseDICOMReaderService::BaseDICOMReaderService(const std::string& description) + : AbstractFileReader(CustomMimeType(IOMimeTypes::DICOM_MIMETYPE()), description) { - this->RegisterService(); } -std::vector<itk::SmartPointer<BaseData> > AutoSelectingDICOMReaderService::Read() +std::vector<itk::SmartPointer<BaseData> > BaseDICOMReaderService::Read() { std::vector<BaseData::Pointer> result; - std::string fileName = this->GetLocalFileName(); - - mitk::StringList relevantFiles = mitk::GetDICOMFilesInSameDirectory(fileName); - - mitk::DICOMFileReaderSelector::Pointer selector = mitk::DICOMFileReaderSelector::New(); - - selector->LoadBuiltIn3DConfigs(); - selector->LoadBuiltIn3DnTConfigs(); - selector->SetInputFiles(relevantFiles); + mitk::StringList relevantFiles = this->GetRelevantFiles(); - mitk::DICOMFileReader::Pointer reader = selector->GetFirstReaderWithMinimumNumberOfOutputImages(); + mitk::DICOMFileReader::Pointer reader = this->GetReader(relevantFiles); reader->SetInputFiles(relevantFiles); reader->AnalyzeInputFiles(); reader->LoadImages(); for (unsigned int i = 0; i < reader->GetNumberOfOutputs(); ++i) { const mitk::DICOMImageBlockDescriptor& desc = reader->GetOutput(i); mitk::BaseData::Pointer data = desc.GetMitkImage(); std::string nodeName = "Unnamed_DICOM"; std::string studyDescription = desc.GetPropertyAsString("studyDescription"); std::string seriesDescription = desc.GetPropertyAsString("seriesDescription"); if (!studyDescription.empty()) { nodeName = studyDescription; } if (!seriesDescription.empty()) { if (!studyDescription.empty()) { nodeName += "/"; } nodeName += seriesDescription; } StringProperty::Pointer nameProp = StringProperty::New(nodeName); data->SetProperty("name", nameProp); result.push_back(data); } return result; } -AutoSelectingDICOMReaderService* AutoSelectingDICOMReaderService::Clone() const +StringList BaseDICOMReaderService::GetRelevantFiles() const { - return new AutoSelectingDICOMReaderService(*this); + std::string fileName = this->GetLocalFileName(); + + mitk::StringList relevantFiles = mitk::GetDICOMFilesInSameDirectory(fileName); + + return relevantFiles; } + } diff --git a/Modules/DICOMReaderServices/src/mitkClassicDICOMSeriesReaderService.cpp b/Modules/DICOMReaderServices/src/mitkClassicDICOMSeriesReaderService.cpp new file mode 100644 index 0000000000..b99e609ec3 --- /dev/null +++ b/Modules/DICOMReaderServices/src/mitkClassicDICOMSeriesReaderService.cpp @@ -0,0 +1,41 @@ +/*=================================================================== + +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 "mitkClassicDICOMSeriesReaderService.h" + +#include <mitkClassicDICOMSeriesReader.h> + +namespace mitk { + + ClassicDICOMSeriesReaderService::ClassicDICOMSeriesReaderService() + : BaseDICOMReaderService("MITK DICOM Reader(2013 classic style)") +{ + this->RegisterService(); +} + + DICOMFileReader::Pointer ClassicDICOMSeriesReaderService::GetReader(const mitk::StringList& relevantFiles) const +{ + mitk::ClassicDICOMSeriesReader::Pointer reader = mitk::ClassicDICOMSeriesReader::New(); + return reader.GetPointer(); +}; + + + ClassicDICOMSeriesReaderService* ClassicDICOMSeriesReaderService::Clone() const + { + return new ClassicDICOMSeriesReaderService(*this); + } + +} diff --git a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp index 4ad13a18f9..14c76fc2b4 100644 --- a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp +++ b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp @@ -1,34 +1,36 @@ /*=================================================================== 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 "mitkDICOMReaderServicesActivator.h" #include "mitkAutoSelectingDICOMReaderService.h" +#include "mitkClassicDICOMSeriesReaderService.h" namespace mitk { void DICOMReaderServicesActivator::Load(us::ModuleContext*) { m_AutoSelectingDICOMReader.reset(new AutoSelectingDICOMReaderService()); + m_ClassicDICOMSeriesReader.reset(new ClassicDICOMSeriesReaderService()); } void DICOMReaderServicesActivator::Unload(us::ModuleContext*) { } } US_EXPORT_MODULE_ACTIVATOR(mitk::DICOMReaderServicesActivator) diff --git a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h index c93d3bdbae..c128e96451 100644 --- a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h +++ b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h @@ -1,42 +1,43 @@ /*=================================================================== 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. ===================================================================*/ #ifndef MITKDICOMREADERSERVICESACTIVATOR_H #define MITKDICOMREADERSERVICESACTIVATOR_H #include <usModuleActivator.h> #include <memory> namespace mitk { struct IFileReader; class DICOMReaderServicesActivator : public us::ModuleActivator { public: void Load(us::ModuleContext*context) override; void Unload(us::ModuleContext* context) override; private: std::unique_ptr<IFileReader> m_AutoSelectingDICOMReader; + std::unique_ptr<IFileReader> m_ClassicDICOMSeriesReader; }; } #endif // MITKDICOMREADERSERVICESACTIVATOR_H