Skip to content
Snippets Groups Projects
Commit 420260c2 authored by Nathan Vegdahl's avatar Nathan Vegdahl
Browse files

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.
parent 6be168ea
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment