Skip to content

Grab Events

See ExampleScripts Grab_Events to see how to trigger an event when you grab an object or release it.  This example will save a flag to the trial_data file with the name of the object and when it was grabbed or released along with the timestamp and the rest of the trial_data. If you have BIOPAC enabled, it will also send a synchronized event to Acqknowledge. 

To set objects as grabbable can click the checkbox in the GUI for grabbable (see creating a new scene) or add to the sceneObjects Dictionairy with code: 

basketball = env.getChild('basketball')

sightlab.addSceneObject('basketball',basketball,gaze = True, grab = True)

import sightlab_utils.sightlab as sl
from sightlab_utils.settings import *
from tools import grabber

sightlab = sl.SightLab()
# Constants
TRIAL_DATA_COLUMN = "grabbed item"
grabber_tool = vizconnect.getRawTool("grabber")

if not sightlab.getConfig() in ["Desktop"]:
    grabber_tool2 = vizconnect.getRawTool("grabber2")



def onGrab(event):
    # Dynamically get the names of the objects during the event
    scene_objects = sightlab.sceneObjects[GAZE_OBJECTS]

    for name in scene_objects.keys():

        if event.grabbed == scene_objects[name]:
            sightlab.setCustomTrialData(
                f"Grabbed {name.capitalize()}", TRIAL_DATA_COLUMN
            )
            print(f"grabbed {name}")

            if sightlab.biopacFlag == True:
                sightlab.acqServer.insertGlobalEvent(f"Grabbed {name}", "stim", "")



def onRelease(event):
    # Dynamically get the names of the objects during the event
    scene_objects = sightlab.sceneObjects[GAZE_OBJECTS]

    for name in scene_objects.keys():

        if event.released == scene_objects[name]:
            sightlab.setCustomTrialData(
                f"Released {name.capitalize()}", TRIAL_DATA_COLUMN
            )
            print(f"released {name}")

            if sightlab.biopacFlag == True:
                sightlab.acqServer.insertGlobalEvent(f"Released {name}", "stim", "")



def runExperiment():
    while True:
        yield viztask.waitKeyDown(" ")
        print("Starting trial")
        yield sightlab.startTrial()
        viz.callback(grabber.GRAB_EVENT, onGrab)
        viz.callback(grabber.RELEASE_EVENT, onRelease)
        yield viztask.waitKeyDown(" ")
        print("Ending trial")
        yield sightlab.endTrial()


# Schedule tasks
viztask.schedule(sightlab.runExperiment)
viztask.schedule(runExperiment)
viz.callback(viz.getEventID("ResetPosition"), sightlab.resetViewPoint)