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