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