Mercurial > hg > orthanc-stone
annotate Framework/Loaders/OrthancMultiframeVolumeLoader.cpp @ 988:4c9b4c4de814 toa2019090901
Fixed bug in DicomStructureSet that prevented points from being added to polygons
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Mon, 09 Sep 2019 16:15:28 +0200 |
parents | a7351ad54960 |
children | 1f74bc3459ba |
rev | line source |
---|---|
815 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #include "OrthancMultiframeVolumeLoader.h" | |
23 | |
816 | 24 #include <Core/Endianness.h> |
815 | 25 #include <Core/Toolbox.h> |
26 | |
27 namespace OrthancStone | |
28 { | |
29 class OrthancMultiframeVolumeLoader::LoadRTDoseGeometry : public LoaderStateMachine::State | |
30 { | |
31 private: | |
32 std::auto_ptr<Orthanc::DicomMap> dicom_; | |
33 | |
34 public: | |
35 LoadRTDoseGeometry(OrthancMultiframeVolumeLoader& that, | |
36 Orthanc::DicomMap* dicom) : | |
37 State(that), | |
38 dicom_(dicom) | |
39 { | |
40 if (dicom == NULL) | |
41 { | |
42 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
43 } | |
44 | |
45 } | |
46 | |
47 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) | |
48 { | |
49 // Complete the DICOM tags with just-received "Grid Frame Offset Vector" | |
50 std::string s = Orthanc::Toolbox::StripSpaces(message.GetAnswer()); | |
51 dicom_->SetValue(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, s, false); | |
52 | |
53 GetLoader<OrthancMultiframeVolumeLoader>().SetGeometry(*dicom_); | |
54 } | |
55 }; | |
56 | |
57 | |
58 static std::string GetSopClassUid(const Orthanc::DicomMap& dicom) | |
59 { | |
60 std::string s; | |
61 if (!dicom.CopyToString(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) | |
62 { | |
63 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, | |
64 "DICOM file without SOP class UID"); | |
65 } | |
66 else | |
67 { | |
68 return s; | |
69 } | |
70 } | |
71 | |
72 | |
73 class OrthancMultiframeVolumeLoader::LoadGeometry : public State | |
74 { | |
75 public: | |
76 LoadGeometry(OrthancMultiframeVolumeLoader& that) : | |
77 State(that) | |
78 { | |
79 } | |
80 | |
81 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) | |
82 { | |
83 OrthancMultiframeVolumeLoader& loader = GetLoader<OrthancMultiframeVolumeLoader>(); | |
84 | |
85 Json::Value body; | |
86 message.ParseJsonBody(body); | |
87 | |
88 if (body.type() != Json::objectValue) | |
89 { | |
90 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); | |
91 } | |
92 | |
93 std::auto_ptr<Orthanc::DicomMap> dicom(new Orthanc::DicomMap); | |
94 dicom->FromDicomAsJson(body); | |
95 | |
96 if (StringToSopClassUid(GetSopClassUid(*dicom)) == SopClassUid_RTDose) | |
97 { | |
98 // Download the "Grid Frame Offset Vector" DICOM tag, that is | |
99 // mandatory for RT-DOSE, but is too long to be returned by default | |
100 | |
101 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
102 command->SetUri("/instances/" + loader.GetInstanceId() + "/content/" + | |
103 Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR.Format()); | |
104 command->SetPayload(new LoadRTDoseGeometry(loader, dicom.release())); | |
105 | |
106 Schedule(command.release()); | |
107 } | |
108 else | |
109 { | |
110 loader.SetGeometry(*dicom); | |
111 } | |
112 } | |
113 }; | |
114 | |
115 | |
116 | |
117 class OrthancMultiframeVolumeLoader::LoadTransferSyntax : public State | |
118 { | |
119 public: | |
120 LoadTransferSyntax(OrthancMultiframeVolumeLoader& that) : | |
121 State(that) | |
122 { | |
123 } | |
124 | |
125 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) | |
126 { | |
127 GetLoader<OrthancMultiframeVolumeLoader>().SetTransferSyntax(message.GetAnswer()); | |
128 } | |
129 }; | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
130 |
815 | 131 class OrthancMultiframeVolumeLoader::LoadUncompressedPixelData : public State |
132 { | |
133 public: | |
134 LoadUncompressedPixelData(OrthancMultiframeVolumeLoader& that) : | |
135 State(that) | |
136 { | |
137 } | |
138 | |
139 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) | |
140 { | |
141 GetLoader<OrthancMultiframeVolumeLoader>().SetUncompressedPixelData(message.GetAnswer()); | |
142 } | |
143 }; | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
144 |
815 | 145 const std::string& OrthancMultiframeVolumeLoader::GetInstanceId() const |
146 { | |
147 if (IsActive()) | |
148 { | |
149 return instanceId_; | |
150 } | |
151 else | |
152 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
153 LOG(ERROR) << "OrthancMultiframeVolumeLoader::GetInstanceId(): (!IsActive())"; |
815 | 154 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
155 } | |
156 } | |
157 | |
158 void OrthancMultiframeVolumeLoader::ScheduleFrameDownloads() | |
159 { | |
160 if (transferSyntaxUid_.empty() || | |
161 !volume_->HasGeometry()) | |
162 { | |
163 return; | |
164 } | |
165 /* | |
166 1.2.840.10008.1.2 Implicit VR Endian: Default Transfer Syntax for DICOM | |
167 1.2.840.10008.1.2.1 Explicit VR Little Endian | |
168 1.2.840.10008.1.2.2 Explicit VR Big Endian | |
169 | |
170 See https://www.dicomlibrary.com/dicom/transfer-syntax/ | |
171 */ | |
172 if (transferSyntaxUid_ == "1.2.840.10008.1.2" || | |
173 transferSyntaxUid_ == "1.2.840.10008.1.2.1" || | |
174 transferSyntaxUid_ == "1.2.840.10008.1.2.2") | |
175 { | |
176 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
177 command->SetHttpHeader("Accept-Encoding", "gzip"); | |
178 command->SetUri("/instances/" + instanceId_ + "/content/" + | |
179 Orthanc::DICOM_TAG_PIXEL_DATA.Format() + "/0"); | |
180 command->SetPayload(new LoadUncompressedPixelData(*this)); | |
181 Schedule(command.release()); | |
182 } | |
183 else | |
184 { | |
185 throw Orthanc::OrthancException( | |
186 Orthanc::ErrorCode_NotImplemented, | |
187 "No support for multiframe instances with transfer syntax: " + transferSyntaxUid_); | |
188 } | |
189 } | |
190 | |
191 | |
192 void OrthancMultiframeVolumeLoader::SetTransferSyntax(const std::string& transferSyntax) | |
193 { | |
194 transferSyntaxUid_ = Orthanc::Toolbox::StripSpaces(transferSyntax); | |
195 ScheduleFrameDownloads(); | |
196 } | |
197 | |
198 void OrthancMultiframeVolumeLoader::SetGeometry(const Orthanc::DicomMap& dicom) | |
199 { | |
200 DicomInstanceParameters parameters(dicom); | |
201 volume_->SetDicomParameters(parameters); | |
202 | |
203 Orthanc::PixelFormat format; | |
204 if (!parameters.GetImageInformation().ExtractPixelFormat(format, true)) | |
205 { | |
206 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
207 } | |
208 | |
209 double spacingZ; | |
210 switch (parameters.GetSopClassUid()) | |
211 { | |
212 case SopClassUid_RTDose: | |
213 spacingZ = parameters.GetThickness(); | |
214 break; | |
215 | |
216 default: | |
217 throw Orthanc::OrthancException( | |
218 Orthanc::ErrorCode_NotImplemented, | |
219 "No support for multiframe instances with SOP class UID: " + GetSopClassUid(dicom)); | |
220 } | |
221 | |
222 const unsigned int width = parameters.GetImageInformation().GetWidth(); | |
223 const unsigned int height = parameters.GetImageInformation().GetHeight(); | |
224 const unsigned int depth = parameters.GetImageInformation().GetNumberOfFrames(); | |
225 | |
226 { | |
227 VolumeImageGeometry geometry; | |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
228 geometry.SetSizeInVoxels(width, height, depth); |
815 | 229 geometry.SetAxialGeometry(parameters.GetGeometry()); |
230 geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(), | |
231 parameters.GetPixelSpacingY(), spacingZ); | |
232 volume_->Initialize(geometry, format); | |
233 } | |
234 | |
235 volume_->GetPixelData().Clear(); | |
236 | |
237 ScheduleFrameDownloads(); | |
238 | |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
239 |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
240 |
815 | 241 BroadcastMessage(DicomVolumeImage::GeometryReadyMessage(*volume_)); |
242 } | |
243 | |
244 | |
245 ORTHANC_FORCE_INLINE | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
246 static void CopyPixel(uint32_t& target, const void* source) |
815 | 247 { |
248 // TODO - check alignement? | |
249 target = le32toh(*reinterpret_cast<const uint32_t*>(source)); | |
250 } | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
251 |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
252 ORTHANC_FORCE_INLINE |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
253 static void CopyPixel(uint16_t& target, const void* source) |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
254 { |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
255 // TODO - check alignement? |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
256 target = le16toh(*reinterpret_cast<const uint16_t*>(source)); |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
257 } |
815 | 258 |
259 template <typename T> | |
260 void OrthancMultiframeVolumeLoader::CopyPixelData(const std::string& pixelData) | |
261 { | |
262 ImageBuffer3D& target = volume_->GetPixelData(); | |
263 | |
264 const unsigned int bpp = target.GetBytesPerPixel(); | |
265 const unsigned int width = target.GetWidth(); | |
266 const unsigned int height = target.GetHeight(); | |
267 const unsigned int depth = target.GetDepth(); | |
268 | |
269 if (pixelData.size() != bpp * width * height * depth) | |
270 { | |
271 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, | |
272 "The pixel data has not the proper size"); | |
273 } | |
274 | |
275 if (pixelData.empty()) | |
276 { | |
277 return; | |
278 } | |
279 | |
280 const uint8_t* source = reinterpret_cast<const uint8_t*>(pixelData.c_str()); | |
281 | |
282 for (unsigned int z = 0; z < depth; z++) | |
283 { | |
284 ImageBuffer3D::SliceWriter writer(target, VolumeProjection_Axial, z); | |
285 | |
286 assert (writer.GetAccessor().GetWidth() == width && | |
287 writer.GetAccessor().GetHeight() == height); | |
288 | |
289 for (unsigned int y = 0; y < height; y++) | |
290 { | |
291 assert(sizeof(T) == Orthanc::GetBytesPerPixel(target.GetFormat())); | |
292 | |
293 T* target = reinterpret_cast<T*>(writer.GetAccessor().GetRow(y)); | |
294 | |
295 for (unsigned int x = 0; x < width; x++) | |
296 { | |
297 CopyPixel(*target, source); | |
298 | |
299 target ++; | |
300 source += bpp; | |
301 } | |
302 } | |
303 } | |
304 } | |
305 | |
306 void OrthancMultiframeVolumeLoader::SetUncompressedPixelData(const std::string& pixelData) | |
307 { | |
308 switch (volume_->GetPixelData().GetFormat()) | |
309 { | |
310 case Orthanc::PixelFormat_Grayscale32: | |
311 CopyPixelData<uint32_t>(pixelData); | |
312 break; | |
925
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
313 case Orthanc::PixelFormat_Grayscale16: |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
314 CopyPixelData<uint16_t>(pixelData); |
4639d0bf6390
Added support for Grayscale16 in the multiframe loader (Victor)
Benjamin Golinvaux <bgo@osimis.io>
parents:
921
diff
changeset
|
315 break; |
815 | 316 default: |
317 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
318 } | |
319 | |
320 volume_->IncrementRevision(); | |
321 | |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
322 pixelDataLoaded_ = true; |
815 | 323 BroadcastMessage(DicomVolumeImage::ContentUpdatedMessage(*volume_)); |
324 } | |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
325 |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
326 bool OrthancMultiframeVolumeLoader::HasGeometry() const |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
327 { |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
328 return volume_->HasGeometry(); |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
329 } |
815 | 330 |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
331 const OrthancStone::VolumeImageGeometry& OrthancMultiframeVolumeLoader::GetImageGeometry() const |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
332 { |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
333 return volume_->GetGeometry(); |
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
937
diff
changeset
|
334 } |
815 | 335 |
921
81d30cd93b65
Ability to ask the loader for the geometry in PULL mode (when subscribing to the messages is not possible) + small changes (removed const/ref qualifiers for boost::shared_ptr param, added traces, doc change)
Benjamin Golinvaux <bgo@osimis.io>
parents:
816
diff
changeset
|
336 OrthancMultiframeVolumeLoader::OrthancMultiframeVolumeLoader(boost::shared_ptr<DicomVolumeImage> volume, |
815 | 337 IOracle& oracle, |
338 IObservable& oracleObservable) : | |
339 LoaderStateMachine(oracle, oracleObservable), | |
340 IObservable(oracleObservable.GetBroker()), | |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
341 volume_(volume), |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
342 pixelDataLoaded_(false) |
815 | 343 { |
344 if (volume.get() == NULL) | |
345 { | |
346 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
347 } | |
348 } | |
349 | |
935
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
925
diff
changeset
|
350 OrthancMultiframeVolumeLoader::~OrthancMultiframeVolumeLoader() |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
925
diff
changeset
|
351 { |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
925
diff
changeset
|
352 LOG(TRACE) << "OrthancMultiframeVolumeLoader::~OrthancMultiframeVolumeLoader()"; |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
925
diff
changeset
|
353 } |
815 | 354 |
355 void OrthancMultiframeVolumeLoader::LoadInstance(const std::string& instanceId) | |
356 { | |
357 Start(); | |
358 | |
359 instanceId_ = instanceId; | |
360 | |
361 { | |
362 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
363 command->SetHttpHeader("Accept-Encoding", "gzip"); | |
364 command->SetUri("/instances/" + instanceId + "/tags"); | |
365 command->SetPayload(new LoadGeometry(*this)); | |
366 Schedule(command.release()); | |
367 } | |
368 | |
369 { | |
370 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
371 command->SetUri("/instances/" + instanceId + "/metadata/TransferSyntax"); | |
372 command->SetPayload(new LoadTransferSyntax(*this)); | |
373 Schedule(command.release()); | |
374 } | |
375 } | |
376 } |