From 420260c2a713bd7729f31da1f95c3fbb064dba42 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl <cessen@cessen.com> Date: Fri, 15 Feb 2013 18:46:36 +0000 Subject: [PATCH] Rigify: improved rigify.utils.write_metarig() It is now able to write out all relevant layer data. Also, the script generated can now be directly run, for testing. --- rigify/utils.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/rigify/utils.py b/rigify/utils.py index 728fc7f90..3e23e3a4d 100644 --- a/rigify/utils.py +++ b/rigify/utils.py @@ -494,12 +494,14 @@ def get_layers(layers): return [x in layers for x in range(0, 32)] -def write_metarig(obj, layers=False, func_name="create_sample"): +def write_metarig(obj, layers=False, func_name="create"): """ Write a metarig as a python script, this rig is to have all info needed for generating the real rig with rigify. """ code = [] + + code.append("import bpy\n") code.append("def %s(obj):" % func_name) code.append(" # generated by rigify.utils.write_metarig") @@ -508,6 +510,18 @@ def write_metarig(obj, layers=False, func_name="create_sample"): code.append(" arm = obj.data") arm = obj.data + + # Rigify layer layout info + if layers and len(arm.rigify_layers) > 0: + code.append("\n for i in range(" + str(len(arm.rigify_layers)) + "):") + code.append(" arm.rigify_layers.add()\n") + + for i in range(len(arm.rigify_layers)): + name = arm.rigify_layers[i].name + row = arm.rigify_layers[i].row + code.append(' arm.rigify_layers[' + str(i) + '].name = "' + name + '"') + code.append(' arm.rigify_layers[' + str(i) + '].row = ' + str(row)) + # write parents first bones = [(len(bone.parent_recursive), bone.name) for bone in arm.edit_bones] bones.sort(key=lambda item: item[0]) @@ -569,6 +583,23 @@ def write_metarig(obj, layers=False, func_name="create_sample"): code.append(" bone.select_tail = True") code.append(" arm.edit_bones.active = bone") + # Set appropriate layers visible + if layers: + # Find what layers have bones on them + active_layers = [] + for bone_name in bones: + bone = obj.data.bones[bone_name] + for i in range(len(bone.layers)): + if bone.layers[i]: + if i not in active_layers: + active_layers.append(i) + active_layers.sort() + + code.append("\n arm.layers = [(x in " + str(active_layers) + ") for x in range(" + str(len(arm.layers)) + ")]") + + code.append('\nif __name__ == "__main__":') + code.append(" " + func_name + "(bpy.context.active_object)") + return "\n".join(code) -- GitLab