Python —— 简述

12 篇文章 0 订阅

目录

一,Houdini中调用Python的方式

二,节点及节点参数编辑

节点编辑

节点参数编辑

三,几何体及几何体组编辑

几何体编辑

几何体组编辑

四,UI窗口

五,函数

六,其他


Houdini Python | 笔记合集 - 知乎

Houdini内置三大语言:

  • 表达式,主要用于节点参数控制,可实现跨模块控制;
  • vex,速度最快(比表达式和Python快一个数量级),非常适合密集型计算环境,应首选;
  • python,注意用于编写脚本,控制pdg,实现houdini以外的功能;可做表达式和vex(材质除外)大部分事情,但最慢;此语言可用于自定义窗口、导出数据、加密、抓取网络数据,任务发布,深度学习等;

一,Houdini中调用Python的方式

  • Python节点;

 

  • Python Shell窗口;

  • Python Source Editor,自定义函数模块,需保存hip文件;
    • 如在该编辑器内定义函数,在Python Shell内调用函数;

//Python Shell内调用函数
hou.session.myFunction()
  • 节点的Operator Type Properties/Scripts,然后可通过button调用hda的脚本;

  • 字符串参数面板,然后可通过button计算参数面板内的代码;

 

  • 工具架工具Scripts;

Parameter callback scripts

        可编写python脚本,会在参数改变时调用;

        事件脚本(event script)能访问在全局字典变量(称为kwargs)内的事件参数,如kwargs["node"]可获取包含参数的hou.OpNode对象,kwargs["parm"]可获取参数的hou.Parm对象;

//hda内PythonModule的Script
def fun(kwargs):
    node = kwargs['node'] //返回该节点
    parm = kwargs['parm'] //返回回调的参数
    parm_name = kwargs['parm_name'] //回调参数的名字,等价于kwargs['parm'].name()
    
//参数的Callback Script
hou.pwd().hm().my_callback(kwargs, hou.pwd())
参数调用的kwargs dictionary内容列表
node包含参数的hou.OpNode对象
parm回调脚本的hou.Parm对象
parm_namehou.Parm的名字,等价于kwargs['parm'].name()
script_parm包含参数的hou.ParmTuple名字,等价于kwargs['parm'].tuple().name()
script_value参数值,等价于kwargs['parm'].eval()
script_value0, script_value1, …数组参数值,等价于[p.eval() for p in kwargs['parm'].tuple()]
script_multiparm_index通常首个multiparm是1,其次是2...
script_multiparm_nesting如参数不是multiparm的实例,值为0;是multiparm的实例,但不包含在其他multiparm的实例,值为1;否则,multiparm实例被嵌套在multiparm实例的一个级别内,返回嵌套级别数;
script_multiparm_index2, …, script_multiparm_indexN仅在script_multiparm_nesting在2或更高,才有效;对应于外部multiparm实例的multiparm实例编号;

二,节点及节点参数编辑

节点编辑
hou.cd(path) //切换当前路径
hou.root() //->hou.OpNode返回根节点,等价于hou.node('/')
//定位指定节点或元素
hou.pwd() //->hou.OpNode 返回当前节点,等价于hou.node('.')
hou.parent() //->hou.OpNode or None 返回当前节点的父节点,等价于hou.node('..')

hou.node(path) //->hou.OpNode or None 返回指定节点对象
hou.nodes(path_tuple) //->tuple of hou.OpNode 返回指定节点对象数组

hou.item(path) //->hou.NetworkMovableItem or None 返回指定NetworkMovableItem对象
hou.items(path_tuple) //->tuple of hou.NetworkMovableItem or None 返回指定NetworkMovableItem对象数组
hou.selectedNodes() //返回所选节点的列表
hou.node('/obj/python').cook(True) //强制重新计算
//节点类型的类别
hou.nodeType() //HOM Funtion
hou.nodeTypeCategories() //返回类别字典
hou.sopNodeTypeCategory() //返回sop类别
node.path() //获取节点的绝对路径
//创建节点
node.createNode('subnet', subnet_name)
node.createInputNode(0, 'box')
node.createOutputNode('box')
//节点状态
node.setDisplayFlag(True)
node.setRenderFlag(True)

node.hide(False)
node.bypass(True)

node.setHighlightFlag(False)
node.setTemplateFlag(False)
node.setSelectableTemplateFlag(False)
node.setSelected(False)
node.setUnloadFlag(False)
node.setHardLocked(True)
node.setSoftLocked(False)
//节点位置
node.position()
node.setPosition(vector2) //(pos.x()+1, pos.y()+1)、hou.Vector2(pos.x()+1, pos.y()+1)
node.move((2,3))
node.moveToGoodPosition()

node.layoutChildren() //自动排列子节点位置,相当于L
//获取节点名字
node.name()
node.setName(newname)
​//复制节点
hou.copyNodesTo(nodes, dest)
node.copyTo(dest)
//选择节点
node.setSelected(True) //设置为选择节点
node.setCurrent(True) //设置当前节点为最后选择的节点
//父子节点
node.parent() //父级节点
node.children() //子节点列表
node.allSubChildren() //递归返回所有子节点
node.allNodes() //递归返回所有子节点,包括本身
node.allItems() //返回所有子项
node.numItems() //子项数

