Share

Allowing to configure the VR menu

This plugin creates a new menu entry under “Scripts/VRMenu”. With this menu you can configure the visible tools in the VR menu.

VRMenuSetupModule.py

# © 2025 Autodesk, Inc. All rights reserved.

from PySide2 import QtCore, QtWidgets
from shiboken2 import wrapInstance
from vrKernelServices import vrdImmersiveMenu

class VRSetupMenu(QtCore.QObject):
    def __init__(self, parent=None):
        super(VRSetupMenu, self).__init__(parent)
        self.settings = QtCore.QSettings("Autodesk","VRED")
        QtCore.QTimer.singleShot(1, self.init)
        self.menuName = QtCore.QCoreApplication.translate("QVRDockWindowManager","Scripts")
    def init(self):
        self.createMenu()
        vrFileIOService.newScene.connect(self.updateMenu)
        vrFileIOService.projectLoaded.connect(self.onProjectLoaded)
    def __del__(self):
        self.destroyMenu()
    def createToolsActions(self,tools,internal):
        for tool in tools:
            if tool.getIsInternal() != internal:
                continue
            action = QtWidgets.QAction(tool.getText(), self.mw)
            action.setCheckable(True)
            key = "VRMenu_"+tool.getName();
            if self.settings.contains(key):
                hideAway = bool(self.settings.value(key,"false") == "true")
            else:
                hideAway = tool.getHideAway()
            tool.hideAway(hideAway)
            action.setChecked(not hideAway)
            action.setProperty("tool",tool.getName())
            action.toggled.connect(self.actionTriggered)
            self.menu.addAction(action)
    def createMenu(self):
        self.mw = wrapInstance(VREDMainWindowId, QtWidgets.QMainWindow)
        self.menu = QtWidgets.QMenu("VR Menu", self.mw)
        showAllAction = QtWidgets.QAction("Show all Tools", self.mw)
        hideAllAction = QtWidgets.QAction("Hide all Tools", self.mw)
        self.menu.addAction(showAllAction)
        self.menu.addAction(hideAllAction)
        self.menu.addSeparator()
        showAllAction.triggered.connect(self.showAll)
        hideAllAction.triggered.connect(self.hideAll)
        tools = sorted(vrImmersiveUiService.getTools(), key=lambda tool: tool.getName())
        self.createToolsActions(tools,True)
        self.menu.addSeparator()
        self.createToolsActions(tools,False)
        self.menu.addSeparator()
        showStatusAction = QtWidgets.QAction("Show status panel", self.mw)
        showStatusAction.setCheckable(True)
        showStatusAction.setChecked(not vrImmersiveUiService.getHideStatusVRPanel())
        showStatusAction.toggled.connect(self.showStatus)
        self.menu.addAction(showStatusAction)
        showParticipantsAction = QtWidgets.QAction("Show participants panel", self.mw)
        showParticipantsAction.setCheckable(True)
        showParticipantsAction.setChecked(not vrImmersiveUiService.getHideParticipantsVRPanel())
        showParticipantsAction.toggled.connect(self.showParticipants)
        self.menu.addAction(showParticipantsAction)
        self.menu.addSeparator()
        showVRMenuAction = QtWidgets.QAction("Show VR Menu", self.mw)
        showVRMenuAction.setCheckable(True)
        showVRMenuAction.setChecked(False)
        showVRMenuAction.toggled.connect(self.showVRMenu)
        self.menu.addAction(showVRMenuAction)
        for action in self.mw.menuBar().actions():
            if action.text() == self.menuName:
                scriptMenu = action.menu()
                first = scriptMenu.actions()[0];
                scriptMenu.insertAction(first, self.menu.menuAction())
                self.separator = scriptMenu.insertSeparator(first)
                break
    def destroyMenu(self):
        for action in self.mw.menuBar().actions():
            if action.text() == self.menuName:
                action.menu().removeAction(self.menu.menuAction())
    def actionTriggered(self,checked):
        action =  self.sender()
        toolName = action.property("tool")
        tool = vrImmersiveUiService.findTool(toolName)
        tool.hideAway(not checked)
        self.settings.setValue("VRMenu_"+tool.getName(),tool.getHideAway())
        self.settings.sync()
    def showAll(self):
        for action in self.menu.actions():
            if not action.property("tool") == None:
                action.setChecked(True)
    def hideAll(self):
        for action in self.menu.actions():
            if not action.property("tool") == None:
                action.setChecked(False)
    def showStatus(self,checked):
        vrImmersiveUiService.setHideStatusVRPanel(not checked)
    def showParticipants(self,checked):
        vrImmersiveUiService.setHideParticipantsVRPanel(not checked)
    def updateMenu(self):
        self.destroyMenu()
        self.createMenu()
    def onProjectLoaded(self):
        QtCore.QTimer.singleShot(0, self.updateMenu)
    def showVRMenu(self,checked):
        # Just for testing. Show VR menu in desktop mode
        if not checked:
            vrImmersiveUiService.showToolsMenu(False,False)
            return
        vrImmersiveUiService.showToolsMenu(True,False)
        tools = vrImmersiveUiService.findMenu("ToolsMenu")
        tools.setOrigin(vrdImmersiveMenu.MenuOrigin.ORIGIN_LOCAL)
        tools.setDepth(3)
        tools.setWidth(200)
        tools.setTranslation(0,300,0)
        tools.setRotation(0,0,0)
        tools.setOrigin(vrdImmersiveMenu.MenuOrigin.ORIGIN_CAMERA)

menuSetup = VRSetupMenu()

label = QtWidgets.QLabel(VREDPluginWidget)
label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter);
label.setScaledContents(True)
label.setText("Python VR menu configure tool\n" + __file__)
VREDPluginWidget.layout().addWidget(label)

Was this information helpful?