From 670bf72cb6978ff2f26a23bf2b5bb83b6e631e10 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl <cessen@cessen.com> Date: Sun, 19 Jun 2011 19:53:01 +0000 Subject: [PATCH] Rig layers can now be organized into rows by the user, for nicer layout. --- rigify/__init__.py | 38 ++++++------------------------------- rigify/generate.py | 16 +++++++++------- rigify/metarigs/human.py | 40 ++++++++++++++++++++++++++------------- rigify/rig_ui_template.py | 39 ++++++++++++++++++++++++++++---------- rigify/ui.py | 16 ++++++++-------- 5 files changed, 79 insertions(+), 70 deletions(-) diff --git a/rigify/__init__.py b/rigify/__init__.py index fe9511cf2..cbd93abd5 100644 --- a/rigify/__init__.py +++ b/rigify/__init__.py @@ -115,35 +115,9 @@ class RigifyParameters(bpy.types.PropertyGroup): name = bpy.props.StringProperty() -class RigifyArmatureProps(bpy.types.PropertyGroup): - layer_name_01 = bpy.props.StringProperty(name="Layer 1 Name", default="1") - layer_name_02 = bpy.props.StringProperty(name="Layer 2 Name", default="2") - layer_name_03 = bpy.props.StringProperty(name="Layer 3 Name", default="3") - layer_name_04 = bpy.props.StringProperty(name="Layer 4 Name", default="4") - layer_name_05 = bpy.props.StringProperty(name="Layer 5 Name", default="5") - layer_name_06 = bpy.props.StringProperty(name="Layer 6 Name", default="6") - layer_name_07 = bpy.props.StringProperty(name="Layer 7 Name", default="7") - layer_name_08 = bpy.props.StringProperty(name="Layer 8 Name", default="8") - layer_name_09 = bpy.props.StringProperty(name="Layer 9 Name", default="9") - layer_name_10 = bpy.props.StringProperty(name="Layer 10 Name", default="10") - layer_name_11 = bpy.props.StringProperty(name="Layer 11 Name", default="11") - layer_name_12 = bpy.props.StringProperty(name="Layer 12 Name", default="12") - layer_name_13 = bpy.props.StringProperty(name="Layer 13 Name", default="13") - layer_name_14 = bpy.props.StringProperty(name="Layer 14 Name", default="14") - layer_name_15 = bpy.props.StringProperty(name="Layer 15 Name", default="15") - layer_name_16 = bpy.props.StringProperty(name="Layer 16 Name", default="16") - layer_name_17 = bpy.props.StringProperty(name="Layer 17 Name", default="17") - layer_name_18 = bpy.props.StringProperty(name="Layer 18 Name", default="18") - layer_name_19 = bpy.props.StringProperty(name="Layer 19 Name", default="19") - layer_name_20 = bpy.props.StringProperty(name="Layer 20 Name", default="20") - layer_name_21 = bpy.props.StringProperty(name="Layer 21 Name", default="21") - layer_name_22 = bpy.props.StringProperty(name="Layer 22 Name", default="22") - layer_name_23 = bpy.props.StringProperty(name="Layer 23 Name", default="23") - layer_name_24 = bpy.props.StringProperty(name="Layer 24 Name", default="24") - layer_name_25 = bpy.props.StringProperty(name="Layer 25 Name", default="25") - layer_name_26 = bpy.props.StringProperty(name="Layer 26 Name", default="26") - layer_name_27 = bpy.props.StringProperty(name="Layer 27 Name", default="27") - layer_name_28 = bpy.props.StringProperty(name="Layer 28 Name", default="28") +class RigifyArmatureLayer(bpy.types.PropertyGroup): + name = bpy.props.StringProperty(name="Layer Name", default=" ") + row = bpy.props.IntProperty(name="Layer Row", default=1, min=1, max=32) ##### REGISTER ##### @@ -154,12 +128,12 @@ def register(): bpy.utils.register_class(RigifyName) bpy.utils.register_class(RigifyParameters) - bpy.utils.register_class(RigifyArmatureProps) + 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.Armature.rigify_props = bpy.props.CollectionProperty(type=RigifyArmatureProps) + bpy.types.Armature.rigify_layers = bpy.props.CollectionProperty(type=RigifyArmatureLayer) IDStore = bpy.types.WindowManager IDStore.rigify_collection = bpy.props.EnumProperty(items=col_enum_list, default="All", name="Rigify Active Collection", description="The selected rig collection") @@ -187,7 +161,7 @@ def unregister(): bpy.utils.unregister_class(RigifyName) bpy.utils.unregister_class(RigifyParameters) - bpy.utils.unregister_class(RigifyArmatureProps) + bpy.utils.unregister_class(RigifyArmatureLayer) metarig_menu.unregister() ui.unregister() diff --git a/rigify/generate.py b/rigify/generate.py index 3de8fe233..96a6d68d6 100644 --- a/rigify/generate.py +++ b/rigify/generate.py @@ -282,12 +282,14 @@ def generate_rig(context, metarig): vis_layers[i] = vis_layers[i] and not (ORG_LAYER[i] or MCH_LAYER[i] or DEF_LAYER[i]) obj.data.layers = vis_layers - # Create list of layer names - if len(metarig.data.rigify_props) < 1: - metarig.data.rigify_props.add() - layer_names = [] - for i in range(28): - layer_names += [getattr(metarig.data.rigify_props[0], "layer_name_%s" % str(i+1).rjust(2, "0"))] + # Ensure the collection of layer names exists + for i in range(1 + len(metarig.data.rigify_layers), 29): + layer = metarig.data.rigify_layers.add() + + # Create list of layer name/row pairs + layer_layout = [] + for l in metarig.data.rigify_layers: + layer_layout += [(l.name, l.row)] # Generate the UI script if "rig_ui.py" in bpy.data.texts: @@ -298,7 +300,7 @@ def generate_rig(context, metarig): script.write(UI_SLIDERS % rig_id) for s in ui_scripts: script.write("\n " + s.replace("\n", "\n ") + "\n") - script.write(layers_ui(vis_layers, layer_names)) + script.write(layers_ui(vis_layers, layer_layout)) script.write(UI_REGISTER) script.use_module = True diff --git a/rigify/metarigs/human.py b/rigify/metarigs/human.py index d0744066c..cfc9f0380 100644 --- a/rigify/metarigs/human.py +++ b/rigify/metarigs/human.py @@ -24,19 +24,33 @@ def create(obj): bpy.ops.object.mode_set(mode='EDIT') arm = obj.data - props = arm.rigify_props.add() - props.layer_name_01 = "Torso" - props.layer_name_03 = "Head" - props.layer_name_05 = "Fingers" - props.layer_name_06 = "Fingers (tweak)" - props.layer_name_07 = "Arm.L (FK)" - props.layer_name_08 = "Arm.L (IK)" - props.layer_name_09 = "Arm.R (FK)" - props.layer_name_10 = "Arm.R (IK)" - props.layer_name_11 = "Leg.L (FK)" - props.layer_name_12 = "Leg.L (IK)" - props.layer_name_13 = "Leg.R (FK)" - props.layer_name_14 = "Leg.R (IK)" + for i in range(28): + arm.rigify_layers.add() + + arm.rigify_layers[0].name = "Torso" + arm.rigify_layers[0].row = 2 + arm.rigify_layers[2].name = "Head" + arm.rigify_layers[2].row = 1 + arm.rigify_layers[4].name = "Fingers" + arm.rigify_layers[4].row = 3 + arm.rigify_layers[5].name = "(Tweak)" + arm.rigify_layers[5].row = 3 + arm.rigify_layers[6].name = "Arm.L (FK)" + arm.rigify_layers[6].row = 4 + arm.rigify_layers[7].name = "Arm.L (IK)" + arm.rigify_layers[7].row = 5 + arm.rigify_layers[8].name = "Arm.R (FK)" + arm.rigify_layers[8].row = 4 + arm.rigify_layers[9].name = "Arm.R (IK)" + arm.rigify_layers[9].row = 5 + arm.rigify_layers[10].name = "Leg.L (FK)" + arm.rigify_layers[10].row = 6 + arm.rigify_layers[11].name = "Leg.L (IK)" + arm.rigify_layers[11].row = 7 + arm.rigify_layers[12].name = "Leg.R (FK)" + arm.rigify_layers[12].row = 6 + arm.rigify_layers[13].name = "Leg.R (IK)" + arm.rigify_layers[13].row = 7 bones = {} diff --git a/rigify/rig_ui_template.py b/rigify/rig_ui_template.py index 35df1ec2a..a54ab1757 100644 --- a/rigify/rig_ui_template.py +++ b/rigify/rig_ui_template.py @@ -493,7 +493,7 @@ class RigUI(bpy.types.Panel): ''' -def layers_ui(layers, names): +def layers_ui(layers, layout): """ Turn a list of booleans + a list of names into a layer UI. """ @@ -515,15 +515,34 @@ class RigLayers(bpy.types.Panel): layout = self.layout col = layout.column() ''' - i = 0 - for layer in layers: - if layer: - code += "\n row = col.row()\n" - if i == 28: - code += " row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='Root')\n" % (str(i)) - else: - code += " row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='%s')\n" % (str(i), names[i]) - i += 1 + rows = {} + for i in range(28): + if layers[i]: + if layout[i][1] not in rows: + rows[layout[i][1]] = [] + rows[layout[i][1]] += [(layout[i][0], i)] + + keys = list(rows.keys()) + keys.sort() + + for key in keys: + code += "\n row = col.row()\n" + i = 0 + for l in rows[key]: + if i > 3: + code += "\n row = col.row()\n" + i = 0 + code += " row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='%s')\n" % (str(l[1]), l[0]) + i += 1 + + # Root layer + code += "\n row = col.row()" + code += "\n row.separator()" + code += "\n row = col.row()" + code += "\n row.separator()\n" + code += "\n row = col.row()\n" + code += " row.prop(context.active_object.data, 'layers', index=28, toggle=True, text='Root')\n" + return code diff --git a/rigify/ui.py b/rigify/ui.py index eafa96796..3a2e89e3d 100644 --- a/rigify/ui.py +++ b/rigify/ui.py @@ -92,10 +92,6 @@ class DATA_PT_rigify_layer_names(bpy.types.Panel): def poll(cls, context): if not context.armature: return False - #obj = context.object - #if obj: - # return (obj.mode in ('POSE', 'OBJECT', 'EDIT')) - #return False return True def draw(self, context): @@ -103,9 +99,11 @@ class DATA_PT_rigify_layer_names(bpy.types.Panel): layout = self.layout obj = context.object - if len(obj.data.rigify_props) < 1: - obj.data.rigify_props.add() + # Ensure that the layers exist + for i in range(1 + len(obj.data.rigify_layers), 29): + layer = obj.data.rigify_layers.add() + # UI for i in range(28): if (i % 16) == 0: col = layout.column() @@ -117,8 +115,10 @@ class DATA_PT_rigify_layer_names(bpy.types.Panel): col = layout.column(align=True) row = col.row() row.prop(obj.data, "layers", index=i, text="", toggle=True) - row.prop(obj.data.rigify_props[0], "layer_name_%s" % str(i+1).rjust(2, "0"), text="Layer %d" % (i + 1)) - + split = row.split(percentage=0.8) + split.prop(obj.data.rigify_layers[i], "name", text="Layer %d" % (i + 1)) + split.prop(obj.data.rigify_layers[i], "row", text="") + #split.prop(obj.data.rigify_layers[i], "column", text="") class BONE_PT_rigify_buttons(bpy.types.Panel): -- GitLab