# HG changeset patch # User Benjamin Golinvaux # Date 1568973594 -7200 # Node ID e704a53c9d0a5d4b634e59666b00d41d5656fb39 # Parent 50e5acf5553be869eac9d593d8a1398202262622 LoaderCache : support for the second set of structure set handling classes diff -r 50e5acf5553b -r e704a53c9d0a Framework/Loaders/LoaderCache.cpp --- a/Framework/Loaders/LoaderCache.cpp Fri Sep 20 11:59:29 2019 +0200 +++ b/Framework/Loaders/LoaderCache.cpp Fri Sep 20 11:59:54 2019 +0200 @@ -23,6 +23,7 @@ #include "OrthancSeriesVolumeProgressiveLoader.h" #include "OrthancMultiframeVolumeLoader.h" #include "DicomStructureSetLoader.h" +#include "DicomStructureSetLoader2.h" #if ORTHANC_ENABLE_WASM == 1 # include @@ -32,8 +33,10 @@ #endif #include "../Messages/LockingEmitter.h" +#include "../Toolbox/DicomStructureSet2.h" #include "../Volumes/DicomVolumeImage.h" #include "../Volumes/DicomVolumeImageMPRSlicer.h" +#include "../Volumes/DicomStructureSetSlicer2.h" #include #include @@ -184,6 +187,18 @@ } } + boost::shared_ptr LoaderCache::GetDicomStructureSetSlicer2(std::string instanceUuid) + { + // if the loader is not available, let's trigger its creation + if (dicomStructureSetSlicers2_.find(instanceUuid) == dicomStructureSetSlicers2_.end()) + { + GetDicomStructureSetLoader2(instanceUuid); + } + ORTHANC_ASSERT(dicomStructureSetSlicers2_.find(instanceUuid) != dicomStructureSetSlicers2_.end()); + + return dicomStructureSetSlicers2_[instanceUuid]; + } + boost::shared_ptr LoaderCache::GetDicomStructureSetLoader(std::string instanceUuid) { try @@ -235,6 +250,60 @@ } + boost::shared_ptr LoaderCache::GetDicomStructureSetLoader2(std::string instanceUuid) + { + try + { + // normalize keys a little + instanceUuid = Orthanc::Toolbox::StripSpaces(instanceUuid); + Orthanc::Toolbox::ToLowerCase(instanceUuid); + + // find in cache + if (dicomStructureSetLoaders2_.find(instanceUuid) == dicomStructureSetLoaders2_.end()) + { + boost::shared_ptr loader; + boost::shared_ptr structureSet(new DicomStructureSet2()); + boost::shared_ptr rtSlicer(new DicomStructureSetSlicer2(structureSet)); + dicomStructureSetSlicers2_[instanceUuid] = rtSlicer; + dicomStructureSets2_[instanceUuid] = structureSet; // to prevent it from being deleted + { +#if ORTHANC_ENABLE_WASM == 1 + loader.reset(new DicomStructureSetLoader2(*(structureSet.get()), oracle_, oracle_)); +#else + LockingEmitter::WriterLock lock(lockingEmitter_); + // TODO: clarify lifetimes... this is DANGEROUS! + loader.reset(new DicomStructureSetLoader2(*(structureSet.get()), oracle_, lock.GetOracleObservable())); +#endif + loader->LoadInstance(instanceUuid); + } + dicomStructureSetLoaders2_[instanceUuid] = loader; + } + return dicomStructureSetLoaders2_[instanceUuid]; + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in GetDicomStructureSetLoader2: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in GetDicomStructureSetLoader2: " << e.What(); + } + throw; + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in GetDicomStructureSetLoader2: " << e.what(); + throw; + } + catch (...) + { + LOG(ERROR) << "Unknown exception in GetDicomStructureSetLoader2"; + throw; + } + } + void LoaderCache::ClearCache() { #if ORTHANC_ENABLE_WASM != 1 @@ -249,9 +318,13 @@ multiframeVolumeLoaders_.clear(); dicomVolumeImageMPRSlicers_.clear(); dicomStructureSetLoaders_.clear(); + + // order is important! + dicomStructureSetLoaders2_.clear(); + dicomStructureSetSlicers2_.clear(); + dicomStructureSets2_.clear(); } - template void DebugDisplayObjRefCountsInMap( const std::string& name, const std::map >& myMap) { @@ -271,5 +344,7 @@ DebugDisplayObjRefCountsInMap("multiframeVolumeLoaders_", multiframeVolumeLoaders_); DebugDisplayObjRefCountsInMap("dicomVolumeImageMPRSlicers_", dicomVolumeImageMPRSlicers_); DebugDisplayObjRefCountsInMap("dicomStructureSetLoaders_", dicomStructureSetLoaders_); + DebugDisplayObjRefCountsInMap("dicomStructureSetLoaders2_", dicomStructureSetLoaders2_); + DebugDisplayObjRefCountsInMap("dicomStructureSetSlicers2_", dicomStructureSetSlicers2_); } } diff -r 50e5acf5553b -r e704a53c9d0a Framework/Loaders/LoaderCache.h --- a/Framework/Loaders/LoaderCache.h Fri Sep 20 11:59:29 2019 +0200 +++ b/Framework/Loaders/LoaderCache.h Fri Sep 20 11:59:54 2019 +0200 @@ -30,6 +30,9 @@ class OrthancSeriesVolumeProgressiveLoader; class DicomVolumeImageMPRSlicer; class DicomStructureSetLoader; + class DicomStructureSetLoader2; + class DicomStructureSetSlicer2; + class DicomStructureSet2; class OrthancMultiframeVolumeLoader; #if ORTHANC_ENABLE_WASM == 1 @@ -60,6 +63,12 @@ boost::shared_ptr GetDicomStructureSetLoader (std::string instanceUuid); + boost::shared_ptr + GetDicomStructureSetLoader2(std::string instanceUuid); + + boost::shared_ptr + GetDicomStructureSetSlicer2(std::string instanceUuid); + void ClearCache(); private: @@ -80,6 +89,12 @@ dicomVolumeImageMPRSlicers_; std::map > dicomStructureSetLoaders_; + std::map > + dicomStructureSetLoaders2_; + std::map > + dicomStructureSets2_; + std::map > + dicomStructureSetSlicers2_; }; }