前言
Houdini内置了Python脚本和相应的编辑器, 很多时候想灵活的制作各种Houdini工具, 基本是必须用到 Python。Houdini官方的python提供了非常完善的接口, 比如可以创建各种节点,连接各种节点,遍历节点各种数据,遍历节点参数等等。
Houdini Python官方资料
Python scripting (sidefx.com)
hou.node (sidefx.com)
非常全面罗列了Houdini Python各种接口。 这篇文章主讲hou模块的基本使用
HoudiniPython编写工具
Python Shell运行控制台
方便用户做Python开发
Houdini里的各种节点和节点参数都可以直接从编辑器拖拽到Python shell里生成获取对象脚本
houdini
Python SourceEditor
相比python shell, 方便写多行python代码,结果也是输出python shell,也支持节点路径拖拽到Editor里
Houdini Python具体使用和概念介绍
节点基本类型
Houdini的节点基础类型为OpNode, 子类型分为ObjNode, SopNode, LopNode等.
这节主讲ObjNode, SopNode
hou.OpNode (sidefx.com)
hou.ObjNode (sidefx.com)
hou.SopNode (sidefx.com)
节点操作
获取节点
hou.node('/obj/geo1/null1')
获取节点类型, 节点类型名和节点名等
hou.node('/obj/geo1/null1').type()
hou.node('/obj/geo1/null1').type().name()
hou.node('/obj/geo1/null1').name()
创建节点
hou.node('/obj/geo1').createNode("box")
hou.node('/obj/geo1').createNode('attribwrangle', "ttt")
这里传的"attribwrangle"为具体节点的类型名, 也就是node.type().name()
CD到某个节点路径下
作用等同于cmd的cd
hou.cd("/obj")
hou.node("geo1")
获取直接的子节点
hou.node('/obj').children()
节点参数
节点参数类型(hou.ParmTuple和hou.Parm)
hou.Parm指最简单参数元素,比如int, float, bool.
而多个(包含1个)hou.Parm一起组成了hou.ParmTuple, 比如float2, int2, color等等.
节点获取某个参数Parm
hou.parm('/obj/geo1/subnet1/Count')
hou.parmTuple('/obj/geo1/subnet1/Pos2')
hou.parmTuple('/obj/geo1/subnet1/Pos2')[0]
节点获取所有parm,parm_name, parmTemplate,parmTemplate的类型
hou.Parm (sidefx.com)
hou.ParmTemplate (sidefx.com)
hou.parmTemplateType (sidefx.com)
hou.node('/obj/geo1/subnet1').parms()
很显然数组实例化出来的"a1", "a2", 文件夹Fold0, 向量的单元素也成为了parm.
import hou
params = hou.node('/obj/geo1/subnet1').parms()
for parm in params:
print(parm.name()) # 名字
print("param is array instance: ", parm.isMultiParmInstance()) # 参数是否是数组的实例
parm_template = parm.parmTemplate()
print(parm_template) # 参数模版
print(parm_template.type()) # 参数模版类型
print("\n")
节点获取所有parm_tuple, parmTemplate
import hou
parm_tuples = hou.node('/obj/geo1/Test1').parmTuples()
for parm_tuple in parm_tuples:
print(parm_tuple)
parmTemplate = parm_tuple.parmTemplate()
# 筛选数组的实例
if not parm_tuple.isMultiParmInstance():
print(parmTemplate)
# 如果此元素为数组,获取子元素模版
if parmTemplate.type() == hou.parmTemplateType.Folder:
print("child element template:")
print(parmTemplate.parmTemplates())
print("\n")
节点设置值和获取值
设置参数值
hou.parm('/obj/geo1/Test1/ArrayName').set(3)
hou.parm('/obj/geo1/Test1/a3').set(1)
hou.parmTuple('/obj/geo1/Test1/Color').set((6, 6, 6))
hou.parm('/obj/geo1/Test1/Button').pressButton()
获取参数值
hou.parmTuple('/obj/geo1/Test1/Color').eval()
hou.parm('/obj/geo1/Test1/a1').eval()
hou.parmTuple('/obj/geo1/Test1/Pos3')[0].eval()
hou.parm('/obj/geo1/Test1/ArrayName').eval()
同类型参数的区分
下面是典型例子,在Houdini中参数的区分不能仅仅用parmTemplateType和parmTupleSize去区分,像Color和float3很明显需要look或者naming schene等信息作为区分.
节点输入输出相关
获取输入节点,输出节点,输入输出连接信息
hou.node('/obj/geo1/Test1').outputs()
hou.node('/obj/geo1/Test1').inputs()
hou.node('/obj/geo1/Test1').inputConnections()
hou.node('/obj/geo1/Test1').outputConnections()
设置节点相连
box_node = hou.node('/obj/geo1/box1')
test_node = hou.node('/obj/geo1/Test1')
null2node = hou.node('/obj/geo1/null2')
test_node.setInput(2, box_node)
null2node.setInput(0, test_node)
null2node.createOutputNode("box", "box_test")