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);