hou.Node class

The base class for all nodes in Houdini (objects, SOPs, COPs, etc.) An instance of this class corresponds to exactly one instance of a node in Houdini.

Subclasses: hou.DopNetNode , hou.DopNode , hou.ShopNode , hou.VopNetNode , hou.ChopNode , hou.CopNode , hou.RopNode , hou.ObjNode , hou.SopNode , hou.PopNetNode , hou.PopNode

Each node has a unique path that defines its location in the tree of nodes. The node path hierarchy is similar to the hierarchy of folders and files in a file system. Some nodes, called networks, may contain other nodes inside them, much like a file folder would, while other nodes may not. For example, an object node instance and a SOP subnetwork node instance may contain SOP nodes, but a box SOP instance may not.

Tip

Be careful not to confuse nodes with node types. A node is an instance of a node type. For example suppose /obj/geo1/box1 is a box SOP. It has its own unique name (box1) and its own copies of parameter values. It is an instance of the box SOP node type. This node type defines what parameters are common to all box SOP node instances, as well as the algorithm that each BOX SOP performs. The class that represents a node type is hou.NodeType.

You cannot create instances of hou.Node using hou.Node.__init__. Instead, you look up Node objects corresponding to existing Houdini nodes with hou.node_. To create a new Houdini node instance inside another node, use hou.Node.createNode. To delete a Houdini node, use hou.Node.destroy.

Note that a Node object internally stores a reference to the corresponding Houdini node, and that their lifetimes are different. If a Python node object is deleted because its reference count in Python goes to zero, the Houdini node will be unaffected. On the other hand, if you have a Node object in a Python variable and the Houdini node is deleted, the Python variable will still exist, and Python will not crash. Instead, if you later call a method on that Python Node object, Houdini will raise a hou.ObjectWasDeleted exception.

Be careful not to confuse this class with the function hou.node_.

Methods

name(self)str

Return this node’s name. See also hou.Node.path.

setName(self, name, unique_name=False)

Set the name of this node. Raises hou.OperationFailed if the new name contains characters other than letters, numbers, periods, dashes, or underscores. Raises hou.OperationFailed if the node could not be renamed (for example, another node already exists with the name, the node is the root node or top-level manager (e.g. /obj), or the node is inside a locked asset). If the unique_name parameter is set to True, the supplied name may be changed to ensure that it doesn’t match the name of any existing node.

digitsInName(self)int

Return the value of the last set of digits inside the node’s name, or 0 if there are no digits.

For example, the result is 102 for a node named geo102, and 34 for a node named light12to34.

path(self)str

Return the full path (i.e. starting with /) of this node in the network.

relativePathTo(self, base_node)str

Return a relative path to another node object from this node.

>>> box1 = hou.node("/obj/box_object1/box1")
>>> sphere1 = hou.node("/obj/sphere_object1/sphere1")
>>> box1.relativePathTo(sphere1)
'../../sphere_object1/sphere1'
>>> hou.node("/obj").relativePathTo(box1)
'box_object1/box1'
>>> box1.relativePathTo(box1)
'.'
node(self, node_path)hou.Node or None

Return the node at the given path, or None if no such node exists. If you pass in a relative path (i.e. the path does not start with /), searches are performed relative to this node.

For example, to get the parent node of a node in the the variable n, use n.node(".."). To get a child node named geo5, use n.node("geo5"). To get a sibling node named light3, use n.node("../light3").

Note that the return value may be an instance of a subclass of Node. For example, if the node being found is an object node, the return value will be a hou.ObjNode instance.

If the path is an absolute path (i.e. it starts with /), this method is a shortcut for hou.node(node_path). Otherwise, it is a shortcut for hou.node(self.path() + "/" + node_path). See also hou.node_.

parent(self)hou.Node

Return the node that contains this node.

This method is a shortcut for self.node(".."). Note that this method returns None if the node is the root (i.e. /).

>>> hou.node("/obj/box_object1").parent()
<hou.Node at /obj>
>>> print hou.node("/").parent()
None
children(self)tuple of hou.Node

Return a list of nodes that are children of this node. Using the file system analogy, a node’s children are like the contents of a folder/directory.

To find the number of children nodes, use len(node.children()).

The order of the children in the result is the same as the user defined ordering in Houdini. To see this order, switch the network view pane into list mode, and ensure that the list order is set to user defined. To reorder nodes, drag and drop them in the list.

def pc(node):
    '''Print the names of the children of a particular node.  This function
       can be handy when working interactively in the Python shell.'''
    for child in node.children():
        print child.name()

def ls():
    '''Print the names of the nodes under the current node.'''
    pc(hou.pwd())

The following expression evaluates to a list of children of a particular node type:

[c for c in node.children() if c.type() == node_type]

allSubChildren(self, top_down=True) → tuple of hou.Node

Recursively return all sub children of this node. For example, hou.node("/").allSubChildren() will return all the nodes in the hip file.

