Mercurial > hg > orthanc-stone
annotate Framework/Toolbox/OrthancSlicesLoader.h @ 260:c887eddd48f1 am-2
merge
author | am@osimis.io |
---|---|
date | Tue, 17 Jul 2018 14:43:42 +0200 |
parents | 9afafb192180 |
children | 77fdab5b5d6e |
rev | line source |
---|---|
73 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
135
e2fe9352f240
upgrade to year 2018
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
120
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
73 | 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 #pragma once | |
23 | |
24 #include "IWebService.h" | |
25 #include "SlicesSorter.h" | |
194
7a031ac16b2d
rename Enumerations.h to StoneEnumerations.h to avoid clashes with Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
135
diff
changeset
|
26 #include "../StoneEnumerations.h" |
73 | 27 |
28 #include <boost/shared_ptr.hpp> | |
29 | |
30 namespace OrthancStone | |
31 { | |
32 class OrthancSlicesLoader : public boost::noncopyable | |
33 { | |
34 public: | |
252 | 35 struct SliceImageReadyMessage : public IMessage |
36 { | |
37 unsigned int sliceIndex_; | |
38 const Slice& slice_; | |
39 std::auto_ptr<Orthanc::ImageAccessor>& image_; | |
40 SliceImageQuality effectiveQuality_; | |
41 | |
42 SliceImageReadyMessage(unsigned int sliceIndex, | |
43 const Slice& slice, | |
44 std::auto_ptr<Orthanc::ImageAccessor>& image, | |
45 SliceImageQuality effectiveQuality) | |
46 : IMessage(MessageType_SliceImageReady), | |
47 sliceIndex_(sliceIndex), | |
48 slice_(slice), | |
49 image_(image), | |
50 effectiveQuality_(effectiveQuality) | |
51 { | |
52 } | |
53 }; | |
54 | |
55 struct SliceImageErrorMessage : public IMessage | |
56 { | |
57 const Slice& slice_; | |
58 unsigned int sliceIndex_; | |
59 SliceImageQuality effectiveQuality_; | |
60 | |
61 SliceImageErrorMessage(unsigned int sliceIndex, | |
62 const Slice& slice, | |
63 SliceImageQuality effectiveQuality) | |
64 : IMessage(MessageType_SliceImageError), | |
65 slice_(slice), | |
66 sliceIndex_(sliceIndex), | |
67 effectiveQuality_(effectiveQuality) | |
68 { | |
69 } | |
70 }; | |
71 | |
72 public: | |
73 class ISliceLoaderObserver : public IObserver | |
73 | 74 { |
75 public: | |
252 | 76 |
77 ISliceLoaderObserver(MessageBroker& broker) | |
78 : IObserver(broker) | |
73 | 79 { |
80 } | |
81 | |
252 | 82 virtual ~ISliceLoaderObserver() |
83 { | |
84 } | |
85 | |
86 virtual void HandleMessage(IObservable& from, const IMessage& message); | |
73 | 87 |
252 | 88 virtual void OnSliceGeometryReady(const OrthancSlicesLoader& loader) = 0; |
73 | 89 |
252 | 90 virtual void OnSliceGeometryError(const OrthancSlicesLoader& loader) = 0; |
91 | |
92 virtual void OnSliceImageReady(const OrthancSlicesLoader& loader, | |
73 | 93 unsigned int sliceIndex, |
94 const Slice& slice, | |
99 | 95 std::auto_ptr<Orthanc::ImageAccessor>& image, |
117
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
96 SliceImageQuality effectiveQuality) = 0; |
73 | 97 |
252 | 98 virtual void OnSliceImageError(const OrthancSlicesLoader& loader, |
73 | 99 unsigned int sliceIndex, |
93
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
100 const Slice& slice, |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
101 SliceImageQuality quality) = 0; |
73 | 102 }; |
103 | |
104 private: | |
105 enum State | |
106 { | |
107 State_Error, | |
108 State_Initialization, | |
109 State_LoadingGeometry, | |
110 State_GeometryReady | |
111 }; | |
112 | |
113 enum Mode | |
114 { | |
115 Mode_SeriesGeometry, | |
116 Mode_InstanceGeometry, | |
117
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
117 Mode_FrameGeometry, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
118 Mode_LoadImage, |
257 | 119 Mode_LoadRawImage, |
120 Mode_LoadDicomFile | |
73 | 121 }; |
122 | |
123 class Operation; | |
124 class WebCallback; | |
125 | |
126 boost::shared_ptr<WebCallback> webCallback_; // This is a PImpl pattern | |
127 | |
252 | 128 ISliceLoaderObserver& userCallback_; |
73 | 129 IWebService& orthanc_; |
130 State state_; | |
131 SlicesSorter slices_; | |
132 | |
93
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
133 void NotifySliceImageSuccess(const Operation& operation, |
99 | 134 std::auto_ptr<Orthanc::ImageAccessor>& image) const; |
93
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
135 |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
136 void NotifySliceImageError(const Operation& operation) const; |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
137 |
73 | 138 void ParseSeriesGeometry(const void* answer, |
139 size_t size); | |
140 | |
141 void ParseInstanceGeometry(const std::string& instanceId, | |
142 const void* answer, | |
143 size_t size); | |
144 | |
117
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
145 void ParseFrameGeometry(const std::string& instanceId, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
146 unsigned int frame, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
147 const void* answer, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
148 size_t size); |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
149 |
93
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
150 void ParseSliceImagePng(const Operation& operation, |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
151 const void* answer, |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
152 size_t size); |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
153 |
257 | 154 void ParseSliceImagePam(const Operation& operation, |
155 const void* answer, | |
156 size_t size); | |
157 | |
93
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
158 void ParseSliceImageJpeg(const Operation& operation, |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
159 const void* answer, |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
160 size_t size); |
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
161 |
117
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
162 void ParseSliceRawImage(const Operation& operation, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
163 const void* answer, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
164 size_t size); |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
165 |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
166 void ScheduleSliceImagePng(const Slice& slice, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
167 size_t index); |
257 | 168 |
169 void ScheduleSliceImagePam(const Slice& slice, | |
170 size_t index); | |
171 | |
117
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
172 void ScheduleSliceImageJpeg(const Slice& slice, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
173 size_t index, |
93
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
174 SliceImageQuality quality); |
120
063f7f3d9f14
fix 3d locations of the doses
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
117
diff
changeset
|
175 |
063f7f3d9f14
fix 3d locations of the doses
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
117
diff
changeset
|
176 void SortAndFinalizeSlices(); |
73 | 177 |
178 public: | |
251
192e6e349e69
first usage of new message system (in SDL only)
am@osimis.io
parents:
194
diff
changeset
|
179 OrthancSlicesLoader(MessageBroker& broker, |
252 | 180 ISliceLoaderObserver& callback, |
73 | 181 IWebService& orthanc); |
182 | |
183 void ScheduleLoadSeries(const std::string& seriesId); | |
184 | |
117
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
185 void ScheduleLoadInstance(const std::string& instanceId); |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
186 |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
187 void ScheduleLoadFrame(const std::string& instanceId, |
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
188 unsigned int frame); |
73 | 189 |
77 | 190 bool IsGeometryReady() const; |
191 | |
73 | 192 size_t GetSliceCount() const; |
193 | |
194 const Slice& GetSlice(size_t index) const; | |
195 | |
77 | 196 bool LookupSlice(size_t& index, |
110
53025eecbc95
renamed SliceGeometry as CoordinateSystem3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
99
diff
changeset
|
197 const CoordinateSystem3D& plane) const; |
77 | 198 |
93
5945e81734a3
decoding of JPEG images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
77
diff
changeset
|
199 void ScheduleLoadSliceImage(size_t index, |
117
42c05a3baee3
loading multi-frame instances as 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
200 SliceImageQuality requestedQuality); |
73 | 201 }; |
202 } |