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