Multiparmの並べ替え・削除

環境:Houdini 20.0.751

MultiParm Listの項目をPythonで入れ替える方法。

並べ替え

特定のタブを一番上に移動させる場合

parm.moveDownMultiParmInstance()を使う。

multiparm = self.node.parm("prims")
count = self.selected_prim
for i in range(count):
    multiparm.moveDownMultiParmInstance(count)
    count -= 1

一つずつ移動するので、回数分ループさせる。

クラスを使い要素で並べ替える

特殊な条件でソートしたい場合もある。クラス配列をつくり、ラムダ式で順番を入れ替えている。

# カーブクラス
class Curve:
    def __init__(self, parent, start, end):
        self.parent = parent    # 親のポリライン番号
        self.start = start   # 始点(パラメトリック値)
        self.end = end    # 終点(パラメトリック値)

同じ要素で構成したクラスを作成する。

#
# Multiparmを並べ替える(特定の要素を基準に昇順で並べ替える)
#
curves = []
multiparm = self.node.parm("prims")
for i in range(multiparm.evalAsInt()):
    parent = self.node.parm("parent_%d" % i).eval()
    start = self.node.parm("start_%d" % i).eval()
    end = self.node.parm("end_%d" % i).eval()

    curves.append(Curve(parent, start, end))

curves = sorted(curves, key=lambda x: x.parent)

for i in range(len(curves)):
    self.node.parm("parent_%d" % i).set(curves[i].parent)
    self.node.parm("start_%d" % i).set(curves[i].start)
    self.node.parm("end_%d" % i).set(curves[i].end)

ラムダ式で並べ替え。

#
# Multiparmの特定項目を一番最初に移動させる   
#
def sortMultiParmList(self):
    index = self.selectedMultiparmIndex()
    multiparm = self.node.parm("prims")

    parent = self.node.parm("parent_%d" % index).eval()
    start = self.node.parm("start_%d" % index).eval()
    end = self.node.parm("end_%d" % index).eval()
    curve = Curve(parent, start, end)

    multiparm.removeMultiParmInstance(index)
    
    multiparm.insertMultiParmInstance(0)
    self.node.parm("parent_%d" % 0).set(curve.parent)
    self.node.parm("start_%d" % 0).set(curve.start)
    self.node.parm("end_%d" % 0).set(curve.end)

手動での入れ替え。

削除

削除にはparm.removeMultiParmInstance()を使う。

ループで処理するには注意が必要で、特定の条件で削除していく場合は、逆順にループを回す必要がある。先頭から順番に処理する場合、要素を削除した場合に後ろにある要素がひとつ前に詰められる影響があり、正しく処理されない問題が発生する。

# 特定のIDを探し適合しなかった場合にタブを削除する
count = multiparm.evalAsInt()
for i in reversed(range(count)):
    parent_id = hda_node.parm("parent_id_" + str(i)).eval()
    
    flag = 0
    for prim in curve_geo.iterPrims():
        id = prim.attribValue("id")
        if parent_id == id:
            flag = 1
            break
            
    if flag == 0:
        print(str(i) + "は適合する親がありません:" + str(parent_id))
        multiparm.removeMultiParmInstance(i)

タイトルとURLをコピーしました