diff OrthancStone/Sources/Toolbox/SortedFrames.cpp @ 1599:73cd85d7da6a

SortedFrames::LookupSopInstanceUid()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 28 Oct 2020 10:55:45 +0100
parents 8563ea5d8ae4
children b253b79906fa
line wrap: on
line diff
--- a/OrthancStone/Sources/Toolbox/SortedFrames.cpp	Mon Oct 26 20:49:28 2020 +0100
+++ b/OrthancStone/Sources/Toolbox/SortedFrames.cpp	Wed Oct 28 10:55:45 2020 +0100
@@ -144,6 +144,7 @@
       delete instances_[i];
     }
 
+    instancesIndex_.clear();
     studyInstanceUid_.clear();
     seriesInstanceUid_.clear();
     frames_.clear();
@@ -155,9 +156,10 @@
   {
     std::unique_ptr<Instance> instance(new Instance(tags));
 
-    std::string studyInstanceUid, seriesInstanceUid;
+    std::string studyInstanceUid, seriesInstanceUid, sopInstanceUid;
     if (!tags.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) ||
-        !tags.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false))
+        !tags.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false) ||
+        !tags.LookupStringValue(sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false))
     {
       throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
     }
@@ -177,12 +179,37 @@
       }
     }
 
+    if (instancesIndex_.find(sopInstanceUid) != instancesIndex_.end())
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange,
+                                      "Cannot register twice the same SOP Instance UID");
+    }
+
+    instancesIndex_[sopInstanceUid] = instances_.size();
+
     instances_.push_back(instance.release());
     sorted_ = false;
     frames_.clear();
   }
 
 
+  bool SortedFrames::LookupSopInstanceUid(size_t& instanceIndex,
+                                          const std::string& sopInstanceUid) const
+  {
+    InstancesIndex::const_iterator found = instancesIndex_.find(sopInstanceUid);
+    
+    if (found == instancesIndex_.end())
+    {
+      return false;
+    }
+    else
+    {
+      instanceIndex = found->second;
+      return true;
+    }
+  }
+
+  
   void SortedFrames::AddFramesOfInstance(std::set<size_t>& remainingInstances,
                                          size_t index)
   {