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.
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
102for a node namedgeo102, and34for a node namedlight12to34. 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 orNone-
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, usen.node(".."). To get a child node namedgeo5, usen.node("geo5"). To get a sibling node namedlight3, usen.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 forhou.node(node_path). Otherwise, it is a shortcut forhou.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)→tupleof 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)reorderChildrenBefore(self, children_nodes, before_node=None)reorderChildrenToBeginning(self, children_nodes)reorderChildrenToEnd(self, children_nodes)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.
patternChild 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.
filterA 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_nameas a child of this node.node_nameThe 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_scriptsIf True, the initialization script associated with the node type will be run on the new node.
load_contentsIf 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
onis 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_selectedis 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)→tupleof 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_hiddenIf 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, andkeep_network_contentsindicate 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 orNone-
Return the parameter at the given path, or
Noneif the parameter doesn’t exist. evalParm(self, parm_path)→int,float, orstr-
Evaluates the specified parameter and returns the result.
parms(self)→tupleof hou.Parm-
Return a list of the parameters on this node.
findParms(self, pattern)→ tuple of Parms__getitem__(self, parm_name)__setitem__(self, parm_name, value)parmTuple(self, parm_path)→ hou.ParmTuple orNone-
Return the parm tuple at the given path, or
Noneif 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)→tupleofint,float, orstr-
Evaluates the specified parameter tuple and returns the result.
parmTuples(self)→tupleof 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)→tupleof 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_namesdoes 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. SeeparmsInFolder()above for information about the arguments.See also hou.Parm.containingFolders and hou.Parm.containingFolderSetParmTuples
parmToNodeReferences(self, max_hierarchy_depth=None)→dictof hou.Parm to hou.NodeexpressionLanguage(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 tostr-
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_folderis 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_folderdoes not exist, this method creates the missing containing folders.See also the
removeSpareParmTuple()andaddSpareParmFolder()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_foldersis 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()andaddSpareParmTuple()methods. removeSpareParmFolder(self, folder)-
Removes an empty folder from the spare parameters.
folderis 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)→tupleof 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)→tupleof 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)→tupleof 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)→tupleof 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 toself.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)→tupleoftupleof 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)→tupleoftupleof 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)→tupleof hou.SubnetIndirectInput-
Return the hou.SubnetIndirectInput objects of a subnet.
Raises hou.InvalidNodeType if this node is not a subnetwork.
inputAncestors(self)→tupleof 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)→tupleof hou.NodeextraOutputs(self)→tupleof hou.Node-
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_inputis 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
Nonethis 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_indexis invalid. Raises hou.OperationFailed ifnode_to_become_inputis 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_nodesis not a child of this network, or ifchild_nodesis 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
NoneHoudini 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_nameparameter. Setting this parameter to True is equivalent to setting this parameter to False and setting thehda_file_nameparameter 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 alsomove()andsetPosition(). 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 is1. 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
Noneif no network box with the given name exists. findNetworkBoxes(self, pattern)→tupleof 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_nameis 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_originalisTrue, 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
Noneif no sticky note with the given name exists. findStickyNotes(self, pattern)→tupleof 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_nameis 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
Noneif 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 tuplesfileReferences(self, recurse=False, ignore_unused_subnet_branches=False)→ tuple of Parm and file_name tuplesreferencedNodes(self, max_hierarchy_depth=None)→ tuple of Nodesinfo(self, verbose=False)→strloadPresets(self, presets)saveToGallery(self, presets_name, dir_name=None)→ hou.GalleryEntrysaveOldStylePresetsFile(self, presets_file_name)loadOldStylePresetsFile(self, presets_file_name)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)creationTime(self)→ datetime.datetimemodificationTime(self)→ datetime.datetimecreator(self)→ NodecreatorState(self)→strsetCreatorState(self, state)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)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)permissions(self)→intsetPermissions(self, permissions)addPermissions(self, permissions)removePermissions(self, permissions)_getArgumentAutoComplete(self, method_name, arguments)→ tuple ofstr-
This method is used internally by Houdini to perform autocompletion in the interactive Python shell.
__eq__(self, node)→bool-
Implements
==betweenNodeobjects.For example, hou.root() == hou.node(“/”) will return
True.There can be multiple Python
Nodeobjects for the same Houdini node. Two identical calls tohou.node()will return different PythonNodeobjects, with each representing the same Houdini node. Comparing these nodes using==(which calls__eq__) will returnTrue, while comparing them usingis(the object identity test) will return false.You can compare a node to
None. This behavior is useful becausehou.node()returnsNoneif the node doesn’t exist. Comparing an node to anything other than another node orNoneraisesTypeError. __ne__(self, node)→bool-
Implements
!=betweenNodeobjects. See__eq__().