# HG changeset patch # User Sebastien Jodogne # Date 1629904821 -7200 # Node ID 9f207131c7f46a9dd0c8a745006bf518a061fe74 # Parent 248408d2b3364cc24ea8b5e1a2ac973eca4564e8 added ParsedDicomFile::LookupSubSequence() diff -r 248408d2b336 -r 9f207131c7f4 OrthancFramework/Sources/DicomFormat/DicomTag.h --- a/OrthancFramework/Sources/DicomFormat/DicomTag.h Wed Aug 25 15:42:34 2021 +0200 +++ b/OrthancFramework/Sources/DicomFormat/DicomTag.h Wed Aug 25 17:20:21 2021 +0200 @@ -172,6 +172,9 @@ static const DicomTag DICOM_TAG_PATIENT_SPECIES_DESCRIPTION(0x0010, 0x2201); static const DicomTag DICOM_TAG_STUDY_COMMENTS(0x0032, 0x4000); static const DicomTag DICOM_TAG_OTHER_PATIENT_IDS(0x0010, 0x1000); + static const DicomTag DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUP_SEQUENCE(0x5200, 0x9230); + static const DicomTag DICOM_TAG_PIXEL_VALUE_TRANSFORMATION_SEQUENCE(0x0028, 0x9145); + static const DicomTag DICOM_TAG_FRAME_VOI_LUT_SEQUENCE(0x0028, 0x9132); // Tags used within the Stone of Orthanc static const DicomTag DICOM_TAG_FRAME_INCREMENT_POINTER(0x0028, 0x0009); diff -r 248408d2b336 -r 9f207131c7f4 OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp --- a/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp Wed Aug 25 15:42:34 2021 +0200 +++ b/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp Wed Aug 25 17:20:21 2021 +0200 @@ -3162,6 +3162,56 @@ IDicomPathVisitor::Apply(visitor, dataset, path); } } + + + bool FromDcmtkBridge::LookupSubSequence(DicomMap& target, + DcmDataset& dataset, + const DicomPath& path, + size_t sequenceIndex) + { + class Visitor : public FromDcmtkBridge::IDicomPathVisitor + { + private: + bool found_; + DicomMap& target_; + size_t sequenceIndex_; + + public: + Visitor(DicomMap& target, + size_t sequenceIndex) : + found_(false), + target_(target), + sequenceIndex_(sequenceIndex) + { + } + + virtual void Visit(DcmItem& item, + const DicomPath& path) ORTHANC_OVERRIDE + { + DcmTagKey tag(path.GetFinalTag().GetGroup(), path.GetFinalTag().GetElement()); + + DcmSequenceOfItems *sequence = NULL; + + if (item.findAndGetSequence(tag, sequence).good() && + sequence != NULL && + sequenceIndex_ < sequence->card()) + { + std::set ignoreTagLength; + ExtractDicomSummary(target_, *sequence->getItem(sequenceIndex_), 0, ignoreTagLength); + found_ = true; + } + } + + bool HasFound() const + { + return found_; + } + }; + + Visitor visitor(target, sequenceIndex); + IDicomPathVisitor::Apply(visitor, dataset, path); + return visitor.HasFound(); + } } diff -r 248408d2b336 -r 9f207131c7f4 OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h --- a/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h Wed Aug 25 15:42:34 2021 +0200 +++ b/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h Wed Aug 25 17:20:21 2021 +0200 @@ -277,5 +277,10 @@ const DicomPath& path, const DcmElement& element, DicomReplaceMode mode); + + static bool LookupSubSequence(DicomMap& target, + DcmDataset& dataset, + const DicomPath& path, + size_t sequenceIndex); }; } diff -r 248408d2b336 -r 9f207131c7f4 OrthancFramework/Sources/DicomParsing/ParsedDicomFile.cpp --- a/OrthancFramework/Sources/DicomParsing/ParsedDicomFile.cpp Wed Aug 25 15:42:34 2021 +0200 +++ b/OrthancFramework/Sources/DicomParsing/ParsedDicomFile.cpp Wed Aug 25 17:20:21 2021 +0200 @@ -1777,6 +1777,15 @@ } + bool ParsedDicomFile::LookupSubSequence(DicomMap& target, + const DicomPath& path, + size_t sequenceIndex) const + { + DcmDataset& dataset = *const_cast(*this).GetDcmtkObject().getDataset(); + return FromDcmtkBridge::LookupSubSequence(target, dataset, path, sequenceIndex); + } + + #if ORTHANC_BUILDING_FRAMEWORK_LIBRARY == 1 // Alias for binary compatibility with Orthanc Framework 1.7.2 => don't use it anymore void ParsedDicomFile::DatasetToJson(Json::Value& target, diff -r 248408d2b336 -r 9f207131c7f4 OrthancFramework/Sources/DicomParsing/ParsedDicomFile.h --- a/OrthancFramework/Sources/DicomParsing/ParsedDicomFile.h Wed Aug 25 15:42:34 2021 +0200 +++ b/OrthancFramework/Sources/DicomParsing/ParsedDicomFile.h Wed Aug 25 17:20:21 2021 +0200 @@ -285,5 +285,9 @@ void ClearPath(const DicomPath& path, bool onlyIfExists); + + bool LookupSubSequence(DicomMap& target, + const DicomPath& path, + size_t sequenceIndex) const; }; } diff -r 248408d2b336 -r 9f207131c7f4 OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp --- a/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp Wed Aug 25 15:42:34 2021 +0200 +++ b/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp Wed Aug 25 17:20:21 2021 +0200 @@ -2739,6 +2739,30 @@ ASSERT_EQ("1.2.840.113619.2.176.2025.1499492.7040.1171286241.726", vv[REF_IM_SEQ][1][REF_SOP_INSTANCE].asString()); // kept ASSERT_EQ("1.2.840.113704.1.111.7016.1342451220.40", vv[REL_SERIES_SEQ][0][STUDY_INSTANCE_UID].asString()); // kept } + + { + std::unique_ptr dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, "")); + + DicomMap m; + ASSERT_TRUE(dicom->LookupSubSequence(m, DicomPath(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE), 0)); + ASSERT_EQ(2u, m.GetSize()); + ASSERT_EQ("1.2.840.113619.2.176.2025.1499492.7040.1171286241.719", + m.GetStringValue(DICOM_TAG_REFERENCED_SOP_INSTANCE_UID, "", false)); + + ASSERT_TRUE(dicom->LookupSubSequence(m, DicomPath(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE), 1)); + ASSERT_EQ(2u, m.GetSize()); + ASSERT_EQ("1.2.840.113619.2.176.2025.1499492.7040.1171286241.726", + m.GetStringValue(DICOM_TAG_REFERENCED_SOP_INSTANCE_UID, "", false)); + + ASSERT_FALSE(dicom->LookupSubSequence(m, DicomPath(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE), 2)); + + ASSERT_TRUE(dicom->LookupSubSequence(m, DicomPath(DicomTag(0x0008, 0x1250), 0, DicomTag(0x0040, 0xa170)), 0)); + ASSERT_EQ(2u, m.GetSize()); + ASSERT_EQ("122403", m.GetStringValue(DicomTag(0x0008, 0x0100), "", false)); + ASSERT_EQ("WORLD", m.GetStringValue(DICOM_TAG_SERIES_DESCRIPTION, "", false)); + + ASSERT_FALSE(dicom->LookupSubSequence(m, DicomPath(DicomTag(0x0008, 0x1250), 0, DicomTag(0x0040, 0xa170)), 1)); + } }