本文主要是介绍小工具:输出Houdini里节点间参数的差别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
需求
节点的参数影响了节点的行为。因此对于节点使用者来说,比较节点间参数的差异就可以明白其行为的差异了。
然而有些节点的参数数量实在太多,比较其参数间的差异会比较麻烦,在没有工具的情况下只能来回在节点间跳转才能比较出参数的不同。
我想,其实可以使用Houdini的Python模块写代码来自动比较并输出不同,这并不麻烦。最后如果能输出更易于阅读的格式(比如csv表格,或Markdown表格语法)会让比较更高效。
另外,我还假定了被比较的节点的类型都是一样的,因此这让代码更为简单——只需要按顺序访问参数就行了,因为参数的顺序一定是一样的。
比较两个节点参数差别
仅对比两个节点的代码是很简单的。
比如我放了两个box节点,并将缩放参数调整得不一样。
#两个对比的节点:
node1 = hou.node("../box1");
node2 = hou.node("../box2");#节点的参数个数
parmCount = len(node1.parms());#遍历所有参数寻找其中不同的值
for i in range(parmCount) :if(node1.parms()[i].eval() != node2.parms()[i].eval()):message = "";message += node1.parms()[i].description()message += " " + str(node1.parms()[i].eval()) + " " + str(node2.parms()[i].eval())print(message)
则输出:
Uniform Scale 1.0 3.11
多节点比较
当考虑多节点时,就以第0个为参照,其他节点都和它比较,只要有一个节点不一样,就输出这个参数所有节点的值。
比如我放了三个box节点,第二三个各有一个参数和第一个不一样。
#要对比的节点们:(以第0个为参照)
nodes = [];
nodes.append(hou.node("../box1"));
nodes.append(hou.node("../box2"));
nodes.append(hou.node("../box3"));#节点的参数个数
parmCount = len(nodes[0].parms());#遍历所有参数寻找其中不同的值
for i in range(parmCount) :allsame = True; #参数是否都一样message = ""; #信息,仅在有参数不同时才予以显示message += nodes[0].parms()[i].description() #参数名message += " " + str(nodes[0].parms()[i].eval()) #参照节点的参数值for j in range(len(nodes)-1):#参数不同,写上值if(nodes[j+1].parms()[i].eval() != nodes[0].parms()[i].eval()): allsame = False;message += " " + str(nodes[j+1].parms()[i].eval())#参数相同:省略值else:message += " -"if not allsame : #仅在有参数不同时输出信息print(message)
输出:
Size 1.0 - 1.9
Uniform Scale 1.0 3.11 -
输出MarkDown表格语法
MarkDown表格语法也是在CSDN博客中可以使用的。
比如
| Syntax | Description |
| - | - |
| Header | Title |
| Paragraph | Text |
在博客中将会变为:
Syntax | Description |
---|---|
Header | Title |
Paragraph | Text |
另外,当前的menu型参数会直接输出数字,可读性较差。
hou模块有接口读到menu:
当失败时会有异常。可以根据此判断是否是menu。
因此,最终代码修改为:
#要对比的节点们:(以第0个为参照)
nodes = [];
nodes.append(hou.node("../box1"));
nodes.append(hou.node("../box2"));
nodes.append(hou.node("../box3"));#MarkDown表格前两行:
line1 = "| - | "
line2 = "| - | "
for n in range(len(nodes)):line1 += nodes[n].name() +" |"line2 += "- |"
print(line1)
print(line2)#节点的参数个数
parmCount = len(nodes[0].parms());#获得参数的值,如果是menu则会输出menu的值
def GetParmMessage(p):try:p.menuLabels()except hou.OperationFailed:return str(p.eval())else:if(isinstance(p.eval(),int)):return p.menuLabels()[p.eval()]else:return str(p.eval());#遍历所有参数寻找其中不同的值
for i in range(parmCount) :allsame = True; #参数是否都一样message = "| "; #信息,仅在有参数不同时才予以显示message += nodes[0].parms()[i].description() #参数名message += " | " + GetParmMessage(nodes[0].parms()[i]) + " |" #参照节点的参数值for j in range(len(nodes)-1):#参数不同,写上值if(nodes[j+1].parms()[i].eval() != nodes[0].parms()[i].eval()): allsame = False;message += " " + GetParmMessage(nodes[j+1].parms()[i])+ " |"#参数相同:省略值else:message += " - |"if not allsame : #仅在有参数不同时输出信息print(message)
将box节点的一个menu型参数修改下。
输出:
| - | box1 |box2 |box3 |
| - | - |- |- |
| Primitive Type | Polygon | - | NURBS |
| Size | 1.0 | - | 1.9 |
| Uniform Scale | 1.0 | 3.11 | - |
将这段直接复制到博客中就会变成:
- | box1 | box2 | box3 |
---|---|---|---|
Primitive Type | Polygon | - | NURBS |
Size | 1.0 | - | 1.9 |
Uniform Scale | 1.0 | 3.11 | - |
在一个复杂的例子中尝试
Downloadable fabrics是Houdini官方关于Vellum布料模拟的一些展示性效果
工程文件可在这里下载。
我建立了一个默认的Vellum布料配置,然后尝试将其与当前的八个布料配置进行比较
#要对比的节点们:(以第0个为参照)
nodes = [];
nodes.append(hou.node("../default"));
nodes.append(hou.node("../vellumcloth6"));#Jersey
nodes.append(hou.node("../vellumcloth3"));#RainCoat
nodes.append(hou.node("../vellumcloth11"));#tulle with embroidery
nodes.append(hou.node("../vellumcloth15"));#Jeans
nodes.append(hou.node("../vellumcloth9"));#Velvet
nodes.append(hou.node("../vellumcloth8"));#Silk
nodes.append(hou.node("../vellumcloth_wool"));#Wool
nodes.append(hou.node("../vellumcloth10"));#Leather...
结果如下:
- | default | vellumcloth6 | vellumcloth3 | vellumcloth11 | vellumcloth15 | vellumcloth9 | vellumcloth8 | vellumcloth_wool | vellumcloth10 |
---|---|---|---|---|---|---|---|---|---|
Density | 0.1 | 0.04 | 0.25 | 0.04 | 0.4 | 0.02 | 0.04 | 0.04 | 0.4 |
Thickness | Calculate Uniform | Calculate Varying | Calculate Varying | Calculate Varying | - | Calculate Varying | Calculate Varying | Calculate Varying | - |
Edge Length Scale | 0.25 | - | - | - | - | - | 0.2 | - | - |
Normal Drag | 10.0 | 40.0 | - | 80.0 | - | 40.0 | 80.0 | 80.0 | - |
Tangent Drag | 0.1 | 0.4 | 1.0 | 0.4 | 5.0 | 40.0 | 0.8 | 0.4 | 2.0 |
Stiffness | 1.0 | - | - | - | 100000000.0 | - | - | - | 100000000.0 |
Damping Ratio | 0.001 | - | - | - | 0.0001 | - | - | - | 0.0001 |
Stiffness | 1.0 | 0.15 | - | - | - | 2.0 | - | - | 2000.0 |
× | 1e-7 | 0.000 01 | 1 | 1 | 10 000 | 0.000 1 | 0.000 1 | - | 1 |
bendstiffnessscalemode | No Scaling | - | - | Scale by Attribute | - | - | - | - | - |
Damping Ratio | 0.01 | - | 0.0075 | - | - | - | 0.1 | - | - |
Rest Angle Scale | 1.0 | - | 2.0 | 2.0 | - | - | - | - | - |
dobendstiffnessfalloff | 0 | - | 1 | - | - | - | - | - | - |
Stiffness Dropoff | 0.0 | 85.0 | 48.0 | 85.0 | 55.0 | 85.0 | 70.0 | 85.0 | 55.0 |
bendstiffnessfalloffdir | Increasing | Decreasing | Decreasing | Decreasing | - | Decreasing | Decreasing | Decreasing | - |
dobendstiffnessdropoffmin | 0 | - | 1 | - | 1 | - | - | - | - |
Min Stiffness | 0.0 | - | 5e-06 | - | 0.0001 | - | - | - | - |
Enable Plasticity | 0 | 1 | 1 | - | 1 | 1 | - | 1 | 1 |
Threshold | 10.0 | 0.1 | 15.0 | - | 35.0 | 1.0 | - | 0.005 | 3.0 |
Rate | 1.0 | 0.25 | 0.3 | - | 5.0 | 2.0 | - | - | 6.0 |
Hardening | 1.0 | 0.3 | - | - | 5.0 | 2.0 | - | - | 0.5 |
Promotion Method | Average | - | - | - | Use Target | - | - | - | Use Target |
Tag | default | vellumcloth6 | vellumcloth3 | vellumcloth11 | vellumcloth15 | vellumcloth9 | vellumcloth8 | vellumcloth_wool | vellumcloth10 |
通过这个列表,就可以知道哪些参数有改变,即我需要关注哪些参数了。
问题记录:
运行python脚本的时候会有报错:
这个问题我在Python 排错UnicodeEncodeError ‘ascii’ codec can’t encode character 错误解决方法 - 授客 - 博客园找到了解决方法,即先运行这段代码:
import sysreload(sys)sys.setdefaultencoding('utf8')
之后就没有报错了
这篇关于小工具:输出Houdini里节点间参数的差别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!