Mercurial > hg > orthanc
diff OrthancServer/Sources/ServerContext.cpp @ 5036:877bc3b96476
Handle Dicom sequences in ExtraMainDicomTags and save them in the 'MainDicomSequences' metadata
author | Alain Mazy <am@osimis.io> |
---|---|
date | Fri, 24 Jun 2022 15:47:10 +0200 |
parents | 2f30aa99c2db |
children | 28db9663fc2d |
line wrap: on
line diff
--- a/OrthancServer/Sources/ServerContext.cpp Wed Jun 22 15:37:08 2022 +0200 +++ b/OrthancServer/Sources/ServerContext.cpp Fri Jun 24 15:47:10 2022 +0200 @@ -526,7 +526,12 @@ bool hasTransferSyntax = dicom.LookupTransferSyntax(transferSyntax); DicomMap summary; - dicom.GetSummary(summary); + dicom.GetSummary(summary); // -> this includes only the leaf nodes + + std::set<DicomTag> allMainDicomTags = DicomMap::GetAllMainDicomTags(); + std::set<DicomTag> mainDicomSequences; + DicomMap::ExtractSequences(mainDicomSequences, allMainDicomTags); + std::map<DicomTag, Json::Value> sequencesToStore; try { @@ -536,9 +541,19 @@ DicomInstanceHasher hasher(summary); resultPublicId = hasher.HashInstance(); - Json::Value dicomAsJson; - dicom.GetDicomAsJson(dicomAsJson); + Json::Value dicomAsJson; // -> this includes the sequences + + dicom.GetDicomAsJson(dicomAsJson, mainDicomSequences /*ignoreTagLength*/); // make sure that sequences that we wish to store in DB are not 'cropped' + for (std::set<DicomTag>::const_iterator it = mainDicomSequences.begin(); + it != mainDicomSequences.end(); ++it) + { + if (dicomAsJson.isMember(it->Format())) + { + sequencesToStore[*it] = dicomAsJson[it->Format()]; + } + } + Json::Value simplifiedTags; Toolbox::SimplifyDicomAsJson(simplifiedTags, dicomAsJson, DicomToJsonFormat_Human); @@ -616,7 +631,7 @@ typedef std::map<MetadataType, std::string> InstanceMetadata; InstanceMetadata instanceMetadata; result.SetStatus(index_.Store( - instanceMetadata, summary, attachments, dicom.GetMetadata(), dicom.GetOrigin(), overwrite, + instanceMetadata, summary, sequencesToStore, attachments, dicom.GetMetadata(), dicom.GetOrigin(), overwrite, hasTransferSyntax, transferSyntax, hasPixelDataOffset, pixelDataOffset, isReconstruct)); // Only keep the metadata for the "instance" level @@ -2094,6 +2109,9 @@ target[REQUESTED_TAGS] = Json::objectValue; FromDcmtkBridge::ToJson(target[REQUESTED_TAGS], tags, format); + + // add the sequences to the requested tags + resource.sequences_.ToJson(target[REQUESTED_TAGS], format); } } @@ -2405,6 +2423,9 @@ // possibly merge missing requested tags from dicom-as-json if (!resource.missingRequestedTags_.empty() && !DicomMap::HasOnlyComputedTags(resource.missingRequestedTags_)) { + std::set<DicomTag> missingSequences; + DicomMap::ExtractSequences(missingSequences, resource.missingRequestedTags_); + OrthancConfiguration::ReaderLock lock; if (lock.GetConfiguration().IsWarningEnabled(Warnings_001_TagsBeingReadFromStorage)) { @@ -2449,12 +2470,14 @@ } Json::Value tmpDicomAsJson; - ReadDicomAsJson(tmpDicomAsJson, instanceId_); + ReadDicomAsJson(tmpDicomAsJson, instanceId_, resource.missingRequestedTags_ /* ignoreTagLength */); // read all tags from DICOM and avoid cropping requested tags tagsFromJson.FromDicomAsJson(tmpDicomAsJson); + resource.sequences_.FromDicomAsJson(tmpDicomAsJson, missingSequences); } else { tagsFromJson.FromDicomAsJson(*dicomAsJson); + resource.sequences_.FromDicomAsJson(*dicomAsJson, missingSequences); } resource.tags_.Merge(tagsFromJson);