fix for some errors and local root bone override

This commit is contained in:
2009-12-10 14:32:37 +00:00
parent aaa181818e
commit 5c5ec6f0a7
5 changed files with 57 additions and 12 deletions

View File

@@ -24,8 +24,7 @@ from Mathutils import Vector
# TODO, have these in a more general module
from rna_prop_ui import rna_idprop_ui_prop_get
EMPTY_LAYER = [False] * 32
DELIMITER = '-._'
def submodule_func_from_type(bone_type):
type_pair = bone_type.split(".")
@@ -39,7 +38,7 @@ def submodule_func_from_type(bone_type):
# from rigify import leg
submod = __import__(name="%s.%s" % (__package__, submod_name), fromlist=[submod_name])
reload(submod)
return submod, getattr(submod, func_name)
@@ -63,6 +62,8 @@ def validate_rig(context, obj):
def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
from collections import OrderedDict
import rigify_utils
reload(rigify_utils)
global_undo = context.user_preferences.edit.global_undo
context.user_preferences.edit.global_undo = False
@@ -110,6 +111,12 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
# value: [functions, ...]
# each function is from the module. eg leg.ik, arm.main
bone_typeinfos = {}
# key: bone name
# value: [new_bone_name, ...]
# where each bone with a 'type' stores a list of bones that it created
# ...needed so we can override the root parent
bone_genesis = {}
# inspect all bones and assign their definitions before modifying
for pbone in obj.pose.bones:
@@ -162,6 +169,8 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
# Only blend results from the same submodule, eg.
# leg.ik and arm.fk could not be blended.
results = OrderedDict()
bone_names_pre = set([bone.name for bone in arm.bones])
for submod_name, type_func in bone_typeinfos[bone_name]:
# this bones definition of the current typeinfo
@@ -186,15 +195,41 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True):
if len(result_submod) == 2:
blend_bone_list(obj, definition, result_submod[0], result_submod[1], target_bone=bone_name)
bone_names_post = set([bone.name for bone in arm.bones])
# Store which bones were created from this one
bone_genesis[bone_name] = list(bone_names_post - bone_names_pre)
# need a reverse lookup on bone_genesis so as to know immediately
# where a bone comes from
bone_genesis_reverse = {}
for bone_name, bone_children in bone_genesis.items():
for bone_child_name in bone_children:
bone_genesis_reverse[bone_child_name] = bone_name
if root_bone:
# assign all new parentless bones to this
bpy.ops.object.mode_set(mode='EDIT')
root_ebone = arm.edit_bones[root_bone]
for ebone in arm.edit_bones:
if ebone.parent is None and ebone.name not in base_names:
bone_name = ebone.name
if ebone.parent is None and bone_name not in base_names:
# check for override
bone_creator = bone_genesis_reverse[bone_name]
pbone_creator = obj.pose.bones[bone_creator]
root_bone_override = pbone_creator.get("root", "")
if root_bone_override:
root_ebone_tmp = arm.edit_bones[root_bone_override]
else:
root_ebone_tmp = root_ebone
ebone.connected = False
ebone.parent = root_ebone
bpy.ops.object.mode_set(mode='OBJECT')
@@ -277,9 +312,11 @@ def generate_test(context, metarig_type="", GENERATE_FINAL=True):
def generate_test_all(context, GRAPH=False):
import rigify
import rigify_utils
import graphviz_export
import os
reload(rigify)
reload(rigify_utils)
reload(graphviz_export)
new_objects = rigify.generate_test(context)

View File

@@ -75,7 +75,7 @@ def main(obj, bone_definition, base_names):
'''
Use this bone to define a delta thats applied to its child in pose mode.
'''
return
mode_orig = obj.mode
bpy.ops.object.mode_set(mode='OBJECT')

View File

@@ -19,8 +19,7 @@
# <pep8 compliant>
import bpy
from rigify import EMPTY_LAYER
from rigify_utils import copy_bone_simple, get_side_name, get_base_name
from rigify_utils import copy_bone_simple, get_side_name, get_base_name, EMPTY_LAYER
from rna_prop_ui import rna_idprop_ui_prop_get
from functools import reduce
@@ -90,7 +89,9 @@ def main(obj, bone_definition, base_names):
# *** EDITMODE
# get assosiated data
arm, orig_pbone, orig_ebone = get_bone_data(obj, bone_definition[0])
arm = obj.data
orig_pbone = obj.pose.bones[bone_definition[0]]
orig_ebone = arm.edit_bones[bone_definition[0]]
obj.animation_data_create() # needed if its a new armature with no keys
@@ -117,7 +118,7 @@ def main(obj, bone_definition, base_names):
children = [pbone.name for pbone in children]
# set an alternate layer for driver bones
other_layer = empty_layer[:]
other_layer = EMPTY_LAYER[:]
other_layer[8] = True

View File

@@ -118,9 +118,9 @@ def main(obj, bone_definition, base_names):
bpy.ops.object.mode_set(mode='OBJECT')
arm, control_pbone, control_ebone = get_bone_data(obj, control_name)
arm, pinky_pbone, pinky_ebone = get_bone_data(obj, children[0])
arm = obj.data
control_pbone = obj.pose.bones[control_name]
pinky_pbone = obj.pose.bones[children[0]]
control_pbone.rotation_mode = 'YZX'
control_pbone.lock_rotation = False, True, True

View File

@@ -25,6 +25,13 @@
# for rigify so in some cases seemingly generic functions make assumptions
# that a generic function would need to check for.
import bpy
from Mathutils import Vector
from rna_prop_ui import rna_idprop_ui_prop_get
DELIMITER = '-._'
EMPTY_LAYER = [False] * 32
def add_stretch_to(obj, from_name, to_name, name):
'''
Adds a bone that stretches from one to another