diff OrthancFramework/Sources/DicomFormat/DicomSequencesMap.cpp @ 5043:ec5c203a97ea

returning sequences in MainDicomTags and RequestedTags
author Alain Mazy <am@osimis.io>
date Mon, 27 Jun 2022 15:22:19 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancFramework/Sources/DicomFormat/DicomSequencesMap.cpp	Mon Jun 27 15:22:19 2022 +0200
@@ -0,0 +1,100 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2022 Osimis S.A., Belgium
+ * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#include "../PrecompiledHeaders.h"
+#include "DicomSequencesMap.h"
+#include "../Toolbox.h"
+
+namespace Orthanc
+{
+
+#if ORTHANC_ENABLE_DCMTK == 1
+
+  // copy all tags from Json (used to read from metadata)
+  void DicomSequencesMap::Deserialize(const Json::Value& serialized)
+  {
+    Json::Value::Members members = serialized.getMemberNames();
+    for (size_t i = 0; i < members.size(); i++)
+    {
+      DicomTag tag(0, 0);
+      if (DicomTag::ParseHexadecimal(tag, members[i].c_str()))
+      {
+        sequences_[tag] = serialized[members[i]];
+      }
+    }
+  }
+
+#endif
+
+  // serialize a subet of tags (used to store in the metadata)
+  void DicomSequencesMap::Serialize(Json::Value& target, const std::set<DicomTag>& tags) const
+  {
+    // add the sequences to "target"
+    for (std::map<DicomTag, Json::Value>::const_iterator it = sequences_.begin();
+          it != sequences_.end(); ++it)
+    {
+      if (tags.find(it->first) != tags.end())
+      {
+        target[it->first.Format()] = it->second;
+      }
+    }
+  }
+
+  // copy a subset of tags from Json
+  void DicomSequencesMap::FromDicomAsJson(const Json::Value& dicomAsJson, const std::set<DicomTag>& tags)
+  {
+    for (std::set<DicomTag>::const_iterator it = tags.begin();
+         it != tags.end(); ++it)
+    {
+      std::string tag = it->Format();
+      if (dicomAsJson.isMember(tag))
+      {
+        sequences_[*it] = dicomAsJson[tag];
+      }
+    }
+  }
+
+  void DicomSequencesMap::ToJson(Json::Value& target, DicomToJsonFormat format, const std::set<DicomTag>& tags) const
+  {
+    // add the sequences to "target"
+    for (std::map<DicomTag, Json::Value>::const_iterator it = sequences_.begin();
+          it != sequences_.end(); ++it)
+    {
+      Json::Value sequenceFullJson = Json::objectValue;
+      sequenceFullJson[it->first.Format()] = it->second;
+
+      Json::Value& requestedFormatJson = sequenceFullJson;
+      Json::Value convertedJson;
+
+      if (format != DicomToJsonFormat_Full)
+      {
+        Toolbox::SimplifyDicomAsJson(convertedJson, sequenceFullJson, format);
+        requestedFormatJson = convertedJson;
+      }
+      
+      Json::Value::Members keys = requestedFormatJson.getMemberNames();  
+      for (size_t i = 0; i < keys.size(); i++)  // there should always be only one member in this JSON
+      {
+        target[keys[i]] = requestedFormatJson[keys[i]];
+      }
+    }
+  }
+}
\ No newline at end of file