diff --git a/Modules/DICOMReader/files.cmake b/Modules/DICOMReader/files.cmake index 691c000235..15f31f5caf 100644 --- a/Modules/DICOMReader/files.cmake +++ b/Modules/DICOMReader/files.cmake @@ -1,38 +1,39 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES mitkDICOMFileReader.cpp mitkDICOMGDCMTagScanner.cpp mitkDICOMImageBlockDescriptor.cpp mitkDICOMITKSeriesGDCMReader.cpp mitkDICOMDatasetSorter.cpp mitkDICOMTagBasedSorter.cpp mitkDICOMGDCMImageFrameInfo.cpp mitkDICOMImageFrameInfo.cpp mitkDICOMSortCriterion.cpp mitkDICOMSortByTag.cpp mitkITKDICOMSeriesReaderHelper.cpp mitkEquiDistantBlocksSorter.cpp mitkNormalDirectionConsistencySorter.cpp mitkSortByImagePositionPatient.cpp mitkGantryTiltInformation.cpp mitkClassicDICOMSeriesReader.cpp mitkThreeDnTDICOMSeriesReader.cpp mitkDICOMTag.cpp mitkDICOMTagHelper.cpp mitkDICOMTagCache.cpp mitkDICOMEnums.cpp mitkDICOMReaderConfigurator.cpp mitkDICOMFileReaderSelector.cpp + mitkIDICOMTagsOfInterest.cpp ) set(RESOURCE_FILES configurations/3D/classicreader.xml configurations/3D/imageposition.xml configurations/3D/imageposition_byacquisition.xml configurations/3D/instancenumber.xml configurations/3D/instancenumber_soft.xml configurations/3D/slicelocation.xml configurations/3DnT/classicreader.xml ) diff --git a/Modules/DICOMReader/include/mitkDICOMTagHelper.h b/Modules/DICOMReader/include/mitkDICOMTagHelper.h index 1cec7e742a..a98680bc99 100644 --- a/Modules/DICOMReader/include/mitkDICOMTagHelper.h +++ b/Modules/DICOMReader/include/mitkDICOMTagHelper.h @@ -1,41 +1,48 @@ /*=================================================================== 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 mitkDICOMTagHelper_h #define mitkDICOMTagHelper_h #include #include #include "MitkDICOMReaderExports.h" namespace mitk { - typedef std::unordered_map DICOMTagMapType; + typedef std::unordered_map DICOMTagMapType; + + /** Returns the list of tags that are by default of interest and should + * be extracted when loading DICOM data. This can for instance be used + * to with DICOMFileReader::SetAdditionalTagsOfInterest().*/ + DICOMTagMapType MITKDICOMREADER_EXPORT GetCurrentDICOMTagsOfInterest(); + + typedef std::unordered_map DefaultDICOMTagMapType; /** Returns the list of tags that are by default of interest and should * be extracted when loading DICOM data. This can for instance be used * to with DICOMFileReader::SetAdditionalTagsOfInterest().*/ - DICOMTagMapType MITKDICOMREADER_EXPORT GetDefaultDICOMTagsOfInterest(); + DefaultDICOMTagMapType MITKDICOMREADER_EXPORT GetDefaultDICOMTagsOfInterest(); /** returns the correct property name for a given DICOMTag instance. */ std::string MITKDICOMREADER_EXPORT GeneratPropertyNameForDICOMTag(const mitk::DICOMTag& tag); } #endif diff --git a/Modules/DICOMReader/include/mitkIDICOMTagsOfInterest.h b/Modules/DICOMReader/include/mitkIDICOMTagsOfInterest.h new file mode 100644 index 0000000000..7bd160d9fd --- /dev/null +++ b/Modules/DICOMReader/include/mitkIDICOMTagsOfInterest.h @@ -0,0 +1,70 @@ +/*=================================================================== + +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 mitkIDICOMTagsOfInterest_h +#define mitkIDICOMTagsOfInterest_h + +#include +#include +#include +#include +#include + +namespace mitk +{ + /** + * \ingroup MicroServices_Interfaces + * \brief Interface of DICOM tags of interest service. + * + * This service allows you to manage the tags of interest (toi). + * All registred toi will be extracted when loading dicom data and stored as properties in the corresponding + * base data object. In addition the service can (if available) use IPropertyPersistance and IPropertyAliases + * to ensure that the tags of interests are also persisted and have a human readable alias. + */ + class MITKDICOMREADER_EXPORT IDICOMTagsOfInterest + { + public: + virtual ~IDICOMTagsOfInterest(); + + typedef std::unordered_map DICOMTagMapType; + + /** \brief Add an tag to the TOI. + * If the tag was already added it will be overwritten with the passed values. + * \param[in] tag Tag that should be added. + * \param[in] makePersistant Indicates if the tag should be made persistant if possible via the IPropertyPersistence service. + */ + virtual void AddTagOfInterest(const DICOMTag& tag, bool makePersistant = true) = 0; + + /** Returns the map of all tags of interest. Key is the property name. Value is the DICOM tag.*/ + virtual DICOMTagMapType GetTagsOfInterest() const = 0; + + /** Indicates if the given tag is already a tag of interest.*/ + virtual bool HasTag(const DICOMTag& tag) const = 0; + + /** \brief Remove specific tag. If it not exists the function will do nothing. + * \param[in] tag Tag that should be removed. + */ + virtual void RemoveTag(const DICOMTag& tag) = 0; + + /** \brief Remove all tags. + */ + virtual void RemoveAllTags() = 0; + }; +} + +MITK_DECLARE_SERVICE_INTERFACE(mitk::IDICOMTagsOfInterest, "org.mitk.IDICOMTagsOfInterest") + +#endif diff --git a/Modules/DICOMReader/src/mitkDICOMTagHelper.cpp b/Modules/DICOMReader/src/mitkDICOMTagHelper.cpp index 7c807d1c63..bc4799a6e5 100644 --- a/Modules/DICOMReader/src/mitkDICOMTagHelper.cpp +++ b/Modules/DICOMReader/src/mitkDICOMTagHelper.cpp @@ -1,197 +1,228 @@ /*=================================================================== 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 "mitkDICOMTagHelper.h" -mitk::DICOMTagMapType::value_type MakeEntry(mitk::DICOMTag& tag) +#include + +#include "usModuleContext.h" +#include "usGetModuleContext.h" + +mitk::DefaultDICOMTagMapType::value_type MakeEntry(mitk::DICOMTag& tag) { return std::make_pair(GeneratPropertyNameForDICOMTag(tag).c_str(), tag); } mitk::DICOMTagMapType +mitk::GetCurrentDICOMTagsOfInterest() +{ + mitk::DICOMTagMapType result; + + std::vector > toiRegisters = us::GetModuleContext()->GetServiceReferences(); + if (toiRegisters.empty()) + { + // bad, no service found, cannot get tags of interest + MITK_ERROR << "DICOM tag error: no service for DICOM tags of interest"; + return result; + } + else if (toiRegisters.size() > 1) + { + MITK_WARN << "DICOM tag error: multiple service for DICOM tags of interest found. Using just one."; + } + + IDICOMTagsOfInterest* toiRegister = us::GetModuleContext()->GetService(toiRegisters.front()); + if (!toiRegister) + { + MITK_ERROR << "Service lookup error, cannot get DICOM tag of interest service "; + } + + return toiRegister->GetTagsOfInterest(); +} + +mitk::DefaultDICOMTagMapType mitk::GetDefaultDICOMTagsOfInterest() { - DICOMTagMapType result; + DefaultDICOMTagMapType result; //These tags are copied from DICOMSeriesReader. The old naming style (deprecated) //is keept for backwards compatibility until it is removed. //Below we have also already added the properties with the new naming style // Patient module result.insert(std::make_pair("dicom.patient.PatientsName", DICOMTag(0x0010, 0x0010))); result.insert(std::make_pair("dicom.patient.PatientID", DICOMTag(0x0010, 0x0020))); result.insert(std::make_pair("dicom.patient.PatientsBirthDate", DICOMTag(0x0010, 0x0030))); result.insert(std::make_pair("dicom.patient.PatientsSex", DICOMTag(0x0010, 0x0040))); result.insert(std::make_pair("dicom.patient.PatientsBirthTime", DICOMTag(0x0010, 0x0032))); result.insert(std::make_pair("dicom.patient.OtherPatientIDs", DICOMTag(0x0010, 0x1000))); result.insert(std::make_pair("dicom.patient.OtherPatientNames", DICOMTag(0x0010, 0x1001))); result.insert(std::make_pair("dicom.patient.EthnicGroup", DICOMTag(0x0010, 0x2160))); result.insert(std::make_pair("dicom.patient.PatientComments", DICOMTag(0x0010, 0x4000))); result.insert(std::make_pair("dicom.patient.PatientIdentityRemoved", DICOMTag(0x0012, 0x0062))); result.insert(std::make_pair("dicom.patient.DeIdentificationMethod", DICOMTag(0x0012, 0x0063))); // General Study module result.insert(std::make_pair("dicom.study.StudyInstanceUID", DICOMTag(0x0020, 0x000d))); result.insert(std::make_pair("dicom.study.StudyDate", DICOMTag(0x0008, 0x0020))); result.insert(std::make_pair("dicom.study.StudyTime", DICOMTag(0x0008, 0x0030))); result.insert(std::make_pair("dicom.study.ReferringPhysiciansName", DICOMTag(0x0008, 0x0090))); result.insert(std::make_pair("dicom.study.StudyID", DICOMTag(0x0020, 0x0010))); result.insert(std::make_pair("dicom.study.AccessionNumber", DICOMTag(0x0008, 0x0050))); result.insert(std::make_pair("dicom.study.StudyDescription", DICOMTag(0x0008, 0x1030))); result.insert(std::make_pair("dicom.study.PhysiciansOfRecord", DICOMTag(0x0008, 0x1048))); result.insert(std::make_pair("dicom.study.NameOfPhysicianReadingStudy", DICOMTag(0x0008, 0x1060))); // General Series module result.insert(std::make_pair("dicom.series.Modality", DICOMTag(0x0008, 0x0060))); result.insert(std::make_pair("dicom.series.SeriesInstanceUID", DICOMTag(0x0020, 0x000e))); result.insert(std::make_pair("dicom.series.SeriesNumber", DICOMTag(0x0020, 0x0011))); result.insert(std::make_pair("dicom.series.Laterality", DICOMTag(0x0020, 0x0060))); result.insert(std::make_pair("dicom.series.SeriesDate", DICOMTag(0x0008, 0x0021))); result.insert(std::make_pair("dicom.series.SeriesTime", DICOMTag(0x0008, 0x0031))); result.insert(std::make_pair("dicom.series.PerformingPhysiciansName", DICOMTag(0x0008, 0x1050))); result.insert(std::make_pair("dicom.series.ProtocolName", DICOMTag(0x0018, 0x1030))); result.insert(std::make_pair("dicom.series.SeriesDescription", DICOMTag(0x0008, 0x103e))); result.insert(std::make_pair("dicom.series.OperatorsName", DICOMTag(0x0008, 0x1070))); result.insert(std::make_pair("dicom.series.BodyPartExamined", DICOMTag(0x0018, 0x0015))); result.insert(std::make_pair("dicom.series.PatientPosition", DICOMTag(0x0018, 0x5100))); result.insert(std::make_pair("dicom.series.SmallestPixelValueInSeries", DICOMTag(0x0028, 0x0108))); result.insert(std::make_pair("dicom.series.LargestPixelValueInSeries", DICOMTag(0x0028, 0x0109))); // VOI LUT module result.insert(std::make_pair("dicom.voilut.WindowCenter", DICOMTag(0x0028, 0x1050))); result.insert(std::make_pair("dicom.voilut.WindowWidth", DICOMTag(0x0028, 0x1051))); result.insert(std::make_pair("dicom.voilut.WindowCenterAndWidthExplanation", DICOMTag(0x0028, 0x1055))); // Image Pixel module result.insert(std::make_pair("dicom.pixel.PhotometricInterpretation", DICOMTag(0x0028, 0x0004))); result.insert(std::make_pair("dicom.pixel.Rows", DICOMTag(0x0028, 0x0010))); result.insert(std::make_pair("dicom.pixel.Columns", DICOMTag(0x0028, 0x0011))); // Image Plane module result.insert(std::make_pair("dicom.PixelSpacing", DICOMTag(0x0028, 0x0030))); result.insert(std::make_pair("dicom.ImagerPixelSpacing", DICOMTag(0x0018, 0x1164))); //additional for RT result.insert(std::make_pair("dicom.RescaleIntercept", DICOMTag(0x0028, 0x1052))); result.insert(std::make_pair("dicom.RescaleSlope", DICOMTag(0x0028, 0x1053))); result.insert(std::make_pair("dicom.ManufacturerModelName", DICOMTag(0x0008, 0x1090))); result.insert(std::make_pair("dicom.ManufacturerName", DICOMTag(0x0008, 0x0070))); result.insert(std::make_pair("dicom.InstitutionName", DICOMTag(0x0008, 0x0080))); result.insert(std::make_pair("dicom.StationName", DICOMTag(0x0008, 0x1010))); result.insert(std::make_pair("dicom.DoseGridScaling", DICOMTag(0x3004, 0x000e))); // Patient module /*dicom.patient.PatientsName*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0010))); /*dicom.patient.PatientID*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0020))); /*dicom.patient.PatientsBirthDate*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0030))); /*dicom.patient.PatientsSex*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0040))); /*dicom.patient.PatientsBirthTime*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0032))); /*dicom.patient.OtherPatientIDs*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x1000))); /*dicom.patient.OtherPatientNames*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x1001))); /*dicom.patient.EthnicGroup*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x2160))); /*dicom.patient.PatientComments*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x4000))); /*dicom.patient.PatientIdentityRemoved*/ result.insert(MakeEntry(DICOMTag(0x0012, 0x0062))); /*dicom.patient.DeIdentificationMethod*/ result.insert(MakeEntry(DICOMTag(0x0012, 0x0063))); // General Study module /*dicom.study.StudyInstanceUID*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x000d))); /*dicom.study.StudyDate*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0020))); /*dicom.study.StudyTime*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0030))); /*dicom.study.ReferringPhysiciansName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0090))); /*dicom.study.StudyID*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x0010))); /*dicom.study.AccessionNumber*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0050))); /*dicom.study.StudyDescription*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1030))); /*dicom.study.PhysiciansOfRecord*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1048))); /*dicom.study.NameOfPhysicianReadingStudy*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1060))); // General Series module /*dicom.series.Modality*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0060))); /*dicom.series.SeriesInstanceUID*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x000e))); /*dicom.series.SeriesNumber*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x0011))); /*dicom.series.Laterality*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x0060))); /*dicom.series.SeriesDate*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0021))); /*dicom.series.SeriesTime*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0031))); /*dicom.series.PerformingPhysiciansName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1050))); /*dicom.series.ProtocolName*/ result.insert(MakeEntry(DICOMTag(0x0018, 0x1030))); /*dicom.series.SeriesDescription*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x103e))); /*dicom.series.OperatorsName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1070))); /*dicom.series.BodyPartExamined*/ result.insert(MakeEntry(DICOMTag(0x0018, 0x0015))); /*dicom.series.PatientPosition*/ result.insert(MakeEntry(DICOMTag(0x0018, 0x5100))); /*dicom.series.SmallestPixelValueInSeries*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0108))); /*dicom.series.LargestPixelValueInSeries*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0109))); // VOI LUT module /*dicom.voilut.WindowCenter*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1050))); /*dicom.voilut.WindowWidth*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1051))); /*dicom.voilut.WindowCenterAndWidthExplanation*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1055))); // Image Pixel module /*dicom.pixel.PhotometricInterpretation*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0004))); /*dicom.pixel.Rows*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0010))); /*dicom.pixel.Columns*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0011))); // Image Plane module /*dicom.PixelSpacing*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0030))); /*dicom.ImagerPixelSpacing*/ result.insert(MakeEntry(DICOMTag(0x0018, 0x1164))); //additional for RT /*dicom.RescaleIntercept*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1052))); /*dicom.RescaleSlope*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1053))); /*dicom.ManufacturerModelName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1090))); /*dicom.ManufacturerName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0070))); /*dicom.InstitutionName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0080))); /*dicom.StationName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1010))); /*dicom.DoseGridScaling*/ result.insert(MakeEntry(DICOMTag(0x3004, 0x000e))); //Additions for PET result.insert(MakeEntry(DICOMTag(0x0018, 0x0031))); //dicom.pet.Tracer result.insert(MakeEntry(DICOMTag(0x0018, 0x1072))); //dicom.pet.RadiopharmaceuticalStartTime result.insert(MakeEntry(DICOMTag(0x0018, 0x1074))); //dicom.pet.RadionuclideTotalDose result.insert(MakeEntry(DICOMTag(0x0018, 0x1075))); //dicom.pet.RadionuclideHalfLife result.insert(MakeEntry(DICOMTag(0x0010, 0x1030))); //dicom.patient.PatientWeight result.insert(MakeEntry(DICOMTag(0x0010, 0x1020))); //dicom.patient.PatientSize result.insert(MakeEntry(DICOMTag(0x0054, 0x1001))); //dicom.pet.RadioactivityUnits result.insert(MakeEntry(DICOMTag(0x0054, 0x1102))); //dicom.pet.DecayCorrection result.insert(MakeEntry(DICOMTag(0x0054, 0x1321))); //dicom.pet.DecayFactor result.insert(MakeEntry(DICOMTag(0x0054, 0x1300))); //dicom.pet.FrameReferenceTime //Other interesting acquisition correlated information result.insert(MakeEntry(DICOMTag(0x0008, 0x0022))); //dicom.acuisition date result.insert(MakeEntry(DICOMTag(0x0008, 0x0032))); //dicom.acuisition time result.insert(MakeEntry(DICOMTag(0x0008, 0x002a))); //dicom.acuisition datetime result.insert(MakeEntry(DICOMTag(0x0008, 0x0080))); //dicom.Modality result.insert(MakeEntry(DICOMTag(0x0018, 0x002a))); //dicom.Sequence Name result.insert(MakeEntry(DICOMTag(0x0018, 0x0020))); //dicom.Scanning Sequence result.insert(MakeEntry(DICOMTag(0x0018, 0x0021))); //dicom.Sequence Variant result.insert(MakeEntry(DICOMTag(0x0018, 0x0080))); //dicom.TR result.insert(MakeEntry(DICOMTag(0x0018, 0x0081))); //dicom.TE result.insert(MakeEntry(DICOMTag(0x0018, 0x1310))); //dicom.Acquisition Matrix result.insert(MakeEntry(DICOMTag(0x0018, 0x0087))); //dicom.Magnetic Field Strength return result; }; std::string mitk::GeneratPropertyNameForDICOMTag(const mitk::DICOMTag& tag) { std::ostringstream nameStream; nameStream << "DICOM." << std::setw(4) << std::setfill('0') << std::hex << tag.GetGroup() << "." << std::setw(4) << std::setfill('0') << std::hex << tag.GetElement(); return nameStream.str(); }; diff --git a/Modules/DICOMReader/src/mitkIDICOMTagsOfInterest.cpp b/Modules/DICOMReader/src/mitkIDICOMTagsOfInterest.cpp new file mode 100644 index 0000000000..a25499e821 --- /dev/null +++ b/Modules/DICOMReader/src/mitkIDICOMTagsOfInterest.cpp @@ -0,0 +1,21 @@ +/*=================================================================== + +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 + +mitk::IDICOMTagsOfInterest::~IDICOMTagsOfInterest() +{ +}; diff --git a/Modules/DICOMReaderServices/files.cmake b/Modules/DICOMReaderServices/files.cmake index a71695bdc3..c8987299cc 100644 --- a/Modules/DICOMReaderServices/files.cmake +++ b/Modules/DICOMReaderServices/files.cmake @@ -1,9 +1,10 @@ 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 + mitkDICOMTagsOfInterestService.cpp ) diff --git a/Modules/DICOMReaderServices/include/mitkDICOMTagsOfInterestService.h b/Modules/DICOMReaderServices/include/mitkDICOMTagsOfInterestService.h new file mode 100644 index 0000000000..7507824147 --- /dev/null +++ b/Modules/DICOMReaderServices/include/mitkDICOMTagsOfInterestService.h @@ -0,0 +1,74 @@ +/*=================================================================== + +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 mitkDICOMTagsOfInterestService_h +#define mitkDICOMTagsOfInterestService_h + +#include +#include +#include +#include + +#include +#include + +namespace mitk +{ + /** + * \ingroup MicroServices_Interfaces + * \brief DICOM tags of interest service. + * + * This service allows you to manage the tags of interest (toi). + * All registred toi will be extracted when loading dicom data and stored as properties in the corresponding + * base data object. In addition the service can (if available) use IPropertyPersistance and IPropertyDescriptions + * to ensure that the tags of interests are also persisted and have a human readable descriptions. + */ + class DICOMTagsOfInterestService: public IDICOMTagsOfInterest + { + public: + DICOMTagsOfInterestService(); + virtual ~DICOMTagsOfInterestService(); + + virtual void AddTagOfInterest(const DICOMTag& tag, bool makePersistant = true) override; + + virtual DICOMTagMapType GetTagsOfInterest() const override; + + virtual bool HasTag(const DICOMTag& tag) const override; + + virtual void RemoveTag(const DICOMTag& tag) override; + + virtual void RemoveAllTags() override; + + private: + + typedef std::unordered_map InternalTagMapType; + typedef std::unordered_map InternalPersistanceMapType; + typedef std::set InternalTagSetType; + typedef itk::MutexLockHolder MutexHolder; + + /**The set is used to ensure that strings that are passed outside as char* + always stay a valid pointer, even if the tag is removed from the service.*/ + InternalTagSetType m_KnownTags; + InternalTagMapType m_TagMap; + InternalPersistanceMapType m_PersMap; + mutable itk::SimpleFastMutexLock m_Lock; + + DICOMTagsOfInterestService(const DICOMTagsOfInterestService&); + DICOMTagsOfInterestService& operator=(const DICOMTagsOfInterestService&); + }; +} + +#endif diff --git a/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp b/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp index f71c7a3f38..9f32110e6a 100644 --- a/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp +++ b/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp @@ -1,122 +1,121 @@ /*=================================================================== 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 "mitkBaseDICOMReaderService.h" #include #include #include #include #include #include #include - #include namespace mitk { BaseDICOMReaderService::BaseDICOMReaderService(const std::string& description) : AbstractFileReader(CustomMimeType(IOMimeTypes::DICOM_MIMETYPE()), description) { } std::vector > BaseDICOMReaderService::Read() { std::vector result; //special handling of Philips 3D US DICOM. //Copied from DICOMSeriesReaderService std::string fileName = this->GetLocalFileName(); if (DicomSeriesReader::IsPhilips3DDicom(fileName)) { MITK_INFO << "it is a Philips3D US Dicom file" << std::endl; const char* previousCLocale = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); std::locale previousCppLocale(std::cin.getloc()); std::locale l("C"); std::cin.imbue(l); DataNode::Pointer node = DataNode::New(); mitk::DicomSeriesReader::StringContainer stringvec; stringvec.push_back(fileName); if (DicomSeriesReader::LoadDicomSeries(stringvec, *node)) { BaseData::Pointer data = node->GetData(); StringProperty::Pointer nameProp = StringProperty::New(itksys::SystemTools::GetFilenameName(fileName)); data->GetPropertyList()->SetProperty("name", nameProp); result.push_back(data); } setlocale(LC_NUMERIC, previousCLocale); std::cin.imbue(previousCppLocale); return result; } //Normal DICOM handling (It wasn't a Philips 3D US) mitk::StringList relevantFiles = this->GetRelevantFiles(); mitk::DICOMFileReader::Pointer reader = this->GetReader(relevantFiles); - reader->SetAdditionalTagsOfInterest(mitk::GetDefaultDICOMTagsOfInterest()); + reader->SetAdditionalTagsOfInterest(mitk::GetCurrentDICOMTagsOfInterest()); 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().GetPointer(); 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; } StringList BaseDICOMReaderService::GetRelevantFiles() const { std::string fileName = this->GetLocalFileName(); mitk::StringList relevantFiles = mitk::GetDICOMFilesInSameDirectory(fileName); return relevantFiles; } } diff --git a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp index 14c76fc2b4..908a71b246 100644 --- a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp +++ b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp @@ -1,36 +1,50 @@ /*=================================================================== 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" +#include "mitkDICOMTagsOfInterestService.h" + +#include "mitkDICOMTagHelper.h" + +#include namespace mitk { - void DICOMReaderServicesActivator::Load(us::ModuleContext*) + void DICOMReaderServicesActivator::Load(us::ModuleContext* context) { m_AutoSelectingDICOMReader.reset(new AutoSelectingDICOMReaderService()); m_ClassicDICOMSeriesReader.reset(new ClassicDICOMSeriesReaderService()); + + m_DICOMTagsOfInterestService.reset(new DICOMTagsOfInterestService()); + context->RegisterService(m_DICOMTagsOfInterestService.get()); + + DefaultDICOMTagMapType tagmap = GetDefaultDICOMTagsOfInterest(); + for (auto tag : tagmap) + { + m_DICOMTagsOfInterestService->AddTagOfInterest(tag.second); + } } 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 c128e96451..175c0158fa 100644 --- a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h +++ b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h @@ -1,43 +1,51 @@ /*=================================================================== 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 +#include #include namespace mitk { struct IFileReader; +class IDICOMTagsOfInterest; class DICOMReaderServicesActivator : public us::ModuleActivator { public: - void Load(us::ModuleContext*context) override; + void Load(us::ModuleContext* context) override; void Unload(us::ModuleContext* context) override; + void AliasServiceChanged(const us::ServiceEvent event); + private: std::unique_ptr m_AutoSelectingDICOMReader; std::unique_ptr m_ClassicDICOMSeriesReader; + std::unique_ptr m_DICOMTagsOfInterestService; + + us::ModuleContext* mitkContext; + }; } #endif // MITKDICOMREADERSERVICESACTIVATOR_H diff --git a/Modules/DICOMReaderServices/src/mitkDICOMTagsOfInterestService.cpp b/Modules/DICOMReaderServices/src/mitkDICOMTagsOfInterestService.cpp new file mode 100644 index 0000000000..d717dbaa30 --- /dev/null +++ b/Modules/DICOMReaderServices/src/mitkDICOMTagsOfInterestService.cpp @@ -0,0 +1,154 @@ +/*=================================================================== + +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 "mitkDICOMTagsOfInterestService.h" +#include "mitkDICOMTagHelper.h" + +#include "usModuleContext.h" +#include "usGetModuleContext.h" + +#include "mitkIPropertyDescriptions.h" +#include "mitkIPropertyPersistence.h" + +mitk::IPropertyDescriptions* +GetDescriptionsService() +{ + mitk::IPropertyDescriptions* result = nullptr; + + std::vector > descriptionRegisters = us::GetModuleContext()->GetServiceReferences(); + if (!descriptionRegisters.empty()) + { + if (descriptionRegisters.size() > 1) + { + MITK_WARN << "Multiple property description services found. Using just one."; + } + result = us::GetModuleContext()->GetService(descriptionRegisters.front()); + } + + return result; +}; + +mitk::IPropertyPersistence* +GetPersistenceService() +{ + mitk::IPropertyPersistence* result = nullptr; + + std::vector > persRegisters = us::GetModuleContext()->GetServiceReferences(); + if (!persRegisters.empty()) + { + if (persRegisters.size() > 1) + { + MITK_WARN << "Multiple property description services found. Using just one."; + } + result = us::GetModuleContext()->GetService(persRegisters.front()); + } + + return result; +}; + +mitk::DICOMTagsOfInterestService:: +DICOMTagsOfInterestService() +{ +}; + +mitk::DICOMTagsOfInterestService:: +~DICOMTagsOfInterestService() +{ +}; + +void +mitk::DICOMTagsOfInterestService:: +AddTagOfInterest(const DICOMTag& tag, bool makePersistant) +{ + MutexHolder lock(m_Lock); + std::string key = mitk::GeneratPropertyNameForDICOMTag(tag); + this->m_TagMap.insert(std::make_pair(key, tag)); + this->m_PersMap.insert(std::make_pair(key, makePersistant)); + this->m_KnownTags.insert(key); + + mitk::IPropertyDescriptions* descriptionSrv = GetDescriptionsService(); + if (descriptionSrv) + { + descriptionSrv->AddDescription(key, "DICOM tag: " + tag.GetName()); + } + + mitk::IPropertyPersistence* persSrv = GetPersistenceService(); + if (persSrv) + { + PropertyPersistenceInfo::Pointer info = PropertyPersistenceInfo::New(key); + persSrv->AddInfo(key, info); + } +}; + +mitk::DICOMTagsOfInterestService::DICOMTagMapType +mitk::DICOMTagsOfInterestService:: +GetTagsOfInterest() const +{ + MutexHolder lock(m_Lock); + DICOMTagMapType result; + + for (auto tag : this->m_TagMap) + { + InternalTagSetType::const_iterator finding = this->m_KnownTags.find(tag.first); + if (finding == this->m_KnownTags.cend()) + { + mitkThrow() << "Invalid status. Tag is missing in the known tag set. Problematic tag:" << tag.first; + } + + result.insert(std::make_pair(finding->c_str(), tag.second)); + } + + return result; +}; + +bool +mitk::DICOMTagsOfInterestService:: +HasTag(const DICOMTag& tag) const +{ + std::string key = mitk::GeneratPropertyNameForDICOMTag(tag); + return this->m_TagMap.find(key) != this->m_TagMap.cend(); +}; + +void +mitk::DICOMTagsOfInterestService:: +RemoveTag(const DICOMTag& tag) +{ + MutexHolder lock(m_Lock); + std::string key = mitk::GeneratPropertyNameForDICOMTag(tag); + this->m_PersMap.erase(key); + this->m_TagMap.erase(key); + + mitk::IPropertyDescriptions* descriptionSrv = GetDescriptionsService(); + if (descriptionSrv && descriptionSrv->HasDescription(key)) + { + descriptionSrv->RemoveDescription(key); + } + + mitk::IPropertyPersistence* persSrv = GetPersistenceService(); + if (persSrv && persSrv->HasInfo(key)) + { + persSrv->RemoveInfo(key); + } +}; + +void +mitk::DICOMTagsOfInterestService:: +RemoveAllTags() +{ + MutexHolder lock(m_Lock); + this->m_PersMap.clear(); + this->m_TagMap.clear(); +}; diff --git a/Plugins/org.mitk.gui.qt.dicom/src/internal/DicomEventHandler.cpp b/Plugins/org.mitk.gui.qt.dicom/src/internal/DicomEventHandler.cpp index 5434154c68..7dc6b6c67d 100644 --- a/Plugins/org.mitk.gui.qt.dicom/src/internal/DicomEventHandler.cpp +++ b/Plugins/org.mitk.gui.qt.dicom/src/internal/DicomEventHandler.cpp @@ -1,371 +1,371 @@ /*=================================================================== 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 "mitkPluginActivator.h" #include "DicomEventHandler.h" #include #include #include #include #include #include #include #include #include #include "mitkImage.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include DicomEventHandler::DicomEventHandler() { } DicomEventHandler::~DicomEventHandler() { } void DicomEventHandler::OnSignalAddSeriesToDataManager(const ctkEvent& ctkEvent) { QStringList listOfFilesForSeries; listOfFilesForSeries = ctkEvent.getProperty("FilesForSeries").toStringList(); if (!listOfFilesForSeries.isEmpty()) { //for rt data, if the modality tag isnt defined or is "CT" the image is handled like before if(ctkEvent.containsProperty("Modality") && (ctkEvent.getProperty("Modality").toString().compare("RTDOSE",Qt::CaseInsensitive) == 0 || ctkEvent.getProperty("Modality").toString().compare("RTSTRUCT",Qt::CaseInsensitive) == 0)) { QString modality = ctkEvent.getProperty("Modality").toString(); if(modality.compare("RTDOSE",Qt::CaseInsensitive) == 0) { mitk::RTDoseReader::Pointer doseReader = mitk::RTDoseReader::New(); mitk::DataNode::Pointer doseImageNode = mitk::DataNode::New(); mitk::DataNode::Pointer doseOutlineNode = mitk::DataNode::New(); doseImageNode = doseReader->LoadRTDose(listOfFilesForSeries.at(0).toStdString().c_str()); doseOutlineNode->SetData(doseImageNode->GetData()); if (doseImageNode.IsNotNull() && doseOutlineNode->GetData() != nullptr) { berry::IPreferencesService* prefService = berry::Platform::GetPreferencesService(); berry::IPreferences::Pointer prefNode = prefService->GetSystemPreferences()->Node(mitk::RTUIConstants::ROOT_ISO_PRESETS_PREFERENCE_NODE_ID.c_str()); typedef QStringList NamesType; NamesType names = prefNode->ChildrenNames(); std::map presetMap; for (NamesType::const_iterator pos = names.begin(); pos != names.end(); ++pos) { berry::IPreferences::Pointer aPresetNode = prefNode->Node(*pos); if (aPresetNode.IsNull()) { mitkThrow() << "Error in preference interface. Cannot find preset node under given name. Name: " << (*pos).toStdString(); } mitk::IsoDoseLevelSet::Pointer levelSet = mitk::IsoDoseLevelSet::New(); NamesType levelNames = aPresetNode->ChildrenNames(); for (NamesType::const_iterator levelName = levelNames.begin(); levelName != levelNames.end(); ++levelName) { berry::IPreferences::Pointer levelNode = aPresetNode->Node(*levelName); if (aPresetNode.IsNull()) { mitkThrow() << "Error in preference interface. Cannot find level node under given preset name. Name: " << (*pos).toStdString() << "; Level id: " << (*levelName).toStdString(); } mitk::IsoDoseLevel::Pointer isoLevel = mitk::IsoDoseLevel::New(); isoLevel->SetDoseValue(levelNode->GetDouble(mitk::RTUIConstants::ISO_LEVEL_DOSE_VALUE_ID.c_str(), 0.0)); mitk::IsoDoseLevel::ColorType color; color.SetRed(levelNode->GetFloat(mitk::RTUIConstants::ISO_LEVEL_COLOR_RED_ID.c_str(), 1.0)); color.SetGreen(levelNode->GetFloat(mitk::RTUIConstants::ISO_LEVEL_COLOR_GREEN_ID.c_str(), 1.0)); color.SetBlue(levelNode->GetFloat(mitk::RTUIConstants::ISO_LEVEL_COLOR_BLUE_ID.c_str(), 1.0)); isoLevel->SetColor(color); isoLevel->SetVisibleIsoLine(levelNode->GetBool(mitk::RTUIConstants::ISO_LEVEL_VISIBILITY_ISOLINES_ID.c_str(), true)); isoLevel->SetVisibleColorWash(levelNode->GetBool(mitk::RTUIConstants::ISO_LEVEL_VISIBILITY_COLORWASH_ID.c_str(), true)); levelSet->SetIsoDoseLevel(isoLevel); } presetMap.insert(std::make_pair((*pos).toStdString(), levelSet)); } if (presetMap.size() == 0) { presetMap.insert(std::make_pair(std::string("Virtuos"), mitk::GeneratIsoLevels_Virtuos())); } prefNode = prefService->GetSystemPreferences()->Node(mitk::RTUIConstants::ROOT_DOSE_VIS_PREFERENCE_NODE_ID.c_str()); if (prefNode.IsNull()) { mitkThrow() << "Error in preference interface. Cannot find preset node under given name. Name: " << prefNode->ToString().toStdString(); } //set some specific colorwash and isoline properties bool showColorWashGlobal = prefNode->GetBool(mitk::RTUIConstants::GLOBAL_VISIBILITY_COLORWASH_ID.c_str(), true); doseImageNode->SetBoolProperty(mitk::RTConstants::DOSE_SHOW_COLORWASH_PROPERTY_NAME.c_str(), showColorWashGlobal); bool showIsolinesGlobal = prefNode->GetBool(mitk::RTUIConstants::GLOBAL_VISIBILITY_ISOLINES_ID.c_str(), true); doseOutlineNode->SetBoolProperty(mitk::RTConstants::DOSE_SHOW_ISOLINES_PROPERTY_NAME.c_str(), showIsolinesGlobal); //Set reference dose property double referenceDose = prefNode->GetDouble(mitk::RTUIConstants::REFERENCE_DOSE_ID.c_str(), mitk::RTUIConstants::DEFAULT_REFERENCE_DOSE_VALUE); doseImageNode->SetFloatProperty(mitk::RTConstants::REFERENCE_DOSE_PROPERTY_NAME.c_str(), referenceDose); doseOutlineNode->SetFloatProperty(mitk::RTConstants::REFERENCE_DOSE_PROPERTY_NAME.c_str(), referenceDose); QString presetName = prefNode->Get(mitk::RTUIConstants::SELECTED_ISO_PRESET_ID.c_str(), "Virtuos"); mitk::IsoDoseLevelSet::Pointer isoDoseLevelPreset = presetMap[presetName.toStdString()]; mitk::IsoDoseLevelSetProperty::Pointer levelSetProp = mitk::IsoDoseLevelSetProperty::New(isoDoseLevelPreset); doseImageNode->SetProperty(mitk::RTConstants::DOSE_ISO_LEVELS_PROPERTY_NAME.c_str(), levelSetProp); doseOutlineNode->SetProperty(mitk::RTConstants::DOSE_ISO_LEVELS_PROPERTY_NAME.c_str(), levelSetProp); mitk::IsoDoseLevelVector::Pointer levelVector = mitk::IsoDoseLevelVector::New(); mitk::IsoDoseLevelVectorProperty::Pointer levelVecProp = mitk::IsoDoseLevelVectorProperty::New(levelVector); doseImageNode->SetProperty(mitk::RTConstants::DOSE_FREE_ISO_VALUES_PROPERTY_NAME.c_str(), levelVecProp); doseOutlineNode->SetProperty(mitk::RTConstants::DOSE_FREE_ISO_VALUES_PROPERTY_NAME.c_str(), levelVecProp); mitk::RenderingModeProperty::Pointer renderingModeProp = mitk::RenderingModeProperty::New(); if (showColorWashGlobal) { //Generating the Colorwash vtkSmartPointer transferFunction = vtkSmartPointer::New(); for (mitk::IsoDoseLevelSet::ConstIterator itIsoDoseLevel = isoDoseLevelPreset->Begin(); itIsoDoseLevel != isoDoseLevelPreset->End(); ++itIsoDoseLevel) { float *hsv = new float[3]; //used for transfer rgb to hsv vtkSmartPointer cCalc = vtkSmartPointer::New(); if (itIsoDoseLevel->GetVisibleColorWash()){ cCalc->RGBToHSV(itIsoDoseLevel->GetColor()[0], itIsoDoseLevel->GetColor()[1], itIsoDoseLevel->GetColor()[2], &hsv[0], &hsv[1], &hsv[2]); transferFunction->AddHSVPoint(itIsoDoseLevel->GetDoseValue()*referenceDose, hsv[0], hsv[1], hsv[2], 1.0, 1.0); } } mitk::TransferFunction::Pointer mitkTransFunc = mitk::TransferFunction::New(); mitk::TransferFunctionProperty::Pointer mitkTransFuncProp = mitk::TransferFunctionProperty::New(); mitkTransFunc->SetColorTransferFunction(transferFunction); mitkTransFuncProp->SetValue(mitkTransFunc); doseImageNode->SetProperty("Image Rendering.Transfer Function", mitkTransFuncProp); renderingModeProp->SetValue(mitk::RenderingModeProperty::COLORTRANSFERFUNCTION_COLOR); } else { //Set rendering mode to levelwindow color mode renderingModeProp->SetValue(mitk::RenderingModeProperty::LOOKUPTABLE_LEVELWINDOW_COLOR); } doseImageNode->SetProperty("Image Rendering.Mode", renderingModeProp); doseImageNode->SetProperty("opacity", mitk::FloatProperty::New(0.5)); //set the outline properties doseOutlineNode->SetBoolProperty("outline binary", true); doseOutlineNode->SetProperty("helper object", mitk::BoolProperty::New(true)); doseOutlineNode->SetProperty("includeInBoundingBox", mitk::BoolProperty::New(false)); ctkServiceReference serviceReference = mitk::PluginActivator::getContext()->getServiceReference(); mitk::IDataStorageService* storageService = mitk::PluginActivator::getContext()->getService(serviceReference); mitk::DataStorage* dataStorage = storageService->GetDefaultDataStorage().GetPointer()->GetDataStorage(); dataStorage->Add(doseImageNode); dataStorage->Add(doseOutlineNode, doseImageNode); //set the dose mapper for outline drawing; the colorwash is realized by the imagevtkmapper2D mitk::DoseImageVtkMapper2D::Pointer contourMapper = mitk::DoseImageVtkMapper2D::New(); doseOutlineNode->SetMapper(1, contourMapper); mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(dataStorage); }//END DOSE } else if(modality.compare("RTSTRUCT",Qt::CaseInsensitive) == 0) { mitk::RTStructureSetReader::Pointer structreader = mitk::RTStructureSetReader::New(); std::deque modelVector = structreader->ReadStructureSet(listOfFilesForSeries.at(0).toStdString().c_str()); if(modelVector.empty()) { MITK_ERROR << "No structuresets were created" << endl; } else { ctkServiceReference serviceReference =mitk::PluginActivator::getContext()->getServiceReference(); mitk::IDataStorageService* storageService = mitk::PluginActivator::getContext()->getService(serviceReference); mitk::DataStorage* dataStorage = storageService->GetDefaultDataStorage().GetPointer()->GetDataStorage(); for(int i=0; iAdd(modelVector.at(i)); } mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(dataStorage); } } } else { mitk::StringList seriesToLoad; QStringListIterator it(listOfFilesForSeries); while (it.hasNext()) { seriesToLoad.push_back(it.next().toStdString()); } //Get Reference for default data storage. ctkServiceReference serviceReference = mitk::PluginActivator::getContext()->getServiceReference(); mitk::IDataStorageService* storageService = mitk::PluginActivator::getContext()->getService(serviceReference); mitk::DataStorage* dataStorage = storageService->GetDefaultDataStorage().GetPointer()->GetDataStorage(); //special handling of Philips 3D US DICOM. //Copied from DICOMSeriesReaderService if (!seriesToLoad.empty() && mitk::DicomSeriesReader::IsPhilips3DDicom(seriesToLoad.front())) { MITK_INFO << "it is a Philips3D US Dicom file" << std::endl; const char* previousCLocale = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); std::locale previousCppLocale(std::cin.getloc()); std::locale l("C"); std::cin.imbue(l); mitk::DataNode::Pointer node = mitk::DataNode::New(); mitk::DicomSeriesReader::StringContainer stringvec; stringvec.push_back(seriesToLoad.front()); if (mitk::DicomSeriesReader::LoadDicomSeries(stringvec, *node)) { mitk::BaseData::Pointer data = node->GetData(); - mitk::StringProperty::Pointer nameProp = mitk::StringProperty::New(itksys::SystemTools::GetFilenameName(fileName)); + mitk::StringProperty::Pointer nameProp = mitk::StringProperty::New(itksys::SystemTools::GetFilenameName(seriesToLoad.front())); data->GetPropertyList()->SetProperty("name", nameProp); node->SetProperty("name", nameProp); dataStorage->Add(node); } setlocale(LC_NUMERIC, previousCLocale); std::cin.imbue(previousCppLocale); return; } //Normal DICOM handling (It wasn't a Philips 3D US) mitk::DICOMFileReaderSelector::Pointer selector = mitk::DICOMFileReaderSelector::New(); selector->LoadBuiltIn3DConfigs(); selector->LoadBuiltIn3DnTConfigs(); selector->SetInputFiles(seriesToLoad); mitk::DICOMFileReader::Pointer reader = selector->GetFirstReaderWithMinimumNumberOfOutputImages(); - reader->SetAdditionalTagsOfInterest(mitk::GetDefaultDICOMTagsOfInterest()); + reader->SetAdditionalTagsOfInterest(mitk::GetCurrentDICOMTagsOfInterest()); reader->SetInputFiles(seriesToLoad); 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().GetPointer(); 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; } mitk::StringProperty::Pointer nameProp = mitk::StringProperty::New(nodeName); data->SetProperty("name", nameProp); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(data); nameProp = mitk::StringProperty::New(nodeName); node->SetProperty("name", nameProp); dataStorage->Add(node); } if (reader->GetNumberOfOutputs() < 1) { MITK_ERROR << "Error loading series: " << ctkEvent.getProperty("SeriesName").toString().toStdString() << " id: " << ctkEvent.getProperty("SeriesUID").toString().toStdString(); } } } else { MITK_INFO << "There are no files for the current series"; } } void DicomEventHandler::OnSignalRemoveSeriesFromStorage(const ctkEvent& /*ctkEvent*/) { } void DicomEventHandler::SubscribeSlots() { ctkServiceReference ref = mitk::PluginActivator::getContext()->getServiceReference(); if (ref) { ctkEventAdmin* eventAdmin = mitk::PluginActivator::getContext()->getService(ref); ctkDictionary properties; properties[ctkEventConstants::EVENT_TOPIC] = "org/mitk/gui/qt/dicom/ADD"; eventAdmin->subscribeSlot(this, SLOT(OnSignalAddSeriesToDataManager(ctkEvent)), properties); properties[ctkEventConstants::EVENT_TOPIC] = "org/mitk/gui/qt/dicom/DELETED"; eventAdmin->subscribeSlot(this, SLOT(OnSignalRemoveSeriesFromStorage(ctkEvent)), properties); } }