Mercurial > hg > orthanc-stone
annotate Samples/Sdl/Loader.cpp @ 757:f7c236894c1a
cont
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 22 May 2019 17:05:14 +0200 |
parents | ab236bb5dbc7 |
children | 774681b2c77c |
rev | line source |
---|---|
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 **/ |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 |
745 | 21 |
746 | 22 #include "../../Framework/Toolbox/DicomInstanceParameters.h" |
748 | 23 #include "../../Framework/Oracle/ThreadedOracle.h" |
746 | 24 #include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h" |
25 #include "../../Framework/Oracle/GetOrthancImageCommand.h" | |
26 #include "../../Framework/Oracle/OrthancRestApiCommand.h" | |
745 | 27 #include "../../Framework/Oracle/SleepOracleCommand.h" |
28 #include "../../Framework/Oracle/OracleCommandExceptionMessage.h" | |
29 | |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 // From Stone |
712 | 31 #include "../../Framework/Loaders/BasicFetchingItemsSorter.h" |
32 #include "../../Framework/Loaders/BasicFetchingStrategy.h" | |
33 #include "../../Framework/Scene2D/Scene2D.h" | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
34 #include "../../Framework/StoneInitialization.h" |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
35 #include "../../Framework/Toolbox/GeometryToolbox.h" |
683
dbc1d8bfc68a
reorganizing ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
681
diff
changeset
|
36 #include "../../Framework/Toolbox/SlicesSorter.h" |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
37 #include "../../Framework/Volumes/ImageBuffer3D.h" |
742
fa5febe0f0c2
moved OrientedBoundingBox in the Volumes folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
735
diff
changeset
|
38 #include "../../Framework/Volumes/VolumeImageGeometry.h" |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 // From Orthanc framework |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 #include <Core/Images/ImageProcessing.h> |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 #include <Core/Logging.h> |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 #include <Core/OrthancException.h> |
683
dbc1d8bfc68a
reorganizing ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
681
diff
changeset
|
44 #include <Core/SystemToolbox.h> |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 |
745 | 47 namespace OrthancStone |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 { |
757 | 49 static bool IsSameCuttingPlane(const CoordinateSystem3D& a, |
50 const CoordinateSystem3D& b) | |
51 { | |
52 double distance; | |
53 return (CoordinateSystem3D::ComputeDistance(distance, a, b) && | |
54 LinearAlgebra::IsCloseToZero(distance)); | |
55 } | |
56 | |
57 | |
58 class IVolumeSlicer : public boost::noncopyable | |
59 { | |
60 public: | |
61 class ExtractedSlice : public boost::noncopyable | |
62 { | |
63 public: | |
64 virtual ~ExtractedSlice() | |
65 { | |
66 } | |
67 | |
68 virtual bool IsValid() = 0; | |
69 | |
70 // Must be a cheap call | |
71 virtual uint64_t GetRevision() = 0; | |
72 | |
73 // This call can take some time | |
74 virtual ISceneLayer* CreateSceneLayer() = 0; | |
75 }; | |
76 | |
77 virtual ~IVolumeSlicer() | |
78 { | |
79 } | |
80 | |
81 virtual ExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) const = 0; | |
82 }; | |
83 | |
84 | |
85 | |
86 class DicomVolumeImageOrthogonalSlice : public IVolumeSlicer::ExtractedSlice | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
87 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
88 private: |
757 | 89 CoordinateSystem3D cuttingPlane_; |
90 bool isInitialized_; | |
91 bool valid_; | |
92 VolumeProjection projection_; | |
93 unsigned int sliceIndex_; | |
94 uint64_t revision_; | |
95 | |
96 void Initialize() | |
97 { | |
98 if (!isInitialized_) | |
99 { | |
100 valid_ = DetectSlice(projection_, sliceIndex_, revision_, cuttingPlane_); | |
101 isInitialized_ = true; | |
102 } | |
103 } | |
104 | |
105 protected: | |
106 virtual const ImageBuffer3D& GetImage() const = 0; | |
107 | |
108 virtual const VolumeImageGeometry& GetGeometry() const = 0; | |
109 | |
110 // WARNING - This cannot be invoked from the constructor, hence lazy "Initialize()" | |
111 virtual bool DetectSlice(VolumeProjection& projection, | |
112 unsigned int& sliceIndex, | |
113 uint64_t& revision, | |
114 const CoordinateSystem3D& cuttingPlane) const = 0; | |
115 | |
116 virtual const DicomInstanceParameters& GetDicomParameters(VolumeProjection projection, | |
117 unsigned int sliceIndex) const = 0; | |
118 | |
119 public: | |
120 DicomVolumeImageOrthogonalSlice(const CoordinateSystem3D& cuttingPlane) : | |
121 cuttingPlane_(cuttingPlane), | |
122 isInitialized_(false) | |
123 { | |
124 } | |
125 | |
126 virtual bool IsValid() | |
127 { | |
128 Initialize(); | |
129 | |
130 return valid_; | |
131 } | |
132 | |
133 virtual uint64_t GetRevision() | |
134 { | |
135 Initialize(); | |
136 | |
137 if (!valid_) | |
138 { | |
139 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
140 } | |
141 else | |
142 { | |
143 return revision_; | |
144 } | |
145 } | |
146 | |
147 virtual ISceneLayer* CreateSceneLayer() | |
148 { | |
149 Initialize(); | |
150 | |
151 if (!valid_) | |
152 { | |
153 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
154 } | |
155 else | |
156 { | |
157 std::auto_ptr<TextureBaseSceneLayer> texture; | |
158 | |
159 { | |
160 ImageBuffer3D::SliceReader reader(GetImage(), projection_, sliceIndex_); | |
161 texture.reset(GetDicomParameters(projection_, sliceIndex_).CreateTexture(reader.GetAccessor())); | |
162 } | |
163 | |
164 const CoordinateSystem3D& system = GetGeometry().GetProjectionGeometry(projection_); | |
165 | |
166 double x0, y0, x1, y1; | |
167 system.ProjectPoint(x0, y0, system.GetOrigin()); | |
168 system.ProjectPoint(x1, y1, system.GetOrigin() + system.GetAxisX()); | |
169 texture->SetOrigin(x0, y0); | |
170 | |
171 double dx = x1 - x0; | |
172 double dy = y1 - y0; | |
173 if (!LinearAlgebra::IsCloseToZero(dx) || | |
174 !LinearAlgebra::IsCloseToZero(dy)) | |
175 { | |
176 texture->SetAngle(atan2(dy, dx)); | |
177 } | |
178 | |
179 Vector tmp; | |
180 GetGeometry().GetVoxelDimensions(projection_); | |
181 texture->SetPixelSpacing(tmp[0], tmp[1]); | |
182 | |
183 // texture->SetLinearInterpolation(linearInterpolation_); // TODO | |
184 | |
185 return texture.release(); | |
186 } | |
187 } | |
188 }; | |
189 | |
190 | |
191 // This class combines a 3D image buffer, a 3D volume geometry and | |
192 // information about the DICOM parameters of each slice. | |
193 class DicomSeriesVolumeImage : public IVolumeSlicer | |
194 { | |
195 private: | |
196 class Slice : public DicomVolumeImageOrthogonalSlice | |
197 { | |
198 private: | |
199 const DicomSeriesVolumeImage& that_; | |
200 | |
201 protected: | |
202 virtual const ImageBuffer3D& GetImage() const | |
203 { | |
204 return that_.GetImage(); | |
205 } | |
206 | |
207 virtual const VolumeImageGeometry& GetGeometry() const | |
208 { | |
209 return that_.GetGeometry(); | |
210 } | |
211 | |
212 virtual bool DetectSlice(VolumeProjection& projection, | |
213 unsigned int& sliceIndex, | |
214 uint64_t& revision, | |
215 const CoordinateSystem3D& cuttingPlane) const | |
216 { | |
217 if (!that_.HasGeometry() || | |
218 !that_.GetGeometry().DetectSlice(projection, sliceIndex, cuttingPlane)) | |
219 { | |
220 return false; | |
221 } | |
222 else | |
223 { | |
224 if (projection == VolumeProjection_Axial) | |
225 { | |
226 revision = that_.GetSliceRevision(sliceIndex); | |
227 } | |
228 else | |
229 { | |
230 // For coronal and sagittal projections, we take the global | |
231 // revision of the volume | |
232 revision = that_.GetRevision(); | |
233 } | |
234 | |
235 return true; | |
236 } | |
237 } | |
238 | |
239 virtual const DicomInstanceParameters& GetDicomParameters(VolumeProjection projection, | |
240 unsigned int sliceIndex) const | |
241 { | |
242 return that_.GetSliceParameters(projection == VolumeProjection_Axial ? sliceIndex : 0); | |
243 } | |
244 | |
245 public: | |
246 Slice(const DicomSeriesVolumeImage& that, | |
247 const CoordinateSystem3D& plane) : | |
248 DicomVolumeImageOrthogonalSlice(plane), | |
249 that_(that) | |
250 { | |
251 } | |
252 }; | |
253 | |
254 | |
746 | 255 std::auto_ptr<ImageBuffer3D> image_; |
256 std::auto_ptr<VolumeImageGeometry> geometry_; | |
257 std::vector<DicomInstanceParameters*> slices_; | |
258 uint64_t revision_; | |
259 std::vector<uint64_t> slicesRevision_; | |
260 std::vector<unsigned int> slicesQuality_; | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
261 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
262 void CheckSlice(size_t index, |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
263 const DicomInstanceParameters& reference) const |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
264 { |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
265 const DicomInstanceParameters& slice = *slices_[index]; |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
266 |
745 | 267 if (!GeometryToolbox::IsParallel( |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
268 reference.GetGeometry().GetNormal(), |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
269 slice.GetGeometry().GetNormal())) |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
270 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
271 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
272 "A slice in the volume image is not parallel to the others"); |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
273 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
274 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
275 if (reference.GetExpectedPixelFormat() != slice.GetExpectedPixelFormat()) |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
276 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
277 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat, |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
278 "The pixel format changes across the slices of the volume image"); |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
279 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
280 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
281 if (reference.GetImageInformation().GetWidth() != slice.GetImageInformation().GetWidth() || |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
282 reference.GetImageInformation().GetHeight() != slice.GetImageInformation().GetHeight()) |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
283 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
284 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize, |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
285 "The width/height of slices are not constant in the volume image"); |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
286 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
287 |
745 | 288 if (!LinearAlgebra::IsNear(reference.GetPixelSpacingX(), slice.GetPixelSpacingX()) || |
289 !LinearAlgebra::IsNear(reference.GetPixelSpacingY(), slice.GetPixelSpacingY())) | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
290 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
291 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
292 "The pixel spacing of the slices change across the volume image"); |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
293 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
294 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
295 |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
296 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
297 void CheckVolume() const |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
298 { |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
299 for (size_t i = 0; i < slices_.size(); i++) |
669 | 300 { |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
301 assert(slices_[i] != NULL); |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
302 if (slices_[i]->GetImageInformation().GetNumberOfFrames() != 1) |
669 | 303 { |
304 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
305 "This class does not support multi-frame images"); | |
306 } | |
307 } | |
308 | |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
309 if (slices_.size() != 0) |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
310 { |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
311 const DicomInstanceParameters& reference = *slices_[0]; |
669 | 312 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
313 for (size_t i = 1; i < slices_.size(); i++) |
669 | 314 { |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
315 CheckSlice(i, reference); |
669 | 316 } |
317 } | |
318 } | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
319 |
669 | 320 |
321 void Clear() | |
322 { | |
323 image_.reset(); | |
735
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
324 geometry_.reset(); |
669 | 325 |
326 for (size_t i = 0; i < slices_.size(); i++) | |
327 { | |
328 assert(slices_[i] != NULL); | |
329 delete slices_[i]; | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
330 } |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
331 |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
332 slices_.clear(); |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
333 slicesRevision_.clear(); |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
334 slicesQuality_.clear(); |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
335 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
336 |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
337 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
338 void CheckSliceIndex(size_t index) const |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
339 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
340 assert(slices_.size() == image_->GetDepth() && |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
341 slices_.size() == slicesRevision_.size()); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
342 |
691 | 343 if (!HasGeometry()) |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
344 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
345 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
346 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
347 else if (index >= slices_.size()) |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
348 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
349 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
350 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
351 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
352 |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
353 |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
354 public: |
757 | 355 DicomSeriesVolumeImage() |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
356 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
357 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
358 |
757 | 359 ~DicomSeriesVolumeImage() |
669 | 360 { |
361 Clear(); | |
362 } | |
363 | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
364 // WARNING: The payload of "slices" must be of class "DicomInstanceParameters" |
745 | 365 void SetGeometry(SlicesSorter& slices) |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
366 { |
669 | 367 Clear(); |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
368 |
669 | 369 if (!slices.Sort()) |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
370 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
371 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
372 "Cannot sort the 3D slices of a DICOM series"); |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
373 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
374 |
745 | 375 geometry_.reset(new VolumeImageGeometry); |
735
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
376 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
377 if (slices.GetSlicesCount() == 0) |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
378 { |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
379 // Empty volume |
745 | 380 image_.reset(new ImageBuffer3D(Orthanc::PixelFormat_Grayscale8, 0, 0, 0, |
381 false /* don't compute range */)); | |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
382 } |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
383 else |
669 | 384 { |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
385 slices_.reserve(slices.GetSlicesCount()); |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
386 slicesRevision_.resize(slices.GetSlicesCount(), 0); |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
387 slicesQuality_.resize(slices.GetSlicesCount(), 0); |
669 | 388 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
389 for (size_t i = 0; i < slices.GetSlicesCount(); i++) |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
390 { |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
391 const DicomInstanceParameters& slice = |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
392 dynamic_cast<const DicomInstanceParameters&>(slices.GetSlicePayload(i)); |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
393 slices_.push_back(new DicomInstanceParameters(slice)); |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
394 } |
669 | 395 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
396 CheckVolume(); |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
397 |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
398 const double spacingZ = slices.ComputeSpacingBetweenSlices(); |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
399 LOG(INFO) << "Computed spacing between slices: " << spacingZ << "mm"; |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
400 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
401 const DicomInstanceParameters& parameters = *slices_[0]; |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
402 |
745 | 403 image_.reset(new ImageBuffer3D(parameters.GetExpectedPixelFormat(), |
404 parameters.GetImageInformation().GetWidth(), | |
405 parameters.GetImageInformation().GetHeight(), | |
406 slices.GetSlicesCount(), false /* don't compute range */)); | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
407 |
735
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
408 geometry_->SetSize(image_->GetWidth(), image_->GetHeight(), image_->GetDepth()); |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
409 geometry_->SetAxialGeometry(slices.GetSliceGeometry(0)); |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
410 geometry_->SetVoxelDimensions(parameters.GetPixelSpacingX(), |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
411 parameters.GetPixelSpacingY(), spacingZ); |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
412 } |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
413 |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
414 image_->Clear(); |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
415 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
416 revision_++; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
417 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
418 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
419 uint64_t GetRevision() const |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
420 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
421 return revision_; |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
422 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
423 |
691 | 424 bool HasGeometry() const |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
425 { |
735
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
426 return (image_.get() != NULL && |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
427 geometry_.get() != NULL); |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
428 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
429 |
745 | 430 const ImageBuffer3D& GetImage() const |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
431 { |
691 | 432 if (!HasGeometry()) |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
433 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
434 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
435 } |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
436 else |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
437 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
438 return *image_; |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
439 } |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
440 } |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
441 |
745 | 442 const VolumeImageGeometry& GetGeometry() const |
735
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
443 { |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
444 if (!HasGeometry()) |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
445 { |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
446 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
447 } |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
448 else |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
449 { |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
450 return *geometry_; |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
451 } |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
452 } |
c3bbb130abc4
removing dependencies in ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
713
diff
changeset
|
453 |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
454 size_t GetSlicesCount() const |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
455 { |
691 | 456 if (!HasGeometry()) |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
457 { |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
458 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
459 } |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
460 else |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
461 { |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
462 return slices_.size(); |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
463 } |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
464 } |
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
465 |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
466 const DicomInstanceParameters& GetSliceParameters(size_t index) const |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
467 { |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
468 CheckSliceIndex(index); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
469 return *slices_[index]; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
470 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
471 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
472 uint64_t GetSliceRevision(size_t index) const |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
473 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
474 CheckSliceIndex(index); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
475 return slicesRevision_[index]; |
678
6f10f9a6676a
turning DicomVolumeImage into a bean class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
669
diff
changeset
|
476 } |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
477 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
478 void SetSliceContent(size_t index, |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
479 const Orthanc::ImageAccessor& image, |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
480 unsigned int quality) |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
481 { |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
482 CheckSliceIndex(index); |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
483 |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
484 // If a better image quality is already available, don't update the content |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
485 if (quality >= slicesQuality_[index]) |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
486 { |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
487 { |
745 | 488 ImageBuffer3D::SliceWriter writer |
489 (*image_, VolumeProjection_Axial, index); | |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
490 Orthanc::ImageProcessing::Copy(writer.GetAccessor(), image); |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
491 } |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
492 |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
493 revision_ ++; |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
494 slicesRevision_[index] += 1; |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
495 } |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
496 } |
757 | 497 |
498 virtual IVolumeSlicer::ExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) const | |
499 { | |
500 return new Slice(*this, cuttingPlane); | |
501 } | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
502 }; |
712 | 503 |
504 | |
505 | |
757 | 506 // This class combines a 3D DICOM volume together with its loader |
746 | 507 class IDicomVolumeImageSource : public boost::noncopyable |
712 | 508 { |
509 public: | |
746 | 510 virtual ~IDicomVolumeImageSource() |
712 | 511 { |
512 } | |
513 | |
757 | 514 virtual const DicomSeriesVolumeImage& GetVolume() const = 0; |
712 | 515 |
516 virtual void NotifyAxialSliceAccessed(unsigned int sliceIndex) = 0; | |
517 }; | |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
518 |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
519 |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
520 |
757 | 521 class OrthancSeriesVolumeProgressiveLoader : |
745 | 522 public IObserver, |
746 | 523 public IDicomVolumeImageSource |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
524 { |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
525 private: |
711 | 526 static const unsigned int LOW_QUALITY = 0; |
527 static const unsigned int MIDDLE_QUALITY = 1; | |
528 static const unsigned int BEST_QUALITY = 2; | |
529 | |
530 | |
531 static unsigned int GetSliceIndexPayload(const OracleCommandWithPayload& command) | |
532 { | |
533 return dynamic_cast< const Orthanc::SingleValueObject<unsigned int>& >(command.GetPayload()).GetValue(); | |
534 } | |
535 | |
536 | |
537 void ScheduleNextSliceDownload() | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
538 { |
711 | 539 assert(strategy_.get() != NULL); |
540 | |
541 unsigned int sliceIndex, quality; | |
542 | |
543 if (strategy_->GetNext(sliceIndex, quality)) | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
544 { |
711 | 545 assert(quality <= BEST_QUALITY); |
546 | |
547 const DicomInstanceParameters& slice = volume_.GetSliceParameters(sliceIndex); | |
548 | |
549 const std::string& instance = slice.GetOrthancInstanceIdentifier(); | |
550 if (instance.empty()) | |
551 { | |
552 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
553 } | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
554 |
745 | 555 std::auto_ptr<OracleCommandWithPayload> command; |
711 | 556 |
557 if (quality == BEST_QUALITY) | |
558 { | |
745 | 559 std::auto_ptr<GetOrthancImageCommand> tmp(new GetOrthancImageCommand); |
711 | 560 tmp->SetHttpHeader("Accept-Encoding", "gzip"); |
561 tmp->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); | |
562 tmp->SetInstanceUri(instance, slice.GetExpectedPixelFormat()); | |
563 tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); | |
564 command.reset(tmp.release()); | |
565 } | |
566 else | |
567 { | |
745 | 568 std::auto_ptr<GetOrthancWebViewerJpegCommand> tmp(new GetOrthancWebViewerJpegCommand); |
711 | 569 tmp->SetHttpHeader("Accept-Encoding", "gzip"); |
570 tmp->SetInstance(instance); | |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
571 tmp->SetQuality((quality == 0 ? 50 : 90)); |
711 | 572 tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); |
573 command.reset(tmp.release()); | |
574 } | |
575 | |
576 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(sliceIndex)); | |
577 oracle_.Schedule(*this, command.release()); | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
578 } |
711 | 579 } |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
580 |
711 | 581 |
582 void LoadGeometry(const OrthancRestApiCommand::SuccessMessage& message) | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
583 { |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
584 Json::Value body; |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
585 message.ParseJsonBody(body); |
711 | 586 |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
587 if (body.type() != Json::objectValue) |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
588 { |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
589 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
590 } |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
591 |
710 | 592 { |
593 Json::Value::Members instances = body.getMemberNames(); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
594 |
745 | 595 SlicesSorter slices; |
710 | 596 |
597 for (size_t i = 0; i < instances.size(); i++) | |
598 { | |
599 Orthanc::DicomMap dicom; | |
600 dicom.FromDicomAsJson(body[instances[i]]); | |
601 | |
602 std::auto_ptr<DicomInstanceParameters> instance(new DicomInstanceParameters(dicom)); | |
603 instance->SetOrthancInstanceIdentifier(instances[i]); | |
604 | |
745 | 605 CoordinateSystem3D geometry = instance->GetGeometry(); |
710 | 606 slices.AddSlice(geometry, instance.release()); |
607 } | |
608 | |
609 volume_.SetGeometry(slices); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
610 } |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
611 |
710 | 612 if (volume_.GetSlicesCount() != 0) |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
613 { |
745 | 614 strategy_.reset(new BasicFetchingStrategy( |
757 | 615 sorter_->CreateSorter(volume_.GetSlicesCount()), BEST_QUALITY)); |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
616 |
757 | 617 assert(simultaneousDownloads_ != 0); |
618 for (unsigned int i = 0; i < simultaneousDownloads_; i++) | |
710 | 619 { |
620 ScheduleNextSliceDownload(); | |
621 } | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
622 } |
710 | 623 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
624 |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
625 |
745 | 626 void LoadBestQualitySliceContent(const GetOrthancImageCommand::SuccessMessage& message) |
711 | 627 { |
628 volume_.SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), | |
629 message.GetImage(), BEST_QUALITY); | |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
630 |
711 | 631 ScheduleNextSliceDownload(); |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
632 } |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
633 |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
634 |
745 | 635 void LoadJpegSliceContent(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) |
710 | 636 { |
711 | 637 unsigned int quality; |
710 | 638 |
711 | 639 switch (message.GetOrigin().GetQuality()) |
640 { | |
641 case 50: | |
642 quality = LOW_QUALITY; | |
643 break; | |
644 | |
645 case 90: | |
646 quality = MIDDLE_QUALITY; | |
647 break; | |
648 | |
649 default: | |
650 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
651 } | |
652 | |
653 volume_.SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), quality); | |
654 | |
710 | 655 ScheduleNextSliceDownload(); |
656 } | |
711 | 657 |
710 | 658 |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
659 IOracle& oracle_; |
669 | 660 bool active_; |
757 | 661 DicomSeriesVolumeImage volume_; |
662 unsigned int simultaneousDownloads_; | |
663 | |
664 std::auto_ptr<IFetchingItemsSorter::IFactory> sorter_; | |
665 std::auto_ptr<IFetchingStrategy> strategy_; | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
666 |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
667 public: |
757 | 668 OrthancSeriesVolumeProgressiveLoader(IOracle& oracle, |
669 IObservable& oracleObservable) : | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
670 IObserver(oracleObservable.GetBroker()), |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
671 oracle_(oracle), |
757 | 672 active_(false), |
673 simultaneousDownloads_(4), | |
674 sorter_(new BasicFetchingItemsSorter::Factory) | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
675 { |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
676 oracleObservable.RegisterObserverCallback( |
757 | 677 new Callable<OrthancSeriesVolumeProgressiveLoader, OrthancRestApiCommand::SuccessMessage> |
678 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadGeometry)); | |
679 | |
680 oracleObservable.RegisterObserverCallback( | |
681 new Callable<OrthancSeriesVolumeProgressiveLoader, GetOrthancImageCommand::SuccessMessage> | |
682 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent)); | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
683 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
684 oracleObservable.RegisterObserverCallback( |
757 | 685 new Callable<OrthancSeriesVolumeProgressiveLoader, GetOrthancWebViewerJpegCommand::SuccessMessage> |
686 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent)); | |
687 } | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
688 |
757 | 689 void SetSimultaneousDownloads(unsigned int count) |
690 { | |
691 if (active_) | |
692 { | |
693 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
694 } | |
695 else if (count == 0) | |
696 { | |
697 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
698 } | |
699 else | |
700 { | |
701 simultaneousDownloads_ = count; | |
702 } | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
703 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
704 |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
705 void LoadSeries(const std::string& seriesId) |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
706 { |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
707 if (active_) |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
708 { |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
709 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
710 } |
757 | 711 else |
712 { | |
713 active_ = true; | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
714 |
757 | 715 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
716 command->SetUri("/series/" + seriesId + "/instances-tags"); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
717 |
757 | 718 oracle_.Schedule(*this, command.release()); |
719 } | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
720 } |
712 | 721 |
722 | |
757 | 723 virtual const DicomSeriesVolumeImage& GetVolume() const |
712 | 724 { |
725 return volume_; | |
726 } | |
727 | |
728 | |
729 virtual void NotifyAxialSliceAccessed(unsigned int sliceIndex) | |
730 { | |
731 if (strategy_.get() == NULL) | |
732 { | |
733 // Should have called GetVolume().HasGeometry() before | |
734 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
735 } | |
736 else | |
737 { | |
738 strategy_->SetCurrent(sliceIndex); | |
739 } | |
740 } | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
741 }; |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
742 |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
743 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
744 |
710 | 745 #if 0 |
746 void LoadInstance(const std::string& instanceId) | |
747 { | |
748 if (active_) | |
749 { | |
750 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
751 } | |
752 | |
753 active_ = true; | |
754 | |
755 // Tag "3004-000c" is "Grid Frame Offset Vector", which is | |
756 // mandatory to read RT DOSE, but is too long to be returned by default | |
757 | |
758 // TODO => Should be part of a second call if needed | |
759 | |
745 | 760 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
710 | 761 command->SetUri("/instances/" + instanceId + "/tags?ignore-length=3004-000c"); |
762 command->SetPayload(new LoadInstanceGeometryHandler(*this)); | |
763 | |
764 oracle_.Schedule(*this, command.release()); | |
765 } | |
766 #endif | |
767 | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
768 |
757 | 769 /* class VolumeSlicerBase : public OLD_IVolumeSlicer |
711 | 770 { |
771 private: | |
745 | 772 Scene2D& scene_; |
711 | 773 int layerDepth_; |
774 bool first_; | |
745 | 775 CoordinateSystem3D lastPlane_; |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
776 |
711 | 777 protected: |
757 | 778 bool HasCuttingPlaneChanged(const CoordinateSystem3D& plane) const |
711 | 779 { |
691 | 780 if (first_ || |
745 | 781 !LinearAlgebra::IsCloseToZero( |
711 | 782 boost::numeric::ublas::norm_2(lastPlane_.GetNormal() - plane.GetNormal()))) |
691 | 783 { |
711 | 784 // This is the first rendering, or the plane has not the same orientation |
785 return false; | |
691 | 786 } |
787 else | |
788 { | |
711 | 789 double offset1 = lastPlane_.ProjectAlongNormal(plane.GetOrigin()); |
790 double offset2 = lastPlane_.ProjectAlongNormal(lastPlane_.GetOrigin()); | |
745 | 791 return LinearAlgebra::IsCloseToZero(offset2 - offset1); |
691 | 792 } |
711 | 793 } |
691 | 794 |
757 | 795 void SetLastCuttingPlane(const CoordinateSystem3D& plane) |
711 | 796 { |
691 | 797 first_ = false; |
798 lastPlane_ = plane; | |
711 | 799 } |
691 | 800 |
745 | 801 void SetLayer(ISceneLayer* layer) |
711 | 802 { |
691 | 803 scene_.SetLayer(layerDepth_, layer); |
711 | 804 } |
691 | 805 |
711 | 806 void DeleteLayer() |
807 { | |
691 | 808 scene_.DeleteLayer(layerDepth_); |
711 | 809 } |
691 | 810 |
711 | 811 public: |
745 | 812 VolumeSlicerBase(Scene2D& scene, |
711 | 813 int layerDepth) : |
691 | 814 scene_(scene), |
815 layerDepth_(layerDepth), | |
816 first_(true) | |
711 | 817 { |
818 } | |
819 };*/ | |
691 | 820 |
821 | |
822 | |
757 | 823 class OLD_IVolumeSlicer : public boost::noncopyable |
745 | 824 { |
825 public: | |
757 | 826 virtual ~OLD_IVolumeSlicer() |
745 | 827 { |
828 } | |
829 | |
757 | 830 virtual void SetCuttingPlane(Scene2D& scene, |
831 const CoordinateSystem3D& plane) = 0; | |
745 | 832 }; |
833 | |
834 | |
757 | 835 class DicomVolumeMPRSlicer : public OLD_IVolumeSlicer |
691 | 836 { |
837 private: | |
746 | 838 bool linearInterpolation_; |
839 int layerDepth_; | |
840 IDicomVolumeImageSource& source_; | |
841 bool first_; | |
842 VolumeProjection lastProjection_; | |
843 unsigned int lastSliceIndex_; | |
844 uint64_t lastSliceRevision_; | |
691 | 845 |
846 public: | |
745 | 847 DicomVolumeMPRSlicer(Scene2D& scene, |
712 | 848 int layerDepth, |
746 | 849 IDicomVolumeImageSource& source) : |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
850 linearInterpolation_(false), |
692
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
851 layerDepth_(layerDepth), |
712 | 852 source_(source), |
692
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
853 first_(true) |
691 | 854 { |
855 } | |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
856 |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
857 void SetLinearInterpolation(bool enabled) |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
858 { |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
859 linearInterpolation_ = enabled; |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
860 } |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
861 |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
862 bool IsLinearInterpolation() const |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
863 { |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
864 return linearInterpolation_; |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
865 } |
691 | 866 |
757 | 867 virtual void SetCuttingPlane(Scene2D& scene, |
868 const CoordinateSystem3D& plane) | |
691 | 869 { |
712 | 870 if (!source_.GetVolume().HasGeometry() || |
871 source_.GetVolume().GetSlicesCount() == 0) | |
691 | 872 { |
757 | 873 scene.DeleteLayer(layerDepth_); |
691 | 874 return; |
875 } | |
876 | |
745 | 877 const VolumeImageGeometry& geometry = source_.GetVolume().GetGeometry(); |
878 | |
879 VolumeProjection projection; | |
691 | 880 unsigned int sliceIndex; |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
881 if (!geometry.DetectSlice(projection, sliceIndex, plane)) |
691 | 882 { |
883 // The cutting plane is neither axial, nor coronal, nor | |
884 // sagittal. Could use "VolumeReslicer" here. | |
757 | 885 scene.DeleteLayer(layerDepth_); |
691 | 886 return; |
887 } | |
888 | |
889 uint64_t sliceRevision; | |
745 | 890 if (projection == VolumeProjection_Axial) |
691 | 891 { |
712 | 892 sliceRevision = source_.GetVolume().GetSliceRevision(sliceIndex); |
893 | |
894 if (first_ || | |
895 lastSliceIndex_ != sliceIndex) | |
896 { | |
897 // Reorder the prefetching queue | |
898 source_.NotifyAxialSliceAccessed(sliceIndex); | |
899 } | |
691 | 900 } |
901 else | |
902 { | |
903 // For coronal and sagittal projections, we take the global | |
904 // revision of the volume | |
712 | 905 sliceRevision = source_.GetVolume().GetRevision(); |
691 | 906 } |
692
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
907 |
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
908 if (first_ || |
712 | 909 lastProjection_ != projection || |
910 lastSliceIndex_ != sliceIndex || | |
911 lastSliceRevision_ != sliceRevision) | |
691 | 912 { |
757 | 913 // Either the cutting plane, or the content of the slice have not |
692
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
914 // changed since the last time the layer was set: Update is needed |
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
915 |
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
916 first_ = false; |
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
917 lastProjection_ = projection; |
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
918 lastSliceIndex_ = sliceIndex; |
691 | 919 lastSliceRevision_ = sliceRevision; |
712 | 920 |
745 | 921 std::auto_ptr<TextureBaseSceneLayer> texture; |
692
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
922 |
691 | 923 { |
712 | 924 const DicomInstanceParameters& parameters = source_.GetVolume().GetSliceParameters |
745 | 925 (projection == VolumeProjection_Axial ? sliceIndex : 0); |
926 | |
927 ImageBuffer3D::SliceReader reader(source_.GetVolume().GetImage(), projection, sliceIndex); | |
712 | 928 texture.reset(parameters.CreateTexture(reader.GetAccessor())); |
929 } | |
691 | 930 |
745 | 931 const CoordinateSystem3D& system = geometry.GetProjectionGeometry(projection); |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
932 |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
933 double x0, y0, x1, y1; |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
934 system.ProjectPoint(x0, y0, system.GetOrigin()); |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
935 system.ProjectPoint(x0, y0, system.GetOrigin() + system.GetAxisX()); |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
936 texture->SetOrigin(x0, y0); |
712 | 937 |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
938 double dx = x1 - x0; |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
939 double dy = y1 - y0; |
745 | 940 if (!LinearAlgebra::IsCloseToZero(dx) || |
941 !LinearAlgebra::IsCloseToZero(dy)) | |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
942 { |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
943 texture->SetAngle(atan2(dy, dx)); |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
944 } |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
945 |
745 | 946 Vector tmp; |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
947 geometry.GetVoxelDimensions(projection); |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
948 texture->SetPixelSpacing(tmp[0], tmp[1]); |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
949 |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
950 texture->SetLinearInterpolation(linearInterpolation_); |
712 | 951 |
757 | 952 scene.SetLayer(layerDepth_, texture.release()); |
691 | 953 } |
954 } | |
955 }; | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
956 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
957 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
958 class NativeApplicationContext : public IMessageEmitter |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
959 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
960 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
961 boost::shared_mutex mutex_; |
745 | 962 MessageBroker broker_; |
963 IObservable oracleObservable_; | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
964 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
965 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
966 NativeApplicationContext() : |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
967 oracleObservable_(broker_) |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
968 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
969 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
970 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
971 |
745 | 972 virtual void EmitMessage(const IObserver& observer, |
973 const IMessage& message) | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
974 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
975 try |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
976 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
977 boost::unique_lock<boost::shared_mutex> lock(mutex_); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
978 oracleObservable_.EmitMessage(observer, message); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
979 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
980 catch (Orthanc::OrthancException& e) |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
981 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
982 LOG(ERROR) << "Exception while emitting a message: " << e.What(); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
983 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
984 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
985 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
986 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
987 class ReaderLock : public boost::noncopyable |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
988 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
989 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
990 NativeApplicationContext& that_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
991 boost::shared_lock<boost::shared_mutex> lock_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
992 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
993 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
994 ReaderLock(NativeApplicationContext& that) : |
745 | 995 that_(that), |
996 lock_(that.mutex_) | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
997 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
998 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
999 }; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1000 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1001 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1002 class WriterLock : public boost::noncopyable |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1003 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1004 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1005 NativeApplicationContext& that_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1006 boost::unique_lock<boost::shared_mutex> lock_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1007 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1008 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1009 WriterLock(NativeApplicationContext& that) : |
745 | 1010 that_(that), |
1011 lock_(that.mutex_) | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1012 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1013 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1014 |
745 | 1015 MessageBroker& GetBroker() |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1016 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1017 return that_.broker_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1018 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1019 |
745 | 1020 IObservable& GetOracleObservable() |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1021 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1022 return that_.oracleObservable_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1023 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1024 }; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1025 }; |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1026 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1027 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1028 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1029 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1030 class Toto : public OrthancStone::IObserver |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1031 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1032 private: |
745 | 1033 void Handle(const OrthancStone::SleepOracleCommand::TimeoutMessage& message) |
744 | 1034 { |
1035 printf("TIMEOUT! %d\n", dynamic_cast<const Orthanc::SingleValueObject<unsigned int>& >(message.GetOrigin().GetPayload()).GetValue()); | |
1036 } | |
1037 | |
745 | 1038 void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1039 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1040 Json::Value v; |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1041 message.ParseJsonBody(v); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1042 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1043 printf("ICI [%s]\n", v.toStyledString().c_str()); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1044 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1045 |
745 | 1046 void Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) |
637
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1047 { |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1048 printf("IMAGE %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight()); |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1049 } |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1050 |
745 | 1051 void Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1052 { |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1053 printf("WebViewer %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight()); |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1054 } |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1055 |
745 | 1056 void Handle(const OrthancStone::OracleCommandExceptionMessage& message) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1057 { |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1058 printf("EXCEPTION: [%s] on command type %d\n", message.GetException().What(), message.GetCommand().GetType()); |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1059 |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1060 switch (message.GetCommand().GetType()) |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1061 { |
745 | 1062 case OrthancStone::IOracleCommand::Type_GetOrthancWebViewerJpeg: |
1063 printf("URI: [%s]\n", dynamic_cast<const OrthancStone::GetOrthancWebViewerJpegCommand&> | |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1064 (message.GetCommand()).GetUri().c_str()); |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1065 break; |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1066 |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1067 default: |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1068 break; |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1069 } |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1070 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1071 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1072 public: |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1073 Toto(OrthancStone::IObservable& oracle) : |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1074 IObserver(oracle.GetBroker()) |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1075 { |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1076 oracle.RegisterObserverCallback |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1077 (new OrthancStone::Callable |
745 | 1078 <Toto, OrthancStone::SleepOracleCommand::TimeoutMessage>(*this, &Toto::Handle)); |
744 | 1079 |
1080 oracle.RegisterObserverCallback | |
1081 (new OrthancStone::Callable | |
745 | 1082 <Toto, OrthancStone::OrthancRestApiCommand::SuccessMessage>(*this, &Toto::Handle)); |
637
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1083 |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1084 oracle.RegisterObserverCallback |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1085 (new OrthancStone::Callable |
745 | 1086 <Toto, OrthancStone::GetOrthancImageCommand::SuccessMessage>(*this, &Toto::Handle)); |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1087 |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1088 oracle.RegisterObserverCallback |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1089 (new OrthancStone::Callable |
745 | 1090 <Toto, OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage>(*this, &Toto::Handle)); |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1091 |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1092 oracle.RegisterObserverCallback |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1093 (new OrthancStone::Callable |
745 | 1094 <Toto, OrthancStone::OracleCommandExceptionMessage>(*this, &Toto::Handle)); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1095 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1096 }; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1097 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1098 |
745 | 1099 void Run(OrthancStone::NativeApplicationContext& context, |
1100 OrthancStone::IOracle& oracle) | |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1101 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1102 std::auto_ptr<Toto> toto; |
757 | 1103 std::auto_ptr<OrthancStone::OrthancSeriesVolumeProgressiveLoader> loader1, loader2; |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1104 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1105 { |
745 | 1106 OrthancStone::NativeApplicationContext::WriterLock lock(context); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1107 toto.reset(new Toto(lock.GetOracleObservable())); |
757 | 1108 loader1.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(oracle, lock.GetOracleObservable())); |
1109 loader2.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(oracle, lock.GetOracleObservable())); | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1110 } |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1111 |
744 | 1112 if (0) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1113 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1114 Json::Value v = Json::objectValue; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1115 v["Level"] = "Series"; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1116 v["Query"] = Json::objectValue; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1117 |
745 | 1118 std::auto_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1119 command->SetMethod(Orthanc::HttpMethod_Post); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1120 command->SetUri("/tools/find"); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1121 command->SetBody(v); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1122 |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1123 oracle.Schedule(*toto, command.release()); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1124 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1125 |
744 | 1126 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1127 { |
745 | 1128 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1129 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Jpeg))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1130 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1131 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1132 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1133 |
744 | 1134 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1135 { |
745 | 1136 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1137 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1138 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1139 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1140 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1141 |
744 | 1142 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1143 { |
745 | 1144 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1145 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1146 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1147 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1148 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1149 |
744 | 1150 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1151 { |
745 | 1152 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1153 command->SetHttpHeader("Accept-Encoding", "gzip"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1154 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1155 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1156 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1157 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1158 |
744 | 1159 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1160 { |
745 | 1161 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1162 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1163 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1164 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1165 } |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1166 |
744 | 1167 if (0) |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1168 { |
745 | 1169 std::auto_ptr<OrthancStone::GetOrthancWebViewerJpegCommand> command(new OrthancStone::GetOrthancWebViewerJpegCommand); |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1170 command->SetHttpHeader("Accept-Encoding", "gzip"); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1171 command->SetInstance("e6c7c20b-c9f65d7e-0d76f2e2-830186f2-3e3c600e"); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1172 command->SetQuality(90); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1173 oracle.Schedule(*toto, command.release()); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1174 } |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1175 |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
1176 |
744 | 1177 if (0) |
1178 { | |
1179 for (unsigned int i = 0; i < 10; i++) | |
1180 { | |
745 | 1181 std::auto_ptr<OrthancStone::SleepOracleCommand> command(new OrthancStone::SleepOracleCommand(i * 1000)); |
744 | 1182 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(42 * i)); |
1183 oracle.Schedule(*toto, command.release()); | |
1184 } | |
1185 } | |
1186 | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1187 // 2017-11-17-Anonymized |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1188 //loader1->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT |
710 | 1189 //loader2->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1190 |
661 | 1191 // Delphine |
744 | 1192 //loader1->LoadSeries("5990e39c-51e5f201-fe87a54c-31a55943-e59ef80e"); // CT |
1193 loader1->LoadSeries("67f1b334-02c16752-45026e40-a5b60b6b-030ecab5"); // Lung 1/10mm | |
661 | 1194 |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1195 LOG(WARNING) << "...Waiting for Ctrl-C..."; |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1196 Orthanc::SystemToolbox::ServerBarrier(); |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1197 //boost::this_thread::sleep(boost::posix_time::seconds(1)); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1198 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1199 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1200 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1201 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1202 /** |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1203 * IMPORTANT: The full arguments to "main()" are needed for SDL on |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1204 * Windows. Otherwise, one gets the linking error "undefined reference |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1205 * to `SDL_main'". https://wiki.libsdl.org/FAQWindows |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1206 **/ |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1207 int main(int argc, char* argv[]) |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1208 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1209 OrthancStone::StoneInitialize(); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1210 Orthanc::Logging::EnableInfoLevel(true); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1211 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1212 try |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1213 { |
745 | 1214 OrthancStone::NativeApplicationContext context; |
1215 | |
1216 OrthancStone::ThreadedOracle oracle(context); | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1217 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1218 { |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1219 Orthanc::WebServiceParameters p; |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1220 //p.SetUrl("http://localhost:8043/"); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1221 p.SetCredentials("orthanc", "orthanc"); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1222 oracle.SetOrthancParameters(p); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1223 } |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1224 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1225 oracle.Start(); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1226 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1227 Run(context, oracle); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1228 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1229 oracle.Stop(); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1230 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1231 catch (Orthanc::OrthancException& e) |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1232 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1233 LOG(ERROR) << "EXCEPTION: " << e.What(); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1234 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1235 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1236 OrthancStone::StoneFinalize(); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1237 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1238 return 0; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1239 } |