代码参考

zhangly 2021-03-15 12:41:56
Categories: > Tags:

获取选择的节点

nodes = hou.selectedNodes()
print nodes

创建一个节点

# 创建一个geo节点在obj层级下
node = hou.node('/obj')
c = node.createNode('geo')

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

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

修改节点参数

# 修改一个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)

在节点的输出端创建节点

node.createOutputNode("null")

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

连接节点

node.setInput(0, another_node)

给节点赋予颜色

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

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

node.setRenderFlag(True)
node.setDisplayFlag(True)

用户输入窗口

# 单个输入行
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'))

节点位置

# 获取
posx = node.position()[0]
posy = node.position()[1]

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

获取节点子级和父级

# 子级
for n in node.allSubChildren():
	print n

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

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

pan = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
pos = pan.selectPosition()

print pos

在节点属性面板添加属性

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数据

primGroups = hou.selectedNodes()[0].geometry().primGroups()
for prim in primGroups:
	print prim.name()
	print "=" * 20
	for i in prim.prims(): 
		print i.number()

获取文件路径

hou.hipFile.name()
hou.hipFile.path()

获取mantra节点的输出范围

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)

创建面板工具

# 获取当前桌面
curDesktop = hou.ui.curDesktop()
pos = (200, 200)
size = (600, 600)

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

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

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

Houdini_gongjuanli_1.png

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

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

Houdini_gongjuanli_2.png