小工具:输出Houdini里节点间参数的差别

2024-09-06 23:08

本文主要是介绍小工具:输出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 |

在博客中将会变为:

SyntaxDescription
HeaderTitle
ParagraphText

另外,当前的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 | - |

将这段直接复制到博客中就会变成:

-box1box2box3
Primitive TypePolygon-NURBS
Size1.0-1.9
Uniform Scale1.03.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...

结果如下:

-defaultvellumcloth6vellumcloth3vellumcloth11vellumcloth15vellumcloth9vellumcloth8vellumcloth_woolvellumcloth10
Density0.10.040.250.040.40.020.040.040.4
ThicknessCalculate UniformCalculate VaryingCalculate VaryingCalculate Varying-Calculate VaryingCalculate VaryingCalculate Varying-
Edge Length Scale0.25-----0.2--
Normal Drag10.040.0-80.0-40.080.080.0-
Tangent Drag0.10.41.00.45.040.00.80.42.0
Stiffness1.0---100000000.0---100000000.0
Damping Ratio0.001---0.0001---0.0001
Stiffness1.00.15---2.0--2000.0
×1e-70.000 011110 0000.000 10.000 1-1
bendstiffnessscalemodeNo Scaling--Scale by Attribute-----
Damping Ratio0.01-0.0075---0.1--
Rest Angle Scale1.0-2.02.0-----
dobendstiffnessfalloff0-1------
Stiffness Dropoff0.085.048.085.055.085.070.085.055.0
bendstiffnessfalloffdirIncreasingDecreasingDecreasingDecreasing-DecreasingDecreasingDecreasing-
dobendstiffnessdropoffmin0-1-1----
Min Stiffness0.0-5e-06-0.0001----
Enable Plasticity011-11-11
Threshold10.00.115.0-35.01.0-0.0053.0
Rate1.00.250.3-5.02.0--6.0
Hardening1.00.3--5.02.0--0.5
Promotion MethodAverage---Use Target---Use Target
Tagdefaultvellumcloth6vellumcloth3vellumcloth11vellumcloth15vellumcloth9vellumcloth8vellumcloth_woolvellumcloth10

通过这个列表,就可以知道哪些参数有改变,即我需要关注哪些参数了。


问题记录:

运行python脚本的时候会有报错:
在这里插入图片描述
这个问题我在Python 排错UnicodeEncodeError ‘ascii’ codec can’t encode character 错误解决方法 - 授客 - 博客园找到了解决方法,即先运行这段代码:

import sysreload(sys)sys.setdefaultencoding('utf8')

之后就没有报错了

这篇关于小工具:输出Houdini里节点间参数的差别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143374

相关文章

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

sqlite3 命令行工具使用指南

《sqlite3命令行工具使用指南》本文系统介绍sqlite3CLI的启动、数据库操作、元数据查询、数据导入导出及输出格式化命令,涵盖文件管理、备份恢复、性能统计等实用功能,并说明命令分类、SQL语... 目录一、启动与退出二、数据库与文件操作三、元数据查询四、数据操作与导入导出五、查询输出格式化六、实用功

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间