diff --git a/rigify/__init__.py b/rigify/__init__.py index ca99e31ca71a0248cadcbcc5e72a754ed1316d70..1ee7d8d85f76bd0b3d9af7d0061435dafc69a3ee 100644 --- a/rigify/__init__.py +++ b/rigify/__init__.py @@ -131,7 +131,7 @@ def register(): bpy.utils.register_class(RigifyArmatureLayer) bpy.types.PoseBone.rigify_type = bpy.props.StringProperty(name="Rigify Type", description="Rig type for this bone") - bpy.types.PoseBone.rigify_parameters = bpy.props.CollectionProperty(type=RigifyParameters) + bpy.types.PoseBone.rigify_parameters = bpy.props.PointerProperty(type=RigifyParameters) bpy.types.Armature.rigify_layers = bpy.props.CollectionProperty(type=RigifyArmatureLayer) diff --git a/rigify/generate.py b/rigify/generate.py index 3d595b4208e05a8c9a29cf33ad019ebc40a4cb7a..89f89b71759d32d1554b32b3102e0733693207d3 100644 --- a/rigify/generate.py +++ b/rigify/generate.py @@ -157,17 +157,15 @@ def generate_rig(context, metarig): # rigify_type and rigify_parameters bone_gen.rigify_type = bone.rigify_type - if len(bone.rigify_parameters) > 0: - bone_gen.rigify_parameters.add() - for prop in dir(bone_gen.rigify_parameters[0]): - if (not prop.startswith("_")) \ - and (not prop.startswith("bl_")) \ - and (prop != "rna_type"): - try: - setattr(bone_gen.rigify_parameters[0], prop, \ - getattr(bone.rigify_parameters[0], prop)) - except AttributeError: - print("FAILED TO COPY PARAMETER: " + str(prop)) + for prop in dir(bone_gen.rigify_parameters): + if (not prop.startswith("_")) \ + and (not prop.startswith("bl_")) \ + and (prop != "rna_type"): + try: + setattr(bone_gen.rigify_parameters, prop, \ + getattr(bone.rigify_parameters, prop)) + except AttributeError: + print("FAILED TO COPY PARAMETER: " + str(prop)) # Custom properties for prop in bone.keys(): @@ -412,10 +410,7 @@ def get_bone_rigs(obj, bone_name, halt_on_missing=False): pass else: # Gather parameters - try: - params = obj.pose.bones[bone_name].rigify_parameters[0] - except (KeyError, IndexError): - params = None + params = obj.pose.bones[bone_name].rigify_parameters # Get the rig try: diff --git a/rigify/metarigs/human.py b/rigify/metarigs/human.py index 23ec2483ae3917976ddd2adcbfe43f1093d9fd7d..6cc92f3b551171fc25b1694c998b4b5da00720e0 100644 --- a/rigify/metarigs/human.py +++ b/rigify/metarigs/human.py @@ -500,8 +500,7 @@ def create(obj): bpy.ops.object.mode_set(mode='OBJECT') pbone = obj.pose.bones[bones['hips']] pbone.rigify_type = 'spine' - pbone.rigify_parameters.add() - pbone.rigify_parameters[0].chain_bone_controls = "1, 2, 3" + pbone.rigify_parameters.chain_bone_controls = "1, 2, 3" pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False @@ -524,13 +523,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_ik_layers = True + pbone.rigify_parameters.separate_ik_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].ik_layers = [False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.ik_layers = [False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['thigh.R']] @@ -541,13 +539,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_ik_layers = True + pbone.rigify_parameters.separate_ik_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].ik_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.ik_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['ribs']] @@ -590,7 +587,6 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'YXZ' pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['shoulder.R']] pbone.rigify_type = 'basic.copy' pbone.lock_location = (True, True, True) @@ -599,7 +595,6 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'YXZ' pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['foot.L']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) @@ -664,13 +659,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_ik_layers = True + pbone.rigify_parameters.separate_ik_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].ik_layers = [False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.ik_layers = [False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['upper_arm.R']] @@ -681,13 +675,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_ik_layers = True + pbone.rigify_parameters.separate_ik_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].ik_layers = [False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.ik_layers = [False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['toe.L']] @@ -746,7 +739,6 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'YXZ' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['palm.02.L']] pbone.rigify_type = '' pbone.lock_location = (True, True, True) @@ -779,7 +771,6 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'YXZ' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['palm.02.R']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) @@ -812,13 +803,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['thumb.01.L']] @@ -829,13 +819,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass pbone = obj.pose.bones[bones['finger_middle.01.L']] @@ -846,13 +835,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['finger_ring.01.L']] @@ -863,13 +851,13 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() + try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['finger_pinky.01.L']] @@ -880,13 +868,13 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() + try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['finger_index.01.R']] @@ -897,13 +885,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass pbone = obj.pose.bones[bones['thumb.01.R']] @@ -914,13 +901,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['finger_middle.01.R']] @@ -931,13 +917,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['finger_ring.01.R']] @@ -948,13 +933,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['finger_pinky.01.R']] @@ -965,13 +949,12 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone.rigify_parameters.add() try: - pbone.rigify_parameters[0].separate_extra_layers = True + pbone.rigify_parameters.separate_extra_layers = True except AttributeError: pass try: - pbone.rigify_parameters[0].extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.rigify_parameters.extra_layers = [False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass pbone = obj.pose.bones[bones['finger_index.02.L']] diff --git a/rigify/rigs/basic/copy.py b/rigify/rigs/basic/copy.py index a961a71ad97b3240273b290280108ceceec82f33..be04830b30f126af59084e352c2202977cbdac6d 100644 --- a/rigify/rigs/basic/copy.py +++ b/rigify/rigs/basic/copy.py @@ -83,18 +83,18 @@ class Rig: create_bone_widget(self.obj, bone) @classmethod - def add_parameters(self, group): + def add_parameters(self, params): """ Add the parameters of this rig type to the RigifyParameters PropertyGroup """ - group.make_control = bpy.props.BoolProperty(name="Control", default=True, description="Create a control bone for the copy") - group.make_deform = bpy.props.BoolProperty(name="Deform", default=True, description="Create a deform bone for the copy") + params.make_control = bpy.props.BoolProperty(name="Control", default=True, description="Create a control bone for the copy") + params.make_deform = bpy.props.BoolProperty(name="Deform", default=True, description="Create a deform bone for the copy") @classmethod def parameters_ui(self, layout, obj, bone): """ Create the ui for the rig parameters. """ - params = obj.pose.bones[bone].rigify_parameters[0] + params = obj.pose.bones[bone].rigify_parameters r = layout.row() r.prop(params, "make_control") @@ -127,7 +127,6 @@ class Rig: pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.rigify_parameters.add() bpy.ops.object.mode_set(mode='EDIT') for bone in arm.edit_bones: diff --git a/rigify/rigs/basic/copy_chain.py b/rigify/rigs/basic/copy_chain.py index eaff060f9b888255f26a266e150776b22b7d7345..4b4f0c8501cedd544c7e3905f7752ed7218fdb0a 100644 --- a/rigify/rigs/basic/copy_chain.py +++ b/rigify/rigs/basic/copy_chain.py @@ -122,18 +122,18 @@ class Rig: create_bone_widget(self.obj, bone) @classmethod - def add_parameters(self, group): + def add_parameters(self, params): """ Add the parameters of this rig type to the RigifyParameters PropertyGroup """ - group.make_controls = bpy.props.BoolProperty(name="Controls", default=True, description="Create control bones for the copy") - group.make_deforms = bpy.props.BoolProperty(name="Deform", default=True, description="Create deform bones for the copy") + params.make_controls = bpy.props.BoolProperty(name="Controls", default=True, description="Create control bones for the copy") + params.make_deforms = bpy.props.BoolProperty(name="Deform", default=True, description="Create deform bones for the copy") @classmethod def parameters_ui(self, layout, obj, bone): """ Create the ui for the rig parameters. """ - params = obj.pose.bones[bone].rigify_parameters[0] + params = obj.pose.bones[bone].rigify_parameters r = layout.row() r.prop(params, "make_controls") @@ -180,7 +180,6 @@ class Rig: pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['bone.02']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) diff --git a/rigify/rigs/biped/arm/__init__.py b/rigify/rigs/biped/arm/__init__.py index e6c426dbeecfed8f5254b2242aed7e39f22d822c..41fe1f718e75c6f42999e1d1042d32a07e18e8eb 100644 --- a/rigify/rigs/biped/arm/__init__.py +++ b/rigify/rigs/biped/arm/__init__.py @@ -89,28 +89,28 @@ class Rig: return [script % (fk_controls[0], fk_controls[1], fk_controls[2], ik_controls[0], ik_controls[1], ik_controls[2], ik_controls[3])] @classmethod - def add_parameters(self, group): + def add_parameters(self, params): """ Add the parameters of this rig type to the RigifyParameters PropertyGroup """ items = [('X', 'X', ''), ('Y', 'Y', ''), ('Z', 'Z', ''), ('-X', '-X', ''), ('-Y', '-Y', ''), ('-Z', '-Z', '')] - group.primary_rotation_axis = bpy.props.EnumProperty(items=items, name="Primary Rotation Axis", default='X') + params.primary_rotation_axis = bpy.props.EnumProperty(items=items, name="Primary Rotation Axis", default='X') - group.bend_hint = bpy.props.BoolProperty(name="Bend Hint", default=True, description="Give IK chain a hint about which way to bend. Useful for perfectly straight chains") + params.bend_hint = bpy.props.BoolProperty(name="Bend Hint", default=True, description="Give IK chain a hint about which way to bend. Useful for perfectly straight chains") - group.separate_ik_layers = bpy.props.BoolProperty(name="Separate IK Control Layers:", default=False, description="Enable putting the ik controls on a separate layer from the fk controls") - group.ik_layers = bpy.props.BoolVectorProperty(size=32, description="Layers for the ik controls to be on") + params.separate_ik_layers = bpy.props.BoolProperty(name="Separate IK Control Layers:", default=False, description="Enable putting the ik controls on a separate layer from the fk controls") + params.ik_layers = bpy.props.BoolVectorProperty(size=32, description="Layers for the ik controls to be on") - group.use_upper_arm_twist = bpy.props.BoolProperty(name="Upper Arm Twist", default=True, description="Generate the dual-bone twist setup for the upper arm") - group.use_forearm_twist = bpy.props.BoolProperty(name="Forearm Twist", default=True, description="Generate the dual-bone twist setup for the forearm") + params.use_upper_arm_twist = bpy.props.BoolProperty(name="Upper Arm Twist", default=True, description="Generate the dual-bone twist setup for the upper arm") + params.use_forearm_twist = bpy.props.BoolProperty(name="Forearm Twist", default=True, description="Generate the dual-bone twist setup for the forearm") @classmethod def parameters_ui(self, layout, obj, bone): """ Create the ui for the rig parameters. """ - params = obj.pose.bones[bone].rigify_parameters[0] + params = obj.pose.bones[bone].rigify_parameters r = layout.row() r.prop(params, "separate_ik_layers") @@ -206,7 +206,6 @@ class Rig: pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['forearm']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) diff --git a/rigify/rigs/biped/leg/__init__.py b/rigify/rigs/biped/leg/__init__.py index 3827d7ccfce39971570ac3c38d23adb6ca2a9265..dbeeb0ef8f7ed8458e8152a3fec8dcb3f01a607f 100644 --- a/rigify/rigs/biped/leg/__init__.py +++ b/rigify/rigs/biped/leg/__init__.py @@ -91,28 +91,28 @@ class Rig: return [script % (fk_controls[0], fk_controls[1], fk_controls[2], fk_controls[3], ik_controls[0], ik_controls[1], ik_controls[2], ik_controls[3], ik_controls[4], ik_controls[5])] @classmethod - def add_parameters(self, group): + def add_parameters(self, params): """ Add the parameters of this rig type to the RigifyParameters PropertyGroup """ items = [('X', 'X', ''), ('Y', 'Y', ''), ('Z', 'Z', ''), ('-X', '-X', ''), ('-Y', '-Y', ''), ('-Z', '-Z', '')] - group.primary_rotation_axis = bpy.props.EnumProperty(items=items, name="Primary Rotation Axis", default='X') + params.primary_rotation_axis = bpy.props.EnumProperty(items=items, name="Primary Rotation Axis", default='X') - group.bend_hint = bpy.props.BoolProperty(name="Bend Hint", default=True, description="Give IK chain a hint about which way to bend (useful for perfectly straight chains)") + params.bend_hint = bpy.props.BoolProperty(name="Bend Hint", default=True, description="Give IK chain a hint about which way to bend (useful for perfectly straight chains)") - group.separate_ik_layers = bpy.props.BoolProperty(name="Separate IK Control Layers:", default=False, description="Enable putting the ik controls on a separate layer from the fk controls") - group.ik_layers = bpy.props.BoolVectorProperty(size=32, description="Layers for the ik controls to be on") + params.separate_ik_layers = bpy.props.BoolProperty(name="Separate IK Control Layers:", default=False, description="Enable putting the ik controls on a separate layer from the fk controls") + params.ik_layers = bpy.props.BoolVectorProperty(size=32, description="Layers for the ik controls to be on") - group.use_thigh_twist = bpy.props.BoolProperty(name="Thigh Twist", default=True, description="Generate the dual-bone twist setup for the thigh") - group.use_shin_twist = bpy.props.BoolProperty(name="Shin Twist", default=True, description="Generate the dual-bone twist setup for the shin") + params.use_thigh_twist = bpy.props.BoolProperty(name="Thigh Twist", default=True, description="Generate the dual-bone twist setup for the thigh") + params.use_shin_twist = bpy.props.BoolProperty(name="Shin Twist", default=True, description="Generate the dual-bone twist setup for the shin") @classmethod def parameters_ui(self, layout, obj, bone): """ Create the ui for the rig parameters. """ - params = obj.pose.bones[bone].rigify_parameters[0] + params = obj.pose.bones[bone].rigify_parameters r = layout.row() r.prop(params, "separate_ik_layers") @@ -229,7 +229,6 @@ class Rig: pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['shin']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) diff --git a/rigify/rigs/finger.py b/rigify/rigs/finger.py index 0dee1b0dc5489d4b1e923298babec311b6acfb03..15e1bbacffe4fa2c65a4f158eaf2313b9f752f2e 100644 --- a/rigify/rigs/finger.py +++ b/rigify/rigs/finger.py @@ -275,23 +275,23 @@ class Rig: self.control() @classmethod - def add_parameters(self, group): + def add_parameters(self, params): """ Add the parameters of this rig type to the RigifyParameters PropertyGroup """ items = [('X', 'X', ''), ('Y', 'Y', ''), ('Z', 'Z', ''), ('-X', '-X', ''), ('-Y', '-Y', ''), ('-Z', '-Z', '')] - group.primary_rotation_axis = bpy.props.EnumProperty(items=items, name="Primary Rotation Axis", default='X') + params.primary_rotation_axis = bpy.props.EnumProperty(items=items, name="Primary Rotation Axis", default='X') - group.separate_extra_layers = bpy.props.BoolProperty(name="Separate Secondary Control Layers:", default=False, description="Enable putting the secondary controls on a separate layer from the primary controls") - group.extra_layers = bpy.props.BoolVectorProperty(size=32, description="Layers for the secondary controls to be on") + params.separate_extra_layers = bpy.props.BoolProperty(name="Separate Secondary Control Layers:", default=False, description="Enable putting the secondary controls on a separate layer from the primary controls") + params.extra_layers = bpy.props.BoolVectorProperty(size=32, description="Layers for the secondary controls to be on") - group.use_digit_twist = bpy.props.BoolProperty(name="Digit Twist", default=True, description="Generate the dual-bone twist setup for the first finger digit") + params.use_digit_twist = bpy.props.BoolProperty(name="Digit Twist", default=True, description="Generate the dual-bone twist setup for the first finger digit") @classmethod def parameters_ui(self, layout, obj, bone): """ Create the ui for the rig parameters. """ - params = obj.pose.bones[bone].rigify_parameters[0] + params = obj.pose.bones[bone].rigify_parameters r = layout.row() r.prop(params, "separate_extra_layers") @@ -383,7 +383,6 @@ class Rig: pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'YZX' - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['finger.02']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) diff --git a/rigify/rigs/misc/delta.py b/rigify/rigs/misc/delta.py index b32134ffd502333aeab937c48a9b753bd826bf46..d13f7d4e6320a242513d526b0aeebd13ae47b61b 100644 --- a/rigify/rigs/misc/delta.py +++ b/rigify/rigs/misc/delta.py @@ -114,7 +114,6 @@ class Rig: pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['Bone']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) diff --git a/rigify/rigs/neck_short.py b/rigify/rigs/neck_short.py index 074208752430ff54cf113b6912c1c4ecfc4bac9a..a94b3ceff912038488549ce9e60fa8462fb10147 100644 --- a/rigify/rigs/neck_short.py +++ b/rigify/rigs/neck_short.py @@ -313,13 +313,8 @@ class Rig: i += 1 # Create control widgets - w1 = create_circle_widget(self.obj, neck_ctrl, radius=1.0, head_tail=0.5) - w2 = create_circle_widget(self.obj, head_ctrl, radius=1.0, head_tail=0.5) - - if w1 != None: - obj_to_bone(w1, self.obj, self.org_bones[(len(self.org_bones) - 1) // 2]) - if w2 != None: - obj_to_bone(w2, self.obj, self.org_bones[-1]) + w1 = create_circle_widget(self.obj, neck_ctrl, radius=1.0, head_tail=0.5, bone_transform_name=self.org_bones[(len(self.org_bones) - 1) // 2]) + w2 = create_circle_widget(self.obj, head_ctrl, radius=1.0, head_tail=0.5, bone_transform_name=self.org_bones[-1]) # Return control bones return (head_ctrl, neck_ctrl) @@ -370,7 +365,6 @@ class Rig: pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.rigify_parameters.add() pbone = obj.pose.bones[bones['head']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) diff --git a/rigify/rigs/palm.py b/rigify/rigs/palm.py index 1d25050a153d790509b060e2a4841290c898d0df..f055dffb44752460ccbb009b6001402822a7bf94 100644 --- a/rigify/rigs/palm.py +++ b/rigify/rigs/palm.py @@ -161,20 +161,20 @@ class Rig: mod.levels = 2 @classmethod - def add_parameters(self, group): + def add_parameters(self, params): """ Add the parameters of this rig type to the RigifyParameters PropertyGroup """ items = [('X', 'X', ''), ('Z', 'Z', '')] - group.palm_rotation_axis = bpy.props.EnumProperty(items=items, name="Palm Rotation Axis", default='X') + params.palm_rotation_axis = bpy.props.EnumProperty(items=items, name="Palm Rotation Axis", default='X') @classmethod def parameters_ui(self, layout, obj, bone): """ Create the ui for the rig parameters. """ - params = obj.pose.bones[bone].rigify_parameters[0] + params = obj.pose.bones[bone].rigify_parameters r = layout.row() r.label(text="Primary rotation axis:") @@ -259,7 +259,6 @@ class Rig: pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'YXZ' - pbone.rigify_parameters.add() bpy.ops.object.mode_set(mode='EDIT') for bone in arm.edit_bones: diff --git a/rigify/rigs/spine.py b/rigify/rigs/spine.py index cee086152a3dd730c5ed2c68f37342afdcf00947..56888c8a4e9bce53f61f2b6960a2b2e5213032ff 100644 --- a/rigify/rigs/spine.py +++ b/rigify/rigs/spine.py @@ -483,30 +483,23 @@ class Rig: # Control appearance # Main pb[main_control].custom_shape_transform = pb[main_wgt2] - w = create_compass_widget(self.obj, main_control) - if w != None: - obj_to_bone(w, self.obj, main_wgt2) + w = create_compass_widget(self.obj, main_control, bone_transform_name=main_wgt2) # Spines for name, i in zip(controls[1:-1], self.control_indices[1:-1]): pb[name].custom_shape_transform = pb[self.org_bones[i]] # Create control widgets - w = create_circle_widget(self.obj, name, radius=1.0, head_tail=0.5, with_line=True) - if w != None: - obj_to_bone(w, self.obj, self.org_bones[i]) + w = create_circle_widget(self.obj, name, radius=1.0, head_tail=0.5, with_line=True, bone_transform_name=self.org_bones[i]) + # Hips pb[controls[0]].custom_shape_transform = pb[self.org_bones[0]] # Create control widgets - w = create_circle_widget(self.obj, controls[0], radius=1.0, head_tail=0.5, with_line=True) - if w != None: - obj_to_bone(w, self.obj, self.org_bones[0]) + w = create_circle_widget(self.obj, controls[0], radius=1.0, head_tail=0.5, with_line=True, bone_transform_name=self.org_bones[0]) # Ribs pb[controls[-1]].custom_shape_transform = pb[self.org_bones[-1]] # Create control widgets - w = create_circle_widget(self.obj, controls[-1], radius=1.0, head_tail=0.5, with_line=True) - if w != None: - obj_to_bone(w, self.obj, self.org_bones[-1]) + w = create_circle_widget(self.obj, controls[-1], radius=1.0, head_tail=0.5, with_line=True, bone_transform_name=self.org_bones[-1]) # Layers pb[main_control].bone.layers = pb[self.org_bones[0]].bone.layers @@ -526,19 +519,19 @@ class Rig: return [script % (controls[0], controls_string)] @classmethod - def add_parameters(self, group): + def add_parameters(self, params): """ Add the parameters of this rig type to the RigifyParameters PropertyGroup """ - group.spine_main_control_name = bpy.props.StringProperty(name="Main control name", default="torso", description="Name that the main control bone should be given") - group.rest_pivot_slide = bpy.props.FloatProperty(name="Rest Pivot Slide", default=0.0, min=0.0, max=1.0, soft_min=0.0, soft_max=1.0, description="The pivot slide value in the rest pose") - group.chain_bone_controls = bpy.props.StringProperty(name="Control bone list", default="", description="Define which bones have controls") + params.spine_main_control_name = bpy.props.StringProperty(name="Main control name", default="torso", description="Name that the main control bone should be given") + params.rest_pivot_slide = bpy.props.FloatProperty(name="Rest Pivot Slide", default=0.0, min=0.0, max=1.0, soft_min=0.0, soft_max=1.0, description="The pivot slide value in the rest pose") + params.chain_bone_controls = bpy.props.StringProperty(name="Control bone list", default="", description="Define which bones have controls") @classmethod def parameters_ui(self, layout, obj, bone): """ Create the ui for the rig parameters. """ - params = obj.pose.bones[bone].rigify_parameters[0] + params = obj.pose.bones[bone].rigify_parameters r = layout.row() r.prop(params, "spine_main_control_name") @@ -602,8 +595,7 @@ class Rig: pbone.rotation_mode = 'QUATERNION' pbone = obj.pose.bones[bones['hips']] pbone['rigify_type'] = 'spine' - pbone.rigify_parameters.add() - pbone.rigify_parameters[0].chain_bone_controls = "1, 2, 3" + pbone.rigify_parameters.chain_bone_controls = "1, 2, 3" bpy.ops.object.mode_set(mode='EDIT') for bone in arm.edit_bones: diff --git a/rigify/ui.py b/rigify/ui.py index 136ff1724434c3ee4054479f038c6d0ee3de4130..946b1e7075922dfae573294917c656acd00cc38b 100644 --- a/rigify/ui.py +++ b/rigify/ui.py @@ -177,9 +177,6 @@ class BONE_PT_rigify_buttons(bpy.types.Panel): # Rig type parameters / Rig type non-exist alert if rig_name != "": - if len(bone.rigify_parameters) < 1: - bone.rigify_parameters.add() - try: rig = get_rig_type(rig_name) rig.Rig diff --git a/rigify/utils.py b/rigify/utils.py index bcb13a66dc9323c9527f6ff8cb10472016c940e8..db66da636fb9d1e12d3e36d9413f53c2d67fd0f9 100644 --- a/rigify/utils.py +++ b/rigify/utils.py @@ -260,20 +260,36 @@ def obj_to_bone(obj, rig, bone_name): obj.scale = (bone.length * scl_avg), (bone.length * scl_avg), (bone.length * scl_avg) -def create_widget(rig, bone_name): +def create_widget(rig, bone_name, bone_transform_name=None): """ Creates an empty widget object for a bone, and returns the object. """ + if bone_transform_name == None: + bone_transform_name = bone_name + obj_name = WGT_PREFIX + bone_name scene = bpy.context.scene - # Check if it already exists + + # Check if it already exists in the scene if obj_name in scene.objects: + # Move object to bone position, in case it changed + obj = scene.objects[obj_name] + obj_to_bone(obj, rig, bone_transform_name) + return None else: + # Delete object if it exists in blend data but not scene data. + # This is necessary so we can then create the object without + # name conflicts. + if obj_name in bpy.data.objects: + bpy.data.objects.remove(bpy.data.objects[obj_name]) + + # Create mesh object mesh = bpy.data.meshes.new(obj_name) obj = bpy.data.objects.new(obj_name, mesh) scene.objects.link(obj) - obj_to_bone(obj, rig, bone_name) + # Move object to bone position and set layers + obj_to_bone(obj, rig, bone_transform_name) obj.layers = WGT_LAYERS return obj @@ -281,22 +297,22 @@ def create_widget(rig, bone_name): # Common Widgets -def create_line_widget(rig, bone_name): +def create_line_widget(rig, bone_name, bone_transform_name=None): """ Creates a basic line widget, a line that spans the length of the bone. """ - obj = create_widget(rig, bone_name) + obj = create_widget(rig, bone_name, bone_transform_name) if obj != None: mesh = obj.data mesh.from_pydata([(0, 0, 0), (0, 1, 0)], [(0, 1)], []) mesh.update() -def create_circle_widget(rig, bone_name, radius=1.0, head_tail=0.0, with_line=False): +def create_circle_widget(rig, bone_name, radius=1.0, head_tail=0.0, with_line=False, bone_transform_name=None): """ Creates a basic circle widget, a circle around the y-axis. radius: the radius of the circle head_tail: where along the length of the bone the circle is (0.0=head, 1.0=tail) """ - obj = create_widget(rig, bone_name) + obj = create_widget(rig, bone_name, bone_transform_name) if obj != None: v = [(0.7071068286895752, 2.980232238769531e-07, -0.7071065306663513), (0.8314696550369263, 2.980232238769531e-07, -0.5555699467658997), (0.9238795042037964, 2.682209014892578e-07, -0.3826831877231598), (0.9807852506637573, 2.5331974029541016e-07, -0.19509011507034302), (1.0, 2.365559055306221e-07, 1.6105803979371558e-07), (0.9807853698730469, 2.2351741790771484e-07, 0.19509044289588928), (0.9238796234130859, 2.086162567138672e-07, 0.38268351554870605), (0.8314696550369263, 1.7881393432617188e-07, 0.5555704236030579), (0.7071068286895752, 1.7881393432617188e-07, 0.7071070075035095), (0.5555702447891235, 1.7881393432617188e-07, 0.8314698934555054), (0.38268327713012695, 1.7881393432617188e-07, 0.923879861831665), (0.19509008526802063, 1.7881393432617188e-07, 0.9807855486869812), (-3.2584136988589307e-07, 1.1920928955078125e-07, 1.000000238418579), (-0.19509072601795197, 1.7881393432617188e-07, 0.9807854294776917), (-0.3826838731765747, 1.7881393432617188e-07, 0.9238795638084412), (-0.5555707216262817, 1.7881393432617188e-07, 0.8314695358276367), (-0.7071071863174438, 1.7881393432617188e-07, 0.7071065902709961), (-0.8314700126647949, 1.7881393432617188e-07, 0.5555698871612549), (-0.923879861831665, 2.086162567138672e-07, 0.3826829195022583), (-0.9807853698730469, 2.2351741790771484e-07, 0.1950896978378296), (-1.0, 2.365559907957504e-07, -7.290432222362142e-07), (-0.9807850122451782, 2.5331974029541016e-07, -0.195091113448143), (-0.9238790273666382, 2.682209014892578e-07, -0.38268423080444336), (-0.831468939781189, 2.980232238769531e-07, -0.5555710196495056), (-0.7071058750152588, 2.980232238769531e-07, -0.707107424736023), (-0.555569052696228, 2.980232238769531e-07, -0.8314701318740845), (-0.38268208503723145, 2.980232238769531e-07, -0.923879861831665), (-0.19508881866931915, 2.980232238769531e-07, -0.9807853102684021), (1.6053570561780361e-06, 2.980232238769531e-07, -0.9999997615814209), (0.19509197771549225, 2.980232238769531e-07, -0.9807847142219543), (0.3826850652694702, 2.980232238769531e-07, -0.9238786101341248), (0.5555717945098877, 2.980232238769531e-07, -0.8314683437347412)] verts = [(a[0] * radius, head_tail, a[2] * radius) for a in v] @@ -312,10 +328,10 @@ def create_circle_widget(rig, bone_name, radius=1.0, head_tail=0.0, with_line=Fa return None -def create_sphere_widget(rig, bone_name): +def create_sphere_widget(rig, bone_name, bone_transform_name=None): """ Creates a basic sphere widget, three pependicular overlapping circles. """ - obj = create_widget(rig, bone_name) + obj = create_widget(rig, bone_name, bone_transform_name) if obj != None: verts = [(0.3535533845424652, 0.3535533845424652, 0.0), (0.4619397521018982, 0.19134171307086945, 0.0), (0.5, -2.1855694143368964e-08, 0.0), (0.4619397521018982, -0.19134175777435303, 0.0), (0.3535533845424652, -0.3535533845424652, 0.0), (0.19134174287319183, -0.4619397521018982, 0.0), (7.549790126404332e-08, -0.5, 0.0), (-0.1913416087627411, -0.46193981170654297, 0.0), (-0.35355329513549805, -0.35355350375175476, 0.0), (-0.4619397521018982, -0.19134178757667542, 0.0), (-0.5, 5.962440319251527e-09, 0.0), (-0.4619397222995758, 0.1913418024778366, 0.0), (-0.35355326533317566, 0.35355350375175476, 0.0), (-0.19134148955345154, 0.46193987131118774, 0.0), (3.2584136988589307e-07, 0.5, 0.0), (0.1913420855998993, 0.46193960309028625, 0.0), (7.450580596923828e-08, 0.46193960309028625, 0.19134199619293213), (5.9254205098113744e-08, 0.5, 2.323586443253589e-07), (4.470348358154297e-08, 0.46193987131118774, -0.1913415789604187), (2.9802322387695312e-08, 0.35355350375175476, -0.3535533547401428), (2.9802322387695312e-08, 0.19134178757667542, -0.46193981170654297), (5.960464477539063e-08, -1.1151834122813398e-08, -0.5000000596046448), (5.960464477539063e-08, -0.1913418024778366, -0.46193984150886536), (5.960464477539063e-08, -0.35355350375175476, -0.3535533845424652), (7.450580596923828e-08, -0.46193981170654297, -0.19134166836738586), (9.348272556053416e-08, -0.5, 1.624372103492533e-08), (1.043081283569336e-07, -0.4619397521018982, 0.19134168326854706), (1.1920928955078125e-07, -0.3535533845424652, 0.35355329513549805), (1.1920928955078125e-07, -0.19134174287319183, 0.46193966269493103), (1.1920928955078125e-07, -4.7414250303745575e-09, 0.49999991059303284), (1.1920928955078125e-07, 0.19134172797203064, 0.46193966269493103), (8.940696716308594e-08, 0.3535533845424652, 0.35355329513549805), (0.3535534739494324, 0.0, 0.35355329513549805), (0.1913418173789978, -2.9802322387695312e-08, 0.46193966269493103), (8.303572940349113e-08, -5.005858838558197e-08, 0.49999991059303284), (-0.19134165346622467, -5.960464477539063e-08, 0.46193966269493103), (-0.35355329513549805, -8.940696716308594e-08, 0.35355329513549805), (-0.46193963289260864, -5.960464477539063e-08, 0.19134168326854706), (-0.49999991059303284, -5.960464477539063e-08, 1.624372103492533e-08), (-0.4619397521018982, -2.9802322387695312e-08, -0.19134166836738586), (-0.3535534143447876, -2.9802322387695312e-08, -0.3535533845424652), (-0.19134171307086945, 0.0, -0.46193984150886536), (7.662531942287387e-08, 9.546055501630235e-09, -0.5000000596046448), (0.19134187698364258, 5.960464477539063e-08, -0.46193981170654297), (0.3535535931587219, 5.960464477539063e-08, -0.3535533547401428), (0.4619399905204773, 5.960464477539063e-08, -0.1913415789604187), (0.5000000596046448, 5.960464477539063e-08, 2.323586443253589e-07), (0.4619396924972534, 2.9802322387695312e-08, 0.19134199619293213)] edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (0, 15), (16, 31), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (32, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 38), (38, 39), (39, 40), (40, 41), (41, 42), (42, 43), (43, 44), (44, 45), (45, 46), (46, 47), (32, 47)] @@ -324,11 +340,11 @@ def create_sphere_widget(rig, bone_name): mesh.update() -def create_limb_widget(rig, bone_name): +def create_limb_widget(rig, bone_name, bone_transform_name=None): """ Creates a basic limb widget, a line that spans the length of the bone, with a circle around the center. """ - obj = create_widget(rig, bone_name) + obj = create_widget(rig, bone_name, bone_transform_name) if obj != None: verts = [(-1.1920928955078125e-07, 1.7881393432617188e-07, 0.0), (3.5762786865234375e-07, 1.0000004768371582, 0.0), (0.1767769455909729, 0.5000001192092896, 0.17677664756774902), (0.20786768198013306, 0.5000001192092896, 0.1388925313949585), (0.23097014427185059, 0.5000001192092896, 0.09567084908485413), (0.24519658088684082, 0.5000001192092896, 0.048772573471069336), (0.2500002384185791, 0.5000001192092896, -2.545945676502015e-09), (0.24519658088684082, 0.5000001192092896, -0.048772573471069336), (0.23097014427185059, 0.5000001192092896, -0.09567084908485413), (0.20786768198013306, 0.5000001192092896, -0.13889259099960327), (0.1767769455909729, 0.5000001192092896, -0.1767767071723938), (0.13889282941818237, 0.5000001192092896, -0.20786744356155396), (0.09567105770111084, 0.5000001192092896, -0.23096990585327148), (0.04877278208732605, 0.5000001192092896, -0.24519634246826172), (1.7279069197684294e-07, 0.5000000596046448, -0.25), (-0.0487724244594574, 0.5000001192092896, -0.24519634246826172), (-0.09567070007324219, 0.5000001192092896, -0.2309698462486267), (-0.13889241218566895, 0.5000001192092896, -0.20786738395690918), (-0.17677652835845947, 0.5000001192092896, -0.17677664756774902), (-0.20786726474761963, 0.5000001192092896, -0.13889244198799133), (-0.23096972703933716, 0.5000001192092896, -0.09567070007324219), (-0.24519610404968262, 0.5000001192092896, -0.04877239465713501), (-0.2499997615814209, 0.5000001192092896, 2.1997936983098043e-07), (-0.24519598484039307, 0.5000001192092896, 0.04877282679080963), (-0.23096948862075806, 0.5000001192092896, 0.09567108750343323), (-0.20786696672439575, 0.5000001192092896, 0.1388927698135376), (-0.1767762303352356, 0.5000001192092896, 0.17677688598632812), (-0.13889199495315552, 0.5000001192092896, 0.2078675627708435), (-0.09567028284072876, 0.5000001192092896, 0.23097002506256104), (-0.048771947622299194, 0.5000001192092896, 0.24519634246826172), (6.555903269145347e-07, 0.5000001192092896, 0.25), (0.04877324402332306, 0.5000001192092896, 0.24519622325897217), (0.09567153453826904, 0.5000001192092896, 0.23096966743469238), (0.13889318704605103, 0.5000001192092896, 0.20786714553833008)] edges = [(0, 1), (2, 3), (4, 3), (5, 4), (5, 6), (6, 7), (8, 7), (8, 9), (10, 9), (10, 11), (11, 12), (13, 12), (14, 13), (14, 15), (16, 15), (16, 17), (17, 18), (19, 18), (19, 20), (21, 20), (21, 22), (22, 23), (24, 23), (25, 24), (25, 26), (27, 26), (27, 28), (29, 28), (29, 30), (30, 31), (32, 31), (32, 33), (2, 33)] @@ -337,10 +353,10 @@ def create_limb_widget(rig, bone_name): mesh.update() -def create_bone_widget(rig, bone_name): +def create_bone_widget(rig, bone_name, bone_transform_name=None): """ Creates a basic bone widget, a simple obolisk-esk shape. """ - obj = create_widget(rig, bone_name) + obj = create_widget(rig, bone_name, bone_transform_name) if obj != None: verts = [(0.04, 1.0, -0.04), (0.1, 0.0, -0.1), (-0.1, 0.0, -0.1), (-0.04, 1.0, -0.04), (0.04, 1.0, 0.04), (0.1, 0.0, 0.1), (-0.1, 0.0, 0.1), (-0.04, 1.0, 0.04)] edges = [(1, 2), (0, 1), (0, 3), (2, 3), (4, 5), (5, 6), (6, 7), (4, 7), (1, 5), (0, 4), (2, 6), (3, 7)] @@ -349,10 +365,10 @@ def create_bone_widget(rig, bone_name): mesh.update() -def create_compass_widget(rig, bone_name): +def create_compass_widget(rig, bone_name, bone_transform_name=None): """ Creates a compass-shaped widget. """ - obj = create_widget(rig, bone_name) + obj = create_widget(rig, bone_name, bone_transform_name) if obj != None: verts = [(0.0, 1.2000000476837158, 0.0), (0.19509032368659973, 0.9807852506637573, 0.0), (0.3826834559440613, 0.9238795042037964, 0.0), (0.5555702447891235, 0.8314695954322815, 0.0), (0.7071067690849304, 0.7071067690849304, 0.0), (0.8314696550369263, 0.5555701851844788, 0.0), (0.9238795042037964, 0.3826834261417389, 0.0), (0.9807852506637573, 0.19509035348892212, 0.0), (1.2000000476837158, 7.549790126404332e-08, 0.0), (0.9807853102684021, -0.19509020447731018, 0.0), (0.9238795638084412, -0.38268327713012695, 0.0), (0.8314696550369263, -0.5555701851844788, 0.0), (0.7071067690849304, -0.7071067690849304, 0.0), (0.5555701851844788, -0.8314696550369263, 0.0), (0.38268327713012695, -0.9238796234130859, 0.0), (0.19509008526802063, -0.9807853102684021, 0.0), (-3.2584136988589307e-07, -1.2999999523162842, 0.0), (-0.19509072601795197, -0.9807851910591125, 0.0), (-0.3826838731765747, -0.9238793253898621, 0.0), (-0.5555707216262817, -0.8314692974090576, 0.0), (-0.7071072459220886, -0.707106351852417, 0.0), (-0.8314700126647949, -0.5555696487426758, 0.0), (-0.923879861831665, -0.3826826810836792, 0.0), (-0.9807854294776917, -0.1950894594192505, 0.0), (-1.2000000476837158, 9.655991561885457e-07, 0.0), (-0.980785071849823, 0.1950913518667221, 0.0), (-0.923879086971283, 0.38268446922302246, 0.0), (-0.831468939781189, 0.5555712580680847, 0.0), (-0.7071058750152588, 0.707107663154602, 0.0), (-0.5555691123008728, 0.8314703702926636, 0.0), (-0.38268208503723145, 0.9238801002502441, 0.0), (-0.19508881866931915, 0.9807855486869812, 0.0)] edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (0, 31)] @@ -361,10 +377,10 @@ def create_compass_widget(rig, bone_name): mesh.update() -def create_root_widget(rig, bone_name): +def create_root_widget(rig, bone_name, bone_transform_name=None): """ Creates a widget for the root bone. """ - obj = create_widget(rig, bone_name) + obj = create_widget(rig, bone_name, bone_transform_name) if obj != None: verts = [(0.7071067690849304, 0.7071067690849304, 0.0), (0.7071067690849304, -0.7071067690849304, 0.0), (-0.7071067690849304, 0.7071067690849304, 0.0), (-0.7071067690849304, -0.7071067690849304, 0.0), (0.8314696550369263, 0.5555701851844788, 0.0), (0.8314696550369263, -0.5555701851844788, 0.0), (-0.8314696550369263, 0.5555701851844788, 0.0), (-0.8314696550369263, -0.5555701851844788, 0.0), (0.9238795042037964, 0.3826834261417389, 0.0), (0.9238795042037964, -0.3826834261417389, 0.0), (-0.9238795042037964, 0.3826834261417389, 0.0), (-0.9238795042037964, -0.3826834261417389, 0.0), (0.9807852506637573, 0.19509035348892212, 0.0), (0.9807852506637573, -0.19509035348892212, 0.0), (-0.9807852506637573, 0.19509035348892212, 0.0), (-0.9807852506637573, -0.19509035348892212, 0.0), (0.19509197771549225, 0.9807849526405334, 0.0), (0.19509197771549225, -0.9807849526405334, 0.0), (-0.19509197771549225, 0.9807849526405334, 0.0), (-0.19509197771549225, -0.9807849526405334, 0.0), (0.3826850652694702, 0.9238788485527039, 0.0), (0.3826850652694702, -0.9238788485527039, 0.0), (-0.3826850652694702, 0.9238788485527039, 0.0), (-0.3826850652694702, -0.9238788485527039, 0.0), (0.5555717945098877, 0.8314685821533203, 0.0), (0.5555717945098877, -0.8314685821533203, 0.0), (-0.5555717945098877, 0.8314685821533203, 0.0), (-0.5555717945098877, -0.8314685821533203, 0.0), (0.19509197771549225, 1.2807848453521729, 0.0), (0.19509197771549225, -1.2807848453521729, 0.0), (-0.19509197771549225, 1.2807848453521729, 0.0), (-0.19509197771549225, -1.2807848453521729, 0.0), (1.280785322189331, 0.19509035348892212, 0.0), (1.280785322189331, -0.19509035348892212, 0.0), (-1.280785322189331, 0.19509035348892212, 0.0), (-1.280785322189331, -0.19509035348892212, 0.0), (0.3950919806957245, 1.2807848453521729, 0.0), (0.3950919806957245, -1.2807848453521729, 0.0), (-0.3950919806957245, 1.2807848453521729, 0.0), (-0.3950919806957245, -1.2807848453521729, 0.0), (1.280785322189331, 0.39509034156799316, 0.0), (1.280785322189331, -0.39509034156799316, 0.0), (-1.280785322189331, 0.39509034156799316, 0.0), (-1.280785322189331, -0.39509034156799316, 0.0), (0.0, 1.5807849168777466, 0.0), (0.0, -1.5807849168777466, 0.0), (1.5807852745056152, 0.0, 0.0), (-1.5807852745056152, 0.0, 0.0)] edges = [(0, 4), (1, 5), (2, 6), (3, 7), (4, 8), (5, 9), (6, 10), (7, 11), (8, 12), (9, 13), (10, 14), (11, 15), (16, 20), (17, 21), (18, 22), (19, 23), (20, 24), (21, 25), (22, 26), (23, 27), (0, 24), (1, 25), (2, 26), (3, 27), (16, 28), (17, 29), (18, 30), (19, 31), (12, 32), (13, 33), (14, 34), (15, 35), (28, 36), (29, 37), (30, 38), (31, 39), (32, 40), (33, 41), (34, 42), (35, 43), (36, 44), (37, 45), (38, 44), (39, 45), (40, 46), (41, 46), (42, 47), (43, 47)] @@ -515,16 +531,16 @@ def write_metarig(obj, layers=False, func_name="create_sample"): if layers: code.append(" pbone.bone.layers = %s" % str(list(pbone.bone.layers))) # Rig type parameters - if len(pbone.rigify_parameters) > 0: - code.append(" pbone.rigify_parameters.add()") - for param_name in pbone.rigify_parameters[0].keys(): - param = getattr(pbone.rigify_parameters[0], param_name) - if str(type(param)) == "<class 'bpy_prop_array'>": - param = list(param) - code.append(" try:") - code.append(" pbone.rigify_parameters[0].%s = %s" % (param_name, str(param))) - code.append(" except AttributeError:") - code.append(" pass") + for param_name in pbone.rigify_parameters.keys(): + param = getattr(pbone.rigify_parameters, param_name) + if str(type(param)) == "<class 'bpy_prop_array'>": + param = list(param) + if type(param) == str: + param = '"' + param + '"' + code.append(" try:") + code.append(" pbone.rigify_parameters.%s = %s" % (param_name, str(param))) + code.append(" except AttributeError:") + code.append(" pass") code.append("\n bpy.ops.object.mode_set(mode='EDIT')") code.append(" for bone in arm.edit_bones:")