Houdini代码块

获取选择的节点

1
2
3
nodes = hou.selectedNodes()
print nodes

创建一个节点

1
2
3
4
5
6
7
8
9
10
# 创建一个geo节点在obj层级下
node = hou.node('/obj')
c = node.createNode('geo')

# 或者
hou.node("obj").createNode('geo')

# 删除geo节点创建时默认包含的file节点(新版本houdini18不会有了)
d = c.node('file1')
d.destroy()

修改节点参数

1
2
3
4
5
6
7
8
9
# 修改一个box的x轴缩放
node = hou.node('/obj/box1/box1')
pram = node.parm('sizex')
s = parm.set(5)

# 修改box的primitive type
type = node.parm('type')
type.set(1)

在节点的输出端创建节点

1
2
3
4
5
6
node.createOutputNode("null")

# 如果找不到节点的类型名称(有些节点类型名称和显示出来的名称不一样,比如mantra节点)
# 可以在houdini的python shell把节点给一个变量(直接把节点拖入shell里)
node = hou.node('/obj/box1/box1')
print node.type().name()

连接节点

1
node.setInput(0, another_node)

给节点赋予颜色

1
2
color = hou.Color(0,1,0)
node.setColor(color)

设置节点渲染和显示的开关

1
2
node.setRenderFlag(True)
node.setDisplayFlag(True)

用户输入窗口

1
2
3
4
5
6
7
8
9
10
11
12
# 单个输入行
inputName = hou.ui.readInput("Input Name:", buttons=['Yes', 'No'])
print inputName
>>> (0, 'input something')
# 返回值是一个元组 按钮的index和输入的内容

# 多个输入行
inputName = hou.ui.readMultiInput('input your info',
["a", "b", "c"],
buttons=["Yes", "No"])
print inputName
>>> (0, ('1', '2', '3'))

节点位置

1
2
3
4
5
6
# 获取
posx = node.position()[0]
posy = node.position()[1]

# 修改
node.setPosition([posx, posy])

获取节点子级和父级

1
2
3
4
5
6
7
# 子级
for n in node.allSubChildren():
print n

# 父级
p = node.parent()
print p.path() # 看看路径

获取节点网格视图,获取光标位置

1
2
3
4
pan = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
pos = pan.selectPosition()

print pos

在节点属性面板添加属性

1
2
3
4
5
6
7
8
9
10
11
12
13
group = node.parmTemplateGroup()
group.addParmTemplate(hou.StringParmTemplate("s", "S", 1))
node.setParmTemplateGroup(group)

'''
String: hou.StringParmTemplate
Float: hou.FloatParmTempalte
Int: hou.IntParmTempalte
'''

# 添加属性也可以根据属性名称来决定,添加到之前或者之后
group.insertBefore("group", hou.StringParmTemplate("s", "S", 1))
group.insertAfter("group", hou.StringParmTemplate("s", "S", 1))

获取选中节点的primGroup数据

1
2
3
4
5
6
primGroups = hou.selectedNodes()[0].geometry().primGroups()
for prim in primGroups:
print prim.name()
print "=" * 20
for i in prim.prims():
print i.number()

获取文件路径

1
2
hou.hipFile.name()
hou.hipFile.path()

获取mantra节点的输出范围

1
2
3
4
5
6
7
node = hou.selectedNodes()[0]
print node.parm("f1").eval(), node.parm("f2").eval()
>>> 101.0 150.0

print node.parmTuple("f").eval()
>>> (101.0, 150.0, 1.0)

创建面板工具

1
2
3
4
5
6
7
8
# 获取当前桌面
curDesktop = hou.ui.curDesktop()
pos = (200, 200)
size = (600, 600)

my_win = curDesktop.createFloatingPane(hou.panTabType.SceneViewer, pos, size)
# hou.panTabType 下可以看到许多View的类型。

根据组信息把模型筛选出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nodes = list(hou.selectedNodes())

for node in nodes:
group = {'point': node.geometry().pointGroups(),
'prim': node.geometry().primGroups(),
'edge': node.geometry().edgeGroups()
}

for child in group.keys():
all_group = group[clild]
for a in all_group:
name = a.name()
blast = node.createOutputNode('blast')
blast.parm('group').set(name)
blast.parm('negate').set(1)
blast.parm('removegrp').set(1)

null = blast.createOutputNode('null', 'OUT_{}'.format(name))
null.setColor(hou.Color(0,1,1))

给多个选择的节点创建switch节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
color = hou.Color(0, 1, 0)

def input_name():
name = hou.ui.readInput("Input Name:", buttons=["Ok", "Cancle"])[1]
name = name.replace(" ", "_")
return name

try:
nodes = hou.selectedNodes()
if len(nodes) != 0:
pan = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
pos = pan.selectPosition()

switch = nodes[0].parent().createNode('switch')
switch.setName(input_name())
switch.setColor(color)
switch.setPosition(pos)


for i in range(len(nodes)):
nodes[i].setSelected(0)
switch.setInput(i, nodes[i])
# 获取输入节点的总数,并设置switch的选择为当前节点
s_num = switch.inputs()
count = switch.parm('input').set(len(s_num) - 1)

switch.setRenderFlag(1)
switch.setDisplayFlag(1)

except:
pass