top_down

If True, this function will do a top-down traversal, placing a node in the returned tuple before its children. If False, it will do a bottom-up traversal, placing children before their parents.

Note that a tuple is returned, not a generator. This means that it is safe to delete or create nodes while looping through the return value.

The following function deletes all children of a particular type that appear anywhere inside a given node:

def removeSubChildrenOfType(node, node_type):
    '''Recursively delete all children of a particular type.'''
    for child in allSubChildren(node):
        if child.type() == node_type:
            child.destroy()

This code, for example, removes all the visibility SOPs anywhere under /obj:

>>> removeSubChildrenOfType(hou.node("/obj"), hou.sopNodeTypeCategory().nodeTypes()['visibility'])

reorderChildrenAfter(self, children_nodes, after_node=None)

Not implemented yet

reorderChildrenBefore(self, children_nodes, before_node=None)

Not implemented yet

reorderChildrenToBeginning(self, children_nodes)

Not implemented yet

reorderChildrenToEnd(self, children_nodes)

Not implemented yet

glob(self, pattern) → tuple of hou.Node

Return a tuple of children nodes name matches the pattern.

The pattern may contain multiple pieces, separated by spaces. An asterisk (*) in a pattern piece will match any character. By default, Houdini will add the nodes from each pattern piece to those already matched. However, if the pattern piece begins with a caret (^), Houdini will remove the matches for that piece from the result.

This method returns an empty tuple if you pass in an empty pattern.

>>> obj = hou.node("/obj")
>>> obj.createNode("geo", "geo1")
<hou.ObjNode of type geo at /obj/geo1>
>>> obj.createNode("geo", "geo2")
<hou.ObjNode of type geo at /obj/geo2>
>>> obj.createNode("geo", "grid")
<hou.ObjNode of type geo at /obj/grid>
>>> obj.createNode("geo", "garbage")
<hou.ObjNode of type geo at /obj/garbage>
>>> obj.createNode("geo", "box")
<hou.ObjNode of type geo at /obj/box>

>>> def names(nodes):
... return [node.name() for node in nodes]

>>> names(obj.glob("g*"))
['geo1', 'geo2', 'grid', 'garbage']
>>> names(obj.glob("ge* ga*"))
['geo1', 'geo2', 'garbage']
>>> names(obj.glob("g* ^ga*"))
['geo1', 'geo2', 'grid']

See also hou.Node.recursiveGlob.

recursiveGlob(self, pattern, filter=hou.nodeTypeFilter.NoFilter) → tuple of hou.Node

Like hou.Node.glob, return a tuple of children nodes whose name matches the pattern. However, any matching child will have all its chidren added, recursively. As well, the result may be filtered by node type.

Houdini first matches children nodes against the pattern, then recursively adds the subchildren of matching children, and then applies the filter.

pattern

Child node names will be matched against this string pattern. See hou.Node.glob and hou.NodeBundle for information about the pattern syntax. Note that if a child node matches the pattern, all of its subchildren will be added to the result (subject to filtering), regardless of the pattern.

filter

A hou.nodeTypeFilter enumeration value to limit matched nodes to a particular type (e.g. object nodes, geometry object nodes, surface shader SHOPs, etc.).

The pattern and filter behaviour is very similar to that used by node bundles in Houdini. See hou.NodeBundle for more information.

Raises hou.OperationFailed if the pattern is invalid.

createNode(self, node_type_name, node_name=None, run_init_scripts=True, load_contents=True)hou.Node

Create a new node of type node_type_name as a child of this node.

node_name

The name of the new node. If not specified, Houdini appends a number to the node type name, incrementing that number until a unique node name is found. If you specify a name and a node already exists with that name, Houdini will append a number to create a unique name.

run_init_scripts

If True, the initialization script associated with the node type will be run on the new node.

load_contents

If True, any subnet contents will be loaded for custom subnet operators.

Raises hou.OperationFailed if this node cannot contain children. Raises hou.PermissionError if this node is inside a locked asset.

>>> obj = hou.node("/obj")

# Let Houdini choose a name based on the node type name.
>>> obj.createNode("geo")
<hou.ObjNode of type geo at /obj/geo1>

# Let Houdini choose a unique name.
>>> obj.createNode("geo")
<hou.ObjNode of type geo at /obj/geo2>

# Give the node a specific name.
>>> obj.createNode("geo", "foo")
<hou.ObjNode of type geo at /obj/foo>

# Let Houdini create a unique name from our suggested name.  Also, don't
# run the geometry object init scripts so the contents are empty.
>>> obj.createNode("geo", "geo1", run_init_scripts=False)
<hou.ObjNode of type geo at /obj/geo3>
>>> obj.node("geo1").children()
(<hou.SopNode of type file at /obj/geo1/file1>,)
>>> obj.node("geo3").children()
()
destroy(self)

