timeline

play_backward ()

Plays backward. I wish it had two functions:

  • stop when playing
  • play backward when stopped
    But it errors.
    My global hotkey: Left Arrow

play_forward ()

Plays forward.
My global hotkey: Right Arrow

play_scrub ()

Scrubs the timeline.
My global hotkey: F8 mapped to Win key.

toggle_realtime ()

Toggles realtime playback.
My global hotkey: Alt-R

toggle_manualupdate ()

Toggles Manual Update (Simulation).
My global hotkey: Alt-S

framerange_from_name ()

Sets the playback range from the container name. I use this naming convention:

  • name_startframe_endframe, e.g.:
  • magnetic_400_2200
  • terrain_600_1800
    My global hotkey: Alt-F

source code

the following code is maintained also on my github
thank you, great people, I couldn't do this without you.

import hou
import toolutils
import wf_selection


def play_backward () :
    hou.playbar.stop()
    #if hou.playbar.isPlaying() :
    #    hou.playbar.stop()
    #else :
    #    hou.playbar.reverse()

def play_forward () :
    hou.playbar.play()

def play_scrub (multiplier) :
    import time
    from PySide2.QtGui import QCursor

    mouse_last = hou.getenv("mouse", "0")
    mouse_last = float(mouse_last)
    mouse_now = QCursor().pos()

    time_now = time.time()
    time_last = hou.getenv("time", "0")
    time_last = float(time_last)
    time_diff = time_now-time_last

    mouse_now = round(  mouse_now.x() / 10 )

    if time_diff > 0.1 :
        mouse_last = mouse_now

    skip = mouse_last - mouse_now
    skip = skip * multiplier
    if abs(skip) > 20 :
        skip = skip * 2

    frame_now = hou.frame()
    frame_now = hou.frame() - skip
    hou.setFrame(frame_now)

    hou.putenv("mouse", str(mouse_now))
    hou.putenv("time", str(time_now))



def toggle_realtime () :
    hou.playbar.setRealTime(not hou.playbar.isRealTime())
    hou.playbar.setRealTimeSkipping(hou.playbar.isRealTime())


def toggle_manualupdate () :
    mode = hou.updateModeSetting().name()
    if mode == 'AutoUpdate':
        hou.setUpdateMode(hou.updateMode.Manual)
    if mode == 'Manual':
        hou.setUpdateMode(hou.updateMode.AutoUpdate)


def framerange_from_name () :
    #local playback range
    start  = hou.playbar.playbackRange()[0]
    end    = hou.playbar.playbackRange()[1]
    actual = hou.intFrame;

    # global time range
    globalstart  = hou.playbar.timelineRange()[0]
    globalend    = hou.playbar.timelineRange()[1]

    # container name
    containername = wf_selection.container().name()
    # active_pane = toolutils.activePane(kwargs)
    # if active_pane is not None and active_pane.type() == hou.paneTabType.NetworkEditor:
    #     containername = active_pane.pwd().name()
        
    if containername == "obj":
        # range from global
        cont_start = globalstart;
        cont_end   = globalend;

    else:
        # range from name
        name = containername.split("_")
        if len(name) == 3 :
            cont_start = float( name[1] )
            cont_end   = float( name[2] )
        else:
            cont_start = globalstart
            cont_end   = globalend
        
    # set range
    hou.playbar.setPlaybackRange( cont_start, cont_end )