環境: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)
手動での入れ替え。