Delete this node.

If you call methods on a Node instance after it has been destroyed, Houdini will raise hou.ObjectWasDeleted.

Raises hou.OperationFailed if you try to delete a node inside a locked asset.

isCurrent(self)bool

Return a boolean to indicate of the node is the last selected node in its network.

Each network (i.e. node containing children) stores its own list of selected nodes, and the last selected node has special meaning. For example, it is the node displayed in unpinned parameter panes.

See also hou.selectedNodes to get a tuple of all the selected nodes in all networks in Houdini. The last node in this list also has special meaning in Houdini, and corresponds to the global current node.

setCurrent(self, on, clear_all_selected=False)

Set or unset this node as the last selected one.

Each network (i.e. node containing children) stores its own list of selected nodes, and the last selected node has special meaning. For example, it is the node displayed in unpinned parameter panes.

If on is True, this node will become the last selected node. If it is False and this node was the last selected one, it will be unselected and the second-last selected node will become the last selected node.

If clear_all_selected is true, Houdini will unselect every node in this network before performing the operation.

See also hou.Node.setSelected and hou.selectedNodes.

isSelected(self)bool

Return whether this node is selected.

See also hou.selectedNodes.

setSelected(self, on, clear_all_selected=False)

Select or deselect this node, optionally deselecting all other selected nodes in this network.

selectedChildren(self, include_hidden=False)tuple of hou.Node

Return a tuple containing the children of this node that are selected. Note that the last selected node has special meaning, and can also be retrieved with hou.Node.isCurrent.

include_hidden

If False, hidden nodes are not included in the result, even if they are selected.

The following example will print the names of all selected objects in /obj:

for n in hou.node("/obj").selectedChildren():
    print n.name()

To find the total number of selected children nodes, use len(node.selectedChildren()).

type(self)hou.NodeType

Return the hou.NodeType object for this node.

For example, all camera node instances share the same node type.

changeNodeType(self, new_node_type, keep_name=True, keep_parms=True, keep_network_contents=True)hou.Node

Changes the node to a new type.

Keep_name, keep_parms, and keep_network_contents indicate that the node should keep the same name, parameter values, and contents, respectively, after its type has changed.

childTypeCategory(self)hou.NodeTypeCategory

Return the hou.NodeTypeCategory corresponding to the children of this node. For example, if this node is a geometry object, the children are SOPs. If it is an object subnet, the children are objects.

parm(self, parm_path)hou.Parm or None

Return the parameter at the given path, or None if the parameter doesn’t exist.

evalParm(self, parm_path)int, float, or str

Evaluates the specified parameter and returns the result.

parms(self)tuple of hou.Parm

Return a list of the parameters on this node.

findParms(self, pattern) → tuple of Parms

Not implemented yet

__getitem__(self, parm_name)

Not implemented yet

__setitem__(self, parm_name, value)

Not implemented yet

parmTuple(self, parm_path)hou.ParmTuple or None

Return the parm tuple at the given path, or None if it doesn’t exist.

This method is similar to parm(), except it returns a hou.ParmTuple instead of a hou.Parm.

evalParmTuple(self, parm_path)tuple of int, float, or str

Evaluates the specified parameter tuple and returns the result.

parmTuples(self)tuple of hou.ParmTuple

Return a list of all parameter tuples on this node.

This method is similar to parms(), except it returns a list of hou.ParmTuple instead of hou.Parm.

parmsInFolder(self, folder_names, folder_style)tuple of hou.Parm

Return a list of parameters in a folder on this node. Returns all parameters in the folder and its subfolders (if any).

folder_names

A sequence of folder name strings. For example, to get a list of the parameters in the Shading folder of the Render folder, use ("Render", "Shading").

If this sequence is empty, the method returns all parameters on the node, the same as if you called parms().

folder_style

A member of hou.folderType describing how the folder is rendered.

Raises hou.OperationFailed if the folder specified by folder_names does not exist.

See also hou.Parm.containingFolders and hou.Parm.containingFolderSetParmTuples

parmTuplesInFolder(self, folder_names) → tuple of hou.ParmTuple

Return a list of the parameter tuples in a folder on this node. This method is similar to parmsInFolder(), except it returns a list of hou.ParmTuple instead of hou.Parm. See parmsInFolder() above for information about the arguments.

See also hou.Parm.containingFolders and hou.Parm.containingFolderSetParmTuples

parmToNodeReferences(self, max_hierarchy_depth=None)dict of hou.Parm to hou.Node

Not implemented yet

expressionLanguage(self)hou.exprLanguage enum value

Return the node’s default expression language.

When you enter an expression in a parameter that does not already contain an expression, the node’s expression language is used to determine how that expression should be evaluated. You can change a node’s expression language in the parameter dialog in the GUI.

Changing the node’s expression language will not change the language in parameters already containing expressions (i.e. parameters with keyframes).

