comparison Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h @ 1381:f4a06ad1580b

Branch broker is now the new default
author Benjamin Golinvaux <bgo@osimis.io>
date Wed, 22 Apr 2020 14:05:47 +0200
parents 8a0a62189f46 556b4bc19118
children afdd5be8731c
comparison
equal deleted inserted replaced
1375:4431ffdcc2a4 1381:f4a06ad1580b
19 **/ 19 **/
20 20
21 21
22 #pragma once 22 #pragma once
23 23
24 #include "../Loaders/IFetchingItemsSorter.h"
25 #include "../Loaders/IFetchingStrategy.h"
24 #include "../Messages/IObservable.h" 26 #include "../Messages/IObservable.h"
25 #include "../Messages/IObserver.h" 27 #include "../Messages/ObserverBase.h"
26 #include "../Oracle/GetOrthancImageCommand.h" 28 #include "../Oracle/GetOrthancImageCommand.h"
27 #include "../Oracle/GetOrthancWebViewerJpegCommand.h" 29 #include "../Oracle/GetOrthancWebViewerJpegCommand.h"
28 #include "../Oracle/IOracle.h" 30 #include "../Oracle/IOracle.h"
29 #include "../Oracle/OrthancRestApiCommand.h" 31 #include "../Oracle/OrthancRestApiCommand.h"
30 #include "../Toolbox/SlicesSorter.h" 32 #include "../Toolbox/SlicesSorter.h"
31 #include "../Volumes/DicomVolumeImage.h" 33 #include "../Volumes/DicomVolumeImage.h"
32 #include "../Volumes/IVolumeSlicer.h" 34 #include "../Volumes/IVolumeSlicer.h"
33 #include "IFetchingItemsSorter.h" 35
34 #include "IFetchingStrategy.h" 36 #include "../Volumes/IGeometryProvider.h"
37
35 38
36 #include <boost/shared_ptr.hpp> 39 #include <boost/shared_ptr.hpp>
37 40
38 namespace OrthancStone 41 namespace OrthancStone
39 { 42 {
43 class ILoadersContext;
40 /** 44 /**
41 This class is used to manage the progressive loading of a volume that 45 This class is used to manage the progressive loading of a volume that
42 is stored in a Dicom series. 46 is stored in a Dicom series.
43 */ 47 */
44 class OrthancSeriesVolumeProgressiveLoader : 48 class OrthancSeriesVolumeProgressiveLoader :
45 public IObserver, 49 public OrthancStone::ObserverBase<OrthancSeriesVolumeProgressiveLoader>,
46 public IObservable, 50 public OrthancStone::IObservable,
47 public IVolumeSlicer, 51 public OrthancStone::IVolumeSlicer,
48 public IGeometryProvider 52 public IGeometryProvider
49 { 53 {
50 private: 54 private:
51 static const unsigned int LOW_QUALITY = 0; 55 static const unsigned int QUALITY_00 = 0;
52 static const unsigned int MIDDLE_QUALITY = 1; 56 static const unsigned int QUALITY_01 = 1;
53 static const unsigned int BEST_QUALITY = 2; 57 static const unsigned int QUALITY_02 = 2;
54 58
55 class ExtractedSlice; 59 class ExtractedSlice;
56 60
57 /** Helper class internal to OrthancSeriesVolumeProgressiveLoader */ 61 /** Helper class internal to OrthancSeriesVolumeProgressiveLoader */
58 class SeriesGeometry : public boost::noncopyable 62 class SeriesGeometry : public boost::noncopyable
59 { 63 {
60 private: 64 private:
61 void CheckSlice(size_t index, 65 void CheckSlice(size_t index,
62 const DicomInstanceParameters& reference) const; 66 const OrthancStone::DicomInstanceParameters& reference) const;
63 67
64 void CheckVolume() const; 68 void CheckVolume() const;
65 69
66 void Clear(); 70 void Clear();
67 71
68 void CheckSliceIndex(size_t index) const; 72 void CheckSliceIndex(size_t index) const;
69 73
70 std::unique_ptr<VolumeImageGeometry> geometry_; 74 std::unique_ptr<OrthancStone::VolumeImageGeometry> geometry_;
71 std::vector<DicomInstanceParameters*> slices_; 75 std::vector<OrthancStone::DicomInstanceParameters*> slices_;
72 std::vector<uint64_t> slicesRevision_; 76 std::vector<uint64_t> slicesRevision_;
73 77
74 public: 78 public:
75 ~SeriesGeometry() 79 ~SeriesGeometry()
76 { 80 {
77 Clear(); 81 Clear();
78 } 82 }
79 83
80 void ComputeGeometry(SlicesSorter& slices); 84 void ComputeGeometry(OrthancStone::SlicesSorter& slices);
81 85
82 virtual bool HasGeometry() const 86 virtual bool HasGeometry() const
83 { 87 {
84 return geometry_.get() != NULL; 88 return geometry_.get() != NULL;
85 } 89 }
86 90
87 virtual const VolumeImageGeometry& GetImageGeometry() const; 91 virtual const OrthancStone::VolumeImageGeometry& GetImageGeometry() const;
88 92
89 const DicomInstanceParameters& GetSliceParameters(size_t index) const; 93 const OrthancStone::DicomInstanceParameters& GetSliceParameters(size_t index) const;
90 94
91 uint64_t GetSliceRevision(size_t index) const; 95 uint64_t GetSliceRevision(size_t index) const;
92 96
93 void IncrementSliceRevision(size_t index); 97 void IncrementSliceRevision(size_t index);
94 }; 98 };
95 99
96 void ScheduleNextSliceDownload(); 100 void ScheduleNextSliceDownload();
97 101
98 void LoadGeometry(const OrthancRestApiCommand::SuccessMessage& message); 102 void LoadGeometry(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message);
99 103
100 void SetSliceContent(unsigned int sliceIndex, 104 void SetSliceContent(unsigned int sliceIndex,
101 const Orthanc::ImageAccessor& image, 105 const Orthanc::ImageAccessor& image,
102 unsigned int quality); 106 unsigned int quality);
103 107
104 void LoadBestQualitySliceContent(const GetOrthancImageCommand::SuccessMessage& message); 108 void LoadBestQualitySliceContent(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message);
105 109
106 void LoadJpegSliceContent(const GetOrthancWebViewerJpegCommand::SuccessMessage& message); 110 void LoadJpegSliceContent(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message);
107 111
108 IOracle& oracle_; 112 OrthancStone::ILoadersContext& loadersContext_;
109 IObservable& oracleObservable_; 113 bool active_;
110 bool active_; 114 bool progressiveQuality_;
111 unsigned int simultaneousDownloads_; 115 unsigned int simultaneousDownloads_;
112 SeriesGeometry seriesGeometry_; 116 SeriesGeometry seriesGeometry_;
113 boost::shared_ptr<DicomVolumeImage> volume_; 117 boost::shared_ptr<OrthancStone::DicomVolumeImage> volume_;
114 std::unique_ptr<IFetchingItemsSorter::IFactory> sorter_; 118 std::unique_ptr<OrthancStone::IFetchingItemsSorter::IFactory> sorter_;
115 std::unique_ptr<IFetchingStrategy> strategy_; 119 std::unique_ptr<OrthancStone::IFetchingStrategy> strategy_;
116 std::vector<unsigned int> slicesQuality_; 120
117 bool volumeImageReadyInHighQuality_; 121 std::vector<unsigned int> slicesQuality_;
118 122 bool volumeImageReadyInHighQuality_;
119 123
124 OrthancSeriesVolumeProgressiveLoader(
125 OrthancStone::ILoadersContext& loadersContext,
126 boost::shared_ptr<OrthancStone::DicomVolumeImage> volume,
127 bool progressiveQuality);
128
120 public: 129 public:
121 ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, VolumeImageReadyInHighQuality, OrthancSeriesVolumeProgressiveLoader); 130 ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, VolumeImageReadyInHighQuality, OrthancSeriesVolumeProgressiveLoader);
122 131
123 132 /**
124 OrthancSeriesVolumeProgressiveLoader(const boost::shared_ptr<DicomVolumeImage>& volume, 133 See doc for the progressiveQuality_ field
125 IOracle& oracle, 134 */
126 IObservable& oracleObservable); 135 static boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader> Create(
136 OrthancStone::ILoadersContext& context,
137 boost::shared_ptr<OrthancStone::DicomVolumeImage> volume,
138 bool progressiveQuality = false);
127 139
128 virtual ~OrthancSeriesVolumeProgressiveLoader(); 140 virtual ~OrthancSeriesVolumeProgressiveLoader();
129 141
130 void SetSimultaneousDownloads(unsigned int count); 142 void SetSimultaneousDownloads(unsigned int count);
131 143
147 } 159 }
148 160
149 /** 161 /**
150 Same remark as HasGeometry 162 Same remark as HasGeometry
151 */ 163 */
152 const VolumeImageGeometry& GetImageGeometry() const ORTHANC_OVERRIDE 164 const OrthancStone::VolumeImageGeometry& GetImageGeometry() const ORTHANC_OVERRIDE
153 { 165 {
154 return seriesGeometry_.GetImageGeometry(); 166 return seriesGeometry_.GetImageGeometry();
155 } 167 }
156 168
157 /** 169 /**
158 When a slice is requested, the strategy algorithm (that defines the 170 When a slice is requested, the strategy algorithm (that defines the
159 sequence of resources to be loaded from the server) is modified to 171 sequence of resources to be loaded from the server) is modified to
160 take into account this request (this is done in the ExtractedSlice ctor) 172 take into account this request (this is done in the ExtractedSlice ctor)
161 */ 173 */
162 virtual IExtractedSlice* 174 virtual IExtractedSlice*
163 ExtractSlice(const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; 175 ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE;
164 }; 176 };
165 } 177 }