"""rename_clip.py — rename the animation inside a GLB (for dance-code adoption). Used when a provisional dance (nd##) is adopted and gets its final dance code (see docs/dances/REGISTRY.md). Renames the clip baked into the GLB; the pack rename is just the output filename. Usage: blender --background --python tools/rename_clip.py -- \ --src --out --name """ import bpy, sys, argparse def parse(): argv = sys.argv[sys.argv.index("--")+1:] if "--" in sys.argv else [] p = argparse.ArgumentParser() p.add_argument("--src", required=True) p.add_argument("--out", required=True) p.add_argument("--name", required=True) return p.parse_args(argv) def main(): a = parse() bpy.ops.wm.read_factory_settings(use_empty=True) bpy.ops.import_scene.gltf(filepath=a.src) arm = next(o for o in bpy.data.objects if o.type == 'ARMATURE') act = arm.animation_data.action if getattr(act, "slots", None) and arm.animation_data.action_slot is None: arm.animation_data.action_slot = act.slots[0] old = act.name act.name = a.name for t in list(arm.animation_data.nla_tracks): arm.animation_data.nla_tracks.remove(t) track = arm.animation_data.nla_tracks.new() track.name = a.name strip = track.strips.new(a.name, 0, act) strip.name = a.name arm.animation_data.action = None for o in [o for o in bpy.data.objects if o.type == 'MESH']: bpy.data.objects.remove(o, do_unlink=True) bpy.ops.export_scene.gltf( filepath=a.out, export_animation_mode="NLA_TRACKS", export_force_sampling=True, export_optimize_animation_size=False, ) print(f"[rename_clip] '{old}' -> '{a.name}' EXPORTED {a.out}") if __name__ == "__main__": main()