Note that if a parameter already contains an expression and you change that expression in the GUI, the expression language will not change, regardless of the value of the node’s expression language. To change the language of an existing expression in a parameter from Python, use hou.Parm.setExpression, as in parm.setExpression(parm.expression(), language).

setExpressionLanguage(self, language)

Set the node’s default expression language. See expressionLanguage() for more information.

parmAliases(self, recurse=False) → dict of hou.Parm to str

Return a dictionary of parameter aliases on the node’s parameters. The keys in the dictionary are the parameters that have aliases and the values are the alias names.

recurse

Return the parameter aliases for this node and its children.

clearParmAliases(self)

Removes all alias names from parameters on the node.

spareParms(self) → tuple of hou.Parm

Return a list of the spare (user-defined) parameters on this node.

addSpareParmTuple(self, parm_template, in_folder=(), create_missing_folders=False)hou.ParmTuple

Add a spare parameter tuple to the end of the parameters on the node. If in_folder is not an empty sequence, this method adds the parameters to the end of the parameters in a particular folder.

parm_template

A hou.ParmTemplate subclass instance that specifies the type of parameter tuple, the default value, range, etc.

in_folder

A sequence of folder names specifying which folder will hold the parameter. If this parameter is an empty sequence (e.g. ()), Houdini will not put the parameter inside a folder. If it is, for example, ("Misc", "Controls"), Houdini puts it inside the “Controls” folder that’s inside the “Misc” folder. If it is, for example, ("Misc",), Houdini puts it inside the “Misc” folder.

create_missing_folders

If True, and the folder location specified by in_folder does not exist, this method creates the missing containing folders.

See also the removeSpareParmTuple() and addSpareParmFolder() methods.

removeSpareParmTuple(self, parm_tuple)

Removes the specified spare parameter tuple.

See also addSpareParmTuple().

addSpareParmFolder(self, folder_name, in_folder=(), parm_name=None, create_missing_folders=False)

Adds a folder to the spare parameters.

Note that all the folders in a set correspond to one parameter. If this is the first folder to go in the set, parm_name will be used as the parameter name. Otherwise, parm_name will be ignored and the parameter name of the first folder in the set is used.

If this is the first folder in the set and parm_name is None, it will default to 'sparefolder0'. If parm_name is already in use, a unique name will be automatically generated.

If create_missing_folders is True, this method will create the folders in in_folder that don’t exist. So, this method can be used to add spare folders and a spare parameter at the same time.

See also the removeSpareParmFolder() and addSpareParmTuple() methods.

removeSpareParmFolder(self, folder)

Removes an empty folder from the spare parameters.

folder is a sequence of folder names. So, to remove the Output folder, use ("Output",) instead of "Output".

See also addSpareParmFolder().

replaceSpareParmTuple(self, parm_tuple_name, parm_template)

Replace an existing spare parameter tuple with a new one. The old parameter tuple is removed and the new one is added in its place.

parm_tuple_name

The name of the spare parameter tuple to replace. Raises hou.OperationFailed if no parameter tuple exists with this name, or if it is the name of a non-spare parameter.

parm_template

A hou.ParmTemplate describing the new parameter tuple.

The new parameter tuple may or may not have the same name as the old one. By providing a parameter tuple with the same name, you can modify an existing spare parameter tuple.

Note that you cannot replace non-spare parameter tuples. However, you can change the visibility of non-spare parameters using hou.ParmTuple.hide.

To change a parameter for all instances of digital asset, use hou.HDADefinition.replaceParmTuple.

inputs(self)tuple of hou.Node

Return a tuple of the nodes connected to this node’s inputs.

This method is a shortcut for [connection.outputNode() for connection in self.inputConnections()].

outputs(self)tuple of hou.Node

Return a tuple of the nodes connected to this node’s outputs.

This method is a shortcut for [connection.inputNode() for connection in self.outputConnections()].

inputConnections(self)tuple of hou.NodeConnection

Return a tuple of NodeConnection objects for the connections coming into the top of this node. If nothing is wired into this node, return an empty tuple.

To get a list of the connected nodes themselves, use hou.Node.inputs.

Note that this method is a shortcut for [connectors[0] for connectors in self.inputConnectors() if len(connectors) != 0].

>>> cookie = hou.node("/obj").createNode("geo").createNode("cookie")
>>> cookie.setInput(1, cookie.parent().createNode("box"))
>>> cookie.inputConnections()
(<hou.NodeConnection from grid1 output 0 to cookie input 1>,)
>>> cookie.inputConnectors()
((), (<hou.NodeConnection from grid1 output 0 to cookie input 1>,))

See also hou.Node.inputConnectors.

outputConnections(self)tuple of hou.NodeConnection

Return a tuple of NodeConnection objects for the connections going out of the bottom of this node. If nothing is wired into the output of this node, return an empty tuple.

To get a list of the connected nodes themselves, use hou.Node.outputs.

