Activate XR menu tools without using the XR menu

Activate XR menu tools without using the XR menu

gianluca.cuschieri
Participant Participant
884 Views
3 Replies
Message 1 of 4

Activate XR menu tools without using the XR menu

gianluca.cuschieri
Participant
Participant

I’d like to be able to active xR Home Menu tools such as Varjo Marker tracking on/off and MR/VR toggle without having to open the XR menu. Ideally I can control this from the script editor. I cannot seem to find any reference to this in the python API. Any ideas how I can do this? Thanks 🙂

0 Likes
Accepted solutions (1)
885 Views
3 Replies
Replies (3)
Message 2 of 4

__daniel.lincoln__
Alumni
Alumni
Accepted solution

Hello,

 

Switching the MR/VR mode is possible.

See this post: Solved: Re: Activate a VR Menu Tool by script? - Autodesk Community - VRED

 

For the Marker tracking on/off, it should be possible by copying the MRMarkerTrackingModule.py script then commenting out the sections having to do with Qt & the VR menu.  I will test this out post an update later.

0 Likes
Message 3 of 4

gianluca.cuschieri
Participant
Participant
Thank you very much.

I’ll keep and eye out for the update 🙂
0 Likes
Message 4 of 4

__daniel.lincoln__
Alumni
Alumni

Below is the modified version of that script.

After executing it you can deactivate and activate markers like this:

markerTool.deactivateAllMarkers()

markerTool.activateAllMarkers()

 

# Modified to work without XR Menu:
# C:/Program Files/Autodesk/VREDPro-15.0/lib/plugins/WIN64/Scripts/VRMenu/MRMarkerTrackingModule.py

# from PySide2 import QtCore, QtWidgets
import vrScenegraph
from vrKernelServices import vrdNode, vrdMarker, vrdMultiMarker, vrXRealityTypes

class MarkerTool:
    def __init__(self):
        vrLogInfo('Initializing MarkerTool')
        vrHMDService.hmdStatusChanged.connect(self.__onHMDActivated)

    '''
    def __createMenuEntry(self):
        self.__tool = vrImmersiveUiService.createTool("vrMarkerTool")
        self.__tool.setText("Enable Markers")
        self.__tool.setCheckable(True)
        self.__tool.setChecked(False)
        self.__tool.setOnOffIconData(onIcon, offIcon)
        self.__tool.signal().checked.connect(self.__activateAllMarkers)
        self.__tool.signal().unchecked.connect(self.__deactivateAllMarkers)
        self.__tool.hideAway(False)
    '''
    
    def activateAllMarkers(self):        
        self.__markerAssigner.enable(True)
        vrLogInfo('Markers Enabled')

    def deactivateAllMarkers(self):
        self.__markerAssigner.enable(False)
        vrLogInfo('Markers Disabled')

    def __onHMDActivated(self, active):
        if not active or not vrHMDService.isMixedRealitySupported():
            return
        
        self.__markerAssigner = MarkerAssigner()
        # self.__createMenuEntry()
        self.activateAllMarkers()
        vrHMDService.hmdStatusChanged.disconnect(self.__onHMDActivated)

