# HG changeset patch # User Sebastien Jodogne # Date 1603878945 -3600 # Node ID 73cd85d7da6abf557f1f330102e76ac530a58fff # Parent 8563ea5d8ae4e4206a3987a4b16ffa58e4213522 SortedFrames::LookupSopInstanceUid() diff -r 8563ea5d8ae4 -r 73cd85d7da6a OrthancStone/Sources/Toolbox/SortedFrames.cpp --- 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(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& remainingInstances, size_t index) { diff -r 8563ea5d8ae4 -r 73cd85d7da6a OrthancStone/Sources/Toolbox/SortedFrames.h --- a/OrthancStone/Sources/Toolbox/SortedFrames.h Mon Oct 26 20:49:28 2020 +0100 +++ b/OrthancStone/Sources/Toolbox/SortedFrames.h Wed Oct 28 10:55:45 2020 +0100 @@ -94,11 +94,16 @@ } }; + + // Maps "SOPInstanceUID" to an index in "instances_" + typedef std::map InstancesIndex; + std::string studyInstanceUid_; std::string seriesInstanceUid_; std::vector instances_; std::vector frames_; bool sorted_; + InstancesIndex instancesIndex_; const Instance& GetInstance(size_t index) const; @@ -154,6 +159,9 @@ return GetInstance(index).GetSopInstanceUid(); } + bool LookupSopInstanceUid(size_t& instanceIndex, + const std::string& sopInstanceUid) const; + bool IsSorted() const { return sorted_; diff -r 8563ea5d8ae4 -r 73cd85d7da6a UnitTestsSources/SortedFramesTests.cpp --- a/UnitTestsSources/SortedFramesTests.cpp Mon Oct 26 20:49:28 2020 +0100 +++ b/UnitTestsSources/SortedFramesTests.cpp Wed Oct 28 10:55:45 2020 +0100 @@ -92,6 +92,12 @@ tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2", false); tags.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "2", false); f.AddInstance(tags); + + size_t i; + ASSERT_TRUE(f.LookupSopInstanceUid(i, "sop1")); ASSERT_EQ(1u, i); + ASSERT_TRUE(f.LookupSopInstanceUid(i, "sop2")); ASSERT_EQ(2u, i); + ASSERT_TRUE(f.LookupSopInstanceUid(i, "sop3")); ASSERT_EQ(0u, i); + ASSERT_FALSE(f.LookupSopInstanceUid(i, "nope")); f.Sort(); ASSERT_EQ(3u, f.GetInstancesCount()); @@ -105,6 +111,12 @@ ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(3)); ASSERT_EQ(0u, f.GetFrameIndex(3)); ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(4)); ASSERT_EQ(1u, f.GetFrameIndex(4)); ASSERT_EQ("sop3", f.GetFrameSopInstanceUid(5)); ASSERT_EQ(0u, f.GetFrameIndex(5)); + + // The instances must not have been reordered, only the frames + ASSERT_TRUE(f.LookupSopInstanceUid(i, "sop1")); ASSERT_EQ(1u, i); + ASSERT_TRUE(f.LookupSopInstanceUid(i, "sop2")); ASSERT_EQ(2u, i); + ASSERT_TRUE(f.LookupSopInstanceUid(i, "sop3")); ASSERT_EQ(0u, i); + ASSERT_FALSE(f.LookupSopInstanceUid(i, "nope")); } @@ -173,7 +185,7 @@ tags.Remove(Orthanc::DICOM_TAG_IMAGE_INDEX); tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "30", false); f.AddInstance(tags); - + f.Sort(); ASSERT_EQ(4u, f.GetInstancesCount()); ASSERT_EQ("sop1", f.GetSopInstanceUid(0));