Mercurial > hg > orthanc-stone
annotate Framework/Deprecated/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp @ 1320:7702ad9b7011 broker
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Tue, 17 Mar 2020 19:21:01 +0100 |
parents | cbfdba08e039 |
children | 4f8db2d202c8 |
rev | line source |
---|---|
814 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
1271
0ca50d275b9a
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1225
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
814 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #include "OrthancSeriesVolumeProgressiveLoader.h" | |
23 | |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
24 #include "../../Loaders/ILoadersContext.h" |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
25 #include "../../Loaders/BasicFetchingItemsSorter.h" |
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
26 #include "../../Loaders/BasicFetchingStrategy.h" |
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
27 #include "../../Toolbox/GeometryToolbox.h" |
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
28 #include "../../Volumes/DicomVolumeImageMPRSlicer.h" |
814 | 29 |
30 #include <Core/Images/ImageProcessing.h> | |
31 #include <Core/OrthancException.h> | |
32 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
33 namespace Deprecated |
814 | 34 { |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
35 using OrthancStone::ILoadersContext; |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
36 |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
37 class OrthancSeriesVolumeProgressiveLoader::ExtractedSlice : public OrthancStone::DicomVolumeImageMPRSlicer::Slice |
814 | 38 { |
39 private: | |
40 const OrthancSeriesVolumeProgressiveLoader& that_; | |
41 | |
42 public: | |
43 ExtractedSlice(const OrthancSeriesVolumeProgressiveLoader& that, | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
44 const OrthancStone::CoordinateSystem3D& plane) : |
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
45 OrthancStone::DicomVolumeImageMPRSlicer::Slice(*that.volume_, plane), |
814 | 46 that_(that) |
47 { | |
819 | 48 if (IsValid()) |
817
68f888812af4
simplification of DicomVolumeImageMPRSlicer::ExtractedSlice
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
814
diff
changeset
|
49 { |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
50 if (GetProjection() == OrthancStone::VolumeProjection_Axial) |
819 | 51 { |
52 // For coronal and sagittal projections, we take the global | |
53 // revision of the volume because even if a single slice changes, | |
54 // this means the projection will yield a different result --> | |
55 // we must increase the revision as soon as any slice changes | |
56 SetRevision(that_.seriesGeometry_.GetSliceRevision(GetSliceIndex())); | |
57 } | |
817
68f888812af4
simplification of DicomVolumeImageMPRSlicer::ExtractedSlice
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
814
diff
changeset
|
58 |
819 | 59 if (that_.strategy_.get() != NULL && |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
60 GetProjection() == OrthancStone::VolumeProjection_Axial) |
819 | 61 { |
62 that_.strategy_->SetCurrent(GetSliceIndex()); | |
63 } | |
814 | 64 } |
65 } | |
66 }; | |
67 | |
68 | |
69 | |
70 void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSlice(size_t index, | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
71 const OrthancStone::DicomInstanceParameters& reference) const |
814 | 72 { |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
73 const OrthancStone::DicomInstanceParameters& slice = *slices_[index]; |
814 | 74 |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
75 if (!OrthancStone::GeometryToolbox::IsParallel( |
814 | 76 reference.GetGeometry().GetNormal(), |
77 slice.GetGeometry().GetNormal())) | |
78 { | |
79 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
80 "A slice in the volume image is not parallel to the others"); | |
81 } | |
82 | |
83 if (reference.GetExpectedPixelFormat() != slice.GetExpectedPixelFormat()) | |
84 { | |
85 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat, | |
86 "The pixel format changes across the slices of the volume image"); | |
87 } | |
88 | |
89 if (reference.GetImageInformation().GetWidth() != slice.GetImageInformation().GetWidth() || | |
90 reference.GetImageInformation().GetHeight() != slice.GetImageInformation().GetHeight()) | |
91 { | |
92 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize, | |
93 "The width/height of slices are not constant in the volume image"); | |
94 } | |
95 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
96 if (!OrthancStone::LinearAlgebra::IsNear(reference.GetPixelSpacingX(), slice.GetPixelSpacingX()) || |
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
97 !OrthancStone::LinearAlgebra::IsNear(reference.GetPixelSpacingY(), slice.GetPixelSpacingY())) |
814 | 98 { |
99 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
100 "The pixel spacing of the slices change across the volume image"); | |
101 } | |
102 } | |
103 | |
104 | |
105 void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckVolume() const | |
106 { | |
107 for (size_t i = 0; i < slices_.size(); i++) | |
108 { | |
109 assert(slices_[i] != NULL); | |
110 if (slices_[i]->GetImageInformation().GetNumberOfFrames() != 1) | |
111 { | |
112 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
113 "This class does not support multi-frame images"); | |
114 } | |
115 } | |
116 | |
117 if (slices_.size() != 0) | |
118 { | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
119 const OrthancStone::DicomInstanceParameters& reference = *slices_[0]; |
814 | 120 |
121 for (size_t i = 1; i < slices_.size(); i++) | |
122 { | |
123 CheckSlice(i, reference); | |
124 } | |
125 } | |
126 } | |
127 | |
128 | |
129 void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::Clear() | |
130 { | |
131 for (size_t i = 0; i < slices_.size(); i++) | |
132 { | |
133 assert(slices_[i] != NULL); | |
134 delete slices_[i]; | |
135 } | |
136 | |
137 slices_.clear(); | |
138 slicesRevision_.clear(); | |
139 } | |
140 | |
141 | |
142 void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSliceIndex(size_t index) const | |
143 { | |
144 if (!HasGeometry()) | |
145 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
146 LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSliceIndex(size_t index): (!HasGeometry())"; |
814 | 147 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
148 } | |
149 else if (index >= slices_.size()) | |
150 { | |
151 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
152 } | |
153 else | |
154 { | |
155 assert(slices_.size() == GetImageGeometry().GetDepth() && | |
156 slices_.size() == slicesRevision_.size()); | |
157 } | |
158 } | |
159 | |
160 | |
161 // WARNING: The payload of "slices" must be of class "DicomInstanceParameters" | |
162 // (called with the slices created in LoadGeometry) | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
163 void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::ComputeGeometry(OrthancStone::SlicesSorter& slices) |
814 | 164 { |
165 Clear(); | |
166 | |
167 if (!slices.Sort()) | |
168 { | |
169 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, | |
170 "Cannot sort the 3D slices of a DICOM series"); | |
171 } | |
172 | |
173 if (slices.GetSlicesCount() == 0) | |
174 { | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
175 geometry_.reset(new OrthancStone::VolumeImageGeometry); |
814 | 176 } |
177 else | |
178 { | |
179 slices_.reserve(slices.GetSlicesCount()); | |
180 slicesRevision_.resize(slices.GetSlicesCount(), 0); | |
181 | |
182 for (size_t i = 0; i < slices.GetSlicesCount(); i++) | |
183 { | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
184 const OrthancStone::DicomInstanceParameters& slice = |
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
185 dynamic_cast<const OrthancStone::DicomInstanceParameters&>(slices.GetSlicePayload(i)); |
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
186 slices_.push_back(new OrthancStone::DicomInstanceParameters(slice)); |
814 | 187 } |
188 | |
189 CheckVolume(); | |
190 | |
1156
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
191 double spacingZ; |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
192 |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
193 if (slices.ComputeSpacingBetweenSlices(spacingZ)) |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
194 { |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
195 LOG(TRACE) << "Computed spacing between slices: " << spacingZ << "mm"; |
814 | 196 |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
197 const OrthancStone::DicomInstanceParameters& parameters = *slices_[0]; |
814 | 198 |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
199 geometry_.reset(new OrthancStone::VolumeImageGeometry); |
1156
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
200 geometry_->SetSizeInVoxels(parameters.GetImageInformation().GetWidth(), |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
201 parameters.GetImageInformation().GetHeight(), |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
202 static_cast<unsigned int>(slices.GetSlicesCount())); |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
203 geometry_->SetAxialGeometry(slices.GetSliceGeometry(0)); |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
204 geometry_->SetVoxelDimensions(parameters.GetPixelSpacingX(), |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
205 parameters.GetPixelSpacingY(), spacingZ); |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
206 } |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
207 else |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
208 { |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
209 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
210 "The origins of the slices of a volume image are not regularly spaced"); |
34ee7204fde3
removing IGeometryProvider
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1135
diff
changeset
|
211 } |
814 | 212 } |
213 } | |
214 | |
215 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
216 const OrthancStone::VolumeImageGeometry& OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetImageGeometry() const |
814 | 217 { |
218 if (!HasGeometry()) | |
219 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
220 LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetImageGeometry(): (!HasGeometry())"; |
814 | 221 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
222 } | |
223 else | |
224 { | |
225 assert(slices_.size() == geometry_->GetDepth()); | |
226 return *geometry_; | |
227 } | |
228 } | |
229 | |
230 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
231 const OrthancStone::DicomInstanceParameters& OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetSliceParameters(size_t index) const |
814 | 232 { |
233 CheckSliceIndex(index); | |
234 return *slices_[index]; | |
235 } | |
236 | |
237 | |
238 uint64_t OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetSliceRevision(size_t index) const | |
239 { | |
240 CheckSliceIndex(index); | |
241 return slicesRevision_[index]; | |
242 } | |
243 | |
244 | |
245 void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::IncrementSliceRevision(size_t index) | |
246 { | |
247 CheckSliceIndex(index); | |
248 slicesRevision_[index] ++; | |
249 } | |
250 | |
251 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
252 static unsigned int GetSliceIndexPayload(const OrthancStone::OracleCommandBase& command) |
814 | 253 { |
1135
a0a33e5ea5bb
IOracleCommand::Clone()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1134
diff
changeset
|
254 assert(command.HasPayload()); |
814 | 255 return dynamic_cast< const Orthanc::SingleValueObject<unsigned int>& >(command.GetPayload()).GetValue(); |
256 } | |
257 | |
258 | |
259 void OrthancSeriesVolumeProgressiveLoader::ScheduleNextSliceDownload() | |
260 { | |
261 assert(strategy_.get() != NULL); | |
262 | |
263 unsigned int sliceIndex, quality; | |
264 | |
265 if (strategy_->GetNext(sliceIndex, quality)) | |
266 { | |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
267 |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
268 #if USE_SINGLE_QUALITY |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
269 assert(quality == SINGLE_QUALITY); |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
270 #else |
814 | 271 assert(quality <= BEST_QUALITY); |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
272 #endif |
814 | 273 |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
274 const OrthancStone::DicomInstanceParameters& slice = seriesGeometry_.GetSliceParameters(sliceIndex); |
814 | 275 |
276 const std::string& instance = slice.GetOrthancInstanceIdentifier(); | |
277 if (instance.empty()) | |
278 { | |
279 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
280 } | |
281 | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1279
diff
changeset
|
282 std::unique_ptr<OrthancStone::OracleCommandBase> command; |
814 | 283 |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
284 #if USE_SINGLE_QUALITY |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
285 #else |
814 | 286 if (quality == BEST_QUALITY) |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
287 #endif |
814 | 288 { |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1279
diff
changeset
|
289 std::unique_ptr<OrthancStone::GetOrthancImageCommand> tmp(new OrthancStone::GetOrthancImageCommand); |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
290 // TODO: review the following comment. |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
291 // - Commented out by bgo on 2019-07-19 | reason: Alain has seen cases |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
292 // where gzipping the uint16 image took 11 sec to produce 5mb. |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
293 // The unzipped request was much much faster. |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
294 // - Re-enabled on 2019-07-30. Reason: in Web Assembly, the browser |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
295 // does not use the Accept-Encoding header and always requests |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
296 // compression. Furthermore, NOT |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
297 tmp->SetHttpHeader("Accept-Encoding", "gzip"); |
814 | 298 tmp->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); |
819 | 299 tmp->SetInstanceUri(instance, slice.GetExpectedPixelFormat()); |
814 | 300 tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
301 //LOG(INFO) |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
302 // << "OrthancSeriesVolumeProgressiveLoader.ScheduleNextSliceDownload()" |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
303 // << " sliceIndex = " << sliceIndex << " slice quality = " << quality |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
304 // << " URI = " << tmp->GetUri(); |
814 | 305 command.reset(tmp.release()); |
306 } | |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
307 #if USE_SINGLE_QUALITY |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
308 #else |
814 | 309 else |
310 { | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1279
diff
changeset
|
311 std::unique_ptr<OrthancStone::GetOrthancWebViewerJpegCommand> tmp(new OrthancStone::GetOrthancWebViewerJpegCommand); |
913
2b4b6b86520a
Re-enabled gl debug output in GuiAdapter +
Benjamin Golinvaux <bgo@osimis.io>
parents:
819
diff
changeset
|
312 // TODO: review the following comment. Commented out by bgo on 2019-07-19 |
2b4b6b86520a
Re-enabled gl debug output in GuiAdapter +
Benjamin Golinvaux <bgo@osimis.io>
parents:
819
diff
changeset
|
313 // (gzip for jpeg seems overkill) |
2b4b6b86520a
Re-enabled gl debug output in GuiAdapter +
Benjamin Golinvaux <bgo@osimis.io>
parents:
819
diff
changeset
|
314 //tmp->SetHttpHeader("Accept-Encoding", "gzip"); |
814 | 315 tmp->SetInstance(instance); |
316 tmp->SetQuality((quality == 0 ? 50 : 90)); | |
317 tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); | |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
318 LOG(TRACE) |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
319 << "OrthancSeriesVolumeProgressiveLoader.ScheduleNextSliceDownload()" |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
320 << " sliceIndex = " << sliceIndex << " slice quality = " << quality; |
814 | 321 command.reset(tmp.release()); |
322 } | |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
323 #endif |
814 | 324 |
1128
8e3763d1736a
removing CustomOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1075
diff
changeset
|
325 command->AcquirePayload(new Orthanc::SingleValueObject<unsigned int>(sliceIndex)); |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
326 |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
327 { |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
328 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(loadersContext_.Lock()); |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
329 boost::shared_ptr<IObserver> observer(GetSharedObserver()); |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
330 lock->Schedule(observer, 0, command.release()); // TODO: priority! |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
331 } |
814 | 332 } |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
333 else |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
334 { |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
335 // loading is finished! |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
336 volumeImageReadyInHighQuality_ = true; |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
337 BroadcastMessage(OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality(*this)); |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
338 } |
814 | 339 } |
340 | |
341 /** | |
342 This is called in response to GET "/series/XXXXXXXXXXXXX/instances-tags" | |
343 */ | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
344 void OrthancSeriesVolumeProgressiveLoader::LoadGeometry(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) |
814 | 345 { |
346 Json::Value body; | |
347 message.ParseJsonBody(body); | |
348 | |
349 if (body.type() != Json::objectValue) | |
350 { | |
351 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); | |
352 } | |
353 | |
354 { | |
355 Json::Value::Members instances = body.getMemberNames(); | |
356 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
357 OrthancStone::SlicesSorter slices; |
814 | 358 |
359 for (size_t i = 0; i < instances.size(); i++) | |
360 { | |
361 Orthanc::DicomMap dicom; | |
362 dicom.FromDicomAsJson(body[instances[i]]); | |
363 | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1279
diff
changeset
|
364 std::unique_ptr<OrthancStone::DicomInstanceParameters> instance(new OrthancStone::DicomInstanceParameters(dicom)); |
814 | 365 instance->SetOrthancInstanceIdentifier(instances[i]); |
366 | |
367 // the 3D plane corresponding to the slice | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
368 OrthancStone::CoordinateSystem3D geometry = instance->GetGeometry(); |
814 | 369 slices.AddSlice(geometry, instance.release()); |
370 } | |
371 | |
372 seriesGeometry_.ComputeGeometry(slices); | |
373 } | |
374 | |
375 size_t slicesCount = seriesGeometry_.GetImageGeometry().GetDepth(); | |
376 | |
377 if (slicesCount == 0) | |
378 { | |
379 volume_->Initialize(seriesGeometry_.GetImageGeometry(), Orthanc::PixelFormat_Grayscale8); | |
380 } | |
381 else | |
382 { | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
383 const OrthancStone::DicomInstanceParameters& parameters = seriesGeometry_.GetSliceParameters(0); |
814 | 384 |
385 volume_->Initialize(seriesGeometry_.GetImageGeometry(), parameters.GetExpectedPixelFormat()); | |
386 volume_->SetDicomParameters(parameters); | |
387 volume_->GetPixelData().Clear(); | |
388 | |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
389 #if USE_SINGLE_QUALITY |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
390 strategy_.reset(new OrthancStone::BasicFetchingStrategy( |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
391 sorter_->CreateSorter(static_cast<unsigned int>(slicesCount)), |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
392 SINGLE_QUALITY)); |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
393 #else |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
394 strategy_.reset(new OrthancStone::BasicFetchingStrategy( |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
395 sorter_->CreateSorter(static_cast<unsigned int>(slicesCount)), |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
396 BEST_QUALITY)); |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
397 #endif |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
398 |
814 | 399 assert(simultaneousDownloads_ != 0); |
400 for (unsigned int i = 0; i < simultaneousDownloads_; i++) | |
401 { | |
402 ScheduleNextSliceDownload(); | |
403 } | |
404 } | |
405 | |
406 slicesQuality_.resize(slicesCount, 0); | |
407 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
408 BroadcastMessage(OrthancStone::DicomVolumeImage::GeometryReadyMessage(*volume_)); |
814 | 409 } |
410 | |
411 | |
412 void OrthancSeriesVolumeProgressiveLoader::SetSliceContent(unsigned int sliceIndex, | |
413 const Orthanc::ImageAccessor& image, | |
414 unsigned int quality) | |
415 { | |
416 assert(sliceIndex < slicesQuality_.size() && | |
417 slicesQuality_.size() == volume_->GetPixelData().GetDepth()); | |
418 | |
419 if (quality >= slicesQuality_[sliceIndex]) | |
420 { | |
421 { | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
422 OrthancStone::ImageBuffer3D::SliceWriter writer(volume_->GetPixelData(), OrthancStone::VolumeProjection_Axial, sliceIndex); |
814 | 423 Orthanc::ImageProcessing::Copy(writer.GetAccessor(), image); |
424 } | |
425 | |
426 volume_->IncrementRevision(); | |
427 seriesGeometry_.IncrementSliceRevision(sliceIndex); | |
428 slicesQuality_[sliceIndex] = quality; | |
429 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
430 BroadcastMessage(OrthancStone::DicomVolumeImage::ContentUpdatedMessage(*volume_)); |
814 | 431 } |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
432 LOG(TRACE) << "SetSliceContent sliceIndex = " << sliceIndex << " -- will " |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
433 << " now call ScheduleNextSliceDownload()"; |
814 | 434 ScheduleNextSliceDownload(); |
435 } | |
436 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
437 void OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) |
814 | 438 { |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
439 #if USE_SINGLE_QUALITY |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
440 SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), SINGLE_QUALITY); |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
441 #else |
1135
a0a33e5ea5bb
IOracleCommand::Clone()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1134
diff
changeset
|
442 SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), BEST_QUALITY); |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
443 #endif |
814 | 444 } |
445 | |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
446 #if USE_SINGLE_QUALITY |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
447 #else |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
448 void OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) |
814 | 449 { |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
450 LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent"; |
814 | 451 unsigned int quality; |
452 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
453 switch (dynamic_cast<const OrthancStone::GetOrthancWebViewerJpegCommand&>(message.GetOrigin()).GetQuality()) |
814 | 454 { |
455 case 50: | |
456 quality = LOW_QUALITY; | |
457 break; | |
458 | |
459 case 90: | |
460 quality = MIDDLE_QUALITY; | |
461 break; | |
462 | |
463 default: | |
464 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
465 } | |
466 | |
1135
a0a33e5ea5bb
IOracleCommand::Clone()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1134
diff
changeset
|
467 SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), quality); |
814 | 468 } |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
469 #endif |
814 | 470 |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
471 OrthancSeriesVolumeProgressiveLoader::OrthancSeriesVolumeProgressiveLoader( |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
472 OrthancStone::ILoadersContext& loadersContext, |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
473 const boost::shared_ptr<OrthancStone::DicomVolumeImage>& volume) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
474 : loadersContext_(loadersContext) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
475 , active_(false) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
476 , simultaneousDownloads_(4) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
477 , volume_(volume) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
478 , sorter_(new OrthancStone::BasicFetchingItemsSorter::Factory) |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
479 , volumeImageReadyInHighQuality_(false) |
814 | 480 { |
1314
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
481 } |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
482 |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
483 boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader> |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
484 OrthancSeriesVolumeProgressiveLoader::Create( |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
485 OrthancStone::ILoadersContext& loadersContext, |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
486 const boost::shared_ptr<OrthancStone::DicomVolumeImage>& volume) |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
487 { |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
488 std::auto_ptr<OrthancStone::ILoadersContext::ILock> lock(loadersContext.Lock()); |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
489 |
1314
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
490 boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader> obj( |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
491 new OrthancSeriesVolumeProgressiveLoader(loadersContext,volume)); |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
492 |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
493 obj->Register<OrthancStone::OrthancRestApiCommand::SuccessMessage>( |
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
494 lock->GetOracleObservable(), |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
495 &OrthancSeriesVolumeProgressiveLoader::LoadGeometry); |
1065
9d42f89b8c3c
improved readability
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1064
diff
changeset
|
496 |
1314
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
497 obj->Register<OrthancStone::GetOrthancImageCommand::SuccessMessage>( |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
498 lock->GetOracleObservable(), |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
499 &OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent); |
1065
9d42f89b8c3c
improved readability
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1064
diff
changeset
|
500 |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
501 #if USE_SINGLE_QUALITY |
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
502 #else |
1314
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
503 obj->Register<OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage>( |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
504 lock->GetOracleObservable(), |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
505 &OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent); |
1320
7702ad9b7011
OrthancSeriesVolumeProgressiveLoader : PNG quality only!
Benjamin Golinvaux <bgo@osimis.io>
parents:
1318
diff
changeset
|
506 #endif |
1314
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
507 return obj; |
814 | 508 } |
509 | |
1314
9b126de2cde2
Since the observer system now uses shared_ptr and many registrations are
Benjamin Golinvaux <bgo@osimis.io>
parents:
1310
diff
changeset
|
510 |
935
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
933
diff
changeset
|
511 OrthancSeriesVolumeProgressiveLoader::~OrthancSeriesVolumeProgressiveLoader() |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
933
diff
changeset
|
512 { |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
933
diff
changeset
|
513 LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::~OrthancSeriesVolumeProgressiveLoader()"; |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
933
diff
changeset
|
514 } |
814 | 515 |
516 void OrthancSeriesVolumeProgressiveLoader::SetSimultaneousDownloads(unsigned int count) | |
517 { | |
518 if (active_) | |
519 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
520 LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SetSimultaneousDownloads(): (active_)"; |
814 | 521 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
522 } | |
523 else if (count == 0) | |
524 { | |
525 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
526 } | |
527 else | |
528 { | |
529 simultaneousDownloads_ = count; | |
530 } | |
531 } | |
532 | |
533 | |
534 void OrthancSeriesVolumeProgressiveLoader::LoadSeries(const std::string& seriesId) | |
535 { | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
913
diff
changeset
|
536 // LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::LoadSeries seriesId=" << seriesId; |
814 | 537 if (active_) |
538 { | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
913
diff
changeset
|
539 // LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::LoadSeries NOT ACTIVE! --> ERROR"; |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
540 LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::LoadSeries(const std::string& seriesId): (active_)"; |
814 | 541 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
542 } | |
543 else | |
544 { | |
545 active_ = true; | |
546 | |
1299
c38c89684d83
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1279
diff
changeset
|
547 std::unique_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand); |
814 | 548 command->SetUri("/series/" + seriesId + "/instances-tags"); |
1310
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
549 { |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
550 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(loadersContext_.Lock()); |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
551 boost::shared_ptr<IObserver> observer(GetSharedObserver()); |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
552 lock->Schedule(observer, 0, command.release()); //TODO: priority! |
9bea7e15b519
- first pass at changes to cope with the refactoring of the loading system
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
553 } |
814 | 554 } |
555 } | |
556 | |
557 | |
1225
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
558 OrthancStone::IVolumeSlicer::IExtractedSlice* |
16738485e457
deprecating DicomStructureSetLoader, OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1156
diff
changeset
|
559 OrthancSeriesVolumeProgressiveLoader::ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) |
814 | 560 { |
561 if (volume_->HasGeometry()) | |
562 { | |
563 return new ExtractedSlice(*this, cuttingPlane); | |
564 } | |
565 else | |
566 { | |
567 return new IVolumeSlicer::InvalidSlice; | |
568 } | |
569 } | |
570 } |