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

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

手動で頑張る場合

要素をひとつひとつ書き出す。

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

    # 選択しているポリラインの情報を記録する
    positions = []
    multiparm_point = self.node.parm("points_" + str(self.selected_prim))
    for i in range(multiparm_point.evalAsInt()):
        parm_pos = self.node.parmTuple("pt_%d_%d" % (self.selected_prim, i)).eval() # parmから値を取得するにはeval()を使う
        pos = hou.Vector3((parm_pos[0],parm_pos[1],parm_pos[2]))
        positions.append(pos)

    roadName = self.node.parm("name_%d" % (self.selected_prim)).evalAsString()
    roadType = self.node.parm("roadType_%d" % (self.selected_prim)).evalAsInt()
    laneRight = self.node.parm("laneRight_%d" % (self.selected_prim)).evalAsInt()
    laneLeft = self.node.parm("laneLeft_%d" % (self.selected_prim)).evalAsInt()
    laneWidth = self.node.parm("laneWidth_%d" % (self.selected_prim)).evalAsFloat()
    
    # 削除
    multiparm = self.node.parm("prims")
    multiparm.removeMultiParmInstance(self.selected_prim)
    
    # 新しく作成
    multiparm.insertMultiParmInstance(0)
    multiparm_point = self.node.parm("points_" + str(0))
    for i in range(len(positions)):
        multiparm_point.insertMultiParmInstance(i)
        self.node.parmTuple("pt_%d_%d" % (0, i)).set(positions[i]) # 座標をセット

    self.node.parm("name_%d" % (0)).set(roadName)
    self.node.parm("roadType_%d" % (0)).set(roadType)
    self.node.parm("laneRight_%d" % (0)).set(laneRight)
    self.node.parm("laneLeft_%d" % (0)).set(laneLeft)
    self.node.parm("laneWidth_%d" % (0)).set(laneWidth)

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

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

# カーブクラス
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)

手動での入れ替え。

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