Python SOPのアトリビュート参照と編集

ジオメトリ

input1に差したジオメトリを参照する場合

inputs = node.inputs()
geo1 = inputs[1].geometry()

# Cdを取得
list_color = geo1.pointFloatAttribValues('Cd')

for point in geo1.iterPoints():
    pos = point.position()
    color = point.attribValue('Cd')

Point

アトリビュートを取得する

# Pointのアトリビュート"ratio"を配列で取得
list_ratio = geo.pointFloatAttribValues('ratio')
print list_ratio
# (0.11170145124197006, 0.1238456666469574, 0.13478811085224152, 0.07900062948465347)

# Cdを取得:そのままVector3の値が配列に格納される
list_color = geo.pointFloatAttribValues('Cd')
print list_color
# (0.05352380499243736, 0.14770568907260895, 0.1253947913646698, 0.07233432680368423, 0.21750175952911377, 0.1926003396511078)

アトリビュートを編集する

# @numpt
numpt = len(geo.points())
print numpt

for point in geo.iterPoints():
    # @ptnum
    index = point.number()

    # 座標を変更
    pos = point.position()
    point.setPosition(pos + hou.Vector3([0, 1, 0]))

    # Cd値を取得する
    color = point.attribValue('Cd')
    print color

    # Cd値を修正する
    point.setAttribValue('Cd', hou.Vector3([1, 0, 0]))

Primitive

プリミティブの値の取得

epsilon = geo.prim(0).attribValue('reductionLength')

プリミティブでアトリビュートの作成、読み込み、値の設定をする

geo.addAttrib(hou.attribType.Prim, "newName", "test")

for prim in geo.prims():
    str = prim.attribValue('name')
    prim.setAttribValue('newName', str + "_test")

各プリミティブからポイント座標を取得する

node = hou.pwd()
geo = node.geometry()

for prim in geo.iterPrims():
    for point in prim.points():
        print(point.position())

'''
[-167.111, 318.391, -130.838]
[-144.301, 413.039, 92.9219]
[40.3859, 440.139, 290.962]
[156.143, 384.721, 473.141]
'''

Detail

型別で読み込む例

# int
car_size = geo.intAttribValue('car_size')
# int配列
car_size_list = geo.intListAttribValue('car_size_list')

# float
car_speed = geo.floatAttribValue('car_speed')
# float配列
car_speed_list = geo.floatListAttribValue('car_speed_list')

# string
car_name = geo.stringAttribValue('car_name')
# string配列
car_list = geo.stringListAttribValue('car_name_list')
# 他のノードから参照する場合
ref_node = hou.node("../object_merge_grid")
ref_geo = ref_node.geometry()
rows = ref_geo.intAttribValue('rows')
columns = ref_geo.intAttribValue('cols')

PythonノードではDetailはGlobalになる。

# Detailに文字列の変数を追加する場合
geo.addAttrib(hou.attribType.Global, 'path', '')

# 値を書き込む
geo.setGlobalAttribValue('path', 'abcdefg')

直下につないだPythonノードで変数を取得する場合

newPath = geo.stringAttribValue('path')

配列の場合

# 配列でアトリビュートを追加して値を設定する
geo.addArrayAttrib(hou.attribType.Global, 'cat_list', hou.attribData.String, 1)
# 値を書き込む
geo.setGlobalAttribValue('cat_list', self.cat_list)
タイトルとURLをコピーしました