Note that this method is a shortcut for: reduce(lambda a, b: a+b, self.outputConnectors(), ()). Since most nodes have only one output connector, though, this method is usually equivalent to self.outputConnectors()[0].

>>> box = hou.node("/obj").createNode("geo").createNode("box")
>>> box.parent().createNode("xform").setFirstInput(box)
>>> box.parent().createNode("subdivide").setFirstInput(box)
>>> box.outputConnections()
(<hou.NodeConnection from box1 output 0 to xform1 output 0>, <hou.NodeConnection from box1 output 0 to subdivide1 input 0>)

See also hou.node.outputConnectors.

inputConnectors(self)tuple of tuple of hou.NodeConnection

Return a tuple of tuples of hou.NodeConnection objects. The length of the result tuple is equal to the number of input connectors on this node. Each subtuple contains exactly one node connection if something is wired into the connector; otherwise it is the empty tuple.

See also hou.NodeConnector and hou.Node.inputConnections.

outputConnectors(self)tuple of tuple of hou.NodeConnection

Return a a tuple of tuples of hou.NodeConnection objects. The length of the result tuple is equal to the number of output connectors on this node. Each subtuple contains all the connections going out of that connector, and is empty if nothing is wired to that connector.

>>> split = hou.node("/obj").createNode("dopnet").createNode("split")
>>> split.parent().createNode("rbdsolver").setFirstInput(split)
>>> split.parent().createNode("gravity").setFirstInput(split, 1)
>>> split.parent().createNode("merge").setFirstInput(split, 1)
>>> split.outputConnectors()
((<hou.NodeConnection from split1 output 0 to rbdsolver1 input 0>,), (<hou.NodeConnection from split1 output 1 to gravity2 input 0>, <hou.NodeConnection from split1 output 1 to merge1 input 0>), (), ())

See also hou.NodeConnection and hou.Node.outputConnections.

indirectInputs(self)tuple of hou.SubnetIndirectInput

Return the hou.SubnetIndirectInput objects of a subnet.

Raises hou.InvalidNodeType if this node is not a subnetwork.

inputAncestors(self)tuple of hou.Node

Return a tuple of all input ancestors of this node. If include_ref_inputs is False, then reference inputs are not traversed. If follow_subnets is True, then instead of treating subnetwork nodes as a single node, we also traverse its children starting with its display node.

See also the inputs() method.

extraInputs(self)tuple of hou.Node

Not implemented yet

extraOutputs(self)tuple of hou.Node

Not implemented yet

Return this node’s extra output nodes.

When a parameter in node A has a channel reference to a parameter in node B, node A becomes an extra output of node B. Note, though, that node B is not an extra input of node A.

>>> a = hou.node("/obj").createNode("geo")
>>> b = hou.node("/obj").createNode("geo")
>>> a.parm("tx").set(b.parm("tx"))
>>> b.extraOutputs()
(<hou.ObjNode of type geo at /obj/geo2>,)
setInput(self, input_index, node_to_become_input, output_index=0)

If node_to_become_input is not None, connect the output connector of another node to an input connector of this node. Otherwise, disconnect anything connected to the input connector.

input_index

The index of this node’s input connector.

node_to_become_input

If None this method disconnects everything from the input connector. If a hou.Node or a hou.SubnetIndirectInput, this method connects its output to this node’s input connector.

output_index

The index of the other node’s output connector.

Raises hou.InvalidInput if output_index is invalid. Raises hou.OperationFailed if node_to_become_input is not in the same network as this node. Raises hou.PermissionError if the node is inside a locked asset.

setFirstInput(self, node_to_become_input, output_index=0)

A shortcut for self.setInput(node_to_become_input, 0). See hou.Node.setInput for more information.

setNextInput(self, node_to_become_input, output_index=0)

Connect the output connector from another node into the first unconnected input connector of this node.

This method is roughly equivalent to:

for input_index, conectors in enumerate(self.inputConnectors()):
    if len(connectors) == 0:
        self.setInput(input_index, node_to_become_input, output_index)
    raise hou.InvalidInput("All inputs are connected")

Raises hou.InvalidInput if all inputs are connected. See hou.Node.setInput for more information.

insertInput(self, input_index, node_to_become_input, output_index=0)

Insert an input wire. In other words, for each input connector after input_index, shift the contents of that input connector to the next one, and then call hou.Node.setInput. See hou.Node.setInput for the meanings of the parameters.

collapseIntoSubnet(self, child_nodes, subnet_name=None)hou.Node

Given a sequence of children nodes of this node, collapse them into a subnetwork. In other words, create a subnet inside this node’s network and move the specified children of this network inside that subnet.

child_nodes

The children nodes of this node that will go in the new subnet.

subnet_name

The name for the new subnet node, or None if you want Houdini to automatically choose a name.

Raises hou.OperationFailed if a node inside child_nodes is not a child of this network, or if child_nodes is an empty sequence.

