欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Houdini 如何将一堆乱七八糟的节点升序排成一横排,python小技巧

程序员文章站 2022-07-14 16:14:13
...

我们在houdini里面经常干这样的事情,就像用wedget批量存储了一堆缓存,然后加载缓存的时候这么干,比如他有上百个,把file节点的名字改成 :file_0,然后缓存路径是:

$HIP/geo/pieces/pieces.`opdigits(opname("."))`.$F.bgeo.sc

opname里面的“.”表示当前也就是取当前节点的名字,opdigits则把拿到的名字里面的数字取出来,然后就Ctrl+C,Ctrl+V...................直到全部复制出来,这么做是为了更快的创建这些缓存节点,有个问题就是太多了怎么把他正确排序呢,我们肯定要给到merge或者switch之前,将他正确排序,否则下一步制作(比如烟和更小的碎块)再使用wedget的时候因为排序不对就会出错,所以我想到一个排序的办法:将每个file名字后面的数字做数字值的大小比较,而不是做字符串的大小比较。

nds = hou.selectedNodes()
import re
nds1 = [n for n in nds if re.findall(r"[a-zA-Z0-9_]+\d+$",n.name())]
dict = {}
for n in nds1:
    name = re.findall(r"\d+$",n.name())
    dict.update({n:int(name[0])})

nds1 = list(sorted(dict.items(), key=lambda e:e[1], reverse=False))
nds2 = [x[0] for x in nds1]

pos = nds2[0].position()
offset = pos.x()
for n in nds2:
    offset += 3
    n.setPosition( (offset, pos.y()) )

先选择要选择的节点,首先用正则表达式排除掉结尾不是数字的节点

nds1 = [n for n in nds if re.findall(r"[a-zA-Z0-9_]+\d+$",n.name())]

然后for循环每一个结尾带数字的节点,然后将末尾的数字和前面的字符分离开形成一个列表,就想把abc123分离成["abc","123"]

然后将节点对象n和从名字里取的结尾数字name[0]分别作为字典的key和value,然后用sorted方法排序,key=lambda e:e[1]表示用字典的value排序,排完序,字典的value就没用了,而key是由小到大排完序的节点对象,然后用postion()方法拿出第一个对象的位置,然后循环每一个节点对象,让其往x方向+3,下面是排序后的结果显示

Houdini 如何将一堆乱七八糟的节点升序排成一横排,python小技巧

如此一来,再用merge合并或者switch选择分支就不会担心顺序排错的问题。