Houdini 如何将一堆乱七八糟的节点升序排成一横排,python小技巧
我们在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,下面是排序后的结果显示
如此一来,再用merge合并或者switch选择分支就不会担心顺序排错的问题。
上一篇: Pyvista---(8)体素化显示表面网格和三角网格显示的区别
下一篇: 三角形图案创建功能