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)