Mercurial > hg > orthanc-stone
annotate Applications/Samples/SingleFrameEditorApplication.h @ 421:f87f28624b96 cache-in-radiography
tentative to make SmartLoader and RadiographyScene work together (not really working)
author | am@osimis.io |
---|---|
date | Tue, 20 Nov 2018 16:35:29 +0100 |
parents | c23df8b3433b |
children |
rev | line source |
---|---|
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
1 /** |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
2 * Stone of Orthanc |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
6 * |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
11 * |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
16 * |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
19 **/ |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
20 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
21 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
22 #pragma once |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
23 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
24 #include "SampleApplicationBase.h" |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
25 |
415
c0589c3173fd
finished reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
414
diff
changeset
|
26 #include "../../Framework/Radiography/RadiographyLayerCropTracker.h" |
414 | 27 #include "../../Framework/Radiography/RadiographyLayerMoveTracker.h" |
415
c0589c3173fd
finished reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
414
diff
changeset
|
28 #include "../../Framework/Radiography/RadiographyLayerResizeTracker.h" |
414 | 29 #include "../../Framework/Radiography/RadiographyLayerRotateTracker.h" |
408 | 30 #include "../../Framework/Radiography/RadiographyScene.h" |
414 | 31 #include "../../Framework/Radiography/RadiographySceneCommand.h" |
413 | 32 #include "../../Framework/Radiography/RadiographyWidget.h" |
415
c0589c3173fd
finished reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
414
diff
changeset
|
33 #include "../../Framework/Radiography/RadiographyWindowingTracker.h" |
421
f87f28624b96
tentative to make SmartLoader and RadiographyScene work together (not really working)
am@osimis.io
parents:
418
diff
changeset
|
34 #include "../../Framework/SmartLoader.h" |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
35 |
418 | 36 #include <Core/HttpClient.h> |
343 | 37 #include <Core/Images/FontRegistry.h> |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
38 #include <Core/Logging.h> |
403 | 39 #include <Core/OrthancException.h> |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
40 |
407 | 41 |
42 // Export using PAM is faster than using PNG, but requires Orthanc | |
43 // core >= 1.4.3 | |
362
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
44 #define EXPORT_USING_PAM 1 |
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
45 |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
46 |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
47 namespace OrthancStone |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
48 { |
407 | 49 namespace Samples |
358 | 50 { |
408 | 51 class RadiographyEditorInteractor : |
407 | 52 public IWorldSceneInteractor, |
53 public IObserver | |
358 | 54 { |
407 | 55 private: |
56 enum Tool | |
57 { | |
58 Tool_Move, | |
59 Tool_Rotate, | |
60 Tool_Crop, | |
61 Tool_Resize, | |
62 Tool_Windowing | |
63 }; | |
358 | 64 |
65 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
66 StoneApplicationContext* context_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
67 UndoRedoStack undoRedoStack_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
68 Tool tool_; |
407 | 69 |
70 | |
71 static double GetHandleSize() | |
72 { | |
73 return 10.0; | |
74 } | |
358 | 75 |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
76 |
407 | 77 public: |
408 | 78 RadiographyEditorInteractor(MessageBroker& broker) : |
407 | 79 IObserver(broker), |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
80 context_(NULL), |
407 | 81 tool_(Tool_Move) |
82 { | |
83 } | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
84 |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
85 void SetContext(StoneApplicationContext& context) |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
86 { |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
87 context_ = &context; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
88 } |
358 | 89 |
407 | 90 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& worldWidget, |
91 const ViewportGeometry& view, | |
92 MouseButton button, | |
93 KeyboardModifiers modifiers, | |
94 int viewportX, | |
95 int viewportY, | |
96 double x, | |
97 double y, | |
98 IStatusBar* statusBar) | |
357
ec4ad6c5eb99
avoid breaking class hierarchy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
356
diff
changeset
|
99 { |
408 | 100 RadiographyWidget& widget = dynamic_cast<RadiographyWidget&>(worldWidget); |
407 | 101 |
102 if (button == MouseButton_Left) | |
358 | 103 { |
407 | 104 size_t selected; |
105 | |
106 if (tool_ == Tool_Windowing) | |
358 | 107 { |
408 | 108 return new RadiographyWindowingTracker( |
109 undoRedoStack_, widget.GetScene(), | |
110 viewportX, viewportY, | |
111 RadiographyWindowingTracker::Action_DecreaseWidth, | |
112 RadiographyWindowingTracker::Action_IncreaseWidth, | |
113 RadiographyWindowingTracker::Action_DecreaseCenter, | |
114 RadiographyWindowingTracker::Action_IncreaseCenter); | |
358 | 115 } |
407 | 116 else if (!widget.LookupSelectedLayer(selected)) |
358 | 117 { |
407 | 118 // No layer is currently selected |
119 size_t layer; | |
120 if (widget.GetScene().LookupLayer(layer, x, y)) | |
358 | 121 { |
407 | 122 widget.Select(layer); |
358 | 123 } |
407 | 124 |
125 return NULL; | |
358 | 126 } |
407 | 127 else if (tool_ == Tool_Crop || |
128 tool_ == Tool_Resize) | |
358 | 129 { |
408 | 130 RadiographyScene::LayerAccessor accessor(widget.GetScene(), selected); |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
408
diff
changeset
|
131 |
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
408
diff
changeset
|
132 Corner corner; |
407 | 133 if (accessor.GetLayer().LookupCorner(corner, x, y, view.GetZoom(), GetHandleSize())) |
358 | 134 { |
407 | 135 switch (tool_) |
136 { | |
137 case Tool_Crop: | |
408 | 138 return new RadiographyLayerCropTracker |
139 (undoRedoStack_, widget.GetScene(), view, selected, x, y, corner); | |
407 | 140 |
141 case Tool_Resize: | |
408 | 142 return new RadiographyLayerResizeTracker |
143 (undoRedoStack_, widget.GetScene(), selected, x, y, corner, | |
144 (modifiers & KeyboardModifiers_Shift)); | |
407 | 145 |
146 default: | |
147 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
148 } | |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
149 } |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
150 else |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
151 { |
407 | 152 size_t layer; |
358 | 153 |
407 | 154 if (widget.GetScene().LookupLayer(layer, x, y)) |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
155 { |
407 | 156 widget.Select(layer); |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
157 } |
407 | 158 else |
159 { | |
160 widget.Unselect(); | |
161 } | |
162 | |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
163 return NULL; |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
164 } |
358 | 165 } |
166 else | |
167 { | |
407 | 168 size_t layer; |
169 | |
170 if (widget.GetScene().LookupLayer(layer, x, y)) | |
171 { | |
172 if (layer == selected) | |
173 { | |
174 switch (tool_) | |
175 { | |
176 case Tool_Move: | |
408 | 177 return new RadiographyLayerMoveTracker |
178 (undoRedoStack_, widget.GetScene(), layer, x, y, | |
179 (modifiers & KeyboardModifiers_Shift)); | |
407 | 180 |
181 case Tool_Rotate: | |
408 | 182 return new RadiographyLayerRotateTracker |
183 (undoRedoStack_, widget.GetScene(), view, layer, x, y, | |
184 (modifiers & KeyboardModifiers_Shift)); | |
407 | 185 |
186 default: | |
187 break; | |
188 } | |
189 | |
190 return NULL; | |
191 } | |
192 else | |
193 { | |
194 widget.Select(layer); | |
195 return NULL; | |
196 } | |
197 } | |
198 else | |
199 { | |
200 widget.Unselect(); | |
201 return NULL; | |
202 } | |
203 } | |
204 } | |
205 else | |
206 { | |
207 return NULL; | |
208 } | |
209 } | |
210 | |
211 virtual void MouseOver(CairoContext& context, | |
212 WorldSceneWidget& worldWidget, | |
213 const ViewportGeometry& view, | |
214 double x, | |
215 double y, | |
216 IStatusBar* statusBar) | |
217 { | |
408 | 218 RadiographyWidget& widget = dynamic_cast<RadiographyWidget&>(worldWidget); |
407 | 219 |
220 #if 0 | |
221 if (statusBar != NULL) | |
222 { | |
223 char buf[64]; | |
224 sprintf(buf, "X = %.02f Y = %.02f (in cm)", x / 10.0, y / 10.0); | |
225 statusBar->SetMessage(buf); | |
226 } | |
227 #endif | |
228 | |
229 size_t selected; | |
230 | |
231 if (widget.LookupSelectedLayer(selected) && | |
232 (tool_ == Tool_Crop || | |
233 tool_ == Tool_Resize)) | |
234 { | |
408 | 235 RadiographyScene::LayerAccessor accessor(widget.GetScene(), selected); |
407 | 236 |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
408
diff
changeset
|
237 Corner corner; |
407 | 238 if (accessor.GetLayer().LookupCorner(corner, x, y, view.GetZoom(), GetHandleSize())) |
239 { | |
240 accessor.GetLayer().GetCorner(x, y, corner); | |
241 | |
242 double z = 1.0 / view.GetZoom(); | |
243 | |
244 context.SetSourceColor(255, 0, 0); | |
245 cairo_t* cr = context.GetObject(); | |
246 cairo_set_line_width(cr, 2.0 * z); | |
247 cairo_move_to(cr, x - GetHandleSize() * z, y - GetHandleSize() * z); | |
248 cairo_line_to(cr, x + GetHandleSize() * z, y - GetHandleSize() * z); | |
249 cairo_line_to(cr, x + GetHandleSize() * z, y + GetHandleSize() * z); | |
250 cairo_line_to(cr, x - GetHandleSize() * z, y + GetHandleSize() * z); | |
251 cairo_line_to(cr, x - GetHandleSize() * z, y - GetHandleSize() * z); | |
252 cairo_stroke(cr); | |
358 | 253 } |
254 } | |
339 | 255 } |
407 | 256 |
257 virtual void MouseWheel(WorldSceneWidget& widget, | |
258 MouseWheelDirection direction, | |
259 KeyboardModifiers modifiers, | |
260 IStatusBar* statusBar) | |
344
fdec8e6893cb
ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
343
diff
changeset
|
261 { |
358 | 262 } |
407 | 263 |
264 virtual void KeyPressed(WorldSceneWidget& worldWidget, | |
265 KeyboardKeys key, | |
266 char keyChar, | |
267 KeyboardModifiers modifiers, | |
268 IStatusBar* statusBar) | |
345 | 269 { |
408 | 270 RadiographyWidget& widget = dynamic_cast<RadiographyWidget&>(worldWidget); |
407 | 271 |
272 switch (keyChar) | |
358 | 273 { |
407 | 274 case 'a': |
275 widget.FitContent(); | |
276 break; | |
277 | |
278 case 'c': | |
279 tool_ = Tool_Crop; | |
280 break; | |
281 | |
282 case 'e': | |
283 { | |
284 Orthanc::DicomMap tags; | |
285 | |
286 // Minimal set of tags to generate a valid CR image | |
287 tags.SetValue(Orthanc::DICOM_TAG_ACCESSION_NUMBER, "NOPE", false); | |
288 tags.SetValue(Orthanc::DICOM_TAG_BODY_PART_EXAMINED, "PELVIS", false); | |
289 tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1", false); | |
290 //tags.SetValue(Orthanc::DICOM_TAG_LATERALITY, "", false); | |
291 tags.SetValue(Orthanc::DICOM_TAG_MANUFACTURER, "OSIMIS", false); | |
292 tags.SetValue(Orthanc::DICOM_TAG_MODALITY, "CR", false); | |
293 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_BIRTH_DATE, "20000101", false); | |
294 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_ID, "hello", false); | |
295 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_NAME, "HELLO^WORLD", false); | |
296 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_ORIENTATION, "", false); | |
297 tags.SetValue(Orthanc::DICOM_TAG_PATIENT_SEX, "M", false); | |
298 tags.SetValue(Orthanc::DICOM_TAG_REFERRING_PHYSICIAN_NAME, "HOUSE^MD", false); | |
299 tags.SetValue(Orthanc::DICOM_TAG_SERIES_NUMBER, "1", false); | |
300 tags.SetValue(Orthanc::DICOM_TAG_SOP_CLASS_UID, "1.2.840.10008.5.1.4.1.1.1", false); | |
301 tags.SetValue(Orthanc::DICOM_TAG_STUDY_ID, "STUDY", false); | |
302 tags.SetValue(Orthanc::DICOM_TAG_VIEW_POSITION, "", false); | |
303 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
304 if (context_ != NULL) |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
305 { |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
306 widget.GetScene().ExportDicom(context_->GetOrthancApiClient(), |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
307 tags, 0.1, 0.1, widget.IsInverted(), |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
308 widget.GetInterpolation(), EXPORT_USING_PAM); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
309 } |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
310 |
407 | 311 break; |
312 } | |
313 | |
314 case 'i': | |
315 widget.SwitchInvert(); | |
316 break; | |
317 | |
318 case 'm': | |
319 tool_ = Tool_Move; | |
320 break; | |
321 | |
322 case 'n': | |
323 { | |
324 switch (widget.GetInterpolation()) | |
325 { | |
326 case ImageInterpolation_Nearest: | |
327 LOG(INFO) << "Switching to bilinear interpolation"; | |
328 widget.SetInterpolation(ImageInterpolation_Bilinear); | |
329 break; | |
330 | |
331 case ImageInterpolation_Bilinear: | |
332 LOG(INFO) << "Switching to nearest neighbor interpolation"; | |
333 widget.SetInterpolation(ImageInterpolation_Nearest); | |
334 break; | |
335 | |
336 default: | |
337 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
338 } | |
358 | 339 |
407 | 340 break; |
341 } | |
342 | |
343 case 'r': | |
344 tool_ = Tool_Rotate; | |
345 break; | |
346 | |
347 case 's': | |
348 tool_ = Tool_Resize; | |
349 break; | |
350 | |
351 case 'w': | |
352 tool_ = Tool_Windowing; | |
353 break; | |
354 | |
355 case 'y': | |
356 if (modifiers & KeyboardModifiers_Control) | |
357 { | |
358 undoRedoStack_.Redo(); | |
359 widget.NotifyContentChanged(); | |
360 } | |
361 break; | |
362 | |
363 case 'z': | |
364 if (modifiers & KeyboardModifiers_Control) | |
365 { | |
366 undoRedoStack_.Undo(); | |
367 widget.NotifyContentChanged(); | |
368 } | |
369 break; | |
370 | |
371 default: | |
372 break; | |
358 | 373 } |
345 | 374 } |
407 | 375 }; |
336
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
376 |
c7fdc8bac581
creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
334
diff
changeset
|
377 |
358 | 378 |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
379 class SingleFrameEditorApplication : |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
380 public SampleSingleCanvasApplicationBase, |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
381 public IObserver |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
382 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
383 private: |
408 | 384 std::auto_ptr<RadiographyScene> scene_; |
385 RadiographyEditorInteractor interactor_; | |
421
f87f28624b96
tentative to make SmartLoader and RadiographyScene work together (not really working)
am@osimis.io
parents:
418
diff
changeset
|
386 std::auto_ptr<SmartLoader> smartLoader_; |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
387 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
388 public: |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
389 SingleFrameEditorApplication(MessageBroker& broker) : |
362
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
390 IObserver(broker), |
12cec26d08ce
export of a valid DICOM CR
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
361
diff
changeset
|
391 interactor_(broker) |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
392 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
393 } |
384
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
394 |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
395 virtual ~SingleFrameEditorApplication() |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
396 { |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
397 LOG(WARNING) << "Destroying the application"; |
d20d75f20c5d
better following of the MVC design pattern
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
377
diff
changeset
|
398 } |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
399 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
400 virtual void DeclareStartupOptions(boost::program_options::options_description& options) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
401 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
402 boost::program_options::options_description generic("Sample options"); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
403 generic.add_options() |
340
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
404 ("instance", boost::program_options::value<std::string>(), |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
405 "Orthanc ID of the instance") |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
406 ("frame", boost::program_options::value<unsigned int>()->default_value(0), |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
407 "Number of the frame, for multi-frame DICOM instances") |
f5d5814a41a0
rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
339
diff
changeset
|
408 ; |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
409 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
410 options.add(generic); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
411 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
412 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
413 virtual void Initialize(StoneApplicationContext* context, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
414 IStatusBar& statusBar, |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
415 const boost::program_options::variables_map& parameters) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
416 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
417 using namespace OrthancStone; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
418 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
419 context_ = context; |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
420 interactor_.SetContext(*context); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
421 |
358 | 422 statusBar.SetMessage("Use the key \"a\" to reinitialize the layout"); |
423 statusBar.SetMessage("Use the key \"c\" to crop"); | |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
424 statusBar.SetMessage("Use the key \"e\" to export DICOM to the Orthanc server"); |
358 | 425 statusBar.SetMessage("Use the key \"f\" to switch full screen"); |
426 statusBar.SetMessage("Use the key \"i\" to invert contrast"); | |
427 statusBar.SetMessage("Use the key \"m\" to move objects"); | |
359
100df90bf0ea
preparing to implement Export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
358
diff
changeset
|
428 statusBar.SetMessage("Use the key \"n\" to switch between nearest neighbor and bilinear interpolation"); |
358 | 429 statusBar.SetMessage("Use the key \"r\" to rotate objects"); |
407 | 430 statusBar.SetMessage("Use the key \"s\" to resize objects (not applicable to DICOM layers)"); |
358 | 431 statusBar.SetMessage("Use the key \"w\" to change windowing"); |
432 | |
433 statusBar.SetMessage("Use the key \"ctrl-z\" to undo action"); | |
434 statusBar.SetMessage("Use the key \"ctrl-y\" to redo action"); | |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
435 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
436 if (parameters.count("instance") != 1) |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
437 { |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
438 LOG(ERROR) << "The instance ID is missing"; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
439 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
440 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
441 |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
442 std::string instance = parameters["instance"].as<std::string>(); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
443 int frame = parameters["frame"].as<unsigned int>(); |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
444 |
343 | 445 Orthanc::FontRegistry fonts; |
446 fonts.AddFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16); | |
447 | |
421
f87f28624b96
tentative to make SmartLoader and RadiographyScene work together (not really working)
am@osimis.io
parents:
418
diff
changeset
|
448 smartLoader_.reset(new SmartLoader(IObserver::GetBroker(), context->GetOrthancApiClient())); |
f87f28624b96
tentative to make SmartLoader and RadiographyScene work together (not really working)
am@osimis.io
parents:
418
diff
changeset
|
449 smartLoader_->SetImageQuality(SliceImageQuality_FullPam); |
f87f28624b96
tentative to make SmartLoader and RadiographyScene work together (not really working)
am@osimis.io
parents:
418
diff
changeset
|
450 |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
451 scene_.reset(new RadiographyScene(GetBroker())); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
452 //scene_->LoadDicomFrame(instance, frame, false); //.SetPan(200, 0); |
421
f87f28624b96
tentative to make SmartLoader and RadiographyScene work together (not really working)
am@osimis.io
parents:
418
diff
changeset
|
453 //scene_->LoadDicomFrame(context->GetOrthancApiClient(), "61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", 0, false); |
f87f28624b96
tentative to make SmartLoader and RadiographyScene work together (not really working)
am@osimis.io
parents:
418
diff
changeset
|
454 smartLoader_->SetFrameInRadiographyScene(*scene_, "61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", 0); |
418 | 455 |
456 #if !defined(ORTHANC_ENABLE_WASM) || ORTHANC_ENABLE_WASM != 1 | |
457 Orthanc::HttpClient::ConfigureSsl(true, "/etc/ssl/certs/ca-certificates.crt"); | |
458 #endif | |
459 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
460 //scene_->LoadDicomWebFrame(context->GetWebService()); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
415
diff
changeset
|
461 |
354 | 462 { |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
408
diff
changeset
|
463 RadiographyLayer& layer = scene_->LoadText(fonts.GetFont(0), "Hello\nworld"); |
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
408
diff
changeset
|
464 layer.SetResizeable(true); |
354 | 465 } |
466 | |
467 { | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
408
diff
changeset
|
468 RadiographyLayer& layer = scene_->LoadTestBlock(100, 50); |
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
408
diff
changeset
|
469 layer.SetResizeable(true); |
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
408
diff
changeset
|
470 layer.SetPan(0, 200); |
354 | 471 } |
472 | |
337 | 473 |
408 | 474 mainWidget_ = new RadiographyWidget(GetBroker(), *scene_, "main-widget"); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
475 mainWidget_->SetTransmitMouseOver(true); |
358 | 476 mainWidget_->SetInteractor(interactor_); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
477 |
407 | 478 //scene_->SetWindowing(128, 256); |
325
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
479 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
480 }; |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
481 } |
37ab9d83dc9b
reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff
changeset
|
482 } |