Houdini的PythonScript基本使用

前言

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()

特殊参数-Ramp类参数设置值
ramp1 = hou.parm('/obj/geo1/subnet1/newparameter')
linear_type = hou.rampBasis.Linear
ramp_data = hou.Ramp((linear_type, linear_type), (0.0, 0.5), ((0.0, 1.0)))
ramp1.set(ramp_data)

获取参数值

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")

获取节点相关几何数据

### HoudiniPython 编程教程和文档 #### 1. 模块结构与导入顺序 在Houdini中,Python脚本遵循特定的模块组织方式。模块内容按照以下顺序排列:模块说明和`docstring`—`import`语句—全局变量和常量—其他定义[^2]。 对于`import`部分,应先引入标准库模块,接着是第三方库,最后才是自定义编写的模块,各部分间需留有空白行以作区分。 #### 2. `hou`模块详解 `hou`作为Houdini的核心Python接口,提供了访问几乎所有内部特性的能力。该模块主要由三大部分组成: - **子模块(Sub-modules)** 这些组件通常用于处理特定领域的工作流,比如文件操作(`hou.hipFile`)、用户界面交互(`hou.ui`)等。它们的名字总是以小写字母开头,并且不会带有括号[^3]。 - **类(Class)** 类代表了各种类型的节点(Node),几何体(Geometry),参数(Parm), 属性(Attrib)以及更具体的实体如点(Point)、边(Edge)、面(Face)等等。这些类名首字母大写,创建实例后才能调用相应的方法或属性。 - **函数(Function)** 函数提供了一系列便捷的操作入口,例如获取当前工作目录下的节点(`hou.pwd()`), 或者解析字符串中的表达式(`hou.expandString()`)。这类成员名称均采用小写字母并附带圆括号表示可执行性。 ```python # 导入必要的包 import hou def example_function(): # 获取当前上下文环境所在的节点 current_node = hou.pwd() # 打印出这个节点的信息 print(f"Current Node Path: {current_node.path()}") example_function() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值