TestCenter Reference
RemoteRenderingEventReplay.py
Go to the documentation of this file.
2# Copyright 2013, MeVis Medical Solutions AG
3#
4# The user may use this file in accordance with the license agreement provided with
5# the Software or, alternatively, in accordance with the terms contained in a
6# written agreement between the user and MeVis Medical Solutions AG.
7#
8# For further information use the contact form at https://www.mevislab.de/contact
9#
10
11from TestSupport import Base, Logging
12from TestSupport.Macros import EXPECT_TRUE
13from mevis import MLAB, MLABFileManager
14from PythonQt import QtCore
15import json
16import time
17import os.path
18
19
20# A helper class to replay events recorded by the RemoteRenderingEventRecorder
22
23 # init the replay with a given remote rendering slave and a *.events filename
24 def __init__(self, slave, filename, resizeHandler=None):
25 self._baseName = os.path.splitext(os.path.basename(filename))[0]
26 self._slave = slave
27 f = open(filename, "rb")
28 self._events = json.load(f)
29 f.close()
31 self.sceneHasChanged = False
32 self.resizeHandler = resizeHandler
33 self._slave.sceneChanged.connect(self.sceneChangedsceneChanged)
34
35 # create an additional screenshot
37 self._slave.imageReceived.connect(self.imageReceivedimageReceived)
38 self._slave.sendRenderRequest(self._slave.PNG)
39 self._slave.imageReceived.disconnect(self.imageReceivedimageReceived)
40
41 # notice if the scene has changed
42 def sceneChanged(self):
43 self.sceneHasChanged = True
44
45 # handle the receiving of an image
46 def imageReceived(self, img):
47 name = self._baseName + str(self.screenshotCount)
48 filename = Base.getResultDirectory() + "/" + name + ".png"
49 EXPECT_TRUE(img.save(filename))
50
51 referenceImage = Base.getDataDirectory() + "/" + name + ".png"
52 if not MLABFileManager.exists(referenceImage):
53 EXPECT_TRUE(img.save(referenceImage))
54
55 Logging.showImage(name + " (reference image on the right)", filename, referenceImage)
56 self.screenshotCount += 1
57
58 def doPause(self, delay):
59 start_time = time.time()
60 while time.time() - start_time < delay / 1000.0:
61 MLAB.msleep(10)
62 MLAB.processEvents()
63
64 # replay all events
65 def replay(self, redrawAfterResize=False, redrawAfterSceneChanged=False):
66 for event in self._events:
67 shouldRedraw = False
68 eventType = event["event"]
69 hasPosition = "x" in event and "y" in event
70 if eventType == "Resize":
71 w = event["width"]
72 h = event["height"]
73 if self.resizeHandler:
74 self.resizeHandler(w, h)
75 self._slave.resize(w, h)
76 if redrawAfterResize:
77 shouldRedraw = True
78 elif eventType == "Pause":
79 self.doPause(event["delay"])
80 elif eventType == "Enter":
81 self._slave.enter()
82 elif eventType == "Leave":
83 self._slave.leave()
84 elif eventType == "MouseMove":
85 self._slave.mouseMoveTo(event["x"], event["y"])
86 elif eventType == "MouseButtonPress":
87 if hasPosition:
88 self._slave.mousePress(event["button"], event["x"], event["y"])
89 else:
90 self._slave.mousePress(event["button"])
91 elif eventType == "MouseButtonRelease":
92 if hasPosition:
93 self._slave.mouseRelease(event["button"], event["x"], event["y"])
94 else:
95 self._slave.mouseRelease(event["button"])
96 elif eventType == "MouseButtonDblClick":
97 if hasPosition:
98 self._slave.mouseDoubleClickPress(event["button"], event["x"], event["y"])
99 else:
100 self._slave.mouseDoubleClickPress(event["button"])
101 elif eventType == "Wheel":
102 if hasPosition:
103 self._slave.mouseWheel(event["delta"], event["x"], event["y"])
104 else:
105 self._slave.mouseWheel(event["delta"])
106 elif eventType == "KeyPress":
107 self._slave.keyPress(event["key"])
108 elif eventType == "KeyRelease":
109 self._slave.keyRelease(event["key"])
110 elif eventType == "Screenshot":
111 self.createScreenshot()
112 else:
113 MLAB.logWarning("Unknown event: " + event)
114
115 # it was required to use QCoreApplication.processEvents instead of MLAB.processEvent()
116 # so that events are reliably delivered to QGraphicsView/RemotePanelRendering:
117 QtCore.QCoreApplication.processEvents()
118
119 if redrawAfterSceneChanged and self.sceneHasChanged:
120 shouldRedraw = True
121 self.sceneHasChanged = False
122 if shouldRedraw:
123 self._slave.sendRenderRequest(self._slave.PNG)
124 MLAB.processEvents()
replay(self, redrawAfterResize=False, redrawAfterSceneChanged=False)
__init__(self, slave, filename, resizeHandler=None)
Adds GoogleTest like methods.
Definition Macros.py:1