//上游节点
node.inputAncestors() 
//连接节点
node.inputs()
node.input(inputindex)
node.outputs()
node.setInput(0, otherNode)
node.setFirstinput(otherNode)
//节点类型
node.type() //Class Function
node.type().instances()
node.type().name()
node.type().category()
node.changeNodeType(newtype)
//用户数据
node.setUserData(name, value)
node.userDataDict()
node.Data(name)
node.destroyUserData(name)
node.clearUserDataDict()
//注释评论
node.setComment(comment) //设置评论
node.setGenericFlag(hou.nodeFlag.DisplayComment, True) //显示评论
节点参数编辑
//获取节点参数
hou.parm(path)
hou.parmTuple(path)
//计算节点参数
hou.ch(path) //等价于hou.evalParm(path)
hou.evalParm(path)
hou.evalParmTuple(path)
//获取节点参数
node.parm(parm_path)
node.parmTuple(parm_path)
node.parms()
node.parmTuples()
//计算节点参数
node.evalParm(parm_path)
node.evalParmTuple(parm_path)
node.parm(parm_path).eval()
//设置参数
node.setParms(parm_dict)
node.parm(parm_path).set(value)
node.parm(parm_path).rawValue()
node.parm(parm_path).keyframes()
node.parm(parm_path).commponentIndex()
node.parm(parm_path).lock(True)
node.parm(parm_path).pressButton() //调用callback脚本
//ramp参数
ramp_value = node.parm('ramp').eval()
ramp_value.lookup(position)

//添加ramp参数
node = hou.node('/obj/box_object1/null1')
ramp_temp = hou.RampParmTemplate("name","label",hou.rampParmType.Color,default_value=2)
ramp_parm = node.addSpareParmTuple(ramp_temp)
ramp_value = hou.Ramp( (hou.rampBasis.Linear, hou.rampBasis.Linear), (0, 1), ((0.0, 1.0, 0.0), (0.0, 0.0, 0.5)) )
ramp_parm[0].set(ramp_value)

三,几何体及几何体组编辑

几何体编辑

hou.SopNode class,表示surface节点;

hou.Geometry class,几何体对象包含定义几何体形状的点或面;

//创建线
geo = hou.pwd().geometry()

point1 = geo.createPoint()
point1.setPosition(hou.Vector3(1,2,3))
point2 = geo.createPoint()
point2.setPosition(hou.Vector3(0,1,2))

poly = geo.createPolygon(False)
poly.addVertex(point1)
poly.addVertex(point2)
//geo
geo.points() //返回所有点
geo.prims() //返回所有面
geo.pointAttribs() //返回所有点属性
geo.primAttribs() //返回所有点属性
geo.vertexAttribs() //返回所有点属性

geo.addAttrib(type, name, default_value, transform_as_normal=False, create_local_variable=True)

point.setAttribValue(name_or_attrib, attrib_value)
prim.setAttribValue(name_or_attrib, attrib_value)
vertex.setAttribValue(name_or_attrib, attrib_value)
geo.setGlobalAttribValue(name_or_attrib, attrib_value)
//point
point.number()
point.position()
point.prims()
point.vertices()
//prim
prim.number()
prim.points()
prim.vertices()
几何体组编辑
//返回对应的所有组
geo.pointGroups()
geo.primGroups()
geo.edgeGroups()
geo.vectexGroups()

//创建对应的组
geo.createPointGroup(name, is_ordered=False)
geo.createPrimGroup(name, is_ordered=False)
geo.createEdgeGroup(name, is_ordered=False)
geo.createVertexGroup(name, is_ordered=False)

//查找对应的组
geo.findPointGroup(name)
geo.findPrimGroup(name)
geo.findEdgeGroup(name)
geo.findVertexGroup(name)

四,UI窗口

//显示提示框
hou.ui.displayMessage(text)
hou.ui.displayConfirmation(text)
hou.ui.displayNodeHelp(node.type())
hou.ui.displayFileDependencyDialog()
//输入弹窗
hou.ui.readInput("Insert text") //单行
hou.ui.readMultiInput(message = "Enter parms:",
input_labels = ["height","lRadius","uRadius","frequency"],
initial_contents = ["20","10","0","3"]) //多行
//文件选择弹窗
hou.ui.selectFile()

五,函数

//自定义函数
def fun(kwargs):
    return kwargs
node.asCode() //打印重建此节点所需的代码
str() //转化为字符类型
exec(str) //将字符做为代码运行
locals().get("var") //是否已存在指定的局部变量
//展开字符串内的局部变量或表达式,已废弃使用hou.text.expandString 
hou.expandString(str)
//在给定帧展开字符串内的局部变量或表达式,已废弃使用 hou.text.expandStringAtFrame
hou.expandStringAtFrame(str, frame_number) 
//hou.Vector3 class
vector.length()
vector.normalized()
vector.distanceTo(vector3)
vector.dot(vector3) 
vector.cross(vector3)
angleTo(vector3) 
x()、y()、z()
//获取图像分辨率
imageResolution(image_file_name)
//获取运行的houdini的路径
hou.houdiniPath()
//设置节点的默认表达式语言
node.setExpressionLanguage(hou.exprLanguage.Hscript)
//将节点从指定版本同步到其HDA定义的当前版本
node.syncNodeVersionIfNeeded(from_version)
//加载自定义hda
hou.hda.installFile(hda_file_path)
//存储当前文件
hou.hipFile.save()
//加载一个新文件
hou.hipFile.load()

六,其他

自定义运行节点代码按钮

  • 在节点创建多行字符串参数,语言改为Python;
  • 创建按钮参数,并编写Python调用脚本(callback script);
//current_node = kwargs['node']
//kwargs = hou.pwd() = kwargs['node']
exec(kwargs['node'].parm('code').eval())
//或
exec(hou.pwd().parm('code').eval())

for…in…语句

paths = ['/obj/geo1', '/obj/geo2']
for path in paths:
    print(hou.node(path))

enumerate()枚举函数

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值