This example function takes a single node and replaces it with a subnet, moving the node into the subnet..

def collapseSingleNodeIntoSubnet(node, subnet_name=None):
    node.parent().collapseIntoSubnet((node,), subnet_name=None)

extractAndDelete(self)

Move the children of this subnet node to become siblings of this node, and then delete this node. The method is the opposite of collapseIntoSubnet().

Raises hou.InvalidNodeType if this node is not a subnetwork.

createDigitalAsset(self, name=None, hda_file_name=None, description=None, min_num_inputs=None, max_num_inputs=None, compress_contents=False, comment=None, version=None, save_as_embedded=False, ignore_external_references=False)Node

Create a digital asset from this node. You would typically call this method on subnet nodes.

name

The name of the node type that the new digital asset will define.

hda_file_name

The name of the otl file where Houdini will save the digital asset. If None Houdini will use $HOME/houdiniX.Y/otls/OPcustom.otl.

description

The name that will appear in the tab menu. If None, Houdini will use the name for the description.

min_num_inputs

The minimum number of inputs that need to be wired into instances of the digital asset. See hou.HDADefinition.minNumInputs for more information.

max_num_inputs

The number of input connectors available on instances of the digital asset for input connections. See hou.HDADefinition.minNumInputs for more information.

compress_contents

Whether or not the contents of this digital asset are compressed inside the otl file. See hou.HDAOptions.compressContents for more information.

comment

A user-defined comment string. See hou.HDADefinition.comment for more information.

version

A user-defined version string. See hou.HDADefinition.version for more information.

save_as_embedded

Whether or not the digital asset’s definition will be saved with the hip file instead of an otl file. When this parameter is True, Houdini ignores the hda_file_name parameter. Setting this parameter to True is equivalent to setting this parameter to False and setting the hda_file_name parameter to “Embedded”.

ignore_external_references

If True, Houdini will not generate warnings if the contents of this digital asset reference nodes outside the asset.

allowEditingOfContents(self, propagate=False)

Unlocks a digital asset so its contents can be edited.

To use this function, you must have permission to modify the HDA.

matchCurrentDefinition(self)

If this node is an unlocked digital asset, change its contents to match what is stored in the definition and lock it. The parameter values are unchanged.

If this node is locked or is not a digital asset, this method has no effect.

See also hou.Node.matchesCurrentDefinition and hou.Node.isLocked.

matchesCurrentDefinition(self)bool

Return whether the contents of the node match its type definition. A locked digital asset instance will always match its definition, but an unlocked one may not.

isLocked(self)bool

If this node is an instance of a digital asset, return whether or not it is locked. Otherwise, return False.

To differentiate between unlocked digital assets and nodes that are not instances of digital assets, check if the node’s type has a definition:

def isUnlockedAsset(node):
    return not node.isLocked() and node.type().definition() is not None

See hou.HDADefinition.updateFromNode for an example of how to save and lock all unlocked digital asset instances.

isInsideLockedHDA(self)bool

Return whether this node is inside a locked digital asset. If this node is not inside a locked HDA, the node may deviate from the OTL definition.

hdaModule(self)hou.HDAModule

