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()