Houdini Py
create a node
parent = hou.node("/obj") node = parent.createNode("node_type", name="node_name")
get a node
# Using absolute path node = hou.node("/path/to/node") # Using relative path parent = hou.node("/path/to/node") node = parent.node("node_name") # or... node = parent.node("../../node_name")
check if a node exists
if not hou.node("/path/to/node"): # the node does not exist
get some node properties
name = node.name() type = node.type().name() position = node.position() color = node.color() comment = node.comment()
set some node properties
node.setName("node_name") node.setColor(hou.Color((1, 1, 1))) node.setPosition([x, y]) node.setComment("comment") # Some node flags node.setGenericFlag(hou.nodeFlag.Render, True) node.setGenericFlag(hou.nodeFlag.Visible, True) node.setGenericFlag(hou.nodeFlag.DisplayComment, True) # Node Shape node.setUserData("nodeshape", "light") # lightbulb shape
delete a node
node.destroy()
unlock a node
node.allowEditingOfContents()
get selected node(s)
selected_nodes = hou.selectedNodes()
set current selected node
node.setCurrent(True, clear_all_selected=True)
get current node (within node callback or expression)
node = hou.pwd()
get all nodes of a type
hou.objNodeTypeCategory().nodeType("obj_node_type_name").instances() # To get all node type categories print hou.nodeTypeCategories().items() # To get node type name components hou.hda.componentsFromFullNodeTypeName("node_type_name")
get node children
# Get all top level child nodes nodes = node.children() # Get all children nodes = node.allSubChildren()
get node parent
parent = node.parent()
get primitive groups
groups = node.geometry().primGroups() for group in groups: name = group.name()
connect nodes
input_node = hou.node("/path/to/node") output_node = hou.node("/path/to/node") # Option 1 output_node.sestInput(output_index, input_node) # Option 2 output_node.setNamedInput("parm_name", input_node, input_node_index)
note: the connection goes from [input_node] —> [output_node]
insert a new node between two connected nodes
output_connections = input_node.outputConnections() new_node = input_node.createOutputNode("node_type") if output_connections: connection = output_connections[0] output_node = connection.outputNode() # output_index = connection.outputIndex() # input_node = connection.inputNode() input_index = connection.inputIndex() output_node.setInput(input_index, new_node)
layout nodes
# Equal to hitting "L" in network view node.layoutChildren() # Layout specific nodes (in reference to first node in list) node.layoutChildren(items=[nodes], horizontal_spacing=1.5, vertical_spacing=1) # Layout a single node node.moveToGoodPosition()
get a parameter
value = node.parm("parm_name").eval() # Method 1 value = node.parm("parm_name").rawValue() # Method 2 value = node.parm("parm_name").evalAsNode # Method 3 value = node.evalParm("parm_name") # Method 4
set a parameter
node.parm("parm_name").set(value) # Set an expression node.parm("parm_name").setExpression(expression, language=hou.exprLanguage.Python) # Set a channel reference node.parm("parm_name").set(ref_node.parm("parm_name"))
create a parameter
parm_group = node.parmTemplateGroup() new_parm = hou.FloatParmTemplate(name="name", label="label", default_value=1) parm_group.insertAfter("existing_parm_name", new_parm) node.setParmTemplateGroup(parm_group)
get all parm templates on a node
parm_group = node.parmTemplateGroup() templates = parm_group.parmTemplates()
remove a parm from a node
parm_group = node.parmTemplateGroup() parm_group.remove(template) node.setParmTemplateGroup(parm_group)
create and customize a sticky note
note = node.createStickyNote() note.setName("note_name") note.setSize([w, h]) note.setPosition([x, y]) node.setText("sticky note text") note.setTextSize(0.5) note.setColor(hou.Color((1, 1, 1))) note.setTextColor(hou.Color((0, 0, 0)))
create and customize a network box
box = node.createNetworkBox() box.setName("box_name") box.setSize([w, h]) box.setPosition([x, y]) box.setComment("title") box.setColor(hou.Color((1, 1, 1)))
get network boxes
# All network boxes boxes = node.networkBoxes() # A specific network box box = node.findNetworkBox("box_name")
get all nodes in a network box
nodes = box.nodes()
get current context
network_editor = None for pane in hou.ui.paneTabs(): if isinstance(pane, hou.NetworkEditor) and pane.isCurrentTab(): network_editor = pane if network_editor: network_node = network_editor.pwd() network_path = network_node.path()
display a message
hou.ui.displayMessage("message to user")
create undo group
with hou.undos.group("group name"): # commands to undo together
working with visualizers
visualize_node = hou.node("path/to/visualize_node") node_category = hou.viewportVisualizerCategory.Node # Get visualizers associated with a visualize node visualizer_list = hou.viewportVisualizers.visualizers(category=node_category, node=visualize_node) # Get visualizer types type_list = hou.viewportVisualizers.types() marker_type = type_list[0] # Create a visualizer visualizer = hou.viewportVisualizers.createVisualizer(marker_type, category=node_category, node=visualize_node) # Set type and parameters visualizer.setType(marker_type) visualizer.setParm("parm_name", value)
To create custom tool uis for houdini, use QT