Scripts

Collection of some useful tool scripts i made over a past few years...

Delayed Load Setup

Just click the node(s) which has the path to your caches (works with Rop output, Geometry, file and file cache nodes) and click the tool. Voila! It creates a delayed load for the caches.

#function for node variable: return type, description and name
def extract_getTypeName(node):
    nodetype = node.type()
    description = nodetype.description()
    type_name = nodetype.name() 
    return type_name
    
#show selection tuple names
selection = hou.selectedNodes()
print len(selection)
my_list = ""
if len(selection) < 1 :
    my_list = "nothing selected, please select at least one object"
else:
    a=1
    for sel in selection:
        my_list = "selected object : " + sel.name()
        a=a+1        
hou.ui.displayMessage(my_list, buttons=('OK',))

#for each object in selection
lenght = len(selection)
print "DONE!"
for i in range(lenght):

#create python variable for selected node
    selected = hou.selectedNodes()[i]
    if selected:
       meshop=hou.node('/shop');
       meshop=meshop.createNode('vm_geo_file');
       meshop.setName('delayed_load_shop_1', 1)
       targetdshop=meshop.path();
       meobj=hou.node('/obj')
       meobj=meobj.createNode("geo");
       meobj.setParms({"shop_geometrypath":targetdshop});
       meobj.setName('DELAYED_load_geo_1', 1)
       targetfile=selected.parm('file') or selected.parm('sopoutput') 
       mefile=meobj.node('file1')
       meobj.parm("geo_velocityblur").set(1)
       meobj.parm("vm_forcegeometry").set(0)
       meshop.parm("file").set(targetfile)

Save (backup) .hip files with comments

click the shelf tool and type a comment. A version of hip file will be saved with your comment, whilst you'll be working on the same file.

import os.path as op
import hou

activeSession = hou.hipFile.name()

# Fetch tuple with index of pressed button and input text.
choice, text = hou.ui.readInput('Type comments message',
                                help='Type comments description.',
                                title='Commented HIP',
                                buttons=('OK', 'Cancel'),
                                default_choice=1,
                                close_choice=1)

# If OK was pressed with some non-empty text.
if choice == 0 and text:
    path = hou.hipFile.path()
    dir, name = op.split(path)

    # Discard extension.
    name = op.splitext(name)[0]

    # Discard one '.anytext' occurence at the end.
    name = name.rsplit('.', 1)[0]

    # Make new name with input text.
    new_name = '%s.%s.hip' % (name, text)

    # Finally, create an absolute path to save file to.
    new = op.normpath(op.join(dir, new_name))

    # Save the file.
    hou.hipFile.save(file_name=new, save_to_recent_files=False)
    hou.hipFile.setName(path)
    print "File saved to - " + (new)

Set houdini variables for paths

Use this tool to set variables for current shot. ($RENDER, $CACHE and $IFD )

message=hou.ui.displayMessage("Note: This is a one time scene setup tool to be used only during a fresh start of your shot.", buttons=("Continue", "Cancel"))
if message ==1:
   hou.ui.displayMessage("Cancelled", buttons=('OK',))

if message ==0:

#Set render path
    hou.ui.displayMessage("Please Select a directory for your renders")
    job=hou.hscriptExpression('$JOB')
    renderDir = hou.ui.selectFile(start_directory = job,
    title = "Select render path",
    collapse_sequences = False,
    file_type = hou.fileType.Directory,
    multiple_select = False,
    chooser_mode = hou.fileChooserMode.Read)
    if renderDir == "":
       print "RENDER path: Not set / Unchanged "
    if renderDir != "":
       hou.hscript("setenv RENDER = '%s'" % renderDir)
       print "RENDER path: " + renderDir


#Set cache path
    hou.ui.displayMessage("Now select a directory for your caches")
    job=hou.hscriptExpression('$JOB')
    cacheDir = hou.ui.selectFile(start_directory = job,
    title = "Select cache path",
    collapse_sequences = False,
    file_type = hou.fileType.Directory,
    multiple_select = False,
    chooser_mode = hou.fileChooserMode.Read)
    if cacheDir == "":
       print "CACHE path: Not set / Unchanged "
    if cacheDir != "":
       hou.hscript("setenv CACHE = '%s'" % cacheDir)
       print "CACHE path: " + cacheDir

#Set ifds path
    hou.ui.displayMessage("And finally select a directory for your IFDs")
    job=hou.hscriptExpression('$JOB')
    ifdDir = hou.ui.selectFile(start_directory = job,
    title = "Select IFDs path",
    collapse_sequences = False,
    file_type = hou.fileType.Directory,
    multiple_select = False,
    chooser_mode = hou.fileChooserMode.Read)
    if ifdDir == "":
       print "IFD path: Not set / Unchanged "
    if ifdDir != "":
       hou.hscript("setenv IFD = '%s'" % ifdDir)
       print "IFDs path: " + ifdDir
       hou.ui.displayMessage("Setup complete", buttons=('OK',))

