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