Mercurial > hg > orthanc-stone
annotate UnitTestsSources/UnitTestsMain.cpp @ 72:c1cc3bdba18c wasm
cleaning up OrthancSlicesLoader
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 24 May 2017 10:36:41 +0200 |
parents | 30c768873d47 |
children | ffa6dded91bd |
rev | line source |
---|---|
20
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
40
7207a407bcd8
shared copyright with osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
20
diff
changeset
|
5 * Copyright (C) 2017 Osimis, Belgium |
20
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
47 | 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. | |
20
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
47 | 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 | |
20
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 **/ |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 #include "gtest/gtest.h" |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
70
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
24 #include "../Framework/Toolbox/OrthancAsynchronousWebService.h" |
20
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 #include "../Resources/Orthanc/Core/Logging.h" |
69
1553b67b24e5
OrthancSynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
26 #include "../Framework/Toolbox/OrthancSynchronousWebService.h" |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
27 #include "../Framework/Layers/OrthancFrameLayerSource.h" |
66 | 28 #include "../Framework/Widgets/LayerWidget.h" |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
29 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
30 |
68 | 31 #include "../Resources/Orthanc/Core/Images/PngReader.h" |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
32 #include "../Framework/Toolbox/MessagingToolbox.h" |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
33 #include "../Framework/Toolbox/DicomFrameConverter.h" |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
34 |
68 | 35 #include <boost/lexical_cast.hpp> |
70
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
36 #include <boost/date_time/posix_time/posix_time.hpp> |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
37 #include <boost/thread/thread.hpp> |
68 | 38 |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
39 namespace OrthancStone |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
40 { |
68 | 41 class Slice |
42 { | |
43 private: | |
44 enum Type | |
45 { | |
46 Type_Invalid, | |
47 Type_OrthancInstance | |
48 // TODO A slice could come from some DICOM file (URL) | |
49 }; | |
50 | |
51 Type type_; | |
52 std::string orthancInstanceId_; | |
53 unsigned int frame_; | |
54 SliceGeometry geometry_; | |
55 double pixelSpacingX_; | |
56 double pixelSpacingY_; | |
57 double thickness_; | |
58 unsigned int width_; | |
59 unsigned int height_; | |
60 DicomFrameConverter converter_; | |
61 | |
62 public: | |
63 Slice() : type_(Type_Invalid) | |
64 { | |
65 } | |
66 | |
67 bool ParseOrthancFrame(const OrthancPlugins::IDicomDataset& dataset, | |
68 const std::string& instanceId, | |
69 unsigned int frame) | |
70 { | |
71 OrthancPlugins::DicomDatasetReader reader(dataset); | |
72 | |
73 unsigned int frameCount; | |
74 if (!reader.GetUnsignedIntegerValue(frameCount, OrthancPlugins::DICOM_TAG_NUMBER_OF_FRAMES)) | |
75 { | |
76 frameCount = 1; // Assume instance with one frame | |
77 } | |
78 | |
79 if (frame >= frameCount) | |
80 { | |
81 return false; | |
82 } | |
83 | |
84 if (!reader.GetDoubleValue(thickness_, OrthancPlugins::DICOM_TAG_SLICE_THICKNESS)) | |
85 { | |
86 thickness_ = 100.0 * std::numeric_limits<double>::epsilon(); | |
87 } | |
88 | |
89 GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dataset); | |
90 | |
91 std::string position, orientation; | |
92 if (dataset.GetStringValue(position, OrthancPlugins::DICOM_TAG_IMAGE_POSITION_PATIENT) && | |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
93 dataset.GetStringValue(orientation, OrthancPlugins::DICOM_TAG_IMAGE_ORIENTATION_PATIENT)) |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
94 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
95 geometry_ = SliceGeometry(position, orientation); |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
96 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
97 |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
98 if (reader.GetUnsignedIntegerValue(width_, OrthancPlugins::DICOM_TAG_COLUMNS) && |
68 | 99 reader.GetUnsignedIntegerValue(height_, OrthancPlugins::DICOM_TAG_ROWS)) |
100 { | |
101 orthancInstanceId_ = instanceId; | |
102 frame_ = frame; | |
103 converter_.ReadParameters(dataset); | |
104 | |
105 type_ = Type_OrthancInstance; | |
106 return true; | |
107 } | |
108 else | |
109 { | |
110 return false; | |
111 } | |
112 } | |
113 | |
114 bool IsOrthancInstance() const | |
115 { | |
116 return type_ == Type_OrthancInstance; | |
117 } | |
118 | |
119 const std::string GetOrthancInstanceId() const | |
120 { | |
121 if (type_ != Type_OrthancInstance) | |
122 { | |
123 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
124 } | |
125 | |
126 return orthancInstanceId_; | |
127 } | |
128 | |
129 unsigned int GetFrame() const | |
130 { | |
131 if (type_ == Type_Invalid) | |
132 { | |
133 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
134 } | |
135 | |
136 return frame_; | |
137 } | |
138 | |
139 const SliceGeometry& GetGeometry() const | |
140 { | |
141 if (type_ == Type_Invalid) | |
142 { | |
143 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
144 } | |
145 | |
146 return geometry_; | |
147 } | |
148 | |
149 double GetThickness() const | |
150 { | |
151 if (type_ == Type_Invalid) | |
152 { | |
153 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
154 } | |
155 | |
156 return thickness_; | |
157 } | |
158 | |
159 double GetPixelSpacingX() const | |
160 { | |
161 if (type_ == Type_Invalid) | |
162 { | |
163 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
164 } | |
165 | |
166 return pixelSpacingX_; | |
167 } | |
168 | |
169 double GetPixelSpacingY() const | |
170 { | |
171 if (type_ == Type_Invalid) | |
172 { | |
173 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
174 } | |
175 | |
176 return pixelSpacingY_; | |
177 } | |
178 | |
179 unsigned int GetWidth() const | |
180 { | |
181 if (type_ == Type_Invalid) | |
182 { | |
183 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
184 } | |
185 | |
186 return width_; | |
187 } | |
188 | |
189 unsigned int GetHeight() const | |
190 { | |
191 if (type_ == Type_Invalid) | |
192 { | |
193 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
194 } | |
195 | |
196 return height_; | |
197 } | |
198 | |
199 const DicomFrameConverter& GetConverter() const | |
200 { | |
201 if (type_ == Type_Invalid) | |
202 { | |
203 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
204 } | |
205 | |
206 return converter_; | |
207 } | |
208 }; | |
209 | |
210 | |
211 class SliceSorter : public boost::noncopyable | |
212 { | |
213 private: | |
214 class SliceWithDepth : public boost::noncopyable | |
215 { | |
216 private: | |
217 Slice slice_; | |
218 double depth_; | |
219 | |
220 public: | |
221 SliceWithDepth(const Slice& slice) : | |
222 slice_(slice), | |
223 depth_(0) | |
224 { | |
225 } | |
226 | |
227 void SetNormal(const Vector& normal) | |
228 { | |
229 depth_ = boost::numeric::ublas::inner_prod | |
230 (slice_.GetGeometry().GetOrigin(), normal); | |
231 } | |
232 | |
233 double GetDepth() const | |
234 { | |
235 return depth_; | |
236 } | |
237 | |
238 const Slice& GetSlice() const | |
239 { | |
240 return slice_; | |
241 } | |
242 }; | |
243 | |
244 struct Comparator | |
245 { | |
246 bool operator() (const SliceWithDepth* const& a, | |
247 const SliceWithDepth* const& b) const | |
248 { | |
249 return a->GetDepth() < b->GetDepth(); | |
250 } | |
251 }; | |
252 | |
253 typedef std::vector<SliceWithDepth*> Slices; | |
254 | |
255 Slices slices_; | |
256 bool hasNormal_; | |
257 | |
258 public: | |
259 SliceSorter() : hasNormal_(false) | |
260 { | |
261 } | |
262 | |
263 ~SliceSorter() | |
264 { | |
265 for (size_t i = 0; i < slices_.size(); i++) | |
266 { | |
267 assert(slices_[i] != NULL); | |
268 delete slices_[i]; | |
269 } | |
270 } | |
271 | |
272 void Reserve(size_t count) | |
273 { | |
274 slices_.reserve(count); | |
275 } | |
276 | |
277 void AddSlice(const Slice& slice) | |
278 { | |
279 slices_.push_back(new SliceWithDepth(slice)); | |
280 } | |
281 | |
282 size_t GetSliceCount() const | |
283 { | |
284 return slices_.size(); | |
285 } | |
286 | |
287 const Slice& GetSlice(size_t i) const | |
288 { | |
289 if (i >= slices_.size()) | |
290 { | |
291 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
292 } | |
293 | |
294 assert(slices_[i] != NULL); | |
295 return slices_[i]->GetSlice(); | |
296 } | |
297 | |
298 void SetNormal(const Vector& normal) | |
299 { | |
300 for (size_t i = 0; i < slices_.size(); i++) | |
301 { | |
302 slices_[i]->SetNormal(normal); | |
303 } | |
304 | |
305 hasNormal_ = true; | |
306 } | |
307 | |
308 void Sort() | |
309 { | |
310 if (!hasNormal_) | |
311 { | |
312 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
313 } | |
314 | |
315 Comparator comparator; | |
316 std::sort(slices_.begin(), slices_.end(), comparator); | |
317 } | |
318 | |
319 void FilterNormal(const Vector& normal) | |
320 { | |
321 size_t pos = 0; | |
322 | |
323 for (size_t i = 0; i < slices_.size(); i++) | |
324 { | |
325 if (GeometryToolbox::IsParallel(normal, slices_[i]->GetSlice().GetGeometry().GetNormal())) | |
326 { | |
327 // This slice is compatible with the selected normal | |
328 slices_[pos] = slices_[i]; | |
329 pos += 1; | |
330 } | |
331 else | |
332 { | |
333 delete slices_[i]; | |
334 slices_[i] = NULL; | |
335 } | |
336 } | |
337 | |
338 slices_.resize(pos); | |
339 } | |
340 | |
341 bool SelectNormal(Vector& normal) const | |
342 { | |
343 std::vector<Vector> normalCandidates; | |
344 std::vector<unsigned int> normalCount; | |
345 | |
346 bool found = false; | |
347 | |
348 for (size_t i = 0; !found && i < GetSliceCount(); i++) | |
349 { | |
350 const Vector& normal = GetSlice(i).GetGeometry().GetNormal(); | |
351 | |
352 bool add = true; | |
353 for (size_t j = 0; add && j < normalCandidates.size(); j++) // (*) | |
354 { | |
355 if (GeometryToolbox::IsParallel(normal, normalCandidates[j])) | |
356 { | |
357 normalCount[j] += 1; | |
358 add = false; | |
359 } | |
360 } | |
361 | |
362 if (add) | |
363 { | |
364 if (normalCount.size() > 2) | |
365 { | |
366 // To get linear-time complexity in (*). This heuristics | |
367 // allows the series to have one single frame that is | |
368 // not parallel to the others (such a frame could be a | |
369 // generated preview) | |
370 found = false; | |
371 } | |
372 else | |
373 { | |
374 normalCandidates.push_back(normal); | |
375 normalCount.push_back(1); | |
376 } | |
377 } | |
378 } | |
379 | |
380 for (size_t i = 0; !found && i < normalCandidates.size(); i++) | |
381 { | |
382 unsigned int count = normalCount[i]; | |
383 if (count == GetSliceCount() || | |
384 count + 1 == GetSliceCount()) | |
385 { | |
386 normal = normalCandidates[i]; | |
387 found = true; | |
388 } | |
389 } | |
390 | |
391 return found; | |
392 } | |
393 }; | |
394 | |
395 | |
396 | |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
397 class OrthancSlicesLoader : public boost::noncopyable |
66 | 398 { |
399 public: | |
400 class ICallback : public boost::noncopyable | |
401 { | |
402 public: | |
403 virtual ~ICallback() | |
404 { | |
405 } | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
406 |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
407 virtual void NotifyGeometryReady(const OrthancSlicesLoader& loader) = 0; |
68 | 408 |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
409 virtual void NotifyGeometryError(const OrthancSlicesLoader& loader) = 0; |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
410 |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
411 virtual void NotifySliceImageReady(const OrthancSlicesLoader& loader, |
68 | 412 unsigned int sliceIndex, |
413 const Slice& slice, | |
414 Orthanc::ImageAccessor* image) = 0; | |
415 | |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
416 virtual void NotifySliceImageError(const OrthancSlicesLoader& loader, |
68 | 417 unsigned int sliceIndex, |
418 const Slice& slice) = 0; | |
66 | 419 }; |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
420 |
66 | 421 private: |
68 | 422 enum State |
66 | 423 { |
68 | 424 State_Error, |
425 State_Initialization, | |
426 State_LoadingGeometry, | |
427 State_GeometryReady | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
428 }; |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
429 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
430 enum Mode |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
431 { |
68 | 432 Mode_SeriesGeometry, |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
433 Mode_InstanceGeometry, |
68 | 434 Mode_LoadImage |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
435 }; |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
436 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
437 class Operation : public Orthanc::IDynamicObject |
66 | 438 { |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
439 private: |
68 | 440 Mode mode_; |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
441 unsigned int frame_; |
68 | 442 unsigned int sliceIndex_; |
443 const Slice* slice_; | |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
444 std::string instanceId_; |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
445 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
446 Operation(Mode mode) : |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
447 mode_(mode) |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
448 { |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
449 } |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
450 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
451 public: |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
452 Mode GetMode() const |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
453 { |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
454 return mode_; |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
455 } |
68 | 456 |
457 unsigned int GetSliceIndex() const | |
458 { | |
459 assert(mode_ == Mode_LoadImage); | |
460 return sliceIndex_; | |
461 } | |
462 | |
463 const Slice& GetSlice() const | |
464 { | |
465 assert(mode_ == Mode_LoadImage && slice_ != NULL); | |
466 return *slice_; | |
467 } | |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
468 |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
469 unsigned int GetFrame() const |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
470 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
471 assert(mode_ == Mode_InstanceGeometry); |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
472 return frame_; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
473 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
474 |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
475 const std::string& GetInstanceId() const |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
476 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
477 assert(mode_ == Mode_InstanceGeometry); |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
478 return instanceId_; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
479 } |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
480 |
68 | 481 static Operation* DownloadSeriesGeometry() |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
482 { |
68 | 483 return new Operation(Mode_SeriesGeometry); |
484 } | |
485 | |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
486 static Operation* DownloadInstanceGeometry(const std::string& instanceId, |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
487 unsigned int frame) |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
488 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
489 std::auto_ptr<Operation> operation(new Operation(Mode_InstanceGeometry)); |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
490 operation->instanceId_ = instanceId; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
491 operation->frame_ = frame; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
492 return operation.release(); |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
493 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
494 |
68 | 495 static Operation* DownloadSliceImage(unsigned int sliceIndex, |
496 const Slice& slice) | |
497 { | |
498 std::auto_ptr<Operation> tmp(new Operation(Mode_LoadImage)); | |
499 tmp->sliceIndex_ = sliceIndex; | |
500 tmp->slice_ = &slice; | |
501 return tmp.release(); | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
502 } |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
503 }; |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
504 |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
505 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
506 class WebCallback : public IWebService::ICallback |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
507 { |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
508 private: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
509 OrthancSlicesLoader& that_; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
510 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
511 public: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
512 WebCallback(OrthancSlicesLoader& that) : |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
513 that_(that) |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
514 { |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
515 } |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
516 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
517 virtual void NotifySuccess(const std::string& uri, |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
518 const void* answer, |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
519 size_t answerSize, |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
520 Orthanc::IDynamicObject* payload) |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
521 { |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
522 std::auto_ptr<Operation> operation(dynamic_cast<Operation*>(payload)); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
523 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
524 switch (operation->GetMode()) |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
525 { |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
526 case Mode_SeriesGeometry: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
527 that_.ParseSeriesGeometry(answer, answerSize); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
528 break; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
529 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
530 case Mode_InstanceGeometry: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
531 that_.ParseInstanceGeometry(operation->GetInstanceId(), |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
532 operation->GetFrame(), answer, answerSize); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
533 break; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
534 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
535 case Mode_LoadImage: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
536 that_.ParseSliceImage(*operation, answer, answerSize); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
537 break; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
538 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
539 default: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
540 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
541 } |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
542 } |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
543 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
544 virtual void NotifyError(const std::string& uri, |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
545 Orthanc::IDynamicObject* payload) |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
546 { |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
547 std::auto_ptr<Operation> operation(dynamic_cast<Operation*>(payload)); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
548 LOG(ERROR) << "Cannot download " << uri; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
549 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
550 switch (operation->GetMode()) |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
551 { |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
552 case Mode_SeriesGeometry: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
553 that_.userCallback_.NotifyGeometryError(that_); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
554 that_.state_ = State_Error; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
555 break; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
556 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
557 case Mode_LoadImage: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
558 that_.userCallback_.NotifySliceImageError(that_, operation->GetSliceIndex(), |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
559 operation->GetSlice()); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
560 break; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
561 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
562 default: |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
563 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
564 } |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
565 } |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
566 }; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
567 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
568 |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
569 WebCallback webCallback_; |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
570 ICallback& userCallback_; |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
571 IWebService& orthanc_; |
68 | 572 State state_; |
573 SliceSorter slices_; | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
574 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
575 |
68 | 576 void ParseSeriesGeometry(const void* answer, |
577 size_t size) | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
578 { |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
579 Json::Value series; |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
580 if (!MessagingToolbox::ParseJson(series, answer, size) || |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
581 series.type() != Json::objectValue) |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
582 { |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
583 userCallback_.NotifyGeometryError(*this); |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
584 return; |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
585 } |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
586 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
587 Json::Value::Members instances = series.getMemberNames(); |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
588 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
589 slices_.Reserve(instances.size()); |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
590 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
591 for (size_t i = 0; i < instances.size(); i++) |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
592 { |
68 | 593 OrthancPlugins::FullOrthancDataset dataset(series[instances[i]]); |
594 | |
595 Slice slice; | |
596 if (slice.ParseOrthancFrame(dataset, instances[i], 0 /* todo */)) | |
597 { | |
598 slices_.AddSlice(slice); | |
599 } | |
600 else | |
601 { | |
602 LOG(WARNING) << "Skipping invalid instance " << instances[i]; | |
603 } | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
604 } |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
605 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
606 bool ok = false; |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
607 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
608 if (slices_.GetSliceCount() > 0) |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
609 { |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
610 Vector normal; |
68 | 611 if (slices_.SelectNormal(normal)) |
612 { | |
613 slices_.FilterNormal(normal); | |
614 slices_.SetNormal(normal); | |
615 slices_.Sort(); | |
616 ok = true; | |
617 } | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
618 } |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
619 |
70
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
620 state_ = State_GeometryReady; |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
621 |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
622 if (ok) |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
623 { |
68 | 624 LOG(INFO) << "Loaded a series with " << slices_.GetSliceCount() << " slice(s)"; |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
625 userCallback_.NotifyGeometryReady(*this); |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
626 } |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
627 else |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
628 { |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
629 LOG(ERROR) << "This series is empty"; |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
630 userCallback_.NotifyGeometryError(*this); |
68 | 631 } |
632 } | |
633 | |
634 | |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
635 void ParseInstanceGeometry(const std::string& instanceId, |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
636 unsigned int frame, |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
637 const void* answer, |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
638 size_t size) |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
639 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
640 Json::Value tags; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
641 if (!MessagingToolbox::ParseJson(tags, answer, size) || |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
642 tags.type() != Json::objectValue) |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
643 { |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
644 userCallback_.NotifyGeometryError(*this); |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
645 return; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
646 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
647 |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
648 OrthancPlugins::FullOrthancDataset dataset(tags); |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
649 |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
650 state_ = State_GeometryReady; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
651 |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
652 Slice slice; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
653 if (slice.ParseOrthancFrame(dataset, instanceId, frame)) |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
654 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
655 LOG(INFO) << "Loaded instance " << instanceId; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
656 slices_.AddSlice(slice); |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
657 userCallback_.NotifyGeometryReady(*this); |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
658 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
659 else |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
660 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
661 LOG(WARNING) << "Skipping invalid instance " << instanceId; |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
662 userCallback_.NotifyGeometryError(*this); |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
663 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
664 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
665 |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
666 |
68 | 667 void ParseSliceImage(const Operation& operation, |
668 const void* answer, | |
669 size_t size) | |
670 { | |
671 std::auto_ptr<Orthanc::PngReader> image(new Orthanc::PngReader); | |
672 image->ReadFromMemory(answer, size); | |
673 | |
674 bool ok = (image->GetWidth() == operation.GetSlice().GetWidth() || | |
675 image->GetHeight() == operation.GetSlice().GetHeight()); | |
676 | |
677 if (ok && | |
678 operation.GetSlice().GetConverter().GetExpectedPixelFormat() == | |
679 Orthanc::PixelFormat_SignedGrayscale16) | |
680 { | |
681 if (image->GetFormat() == Orthanc::PixelFormat_Grayscale16) | |
682 { | |
683 image->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); | |
684 } | |
685 else | |
686 { | |
687 ok = false; | |
688 } | |
689 } | |
690 | |
691 if (ok) | |
692 { | |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
693 userCallback_.NotifySliceImageReady(*this, operation.GetSliceIndex(), |
68 | 694 operation.GetSlice(), image.release()); |
695 } | |
696 else | |
697 { | |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
698 userCallback_.NotifySliceImageError(*this, operation.GetSliceIndex(), |
68 | 699 operation.GetSlice()); |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
700 } |
66 | 701 } |
702 | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
703 |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
704 public: |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
705 OrthancSlicesLoader(ICallback& callback, |
68 | 706 IWebService& orthanc) : |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
707 webCallback_(*this), |
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
708 userCallback_(callback), |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
709 orthanc_(orthanc), |
68 | 710 state_(State_Initialization) |
711 { | |
712 } | |
713 | |
714 void ScheduleLoadSeries(const std::string& seriesId) | |
66 | 715 { |
68 | 716 if (state_ != State_Initialization) |
717 { | |
718 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
719 } | |
720 else | |
721 { | |
722 state_ = State_LoadingGeometry; | |
723 std::string uri = "/series/" + seriesId + "/instances-tags"; | |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
724 orthanc_.ScheduleGetRequest(webCallback_, uri, Operation::DownloadSeriesGeometry()); |
68 | 725 } |
726 } | |
727 | |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
728 void ScheduleLoadInstance(const std::string& instanceId, |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
729 unsigned int frame) |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
730 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
731 if (state_ != State_Initialization) |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
732 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
733 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
734 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
735 else |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
736 { |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
737 state_ = State_LoadingGeometry; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
738 std::string uri = "/instances/" + instanceId + "/tags"; |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
739 orthanc_.ScheduleGetRequest |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
740 (webCallback_, uri, Operation::DownloadInstanceGeometry(instanceId, frame)); |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
741 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
742 } |
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
743 |
68 | 744 size_t GetSliceCount() const |
745 { | |
746 if (state_ != State_GeometryReady) | |
747 { | |
748 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
749 } | |
750 | |
751 return slices_.GetSliceCount(); | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
752 } |
66 | 753 |
68 | 754 const Slice& GetSlice(size_t index) const |
755 { | |
756 if (state_ != State_GeometryReady) | |
757 { | |
758 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
759 } | |
760 | |
761 return slices_.GetSlice(index); | |
762 } | |
763 | |
764 void ScheduleLoadSliceImage(size_t index) | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
765 { |
68 | 766 if (state_ != State_GeometryReady) |
767 { | |
768 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
769 } | |
770 else | |
771 { | |
772 const Slice& slice = GetSlice(index); | |
773 | |
774 std::string uri = ("/instances/" + slice.GetOrthancInstanceId() + "/frames/" + | |
775 boost::lexical_cast<std::string>(slice.GetFrame())); | |
776 | |
777 switch (slice.GetConverter().GetExpectedPixelFormat()) | |
778 { | |
779 case Orthanc::PixelFormat_RGB24: | |
780 uri += "/preview"; | |
781 break; | |
782 | |
783 case Orthanc::PixelFormat_Grayscale16: | |
784 uri += "/image-uint16"; | |
785 break; | |
786 | |
787 case Orthanc::PixelFormat_SignedGrayscale16: | |
788 uri += "/image-int16"; | |
789 break; | |
790 | |
791 default: | |
792 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
793 } | |
794 | |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
795 orthanc_.ScheduleGetRequest(webCallback_, uri, Operation::DownloadSliceImage(index, slice)); |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
796 } |
66 | 797 } |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
798 }; |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
799 |
66 | 800 |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
801 class Tata : public OrthancSlicesLoader::ICallback |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
802 { |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
803 public: |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
804 virtual void NotifyGeometryReady(const OrthancSlicesLoader& loader) |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
805 { |
70
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
806 printf(">> %d\n", loader.GetSliceCount()); |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
807 |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
808 for (size_t i = 0; i < loader.GetSliceCount(); i++) |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
809 { |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
810 const_cast<OrthancSlicesLoader&>(loader).ScheduleLoadSliceImage(i); |
70
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
811 } |
68 | 812 } |
813 | |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
814 virtual void NotifyGeometryError(const OrthancSlicesLoader& loader) |
68 | 815 { |
816 printf("Error\n"); | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
817 } |
66 | 818 |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
819 virtual void NotifySliceImageReady(const OrthancSlicesLoader& loader, |
68 | 820 unsigned int sliceIndex, |
821 const Slice& slice, | |
822 Orthanc::ImageAccessor* image) | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
823 { |
68 | 824 std::auto_ptr<Orthanc::ImageAccessor> tmp(image); |
70
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
825 printf("Slice OK %dx%d\n", tmp->GetWidth(), tmp->GetHeight()); |
68 | 826 } |
827 | |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
828 virtual void NotifySliceImageError(const OrthancSlicesLoader& loader, |
68 | 829 unsigned int sliceIndex, |
830 const Slice& slice) | |
831 { | |
832 printf("ERROR 2\n"); | |
67
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
833 } |
acb60cbb8301
refactoring SeriesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
66
diff
changeset
|
834 }; |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
835 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
836 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
837 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
838 TEST(Toto, Tutu) |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
839 { |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
840 Orthanc::WebServiceParameters web; |
70
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
841 OrthancStone::OrthancAsynchronousWebService orthanc(web, 4); |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
842 orthanc.Start(); |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
843 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
844 OrthancStone::Tata tata; |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
845 OrthancStone::OrthancSlicesLoader loader(tata, orthanc); |
68 | 846 //loader.ScheduleLoadSeries("c1c4cb95-05e3bd11-8da9f5bb-87278f71-0b2b43f5"); |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
847 loader.ScheduleLoadSeries("67f1b334-02c16752-45026e40-a5b60b6b-030ecab5"); |
71
30c768873d47
OrthancSliceLoader::ScheduleLoadInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
70
diff
changeset
|
848 |
72
c1cc3bdba18c
cleaning up OrthancSlicesLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
849 //loader.ScheduleLoadInstance("19816330-cb02e1cf-df3a8fe8-bf510623-ccefe9f5", 0); |
68 | 850 |
70
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
851 /*printf(">> %d\n", loader.GetSliceCount()); |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
852 loader.ScheduleLoadSliceImage(31);*/ |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
853 |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
854 boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
855 |
f73aed014bde
OrthancAsynchronousWebService
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
69
diff
changeset
|
856 orthanc.Stop(); |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
857 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
858 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
859 |
20
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
860 |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
861 int main(int argc, char **argv) |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
862 { |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
863 Orthanc::Logging::Initialize(); |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
864 Orthanc::Logging::EnableInfoLevel(true); |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
865 |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
866 ::testing::InitGoogleTest(&argc, argv); |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
867 int result = RUN_ALL_TESTS(); |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
868 |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
869 Orthanc::Logging::Finalize(); |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
870 |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
871 return result; |
946377d1c992
skeleton for unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
872 } |