This method is a shortcut for `self.type().hdaModule() to reduce the length of expressions in Python parameters and button callbacks. See hou.NodeType.hdaModule for more information.

comment(self)str

Return the node’s comment string.

setComment(self, comment)

Sets the comment associated with this node. See also appendComment().

appendComment(self, comment)

Appends the given text to the comment associated with this node.

color(self)hou.Color

Return the color of this node’s tile in the network editor.

setColor(self, color)

Sets the color of this node’s tile in the network editor to the given hou.Color.

position(self)hou.Vector2

Return the position of this node’s tile in the network editor graph as a Vector2. See also move() and setPosition().

setPosition(self, vector2)

Sets the position of this node’s tile in the network editor graph. Raises hou.InvalidInput if the node cannot have the given position.

move(self, vector2)

Moves this node’s tile in the network editor graph by the increments in the given hou.Vector2.

To position a node absolutely, use setPosition().

To get the node’s current graph position, use position().

Raises hou.InvalidInput if the node cannot move to the position specified.

moveToGoodPosition(self, relative_to_inputs=True, move_inputs=True, move_outputs=True, move_unconnected=True)hou.Vector2

Moves a node to a well-spaced position near its inputs or outputs and returns the new position of the node.

layoutChildren(self, child_nodes=(), horizontal_spacing=-1.0, vertical_spacing=-1.0)

Automatically position all or some children of this node in the network editor.

child_nodes

A sequence of child nodes to position. If this sequence is empty, this method will reposition all children of this node.

horizontal_spacing

A fraction of the width and height of a tile that affects the space between nodes with common inputs. If this parameter is -1, Houdini uses the default spacing.

vertical_spacing

A fraction of the width and height of a tile that affects the space between a node and its output nodes. If this parameter is -1, Houdini uses the default spacing.

size(self)hou.Vector2

Return the size of this node’s tile in the network editor graph as a Vector2.

isHidden(self)

Return whether the node is hidden in the network editor. Note that Houdini also uses the term “exposed” to refer to nodes that are not hidden.

If a visible node is connected to a hidden node, the network editor will display dashed lines for the wire going from the visible node to the hidden node.

See also hou.Node.hide.

hide(self, on)

Hide or show a node in the network editor. See hou.Node.isHidden for more information about hidden nodes.

cook(self, force=False, frame_range=())

Asks or forces the node to re-cook.

frame_range

The frames at which to cook the object. This should be a tuple of 2 or 3 ints giving the start frame, end frame, and optionally a frame increment, in that order. If you supply a two-tuple (start, end), the increment is 1.

errors(self)str

Return the text of any errors from the last cook of this node, or the empty string ("") if there were no errors.

warnings(self)str

Return the text of any warnings from the last cook of this node, or the empty string ("") if there were no warnings.

messages(self)str

Return the text of any messages from the last cook of this node, or the empty string ("") if there were no messages.

networkBoxes(self) → tuple of hou.NetworkBox

Return a list of the network boxes inside this node.

findNetworkBox(self, name)hou.NetworkBox

Return a network box with the given name inside this node, or None if no network box with the given name exists.

findNetworkBoxes(self, pattern)tuple of hou.NetworkBox

Return a list of network boxes inside this node whose names match a pattern.

createNetworkBox(self, name=None)hou.NetworkBox

Creates a network box inside this network. Raises hou.OperationFailed if this node is not a network.

If you don’t specify a name, Houdini gives the box a default name.

copyNetworkBox(self, network_box_to_copy, new_name=None, channel_reference_original=False)hou.NetworkBox

Copies a network box and returns the copy.

If new_name is given, the network box will be copied to a new network box named new_name (a different name will be generated if there is already a network box with that name).

If channel_reference_original is True, all operators created by the copy will have their animatable parameters set to reference the original operators.

Raises hou.OperationFailed if this node is not a network or if the node child type does not match the network box’s node type.

stickyNotes(self) → tuple of hou.StickyNote

Return a list of the sticky notes inside this node.

findStickyNote(self, name)hou.StickyNote

Return a sticky note with the given name inside this node, or None if no sticky note with the given name exists.

findStickyNotes(self, pattern)tuple of hou.StickyNote

Return a list of sticky notes inside this node whose names match a pattern.

createStickyNote(self, name=None)hou.StickyNote

Creates a sticky note inside this network. Raises hou.OperationFailed if this node is not a network.

If you don’t specify a name, Houdini gives the note a default name.

copyStickyNote(self, network_box_to_copy, new_name=None)hou.StickyNote

Copies a sticky note and returns the copy.

If new_name is given, the sticky note will be copied to a new sticky note named new_name (a different name will be generated if there is already a sticky note with that name).

Raises hou.OperationFailed if this node is not a network or if the node child type does not match the sticky note’s node type.

addNodeGroup(self, name=None)hou.NodeGroup

Add a node group to the node and return the new group.

If a group of the given name already exists then this function simply returns the existing group without adding a new one. If the name of the group is None or an empty string, then a unique default name is automatically chosen.

This function can only be called on nodes that are networks. If it is called on a node that is not a network, then it raises hou.OperationFailed.

To remove a node group, use hou.NodeGroup.destroy.

nodeGroup(self, name)hou.NodeGroup

Return a node group contained by the node with the given name, or None if the group does not exist.

nodeGroups(self) → tuple of hou.NodeGroup

Return the list of node groups in this node.

runInitScripts(self)

Runs the initialization script associated with this node’s type.

deleteScript(self)str

Return the script that will run when this node is deleted.

setDeleteScript(self, script_text, language=hou.scriptLanguage.Python)

Sets the script that will run when this node is deleted.

fileReferencePatterns(self, recurse=False, ignore_unused_subnet_branches=False) → tuple of Parm and file_name tuples

Not implemented yet

fileReferences(self, recurse=False, ignore_unused_subnet_branches=False) → tuple of Parm and file_name tuples

Not implemented yet

referencedNodes(self, max_hierarchy_depth=None) → tuple of Nodes

Not implemented yet

info(self, verbose=False)str

Not implemented yet

loadPresets(self, presets)

Not implemented yet

saveToGallery(self, presets_name, dir_name=None)hou.GalleryEntry

Not implemented yet

saveOldStylePresetsFile(self, presets_file_name)

Not implemented yet

loadOldStylePresetsFile(self, presets_file_name)

Not implemented yet

saveCompiledCookCodeToFile(self, file_name)

Saves compiled VEX code to a disk file (on nodes that support this).

saveCookCodeToFile(self, file_name, skip_header=False)

Saves VEX/RSL source code to a disk file (on nodes that support this).

sessionId(self)

Not documented yet

creationTime(self) → datetime.datetime

Not implemented yet

modificationTime(self) → datetime.datetime

Not implemented yet

creator(self) → Node

Not documented yet

creatorState(self)str

Not documented yet

setCreatorState(self, state)

Not documented yet

isBuiltExplicitly(self)bool

Return whether this node was built explicitly (defaults to True). Most nodes are built explicitly, but some are implicitly created by Houdini. For example, if you select geometry from multiple SOPs and then perform an operation, Houdini will put down an implicit merge SOP before performing that operation. When reselecting geometry in SOPs, Houdini will automatically delete any SOPs that were created implicitly.

setBuiltExplicitly(self, built_explicitly)

Set whether this node was built explicitly (default value is True). If set to False, this node will not show up in various menus and in the Network View pane’s list mode. This flag is typically used for intermediate utility nodes that one is unlikely to want to change its parameters.

isTimeDependent(self)bool

Return whether the node is time dependent. A time dependent node is re-evaluated every time the frame changes.

motionEffectsNetworkPath(self)str

Return a node path representing the location for storing clips. This location may or may not exist. To find or create such a network, use hou.Node.findOrCreateMotionEffectsNetwork.

findOrCreateMotionEffectsNetwork(self, create=True)hou.ChopNetNode

Return a CHOP network node suitable for storing Motion Effects. By default, if the node doesn’t exist, it will be created.

See also hou.Parm.storeAsClip and hou.Node.motionEffectsNetworkPath.

stampValue(self, parm_name, default_value)

Not implemented yet

saveChildrenToFile(self, nodes, network_boxes, file_name)

Given sequences of children nodes and network boxes, save a file containing those items. You can load this file using hou.Node.loadChildrenFromFile.

nodes

A sequence of hou.Nodes that are children of this node.

network_boxes

A sequence of hou.NetworkBoxes that are contained in this node. Note that the contents of the network boxes are not automatically saved, so it is up to you to put them in the list of nodes.

file_name

The name of the file to write the contents to. You can use any extension for this file name.

Raises hou.OperationFailed if any of the nodes or network boxes are node children of this node, or if the file could not be written to. Raises hou.PermissionError if you do not have permission to read the contents of this node.

loadChildrenFromFile(self, file_name)

Load the contents of a file saved with hou.Node.saveChildrenToFile into the contents of this node.

Raises hou.OperationFailed if the file does not exist or it is not the correct type of file. Raises hou.PermissionError if this node is a locked instance of a digital asset.

asCode(self, brief=False, recurse=False, save_channels_only=False, save_creation_commands=False, save_keys_in_frames=False, save_outgoing_wires=False, save_parm_values_only=False, save_spare_parms=True, function_name=None)str

Prints the Python code necessary to recreate a node.

brief

Do not set values if they are the parameter’s default. Applies to the contents of the node if either recurse or save_box_contents is True.

recurse

Recursively apply to the entire operator hierarchy.

save_box_contents

Script the contents of the node.

save_channels_only

Only output channels. Applies to the contents of the node if either recurse or save_box_contents is True.

save_creation_commands

Generate a creation script for the node. If set to False (the default), the generated script assumes that the network box already exists. When set to True, the script will begin by creating the network box.

save_keys_in_frames

Output channel and key times in samples (frames) instead of seconds. Applies to the contents of the node if either recurse or save_box_contents is True.

save_parm_values_only

Evaluate parameters, saving their values instead of the expressions. Applies to the contents of the node if either recurse or save_box_contents is True.

save_spare_parms

Save spare parameters as well. When save_creation_commands is True, commands for creating spare parameters will also be output. Applies to the contents of the node if either recurse or save_box_contents is True.

function_name

If a function_name is specified, the output will be wrapped in a Python function.

asXML(self, recurse=True, output_non_default_parms=True)

Not implemented yet

permissions(self)int

Not implemented yet

setPermissions(self, permissions)

Not implemented yet

addPermissions(self, permissions)

Not implemented yet

removePermissions(self, permissions)

Not implemented yet

_getArgumentAutoComplete(self, method_name, arguments) → tuple of str

This method is used internally by Houdini to perform autocompletion in the interactive Python shell.

__eq__(self, node)bool

Implements == between Node objects.

For example, hou.root() == hou.node(“/”) will return True.

There can be multiple Python Node objects for the same Houdini node. Two identical calls to hou.node() will return different Python Node objects, with each representing the same Houdini node. Comparing these nodes using == (which calls __eq__) will return True, while comparing them using is (the object identity test) will return false.

You can compare a node to None. This behavior is useful because hou.node() returns None if the node doesn’t exist. Comparing an node to anything other than another node or None raises TypeError.

__ne__(self, node)bool

Implements != between Node objects. See __eq__().