Houdni Python Note ( 一 )
// 获得子节点
1 mygeo = hou.node("obj").createNode("geo") 2 for child in mygeo.children(): 3 print child
Output:
file1
上面代码创建了一个geo1节点,里面包含一个初始化的节点file1
// 删除节点
1 for child in mygeo.children(): 2 child.destroy()
file1节点就被删除了。
//设置位移
1 >>>mygeo = hou.node("/obj/geo1") 2 >>>mygeo.parm("tx").set(4) 3 >>>mygeo.parm("ty").set(6) 4 >>>mygeo.parm("tz").set(8)
或者
>>>mygeo = hou.node("/obj/geo1") >>>mygeo.parmTuple("t").set((4,6,8))
//拷贝节点
1 >>> null1 = hou.node("/obj/geo1/null1") 2 >>> geo2 = hou.node("/obj/geo2") 3 >>> hou.copyNodesTo([null1],geo2)
注意第一个参数要求是一个list,可以把多个节点拷贝到某一节点下。
// 获取当前节点路径
1 >>> obj = hou.node("obj/geo1/subnet1/box1") 2 >>> obj.path()
//批量Bypass
从上游接过来的模型经常会有改动,有的模型不需要,被删掉,造成Houdini节点读取错误,要想在Houdini中正确渲染模型,必须手动修改,下面提供了一个简便的脚本
1 mynode = hou.node("/obj/palace") 2 for child in mynode.children(): 3 for sub_child in child.children(): 4 if len(sub_child.errors()) > 0: 5 sub_child.bypass(True)
//学习groupby
将key函数作用于原循环器的各个元素。根据key函数结果,将拥有相同函数结果的元素分到一个新的循环器。每个新的循环器以函数返回结果为标签。
1 #!/usr/bin/env python 2 from itertools import * 3 4 def height_class(h): 5 if h > 180: 6 return "tall" 7 elif h <160: 8 return "short" 9 else: 10 return "middle" 11 12 friends = [191,158,159,165,170,177,181,182,190] 13 14 for m,n in groupby(friends,key = height_class): 15 print m 16 print list(n)
最终打印结果:
tall [191] short [158, 159] middle [165, 170, 177] tall [181, 182, 190]
//自动为曲线添加点(shelf tool)
在Houdini中新建一个shelf , Script Language 选Python
1 currentNode = hou.selectedNodes()[0] 2 path = currentNode.node("..") 3 new_node = path.createNode("attribwrangle","curve_twist") 4 new_node.setFirstInput(currentNode) 5 snippet = '''int pt = addpoint(geoself(),vector( point(geoself(),"P",npoints(geoself())-1) ) + set(0,0,0.1) ); 6 int vt = addvertex(geoself(),0,pt);''' 7 new_node.setParms({"snippet":snippet}) 8 new_node.setParms({"class":"detail"}) 9 new_node.setDisplayFlag(True) 10 new_node.setRenderFlag(True) 11 pos = currentNode.position() 12 new_node.setPosition(pos + hou.Vector2(0,-1.5))
之后,点一下shelf就会自动添加节点,为曲线添加点
//获取物体中心(Pivot)
在研究一个RBD的文件时,看到老外(绝逼是B神)写了一段Python代码,在参数栏里,研究了一下,觉得挺酸爽
源文件:http://pan.baidu.com/s/1kVazAmV (IntrinsicXformsInSim.hip 文件)
代码如下:
1 obj = hou.node(hou.parm("soppath").eval()) //得到的是 SOP Path(/obj/Dyn/OUT_Dyn) 的节点 2 dopnet = hou.pwd().creator() //得到本节点的上游节点,本案例中,
由于RBD_Packed Object是在AutoDopNetwork这个节点中,所以得到的就是AutoDopNetwork 3 if dopnet and dopnet.type().category() != hou.objNodeTypeCategory(): //判断是否是Obj级别的节点 4 dopnet = None 5 if obj is None: 6 return 0 7 if obj.type().category() != hou.objNodeTypeCategory(): 8 obj = obj.creator() // 如果不是Obj级别的节点,就找它的上一级别节点 9 p = hou.Vector3(obj.parm("px").eval(), 10 obj.parm("py").eval(), 11 obj.parm("pz").eval()) // 获取 pivot 12 tp = p * obj.worldTransform() // 得到transform 后的pivot 13 if dopnet is not None: 14 tp = tp * dopnet.worldTransform().inverted() 15 return tp[0] //Pivot 的三个参数分别对应tp[0] tp[1] tp[2]
//
def getInput(node): inputnode = node.inputs() if inputnode : inputnode = inputnode[0] inputnode = getInput(inputnode) else: return node return inputnode node = hou.pwd() node = getInput(node) print node
//列出houdini各个层级下的所有结点
categories = hou.nodeTypeCategories() for category in categories.values(): nodeTypes = category.nodeTypes() for nodeType in nodeTypes.keys(): print nodeType
列出部分结果
//删除NurbsCurve
node = hou.pwd().inputs()[0] geo = node.geometry() group = "" for prim in geo.prims(): if prim.type()== hou.primType.NURBSCurve: group += str(prim.number()) group +=" " return group