# HG changeset patch # User Sebastien Jodogne # Date 1720268685 -7200 # Node ID e300f22a46f0b4b1b569d4a0eec024dffb540226 # Parent b4c97c51f9db2cfe3a5fcaa32ddb719f7b28ef49 implemented computed tags diff -r b4c97c51f9db -r e300f22a46f0 OrthancServer/Sources/Database/Compatibility/GenericFind.cpp --- a/OrthancServer/Sources/Database/Compatibility/GenericFind.cpp Sat Jul 06 13:57:14 2024 +0200 +++ b/OrthancServer/Sources/Database/Compatibility/GenericFind.cpp Sat Jul 06 14:24:45 2024 +0200 @@ -497,8 +497,7 @@ for (std::list::const_iterator it3 = values.begin(); it3 != values.end(); ++it3) { - // TODO-FIND - Inject this value in the response - printf("[%s]\n", it3->c_str()); + resource->AddChildrenMetadataValue(childrenLevel, *it, *it3); } } } @@ -530,8 +529,7 @@ std::string value; if (m.LookupStringValue(value, *it2, false /* no binary allowed */)) { - // TODO-FIND - Inject this value in the response - printf("<%s>\n", value.c_str()); + resource->AddChildrenMainDicomTagValue(childrenLevel, *it2, value); } } } diff -r b4c97c51f9db -r e300f22a46f0 OrthancServer/Sources/Database/FindResponse.cpp --- a/OrthancServer/Sources/Database/FindResponse.cpp Sat Jul 06 13:57:14 2024 +0200 +++ b/OrthancServer/Sources/Database/FindResponse.cpp Sat Jul 06 14:24:45 2024 +0200 @@ -155,6 +155,74 @@ } + void FindResponse::ChildrenInformation::AddMetadataValue(MetadataType metadata, + const std::string& value) + { + MetadataValues::iterator found = metadataValues_.find(metadata); + + if (found == metadataValues_.end()) + { + std::set s; + s.insert(value); + metadataValues_[metadata] = s; + } + else + { + found->second.insert(value); + } + } + + + void FindResponse::ChildrenInformation::GetMetadataValues(std::set& values, + MetadataType metadata) const + { + MetadataValues::const_iterator found = metadataValues_.find(metadata); + + if (found == metadataValues_.end()) + { + values.clear(); + } + else + { + values = found->second; + } + } + + + void FindResponse::ChildrenInformation::AddMainDicomTagValue(const DicomTag& tag, + const std::string& value) + { + MainDicomTagValues::iterator found = mainDicomTagValues_.find(tag); + + if (found == mainDicomTagValues_.end()) + { + std::set s; + s.insert(value); + mainDicomTagValues_[tag] = s; + } + else + { + found->second.insert(value); + } + } + + + void FindResponse::ChildrenInformation::GetMainDicomTagValues(std::set& values, + const DicomTag& tag) const + { + MainDicomTagValues::const_iterator found = mainDicomTagValues_.find(tag); + + if (found == mainDicomTagValues_.end()) + { + values.clear(); + } + else + { + values = found->second; + } + } + + FindResponse::ChildrenInformation& FindResponse::Resource::GetChildrenInformation(ResourceType level) { switch (level) diff -r b4c97c51f9db -r e300f22a46f0 OrthancServer/Sources/Database/FindResponse.h --- a/OrthancServer/Sources/Database/FindResponse.h Sat Jul 06 13:57:14 2024 +0200 +++ b/OrthancServer/Sources/Database/FindResponse.h Sat Jul 06 14:24:45 2024 +0200 @@ -69,7 +69,12 @@ class ChildrenInformation : public boost::noncopyable { private: + typedef std::map > MetadataValues; + typedef std::map > MainDicomTagValues; + std::set identifiers_; + MetadataValues metadataValues_; + MainDicomTagValues mainDicomTagValues_; public: void AddIdentifier(const std::string& identifier); @@ -78,6 +83,18 @@ { return identifiers_; } + + void AddMetadataValue(MetadataType metadata, + const std::string& value); + + void GetMetadataValues(std::set& values, + MetadataType metadata) const; + + void AddMainDicomTagValue(const DicomTag& tag, + const std::string& value); + + void GetMainDicomTagValues(std::set& values, + const DicomTag& tag) const; }; @@ -104,7 +121,7 @@ ChildrenInformation childrenInstancesInformation_; std::set labels_; std::map attachments_; - ChildrenMetadata childrenMetadata_; + ChildrenMetadata childrenMetadata_; // TODO-FIND: REMOVE MainDicomTagsAtLevel& GetMainDicomTagsAtLevel(ResourceType level); @@ -200,6 +217,34 @@ return GetChildrenInformation(level).GetIdentifiers(); } + void AddChildrenMetadataValue(ResourceType level, + MetadataType metadata, + const std::string& value) + { + GetChildrenInformation(level).AddMetadataValue(metadata, value); + } + + void GetChildrenMetadataValues(std::set& values, + ResourceType level, + MetadataType metadata) const + { + GetChildrenInformation(level).GetMetadataValues(values, metadata); + } + + void AddChildrenMainDicomTagValue(ResourceType level, + const DicomTag& tag, + const std::string& value) + { + GetChildrenInformation(level).AddMainDicomTagValue(tag, value); + } + + void GetChildrenMainDicomTagValues(std::set& values, + ResourceType level, + const DicomTag& tag) const + { + GetChildrenInformation(level).GetMainDicomTagValues(values, tag); + } + void AddLabel(const std::string& label); std::set& GetLabels() @@ -222,9 +267,11 @@ return attachments_; } + // TODO-FIND: REMOVE void AddChildrenMetadata(MetadataType metadata, const std::list& values); + // TODO-FIND: REMOVE bool LookupChildrenMetadata(std::list& values, MetadataType metadata) const; diff -r b4c97c51f9db -r e300f22a46f0 OrthancServer/Sources/ResourceFinder.cpp --- a/OrthancServer/Sources/ResourceFinder.cpp Sat Jul 06 13:57:14 2024 +0200 +++ b/OrthancServer/Sources/ResourceFinder.cpp Sat Jul 06 14:24:45 2024 +0200 @@ -75,6 +75,29 @@ case ResourceType_Study: InjectChildrenCountComputedTag(requestedTags, DICOM_TAG_NUMBER_OF_STUDY_RELATED_SERIES, resource, ResourceType_Series); InjectChildrenCountComputedTag(requestedTags, DICOM_TAG_NUMBER_OF_STUDY_RELATED_INSTANCES, resource, ResourceType_Instance); + + if (IsRequestedComputedTag(DICOM_TAG_MODALITIES_IN_STUDY)) + { + std::set modalities; + resource.GetChildrenMainDicomTagValues(modalities, ResourceType_Series, DICOM_TAG_MODALITY); + + std::string s; + Toolbox::JoinStrings(s, modalities, "\\"); + + requestedTags.SetValue(DICOM_TAG_MODALITIES_IN_STUDY, s, false); + } + + if (IsRequestedComputedTag(DICOM_TAG_SOP_CLASSES_IN_STUDY)) + { + std::set classes; + resource.GetChildrenMetadataValues(classes, ResourceType_Instance, MetadataType_Instance_SopClassUid); + + std::string s; + Toolbox::JoinStrings(s, classes, "\\"); + + requestedTags.SetValue(DICOM_TAG_SOP_CLASSES_IN_STUDY, s, false); + } + break; case ResourceType_Series: