To support multiple hardware interfaces, like a keyboard+mouse test mode and production VR tracker mode, you want to separate the "application logic" from the hardware interface code. Their are a few ways you can organize the code to do this. I would use object oriented classes.
Say the user interacts with your Catia model with some 3D cursor thing. That is application logic. I'ed create a Cursor class that holds all the application level information and behavior for this 3D cursor: 3D position, appearance, methods for selecting and moving the Catia model.
I'd create another class called CursorControllerKeyboard that has a pointer to the Cursor class. This guy will respond to keyboard events and manipulate the Cursor appropratly. Another class called CursorControllerWand could manipulate the Cursor in response to input from the Intersense Wand device.
Let the Cursor classes constructor choose which controler to create based on some configuration varable. Here's some code:
Code:
import viz
import vizact
IS_VR_HARDWARE_CONNECTED = False
class Cursor:
def __init__(self):
#Application level stuff
self.root = viz.addGroup() #3d position
self.model = viz.add('arrow.wrl', parent=self.root)
if IS_VR_HARDWARE_CONNECTED:
self.CursorControllerWand(self) #pass pointer to self
else:
self.CursorControllerKeyboard(self) #pass pointer to self
def grabModel(self):
#application level stuff
self.model.color(viz.GREEN)
class CursorControllerKeyboard: #sub-class of Cursor, only Cursor can use me
def __init__(self, appCursor):
self.appCursor = appCursor
vizact.onkeydown(viz.KEY_UP, self.appCursor.root.setPosition, [0,0,1], viz.REL_LOCAL)
vizact.onkeydown(' ', self.appCursor.grabModel)
class CursorControllerWand: #sub-class of Cursor, only Cursor can use me
def __init__(self, appCursor):
self.appCursor = appCursor
#do Vr hardware callbacks
if __name__ == '__main__':
viz.go()
Cursor()