# HG changeset patch # User Sebastien Jodogne # Date 1516103394 -3600 # Node ID a06ad9d7406e5d7b626d31719f9456316d87e651 # Parent e2fe9352f240dd6115c8583fffb6116d3eb330fa ISlicedVolume::NotifyVolumeReady diff -r e2fe9352f240 -r a06ad9d7406e Framework/Volumes/ISlicedVolume.h --- a/Framework/Volumes/ISlicedVolume.h Tue Jan 02 09:56:08 2018 +0100 +++ b/Framework/Volumes/ISlicedVolume.h Tue Jan 16 12:49:54 2018 +0100 @@ -48,6 +48,9 @@ virtual void NotifySliceChange(const ISlicedVolume& volume, const size_t& sliceIndex, const Slice& slice) = 0; + + // Triggered when the geometry *and* the content of the volume are available + virtual void NotifyVolumeReady(const ISlicedVolume& volume) = 0; }; virtual ~ISlicedVolume() diff -r e2fe9352f240 -r a06ad9d7406e Framework/Volumes/SlicedVolumeBase.cpp --- a/Framework/Volumes/SlicedVolumeBase.cpp Tue Jan 02 09:56:08 2018 +0100 +++ b/Framework/Volumes/SlicedVolumeBase.cpp Tue Jan 16 12:49:54 2018 +0100 @@ -43,4 +43,9 @@ { observers_.Apply(*this, &IObserver::NotifySliceChange, sliceIndex, slice); } + + void SlicedVolumeBase::NotifyVolumeReady() + { + observers_.Apply(*this, &IObserver::NotifyVolumeReady); + } } diff -r e2fe9352f240 -r a06ad9d7406e Framework/Volumes/SlicedVolumeBase.h --- a/Framework/Volumes/SlicedVolumeBase.h Tue Jan 02 09:56:08 2018 +0100 +++ b/Framework/Volumes/SlicedVolumeBase.h Tue Jan 16 12:49:54 2018 +0100 @@ -43,6 +43,8 @@ virtual void NotifySliceChange(const size_t& sliceIndex, const Slice& slice); + virtual void NotifyVolumeReady(); + public: virtual void Register(IObserver& observer) { diff -r e2fe9352f240 -r a06ad9d7406e Framework/dev.h --- a/Framework/dev.h Tue Jan 02 09:56:08 2018 +0100 +++ b/Framework/dev.h Tue Jan 16 12:49:54 2018 +0100 @@ -39,6 +39,7 @@ namespace OrthancStone { + // TODO: Handle errors while loading class OrthancVolumeImage : public SlicedVolumeBase, private OrthancSlicesLoader::ICallback @@ -48,6 +49,7 @@ std::auto_ptr image_; std::auto_ptr downloadStack_; bool computeRange_; + size_t pendingSlices_; void ScheduleSliceDownload() { @@ -158,6 +160,7 @@ image_->Clear(); downloadStack_.reset(new DownloadStack(loader.GetSliceCount())); + pendingSlices_ = loader.GetSliceCount(); for (unsigned int i = 0; i < 4; i++) // Limit to 4 simultaneous downloads { @@ -186,7 +189,17 @@ Orthanc::ImageProcessing::Copy(writer.GetAccessor(), *image); } - SlicedVolumeBase::NotifySliceChange(sliceIndex, slice); + SlicedVolumeBase::NotifySliceChange(sliceIndex, slice); + + if (pendingSlices_ == 1) + { + SlicedVolumeBase::NotifyVolumeReady(); + pendingSlices_ = 0; + } + else if (pendingSlices_ > 1) + { + pendingSlices_ -= 1; + } ScheduleSliceDownload(); } @@ -204,7 +217,8 @@ OrthancVolumeImage(IWebService& orthanc, bool computeRange) : loader_(*this, orthanc), - computeRange_(computeRange) + computeRange_(computeRange), + pendingSlices_(0) { } diff -r e2fe9352f240 -r a06ad9d7406e Platforms/Generic/CMakeLists.txt --- a/Platforms/Generic/CMakeLists.txt Tue Jan 02 09:56:08 2018 +0100 +++ b/Platforms/Generic/CMakeLists.txt Tue Jan 16 12:49:54 2018 +0100 @@ -9,7 +9,7 @@ include(../../Resources/CMake/OrthancStoneParameters.cmake) SET(ORTHANC_SANDBOXED OFF) -SET(ORTHANC_BOOST_COMPONENTS program_options) +LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) SET(ENABLE_CRYPTO_OPTIONS ON) SET(ENABLE_GOOGLE_TEST ON) SET(ENABLE_WEB_CLIENT ON)