houdini python self tools

本文介绍了在Houdini中使用Python脚本进行geo处理,创建mantra节点并设置参数,以及如何利用Lambda表达式对节点进行批量排序和连接操作。

记录一些自己瞎写 (原谅本人的才疏学浅)以方便工作的hou 插件

01.geo 对应创建mantra

import hou 
null_path=[]
for i in hou.selectedNodes():
    mantra=hou.node('out').createNode('ifd','{0}'.format(i.name()))
    mantra.parm('trange').set(1)
    frame=hou.parmTuple('{0}/f'.format(mantra.path()))
    frame.deleteAllKeyframes()
    for s in i.children():
        if s.type().name()=='null':
            null_path=s.path()
            star=hou.parm('{0}/start'.format(null_path)).eval()
            end=hou.parm('{0}/end'.format(null_path)).eval()
    star=int(star)
    end=int(end)
    mantra.parm('f1').set(star)
    mantra.parm('f2').set(end)
    mantra.moveToGoodPosition()
    

02.关于节点批量排序

Lambda表达式
》》》learn form 大佬
注意列表中的顺序

nodes=list((hou.node('/obj/topnet1/null1'), hou.node('/obj/topnet1/null2'), hou.node('/obj/topnet1/null3'), hou.node('/obj/topnet1/null4')))

nodes.sort(key=lambda x:x.name())

reduce(lambda x ,y:y.setNextInput(x)or y ,nodes)

03.创建对应物体到geo层级进行渲染

import hou
##tip:
tord=hou.ui.displayMessage('Choose nodes to Rendr (geo to obj)',buttons=('Ok','Close'))
if tord==0:
        create=[]
    #choose  nodes to render
        for n in hou.selectedNodes():
            geos=hou.node('obj').createNode('geo','{0}'.format(n.name()))
            objmerge=geos.createNode('object_merge','{0}'.format(n.name()))
            objmerge.parm('xformtype').set(1)
            objmerge.parm('objpath1').set(n.path())
    #create geo col
            col=(.5,0,1);
            geos.setColor(hou.Color(col));
            father=n.parent()
            pos=father.position()
            create.append(geos)
            for i in range(len(create)):
                geos.setPosition(hou.Vector2(pos[0]+i*3,pos[1]-1))
            # hou.node("/obj").layoutChildren(items=(create),horizontal_spacing=2.0, vertical_spacing=-1.0)

            
            
            

04.通过path去删出每个不同path的物体(写的时候path默认设定在面上)

import hou
#currentNode
currentNodes = hou.selectedNodes()
#print(currentNode)
for i in currentNodes:
    #col = (0.5,0.5,0.5)
    #i.setColor(hou.Color(col))
    nodepath = i.path()
    root = i.parent().path()
    print(root)
    nodepos = i.position()
    print(nodepos)
    pathAttcode = i.geometry().findPrimtAttrib("path")
    pathAtt = []
    if pathAttcode :
        for path in pathAttcode.strings() :
            #print(path)
            pathAtt.append(path)
        # print(pathAtt)
    for ib in range(len(pathAtt)):
        # print(ib)
        # print(pathAtt[ib])
        name = pathAtt[ib].split("/")
        # print(name[-1])
        blast = hou.node(root).createNode("blast","ExtraPath_" + name[-1])
        blast.setPosition(hou.Vector2(nodepos[0]+ib*3,nodepos[1]-1))
        blast.setInput(0, i)
        blast.parm("group").set("@path=" + pathAtt[ib])
        # blast.parm("grouptype").set(3)
        blast.parm("negate").set(1)
        null = blast.createOutputNode("null","Out_ExtraPath_" + name[-1])
        null.setGenericFlag(hou.nodeFlag.DisplayComment,True)
        null.setComment(name[-1])

05.不用进入相机内部去设置相机的属性 (导入abc时设施分辨率麻烦)

import hou 

def fix_camrea():
    nodes = hou.selectedNodes()
    
    camera_data = hou.ui.readMultiInput("输入相机分辨率参数&&相机近裁切参数",
                                input_labels=("Camera X Reslution", "Camera Y Reslution", "近裁切"),
                                buttons=("确定", "取消"),
                                severity=hou.severityType.ImportantMessage,
                                initial_contents=("2048", "872", "0.001"))
    if camera_data[0] == 1:
        pass
        
    else:
        reslution = hou.Vector2(int(camera_data[1][0]), int(camera_data[1][1]))
        
        for node in nodes:
            if node.type().name() == "alembicarchive":
                press_parm = node.parm("buildHierarchy")
                press_parm.pressButton()
                
                for camera in node.allNodes():
                    if camera.type().name() == "cam":
                        camera.parmTuple("res").set(reslution)
                        camera.parm("near").deleteAllKeyframes()
                        camera.parm("near").set(camera_data[1][2])  
                        
        hou.ui.displayMessage("相机分辨参设置完成!")   
    
fix_camrea()            
        

06.根据geo创建redshift 的节点

import hou
def find_cameras(node):
    cameras = []
    if node.type().name() == "cam":
        cameras.append(node.path())
    # 遍历子节点
    for child in node.children():
        cameras.extend(find_cameras(child))
    return cameras
# 获取 /obj 层级下的所有相机,包括子层级
obj_node = hou.node("/obj")
all_cameras = find_cameras(obj_node)
# 输出所有相机路径
# print(all_cameras)
# print(len(all_cameras)!=0)
create=[]
#choose  nodes to render
for n in hou.selectedNodes():
    # print(n)# 在选中节点下创建ROP网络(若不存在)
    # 在ROP网络中创建Redshift渲染节点
    rs_render = hou.node("out").createNode("Redshift_ROP","rndr_" + "{0}".format(n.name()))
    # 设置基本渲染参数(示例)
    rs_render.parm("trange").set("on")
    if(len(all_cameras)!=0):
        rs_render.parm("RS_renderCamera").set(all_cameras[0])    # 指定渲染相机
    rs_render.parm("RS_outputFileNamePrefix").set("$HIP/render/v001/$OS/$OS.$F4.exr")  # image输出路径
    rs_render.parm("RS_archive_file").set("$HIP/rop/v001/$OS/$OS.$F4.rs")  # proxy输出路径
    #rs_render.parm("RS_archive_enable").set(True)
    rs_render.parm("RS_objects_candidate").set("")  # object
    rs_render.parm("RS_objects_force").set("{0}".format(n.name()))
    rs_render.parm("RS_lights_candidate").set("")  # light
    rs_render.setCurrent(True,True)
    create.append(rs_render)
    pos=(0,0,0)
    for i in range(len(create)):
        rs_render.setPosition(hou.Vector2(pos[0]+i*3,pos[1]-6))
hou.ui.setStatusMessage(" Redshift node creation is complete and has been associated to the selected nodes ")
# hou.ui.displayMessage("Redshift节点创建完成并已关联到: {}".format(n.name()))

07.如何把ai(这里调的kimi (有15元免费试用))在hou中调用(不是太实用)

import hou

from openai import OpenAI

question=hou.ui.readInput("你好有什么问题")[1]

 
client = OpenAI(
    api_key = "这里需要填写你自己api需要的key",
    base_url = "https://api.moonshot.cn/v1",
)
 
completion = client.chat.completions.create(
    model = "moonshot-v1-8k",
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": '{0}'.format(question)}
    ],
    temperature = 0.3,
)
hou.ui.displayMessage('{0}'.format(completion.choices[0].message.content),buttons=('Ok','Close'))
# print(completion.choices[0].message.content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BenFX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值