Mercurial > hg > orthanc-stone
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 } |