Measure distances in VR¶
VRMeasureModule.py¶
1from PySide6 import QtCore,QtWidgets
2from vrMeasurement import *
3from vrOSGTypes import *
4
5class Measure():
6 def __init__(self):
7 QtCore.QTimer.singleShot(0, self.init)
8 def init(self):
9 self.on = False
10 self.point1Selected = False
11 self.createMenu()
12 def switchOn(self):
13 if not self.on:
14 self.point1Selected = False
15 pointer = vrDeviceService.getInteraction("Pointer")
16 execute = pointer.getControllerAction("execute")
17 execute.signal().triggered.connect(self.selectPoint)
18 self.on = True
19 def switchOff(self):
20 if self.on:
21 pointer = vrDeviceService.getInteraction("Pointer")
22 execute = pointer.getControllerAction("execute")
23 execute.signal().triggered.disconnect(self.selectPoint)
24 self.on = False
25 def selectPoint(self,action,device):
26 hit = device.pick()
27 # ignore hitting the vr panel
28 if not hit.hasHit() or hit.getNode().getName() == "VRMenuPanel":
29 return
30 if not self.point1Selected:
31 self.point1Selected = True
32 self.node1 = hit.getNode()
33 self.point1 = hit.getPoint()
34 self.removeMeasurement()
35 else:
36 self.point1Selected = False
37 self.node2 = hit.getNode()
38 self.point2 = hit.getPoint()
39 self.createMeasurement()
40 def createMenu(self):
41 # png icons as base64 string
42 onIcon = "iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAAk1BMVEX5ohHvlxj5tgf1oxHylxjwjR7vhSLtfib4sQn6uwT3qw30nxTxjh7vhyLugyPvhyH4rwvvixzvhiLuhSLvhiHykxvwih/0oxHwjxzviCDtfSbwjx3tfyX6twX6uwT4sgj3qw31oRP5twbzmRf1ohL0nBX4sQn3qw3xlBnxkhvxjxzvhiH0nBX0nhTwjB7zmRf8wAGSQI6vAAAAMHRSTlMAIP///////kru/ycxUnKm9BCLOK4VUKNi5NVC6WDiu9Dt34NX9cFok8TU8eSz+nqRmIqRAAAACXBIWXMAACTpAAAk6QFQJOf4AAAEJUlEQVRYCe1YXWObOBDUp7nKgCsMLo2TkrSXpm56V/3/X9fZtXFCC5bA7Vv1YiSkYUa72l1ZiOVNhqCU0tyMMdauVlm2HA4r/3kDQOcI0QHvekAhgagBaNZ5URZ2U1zJEBzfgiEQfVVsfd3UVwOKXVBOOyfetUXlt/Z6QJEH7KDyALO+/h2AIjdA9O+1sc0NzJxqZe8nZ0og7m9h5eImnWHlzN0kYu70yQ3T/TAoc0HM2gBxnh8qdwlQ5FrbeScFgKtJyXiRwyY4KOmSlbMXAUW+gug5gDoCKOTcPYwBijyzUHzBdIMt+6DMzWBgpCMBlwy47e63IxjDIUYcDo32fLWpGiF80XXTx4VX5mkMa1jv1jcIfW8SEEc5DQYle0PRBgr4cvDq145MMEoF/8qyqgOgU9WvGMORfNgd62WcK6Rnhg9jM+aN5Yx3L8RHSnEhbusYfMVn9JMQ/6qgQohqjuGJ46FvvGhY82N0QWTCjgFrmvUZmp27UrOHYmhuCfCOATt6XN78IxjaFZ8Qj4yJFjktkW89EZ5lxULcc+ExnVsiWPx6Q3i2OLK6oz10m5R1U3M8557spNK/JckOgWJxe+L0eOb0hRiqp8VwQhyY4dlT9oEKo8NyQCim1PNiV64Gr9BcOgKk0ya1LfDTQbN27JWLaH6lbGu3YFgcc0rOm/i8CIxoUYWh39Py7sMxST1Q/WvkMkRfYq0xfNZODEkzEMtlgOKRbGIk2aQNR4ZrKi+NeTHTHGipiOCzWJ8BvfSPYGg0Dc1vFa011S64eteRUe61KSow1GqRZs93GtPIrnsu95DsP3atlCRZL9K8J37m9qisVfrr8emAclUbcqW5jcQZfXLiLuhTbdPyRpyPdzqq13SL649Zb2UhGnIcY+cz3DNeX3JB8unRH2gr7DlgJFP8wh7XnpjsTn6I5QVtrZ6t2UMvqPTKmm/PPSdPB3K+5iJgq/QpmQxl1ezwFHzmtP8C9tDtx5bsaQ9tv7tjM0bGPGIzIl+veDDDs2QrB4OxTsvBfmLnN2BoOODGYF7eH/im3tvhZZyftkpbGy/iX69qUFtqp0YVY97/ZOZZYbakUK8nS7eKU8OckIMCHV4zWd7m/B/IjNSyRlmklHm9CcNnunraVbqdv1OdFS5IKrmGujBh+H2P4heIFwhIvs3eThltCIfLL/8Fxenz51d9/4Yr7wm36iedfz+hDlSX8wZpXq0m3eAMxQ+oVNH60Dp81/dQmtD9PU3zFoBBfevXjv+y5ixN8zsCDJGKqGCGE4f9Jw6ObBIiajw5YuJ1m208Glpff7lOB4TeqGKkFr71vv7E5PNnAowoxmKyclrYfgJeN/m584varGzEcv1cAI4mk/798XcPo8R18NwyhOHa8V6WpUYH/5A0s0wlOM7n7+jfHfiDO/ADXuw2Qr3z2sAAAAAASUVORK5CYII="
43 offIcon = "iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAAb1BMVEWxsrWmp6m6vL21triwsbOur7GnqKqdnqGcnJyfoKK7u8Gpqayho6Sio6WoqKyurrG0tbevr7G3t7mfoKK1tritrrChoqWmp6m0tbijpKahpKSfoKKvsLO4ubyxsrS3uLisrK6pqqy2t7moqau3uLk51RP7AAAAJXRSTlMAQ+7//v7++zH+LYdkpxImvGeM4+jF1ObXw2J2Gt9ysJZXy9Z3MR72KQAAAAlwSFlzAAAk6QAAJOkBUCTn+AAAA9tJREFUWAntWNuC4iAMBaHUtrZSrc7NWeey//+NexKo1l0KVPdxeLEl4TQnCQkoxP1DrtQ4tC4MjbK8Hw4r11c8xXimegxwRNS6rmWzMa18FFCsmbXWopWya7dtVT1E+cpa2L7fCfkwZSG6LftRdHJvRGset1AIOWilur02pjssiHI375u1UXq9R5T7Yz5go1QzCymB6NKwyqYMR0XiVw8ajGlkp41SJgKI8JKJsG+BhVFAURvPOXenKFXEVevBMY5rXcMAysP1LfQkn8iFS3yY+jYhltmAgyr2Ibumc3VJJk5nIs/y8LyOiJ2oLjGSWlBomgYbpdtYG9kvBCSfsii/ICX2XUdFwNKyyJBlBuXaVPBN/8pVJcW7TnpaiB0lWNm8MaCNmMcimVIQgvJLVSdX997T+ikNCb5KAci1uG1KPyknxkpthPiVxzkJiGxFusKwEwOq5IKEAhgD74W03hkxw+tRyBaAKO6k4xLHRtXTQsYzvEM4tdGP0osiGhsGbJ3GgTmztZElcdGZAT2GfDzOXcGVfWTp4jy+xU0JS3vG+xiFlhE/x9c7fg8MKMeVjvNhfF3+C8ZAnDSTR7dfr8hCijGaGkXmTJy1j9FyA8VRkYXEGNDE1HHOqHnhj5008Apm3Ct9JKWBLNR1WD85u2MXWtLDtmNAHJoAOH9uimMOACwMm7PzgCizWus7OdfwYIEYU031FsruqIGo7uMMerh+NGulrdyQhUdtep5UH3FqM9IVsdPbemefrV2tjt37od9uaU6bmSXRaQlyRcGhEIItZPUjf+ayeaIQt8IWjIvCJzGaqIdGAsFCX9BuV8TffDk9Oa2rhTSPUC0vOe4e9+W/OuYhXlFmYeJyzpYLwacH7C+URU+U9XLOaMYYI7Pue7jYVHCcR4n/YvLnk/FsSM/CQt8IQ+KZuS8GvFg11ZIALMx5OpV+9jEOKnZ0fS/MslMO8g7DBgFFSxa65h9WCMw6xjPHS5RZOHFRa3GMV4Ev8dTAYVnC+XeMMR1qqdcsKbOc1GqGMVoL3z395p6jMZ3n46+etM+pkJ73sLBytfxvUfDdnRB2QRlPNmC8hLM7WkbqPN1mK5PN2R1+o+pHGFhll5wkY9zWCK/KLTmcM5dCE/TklnxYZbZTd96IMkaZJRMzOTvGr0HLLpM9mZiZ23R+uZbWC8TtQ0d7pczjzHhjM7mFmbzhvpH7DwMDjs1kAnH7SJyzrttCfBNiumWU+NcnETlvAt2Y7K05oTeUWfUWEvw7h50XbCa3mrIwGTx4zZmux+kx0KU3b6xsjt5ulXZ0Ds6Pzo8H/r8H/gCZDSF/0DUijwAAAABJRU5ErkJggg=="
44 self.tool = vrImmersiveUiService.createTool("vrMeasureTool")
45 self.tool.setText("Measure")
46 self.tool.setCheckable(True)
47 self.tool.setOnOffIconData(onIcon,offIcon)
48 self.tool.signal().checked.connect(self.switchOn)
49 self.tool.signal().unchecked.connect(self.switchOff)
50 self.tool.hideAway(True)
51 def createMeasurement(self):
52 vrSessionService.sendPython("createPointPointMeasurement({},{},{},{})".format(
53 vrSessionService.toPythonString(self.node1),
54 vrSessionService.toPythonString(self.point1),
55 vrSessionService.toPythonString(self.node2),
56 vrSessionService.toPythonString(self.point2)))
57 #createPointPointMeasurement(self.node1,self.point1,self.node2,self.point2)
58 def removeMeasurement(self):
59 vrSessionService.sendPython("removeSelectedMeasurement()")
60
61measure = Measure()
62
63label = QtWidgets.QLabel(VREDPluginWidget)
64label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter);
65label.setScaledContents(True)
66label.setText("Python VR measurement tool\n" + __file__)
67VREDPluginWidget.layout().addWidget(label)