アトリビュートにJSON文字列を使う

以下コードサンプル

JSONデータからアトリビュートへ

ポイントごとにIDを照会し、一致していたらJSONに該当するブロックを文字列としてアトリビュートに割り当てる。

#
# IDが一致したらポイントアトリビュートにJSON構造を保存する
#
import json

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

node = hou.node('..')

# ポイントごとのループ
for i in range(len(geo.points())):
    
    id = geo.point(i).attribValue('id')
    
    if id:
        # アトリビュートを事前に設定する
        geo.addAttrib(hou.attribType.Point, "roundabout", "")
        
        # JSONデータ
        data = []
        data_string = node.parm("data_string").evalAsString()
        
        if data_string:
            data = json.loads(data_string)
            
            for i, item in enumerate(data):
                if item["id"] == id:
                    # JSON文字列(一行)に変換
                    json_string = json.dumps(item)
                    geo.point(i).setAttribValue('roundabout', json_string)
                    break

デバッグ表示

import json

node = hou.node("..")
data_string = node.parm("data_string").evalAsString()

if data_string:
    data = json.loads(data_string)

    # 改行・インデント付きの文字列に変換
    pretty = json.dumps(data, indent=4, ensure_ascii=False)

    print(pretty)

結果

[
    {
        "id": "3b980fc1",
        "name": "roundabout_test",
        "type": 1,
        "entryDist": 12.0,
        "outerDiameter": 40.0,
        "islandRadius": 10.0,
        "roadCount": 1,
        "connectedIds": [
            {
                "prim_id": "f44c6f12"
            },
            {
                "prim_id": "5dd6a861"
            },
            {
                "prim_id": "8eac1a1a"
            }
        ]
    }
]
[
    {
        "id": "3b980fc1",
        "name": "roundabout_test",
        "type": 1,
        "entryDist": 12.0,
        "outerDiameter": 40.0,
        "islandRadius": 10.0,
        "roadCount": 1,
        "connectedIds": [
            {
                "prim_id": "f44c6f12"
            },
            {
                "prim_id": "5dd6a861"
            },
            {
                "prim_id": "8eac1a1a"
            }
        ]
    }
]

各ポイントに格納したJSON文字列をアトリビュートに展開する

#
# JSONの文字列からアトリビュートをつくる
# JSON例:{"id": "86e263c2", "name": "", "type": 1, "entryDist": 12.0, "outerDiameter": 40.0, "islandRadius": 10.0, "roadCount": 1, "connectedIds": [{"prim_id": "f44c6f12"}, {"prim_id": "5dd6a861"}, {"prim_id": "8eac1a1a"}]}
#
import json

geo = hou.pwd().geometry()

geo.addAttrib(hou.attribType.Point, "outerDiameter", 0.0)
geo.addAttrib(hou.attribType.Point, "islandRadius", 0.0)
geo.addAttrib(hou.attribType.Point, "roadCount", 0)

for pt in geo.points():
    data_string = pt.attribValue("roundabout")
    if not data_string:
        continue

    data = json.loads(data_string)  # dict想定

    if "outerDiameter" in data:
        pt.setAttribValue("outerDiameter", float(data["outerDiameter"]))
    if "islandRadius" in data:
        pt.setAttribValue("islandRadius", float(data["islandRadius"]))
    if "roadCount" in data:
        pt.setAttribValue("roadCount", int(data["roadCount"]))
タイトルとURLをコピーしました