Mercurial > hg > orthanc-stone
comparison Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp @ 1790:b325761e0bd3
angle measure and undo/redo in sdl simple viewer
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 17 May 2021 13:57:25 +0200 |
parents | 462d7a0e064e |
children | 20a0aba0ede5 |
comparison
equal
deleted
inserted
replaced
1789:462d7a0e064e | 1790:b325761e0bd3 |
---|---|
22 #include "SdlSimpleViewerApplication.h" | 22 #include "SdlSimpleViewerApplication.h" |
23 #include "../SdlHelpers.h" | 23 #include "../SdlHelpers.h" |
24 #include "../../Common/SampleHelpers.h" | 24 #include "../../Common/SampleHelpers.h" |
25 | 25 |
26 #include "../../../../OrthancStone/Sources/Loaders/GenericLoadersContext.h" | 26 #include "../../../../OrthancStone/Sources/Loaders/GenericLoadersContext.h" |
27 #include "../../../../OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h" | |
27 #include "../../../../OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h" | 28 #include "../../../../OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h" |
28 #include "../../../../OrthancStone/Sources/Scene2DViewport/UndoStack.h" | 29 #include "../../../../OrthancStone/Sources/Scene2DViewport/UndoStack.h" |
29 #include "../../../../OrthancStone/Sources/StoneEnumerations.h" | 30 #include "../../../../OrthancStone/Sources/StoneEnumerations.h" |
30 #include "../../../../OrthancStone/Sources/StoneException.h" | 31 #include "../../../../OrthancStone/Sources/StoneException.h" |
31 #include "../../../../OrthancStone/Sources/StoneInitialization.h" | 32 #include "../../../../OrthancStone/Sources/StoneInitialization.h" |
67 ; | 68 ; |
68 | 69 |
69 std::cout << desc << std::endl; | 70 std::cout << desc << std::endl; |
70 | 71 |
71 std::cout << std::endl << "Keyboard shorcuts:" << std::endl | 72 std::cout << std::endl << "Keyboard shorcuts:" << std::endl |
73 << " a\tEnable/disable the angle measure tool" << std::endl | |
72 << " f\tToggle fullscreen display" << std::endl | 74 << " f\tToggle fullscreen display" << std::endl |
73 << " l\tEnable/disable the line measure tool" << std::endl | 75 << " l\tEnable/disable the line measure tool" << std::endl |
74 << " q\tExit" << std::endl | 76 << " q\tExit" << std::endl |
77 << " r\tRedo the last edit to the measure tools" << std::endl | |
75 << " s\tFit the viewpoint to the image" << std::endl | 78 << " s\tFit the viewpoint to the image" << std::endl |
79 << " u\tUndo the last edit to the measure tools" << std::endl | |
76 << std::endl << "Mouse buttons:" << std::endl | 80 << std::endl << "Mouse buttons:" << std::endl |
77 << " left \tChange windowing, or edit measure" << std::endl | 81 << " left \tChange windowing, or edit measure" << std::endl |
78 << " center\tMove the viewpoint, or move measure" << std::endl | 82 << " center\tMove the viewpoint, or edit measure" << std::endl |
79 << " right \tZoom, or move measure" << std::endl | 83 << " right \tZoom, or edit measure" << std::endl |
80 << std::endl; | 84 << std::endl; |
81 | 85 |
82 po::variables_map vm; | 86 po::variables_map vm; |
83 try | 87 try |
84 { | 88 { |
109 | 113 |
110 if (vm.count("frame_index") > 0) | 114 if (vm.count("frame_index") > 0) |
111 { | 115 { |
112 frameIndex = vm["frame_index"].as<int>(); | 116 frameIndex = vm["frame_index"].as<int>(); |
113 } | 117 } |
114 | |
115 } | 118 } |
119 | |
120 | |
121 enum ActiveTool | |
122 { | |
123 ActiveTool_None, | |
124 ActiveTool_Line, | |
125 ActiveTool_Angle | |
126 }; | |
127 | |
116 | 128 |
117 /** | 129 /** |
118 * IMPORTANT: The full arguments to "main()" are needed for SDL on | 130 * IMPORTANT: The full arguments to "main()" are needed for SDL on |
119 * Windows. Otherwise, one gets the linking error "undefined reference | 131 * Windows. Otherwise, one gets the linking error "undefined reference |
120 * to `SDL_main'". https://wiki.libsdl.org/FAQWindows | 132 * to `SDL_main'". https://wiki.libsdl.org/FAQWindows |
159 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | 171 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); |
160 lock->GetCompositor().SetFont(0, font, 16, Orthanc::Encoding_Latin1); | 172 lock->GetCompositor().SetFont(0, font, 16, Orthanc::Encoding_Latin1); |
161 lock->GetController().SetUndoStack(undoStack); | 173 lock->GetController().SetUndoStack(undoStack); |
162 } | 174 } |
163 | 175 |
176 ActiveTool activeTool = ActiveTool_None; | |
177 | |
164 boost::shared_ptr<OrthancStone::LineMeasureTool> lineMeasureTool(OrthancStone::LineMeasureTool::Create(viewport)); | 178 boost::shared_ptr<OrthancStone::LineMeasureTool> lineMeasureTool(OrthancStone::LineMeasureTool::Create(viewport)); |
165 bool lineMeasureFirst = true; | 179 bool lineMeasureFirst = true; |
166 bool lineMeasureEnabled = false; | |
167 lineMeasureTool->Disable(); | 180 lineMeasureTool->Disable(); |
181 | |
182 boost::shared_ptr<OrthancStone::AngleMeasureTool> angleMeasureTool(OrthancStone::AngleMeasureTool::Create(viewport)); | |
183 bool angleMeasureFirst = true; | |
184 angleMeasureTool->Disable(); | |
168 | 185 |
169 boost::shared_ptr<SdlSimpleViewerApplication> application( | 186 boost::shared_ptr<SdlSimpleViewerApplication> application( |
170 SdlSimpleViewerApplication::Create(context, viewport)); | 187 SdlSimpleViewerApplication::Create(context, viewport)); |
171 | 188 |
172 OrthancStone::DicomSource source; | 189 OrthancStone::DicomSource source; |
224 | 241 |
225 case SDLK_q: | 242 case SDLK_q: |
226 stop = true; | 243 stop = true; |
227 break; | 244 break; |
228 | 245 |
246 case SDLK_u: | |
247 { | |
248 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
249 if (lock->GetController().CanUndo()) | |
250 { | |
251 lock->GetController().Undo(); | |
252 } | |
253 break; | |
254 } | |
255 | |
256 case SDLK_r: | |
257 { | |
258 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
259 if (lock->GetController().CanRedo()) | |
260 { | |
261 lock->GetController().Redo(); | |
262 } | |
263 break; | |
264 } | |
265 | |
229 case SDLK_l: | 266 case SDLK_l: |
230 if (lineMeasureEnabled) | 267 if (activeTool == ActiveTool_Line) |
231 { | 268 { |
232 lineMeasureTool->Disable(); | 269 lineMeasureTool->Disable(); |
233 lineMeasureEnabled = false; | 270 activeTool = ActiveTool_None; |
234 } | 271 } |
235 else | 272 else |
236 { | 273 { |
237 if (lineMeasureFirst) | 274 if (lineMeasureFirst) |
238 { | 275 { |
246 } | 283 } |
247 lineMeasureFirst = false; | 284 lineMeasureFirst = false; |
248 } | 285 } |
249 | 286 |
250 lineMeasureTool->Enable(); | 287 lineMeasureTool->Enable(); |
251 lineMeasureEnabled = true; | 288 angleMeasureTool->Disable(); |
289 activeTool = ActiveTool_Line; | |
290 } | |
291 break; | |
292 | |
293 case SDLK_a: | |
294 if (activeTool == ActiveTool_Angle) | |
295 { | |
296 angleMeasureTool->Disable(); | |
297 activeTool = ActiveTool_None; | |
298 } | |
299 else | |
300 { | |
301 if (angleMeasureFirst) | |
302 { | |
303 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); | |
304 OrthancStone::Extent2D extent; | |
305 lock->GetController().GetScene().GetBoundingBox(extent); | |
306 if (!extent.IsEmpty()) | |
307 { | |
308 OrthancStone::ScenePoint2D p1(1.0 * extent.GetX1() / 3.0 + 2.0 * extent.GetX2() / 3.0, | |
309 2.0 * extent.GetY1() / 3.0 + 2.0 * extent.GetY2() / 3.0); | |
310 OrthancStone::ScenePoint2D p2(1.0 * extent.GetX1() / 2.0 + 1.0 * extent.GetX2() / 2.0, | |
311 1.0 * extent.GetY1() / 3.0 + 1.0 * extent.GetY2() / 3.0); | |
312 OrthancStone::ScenePoint2D p3(2.0 * extent.GetX1() / 3.0 + 1.0 * extent.GetX2() / 3.0, | |
313 2.0 * extent.GetY1() / 3.0 + 2.0 * extent.GetY2() / 3.0); | |
314 angleMeasureTool->SetSide1End(p1); | |
315 angleMeasureTool->SetCenter(p2); | |
316 angleMeasureTool->SetSide2End(p3); | |
317 } | |
318 angleMeasureFirst = false; | |
319 } | |
320 | |
321 lineMeasureTool->Disable(); | |
322 angleMeasureTool->Enable(); | |
323 activeTool = ActiveTool_Angle; | |
252 } | 324 } |
253 break; | 325 break; |
254 | 326 |
255 default: | 327 default: |
256 break; | 328 break; |
270 switch (event.type) | 342 switch (event.type) |
271 { | 343 { |
272 case SDL_MOUSEBUTTONDOWN: | 344 case SDL_MOUSEBUTTONDOWN: |
273 { | 345 { |
274 boost::shared_ptr<OrthancStone::IFlexiblePointerTracker> t; | 346 boost::shared_ptr<OrthancStone::IFlexiblePointerTracker> t; |
275 if (lineMeasureEnabled) | 347 switch (activeTool) |
276 { | 348 { |
277 t = lineMeasureTool->CreateEditionTracker(p); | 349 case ActiveTool_Angle: |
350 t = angleMeasureTool->CreateEditionTracker(p); | |
351 break; | |
352 | |
353 case ActiveTool_Line: | |
354 t = lineMeasureTool->CreateEditionTracker(p); | |
355 break; | |
356 | |
357 case ActiveTool_None: | |
358 break; | |
359 | |
360 default: | |
361 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
278 } | 362 } |
279 | 363 |
280 if (t.get() != NULL) | 364 if (t.get() != NULL) |
281 { | 365 { |
282 lock->GetController().AcquireActiveTracker(t); | 366 lock->GetController().AcquireActiveTracker(t); |