以下コードサンプル
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"]))
