Files
settled-reach/tooling/blender_list_bones.py
T
jpmschweitzerandClaude Opus 4.6 bcd5887b82 fix(client): address PR #95 review — 8 items
SLOT_TO_BONE expanded to 12 slots (earring_l/r, necklace, wrist_l/r).
_clear() outline teardown ordering fixed. toon_masked.gdshader: removed
cull_disabled, added ALPHA output. _attach_to_bone() returns node instead
of bool. skin_tone clamped in from_dict(). D-160 segment count 15→17.
Blender scripts: docstrings + __main__ guards. Reload test tightened.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 07:59:23 +01:00

38 lines
1.1 KiB
Python

"""
blender_list_bones.py
Usage: tooling/blender --background --python tooling/blender_list_bones.py -- <input.glb>
Lists all bone names in a GLB/GLTF armature, sorted alphabetically.
Used to verify bone naming after the January 2026 Quaternius naming update.
"""
import sys
import bpy
if __name__ == "__main__":
argv = sys.argv
if "--" not in argv:
print("Usage: tooling/blender --background --python tooling/blender_list_bones.py -- <input.glb>")
sys.exit(1)
args = argv[argv.index("--") + 1:]
if len(args) < 1:
print("ERROR: Provide a GLB/GLTF path.")
sys.exit(1)
input_path = args[0]
bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.import_scene.gltf(filepath=input_path)
for obj in bpy.context.scene.objects:
if obj.type == 'ARMATURE':
print(f"ARMATURE: {obj.name}{len(obj.data.bones)} bones")
for b in sorted(obj.data.bones, key=lambda x: x.name):
print("BONE: " + b.name)
break
else:
print("ERROR: No armature found in the imported file.")
sys.exit(1)