diff --git a/rigify/generate.py b/rigify/generate.py index 96a6d68d60af07c1b4317e6309c5b707bcbaec97..73552442044516ab3ae8d75dadc40c278f53c57e 100644 --- a/rigify/generate.py +++ b/rigify/generate.py @@ -130,6 +130,15 @@ def generate_rig(context, metarig): obj.select = True scene.objects.active = obj + # Copy over bone properties + for bone in metarig.data.bones: + bone_gen = obj.data.bones[bone.name] + + # B-bone stuff + bone_gen.bbone_segments = bone.bbone_segments + bone_gen.bbone_in = bone.bbone_in + bone_gen.bbone_out = bone.bbone_out + # Copy over the pose_bone properties for bone in metarig.pose.bones: bone_gen = obj.pose.bones[bone.name] @@ -146,14 +155,28 @@ def generate_rig(context, metarig): for prop in bone.keys(): bone_gen[prop] = bone[prop] - # Copy over bone properties - for bone in metarig.data.bones: - bone_gen = obj.data.bones[bone.name] - - # B-bone stuff - bone_gen.bbone_segments = bone.bbone_segments - bone_gen.bbone_in = bone.bbone_in - bone_gen.bbone_out = bone.bbone_out + # Constraints + for con1 in bone.constraints: + con2 = bone_gen.constraints.new(type=con1.type) + + # Copy attributes + keys = dir(con1) + for key in keys: + if not key.startswith("_") \ + and not key.startswith("error_") \ + and key != "is_valid" \ + and key != "rna_type" \ + and key != "type" \ + and key != "bl_rna": + try: + setattr(con2, key, getattr(con1, key)) + except AttributeError: + print("Could not write to constraint attribute '%s'" % key) + + # Set metarig target to rig target + if "target" in keys: + if getattr(con2, "target") == metarig: + setattr(con2, "target", obj) t.tick("Duplicate rig: ") #---------------------------------- diff --git a/rigify/utils.py b/rigify/utils.py index c97712228b03d0dc52c5eaed9c8f6a133bd6dadf..4add7a15052315c1893629cf15dee219b0ed7f69 100644 --- a/rigify/utils.py +++ b/rigify/utils.py @@ -185,6 +185,17 @@ def copy_bone(obj, bone_name, assign_name=''): pose_bone_2.lock_rotation_w = pose_bone_1.lock_rotation_w pose_bone_2.lock_rotations_4d = pose_bone_1.lock_rotations_4d + # Copy custom properties + for key in pose_bone_1.keys(): + if key != "_RNA_UI" \ + and key != "rigify_parameters" \ + and key != "rigify_type": + prop1 = rna_idprop_ui_prop_get(pose_bone_1, key, create=False) + prop2 = rna_idprop_ui_prop_get(pose_bone_2, key, create=True) + pose_bone_2[key] = pose_bone_1[key] + for key in prop1.keys(): + prop2[key] = prop1[key] + bpy.ops.object.mode_set(mode='EDIT') return bone_name_2