Make Null node by pressing a key

You can use this code for any nodes you want by just slightly modifying it. Just don't forget to set a shortcut key from the Hotkeys tab..

selected_nodes = hou.selectedNodes()
for node in selected_nodes:
    parent = node.parent()
    name_node_selected = node.name()
    null = parent.createNode('null','OUT_' +
        name_node_selected)
    null.setInput(0,node)
    macolo = hou.Color((0,0.5,0))
    null.setColor(macolo)
    pos = node.position()
    null.setPosition(pos)
    null.move([0,-1])
    #flags
    null.setSelected(True,True)
    null.setDisplayFlag(True)
    null.setRenderFlag(True)

Object merge a selected node by pressing a key

Don't forget to set a shortcut key from the Hotkeys tab..

#define
def objmerge():
    
    #pick node
    network_pane = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
    parmeters = hou.ui.paneTabOfType(hou.paneTabType.Parm)
    pos = network_pane.selectPosition()
    if(len(hou.selectedNodes()) > 0):
        sel = hou.selectedNodes()[0]        
        node = network_pane.pwd().createNode("object_merge", "merge_"+sel.name())        
        node.parm('objpath1').set(sel.path())        
    else:
        node = network_pane.pwd().createNode("object_merge")
        
    #arrange
    node.setPosition(pos)
    network_pane.setCurrentNode(node)
    node.setSelected(True, clear_all_selected=1)
    
    #color
    mycolor = hou.Color((0,0.5,0))
    node.setColor(mycolor)
    
    #flags
    node.setSelected(True,True)
    node.setDisplayFlag(True)
    node.setRenderFlag(True)
    
#callback       
objmerge()

Change BG color of viewport by pressing a key

Again....don't forget to set shortcut key.

import toolutils

bg = None

try:
    # cycle next bg
    if kwargs['ctrlclick']: raise
    bgs = hou.session.bg[:]
    bgs = bgs[1:]+bgs[:1]
    if kwargs['shiftclick']: bgs = ['bw', 'light', 'wb']
    bg = bgs[0]
    hou.session.bg = bgs
except:
    # set up default bg vars
    hou.session.bg = ['wb', 'bw', 'light']
    bg = hou.session.bg[0]

bgs = { 'wb':'dark', 'bw':'grey', 'light':'light' }

hou.hscript("viewdisplay -B %s *" % bg)
hou.ui.setStatusMessage("Cycled background to %s" % bgs[bg].upper() )

Merge multiple VDBs

select all the VDB nodes and click the tool of merge them by steps.

selected_nodes = hou.selectedNodes()
vdbcombines = []

for x, node in enumerate(selected_nodes):
    if x < len(selected_nodes)-1:
        vdbcombine = node.createOutputNode('vdbcombine')
        vdbcombine.setNextInput(selected_nodes[x+1])
        vdbcombine.setParms({'operation':'add'})
        vdbcombines.append(vdbcombine)

for x, vdbcombine in enumerate(vdbcombines):
    if x < len(vdbcombines)-1:
        vdbcombine.setInput(1, vdbcombines[x+1])

Add nodes to Force objects (Mantra)

Select nodes and click the shelf tool to add them to force objects in mantra. The code can be modified to add nodes to any parameter in Mantra...

import hou
selection = hou.selectedNodes()
names = [n.name() for n in selection]
my_list = ""
if len(selection) < 1 :
my_list = "nothing selected, please select at least one object"
else:
a=1
for sel in selection:
my_list = my_list + "\n" + "selected object " + str(a) + ":" + sel.name()
a=a+1 
hou.ui.displayMessage(my_list, buttons=('OK',))
length = len(selection)
print "Number of nodes selected: " + str(length)
paths = [n.path() for n in hou.node('/out').allSubChildren()
if n.type() == hou.nodeType('Driver/ifd')]
selected = hou.ui.selectFromTree(choices=paths)
mantras = [hou.node(path) for path in selected]
for m in mantras:
m.parm('forceobject').set(' '.join(n.name() for n in hou.selectedNodes())) # CHANGE PARAMETER NAME AS REQURIED
m.parm('vobject').set("")
print ("Selected mantra nodes : ") + m.name()
new_name=' '.join(names)
hou.ui.displayMessage("( "+ (new_name) + " ) - added to selected mantra(s) matte objects.", buttons=('*Claps*',))

Save scene faster on a network

This tool saves your scene a bit faster when you're on a network drive. Helps if you're experiencing slow saving times even on a fast network.

activeSession = hou.hipFile.name()
hou.hscript("setenv HOUDINI_BUFFEREDSAVE = 1")
hou.hscript("setenv HOUDINI_DISABLE_SAVE_THUMB = 1")
hou.hipFile.save()
hou.ui.setStatusMessage("Scene saved " + activeSession)


More updates to come as i discover more...!