class MarkerAssigner:
    def __init__(self):
        self.__initialized = False
        self.__enabled = False

        self.__markerNodes = dict()
        
        self.__detectedMarkers = dict()

        self.__constraints = dict()

        vrImmersiveInteractionService.markersDetected.connect(self.__onMarkersDetected)

        vrFileIOService.newScene.connect(self.__onNewScene)
        vrFileIOService.projectLoaded.connect(self.__onProjectLoaded)

        vrHMDService.hmdStatusChanged.connect(self.__onHMDActivated)

        self.__initialize()

    def __initialize(self):
        self.__registerMarkers()
        self.__initialized = True

    def __onHMDActivated(self, active):
        if active:
            if not self.__initialized:            
                self.__initialize()
       
    def __onNewScene(self):
        if not self.__initialized:
            return

        self.__clear()

    def __onProjectLoaded(self, fileName):
        if not self.__initialized:
            return
        
        self.__initialize()

        if self.__enabled:
            self.enable(True)

    def __clear(self):
        for constraint in self.__constraints.values():
            vrConstraintService.deleteConstraint(constraint)

        self.__constraints.clear()
        self.__markerNodes.clear()

        self.__initialized = False

    def enable(self, enable):
        for markerName in self.__detectedMarkers:
            self.enableMarkerPositioning(markerName, enable)

        self.__enabled = enable

    def enableMarkerPositioning(self, name, enable):
        node, marker = self.__getNodeMarkerPair(name)

        if node.isNull() or marker.isNull():               
            return

        if enable:          
            self.__attachNodeToMarker(node, marker)
        else:
            self.__detachNodeFromMarker(node)

    def __getNodeMarkerPair(self, name):
        if name in self.__detectedMarkers:
            marker = self.__detectedMarkers[name]

            multiMarker = vrdMultiMarker(marker)

            node = vrdNode()
            if len(multiMarker.getMarkers()) > 0:
                node = self.__findMultiMarkerNode(multiMarker)
            else:
                node = self.__findMarkerNode(marker)
            
            return node, marker

        return vrdNode(), vrdMarker()
    
    def __attachNodeToMarker(self, node, marker):
        if node.getObjectId() in self.__constraints:
            self.__constraints[node.getObjectId()].setActive(True)
            return

        constraint = vrConstraintService.createParentConstraint([marker.getNode()], node, False)
        self.__constraints[node.getObjectId()] = constraint

    def __detachNodeFromMarker(self, node):
        if node.getObjectId() in self.__constraints:
            self.__constraints[node.getObjectId()].setActive(False)

    def __onMarkersDetected(self, markers):
        for marker in markers:
            name = marker.getName()
            self.__detectedMarkers[name] = marker            
            
            if self.__enabled:
                self.enableMarkerPositioning(name, self.__enabled)

    def __findMarkerNode(self, marker):
        name = marker.getName()

        if name not in self.__markerNodes:
            tags = ["VarjoMarker", name]
            nodes = vrScenegraph.getNodesWithTags(tags, True)
            if len(nodes) != 1:                
                return vrdNode()

            if len(vrScenegraph.getNodeTags(nodes[0])) > 2:
                return vrdNode()
            
            self.__markerNodes[name] = vrdNode(nodes[0])
        
        return self.__markerNodes[name]

    def __findMultiMarkerNode(self, multiMarker):
        name = self.__getMultiMarkerName(multiMarker)

        if name not in self.__markerNodes:
            tags = ["VarjoMarker"]
            
            for marker in multiMarker.getMarkers():
                tags.append(marker.getName())

            nodes = vrScenegraph.getNodesWithTags(tags, True)

            if len(nodes) != 1:                
                return vrdNode()

            self.__markerNodes[name] = vrdNode(nodes[0])

        return self.__markerNodes[name]

    def __getMultiMarkerName(self, markerTags):
        name = "VarjoMarker"
        
        for markerName in markerTags:
            name += "_"
            name += markerName
        
        return name

    def __registerMarkers(self):
        tags = ["VarjoMarker"]
        markerNodes = vrScenegraph.getNodesWithTags(tags, False)

        for node in markerNodes:
            markerTags = vrScenegraph.getNodeTags(node)
            markerTags.remove("VarjoMarker")

            name = ""
            if len(markerTags) > 1:
                name = self.__getMultiMarkerName(markerTags)
                marker = vrImmersiveInteractionService.createMultiMarker(name, markerTags, vrXRealityTypes.MarkerTypes.VarjoMarker)                                
            elif len(markerTags) == 1:
                name = "VarjoMarker_" + markerTags[0]                

            if len(name) > 0:
                self.__markerNodes[name] = vrdNode(node)
                vrSessionService.addNodeSync(node)


markerTool = MarkerTool()

'''
label = QtWidgets.QLabel(VREDPluginWidget)
label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
label.setScaledContents(True)
label.setText("Python MR markers tool\n" + __file__)
VREDPluginWidget.layout().addWidget(label)
'''

 

0 Likes