Interactive color manipulation in VR

This example shows how to open a submenu in the VR menu. When the color tool is activated, a color selection appears in the VR menu. The “pointer” interaction is used to select objects.

vr/colorChooser.py
 1# © 2024 Autodesk, Inc. All rights reserved.
 2
 3from PySide6 import QtCore, QtGui, QtWidgets
 4
 5class ColorChooser():
 6    def __init__(self, parent=None):
 7        self.chooserEnabled = False
 8        self.colorTool = QtWidgets.QColorDialog()
 9        self.colorTool.setOption(QtWidgets.QColorDialog.ColorDialogOption.NoButtons,True)
10        self.colorTool.currentColorChanged.connect(self.setColor)
11        self.toolWidget = QtWidgets.QWidget()
12        layout = QtWidgets.QVBoxLayout()
13        self.title = QtWidgets.QLabel()
14        font = self.title.font()
15        font.setPointSize(11)
16        self.title.setFont(font)
17        layout.addWidget(self.title)
18        layout.addWidget(self.colorTool)
19        self.toolWidget.setLayout(layout)
20        self.createMenu()
21        self.material = None
22        
23    def setColor(self,value):
24        if self.material == None:
25            return
26        cmd = "findMaterial('{}').fields().setVec3f('diffuseColor',{},{},{})".format(
27            self.material.getName(),
28            value.redF(),
29            value.greenF(),
30            value.blueF())
31        vrSessionService.sendPython(cmd,self.material.getName() + ".diffuseColor")
32    def pickNode(self,action,device):
33        self.selectNode(device.pick().getNode())
34    def selectNode(self,node):
35        name = vrNodePtr(node).getName()
36        # ignore VR panel
37        if name == "VRMenuPanel":
38            return
39        self.node = node
40        self.material = vrNodePtr(node).getMaterial()
41        self.title.setText("Node: {} Material: {}".format(vrNodePtr(node).getName(),self.material.getName()))
42        color = self.material.fields().getVec("diffuseColor",3)
43        qcolor = QtGui.QColor(color[0]*255,color[1]*255,color[2]*255)
44        self.colorTool.blockSignals(True)
45        self.colorTool.setCurrentColor(qcolor)
46        self.colorTool.blockSignals(False)
47    def createMenu(self):
48        icon = QtGui.QIcon()
49        icon.addFile("colorChooser.png",QtCore.QSize(),QtGui.QIcon.Mode.Normal)
50        self.tool = vrImmersiveUiService.createTool("CustomColorChooser")
51        self.tool.setText("Color")
52        self.tool.setIcon(icon)
53        self.tool.setViewWidget(self.toolWidget)
54        self.tool.signal().clicked.connect(self.enableChooser)
55        self.tool.signal().viewClosed.connect(self.disableChooser)
56    def deleteMenu(self):
57        vrImmersiveUiService.deleteTool(self.tool)
58    def enableChooser(self):
59        if not self.chooserEnabled:
60            pointer = vrDeviceService.getInteraction("Pointer")
61            execute = pointer.getControllerAction("execute")
62            execute.signal().triggered.connect(self.pickNode)
63            self.chooserEnabled = True
64    def disableChooser(self):
65        if self.chooserEnabled:
66            pointer = vrDeviceService.getInteraction("Pointer")
67            execute = pointer.getControllerAction("execute")
68            execute.signal().triggered.disconnect(self.pickNode)
69            self.chooserEnabled = False
70
71chooser = ColorChooser()