Skip to content

Advanced options in object instead of window manager #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: mad_master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 35 additions & 33 deletions __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"name": "Rigify",
"version": (0, 5),
"author": "Nathan Vegdahl, Lucio Rossi, Ivan Cappiello",
"blender": (2, 78, 0),
"blender": (2, 79, 0),
"description": "Automatic rigging from building-block components",
"location": "Armature properties, Bone properties, View3d tools panel, Armature Add menu",
"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"
Expand All @@ -46,6 +46,7 @@
from bpy.types import AddonPreferences
from bpy.props import BoolProperty
from bpy.props import StringProperty
from bpy.props import PointerProperty


class RigifyPreferences(AddonPreferences):
Expand Down Expand Up @@ -331,6 +332,39 @@ def register():
('THEME20', 'THEME20', '')
), name='Theme')

bpy.types.Armature.rigify_advanced_generation = bpy.props.BoolProperty(name="Advanced Options",
description="Enables/disables advanced options for Rigify rig generation",
default=False)

def update_mode(self, context):
if self.rigify_generate_mode == 'new':
self.rigify_force_widget_update = False

bpy.types.Armature.rigify_generate_mode = bpy.props.EnumProperty(name="Rigify Generate Rig Mode",
description="'Generate Rig' mode. In 'overwrite' mode the features of the target rig will be updated as defined by the metarig. In 'new' mode a new rig will be created as defined by the metarig. Current mode",
update=update_mode,
items=(('overwrite', 'overwrite', ''),
('new', 'new', '')))

bpy.types.Armature.rigify_force_widget_update = bpy.props.BoolProperty(name="Force Widget Update",
description="Forces Rigify to delete and rebuild all the rig widgets. if unset, only missing widgets will be created",
default=False)

# bpy.types.Armature.rigify_target_rigs = bpy.props.CollectionProperty(type=RigifyName)
bpy.types.Armature.rigify_target_rig = PointerProperty(type=bpy.types.Object,
name="Rigify Target Rig",
description="Defines which rig to overwrite. If unset, a new one called 'rig' will be created.",
poll=lambda self, obj: obj.type == 'ARMATURE')

# bpy.types.Armature.rigify_rig_uis = bpy.props.CollectionProperty(type=RigifyName)
bpy.types.Armature.rigify_rig_ui = PointerProperty(type=bpy.types.Text,
name="Rigify Target Rig UI",
description="Defines the UI to overwrite. It should always be the same as the target rig. If unset, 'rig_ui.py' will be used")

bpy.types.Armature.rigify_rig_basename = bpy.props.StringProperty(name="Rigify Rig Name",
description="Defines the name of the Rig. If unset, in 'new' mode 'rig' will be used, in 'overwrite' mode the target rig name will be used",
default="")

IDStore = bpy.types.WindowManager
IDStore.rigify_collection = bpy.props.EnumProperty(items=rig_lists.col_enum_list, default="All",
name="Rigify Active Collection",
Expand All @@ -339,38 +373,6 @@ def register():
IDStore.rigify_types = bpy.props.CollectionProperty(type=RigifyName)
IDStore.rigify_active_type = bpy.props.IntProperty(name="Rigify Active Type", description="The selected rig type")

IDStore.rigify_advanced_generation = bpy.props.BoolProperty(name="Advanced Options",
description="Enables/disables advanced options for Rigify rig generation",
default=False)

def update_mode(self, context):
if self.rigify_generate_mode == 'new':
self.rigify_force_widget_update = False

IDStore.rigify_generate_mode = bpy.props.EnumProperty(name="Rigify Generate Rig Mode",
description="'Generate Rig' mode. In 'overwrite' mode the features of the target rig will be updated as defined by the metarig. In 'new' mode a new rig will be created as defined by the metarig. Current mode",
update=update_mode,
items=(('overwrite', 'overwrite', ''),
('new', 'new', '')))

IDStore.rigify_force_widget_update = bpy.props.BoolProperty(name="Force Widget Update",
description="Forces Rigify to delete and rebuild all the rig widgets. if unset, only missing widgets will be created",
default=False)

IDStore.rigify_target_rigs = bpy.props.CollectionProperty(type=RigifyName)
IDStore.rigify_target_rig = bpy.props.StringProperty(name="Rigify Target Rig",
description="Defines which rig to overwrite. If unset, a new one called 'rig' will be created.",
default="")

IDStore.rigify_rig_uis = bpy.props.CollectionProperty(type=RigifyName)
IDStore.rigify_rig_ui = bpy.props.StringProperty(name="Rigify Target Rig UI",
description="Defines the UI to overwrite. It should always be the same as the target rig. If unset, 'rig_ui.py' will be used",
default="")

IDStore.rigify_rig_basename = bpy.props.StringProperty(name="Rigify Rig Name",
description="Defines the name of the Rig. If unset, in 'new' mode 'rig' will be used, in 'overwrite' mode the target rig name will be used",
default="")

IDStore.rigify_transfer_only_selected = bpy.props.BoolProperty(name="Transfer Only Selected", description="Transfer selected bones only", default=True)
IDStore.rigify_transfer_start_frame = bpy.props.IntProperty(name="Start Frame", description="First Frame to Transfer", default=0, min= 0)
IDStore.rigify_transfer_end_frame = bpy.props.IntProperty(name="End Frame", description="Last Frame to Transfer", default=0, min= 0)
Expand Down
67 changes: 37 additions & 30 deletions generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,28 +83,34 @@ def generate_rig(context, metarig):

rig_new_name = ""
rig_old_name = ""
if id_store.rigify_rig_basename:
rig_new_name = id_store.rigify_rig_basename + "_rig"
if metarig.data.rigify_rig_basename:
rig_new_name = metarig.data.rigify_rig_basename + "_rig"
else:
rig_new_name = "rig"

if id_store.rigify_generate_mode == 'overwrite':
name = id_store.rigify_target_rig or "rig"
try:
obj = scene.objects[name]
rig_old_name = name
obj.name = rig_new_name or name
except KeyError:
rig_old_name = name
name = rig_new_name or name
obj = bpy.data.objects.new(name, bpy.data.armatures.new(name))
obj.draw_type = 'WIRE'
scene.objects.link(obj)
if metarig.data.rigify_generate_mode == 'overwrite':
if metarig.data.rigify_target_rig is not None:
rig_old_name = metarig.data.rigify_target_rig.name
obj = metarig.data.rigify_target_rig
obj.name = rig_new_name or obj.name
else:
name = rig_new_name
if name in bpy.data.objects:
obj = bpy.data.objects[name]
else:
obj = bpy.data.objects.new(name, bpy.data.armatures.new(name))
obj.draw_type = 'WIRE'
scene.objects.link(obj)
else:
name = rig_new_name or "rig"
obj = bpy.data.objects.new(name, bpy.data.armatures.new(name)) # in case name 'rig' exists it will be rig.001
name = rig_new_name
obj = bpy.data.objects.new(name, bpy.data.armatures.new(name))
obj.draw_type = 'WIRE'
scene.objects.link(obj)

id_store.rigify_target_rig = obj.name
if obj.name not in bpy.context.scene.objects: # rig exists but deleted
bpy.context.scene.objects.link(obj)

metarig.data.rigify_target_rig = obj
obj.data.pose_position = 'POSE'

# Get rid of anim data in case the rig already existed
Expand All @@ -118,8 +124,7 @@ def generate_rig(context, metarig):

# Remove wgts if force update is set
wgts_group_name = "WGTS_" + (rig_old_name or obj.name)
if wgts_group_name in scene.objects and id_store.rigify_force_widget_update:
bpy.ops.object.mode_set(mode='OBJECT')
if wgts_group_name in scene.objects and metarig.data.rigify_force_widget_update:
bpy.ops.object.select_all(action='DESELECT')
for i, lyr in enumerate(WGT_LAYERS):
if lyr:
Expand Down Expand Up @@ -477,23 +482,25 @@ def generate_rig(context, metarig):
layer_layout += [(l.name, l.row)]

# Generate the UI script
if id_store.rigify_generate_mode == 'overwrite':
rig_ui_name = id_store.rigify_rig_ui or 'rig_ui.py'
if metarig.data.rigify_rig_basename:
script_name = metarig.data.rigify_rig_basename + "_rig_ui.py"
else:
rig_ui_name = 'rig_ui.py'
script_name = "rig_ui.py"

if id_store.rigify_generate_mode == 'overwrite' and rig_ui_name in bpy.data.texts.keys():
script = bpy.data.texts[rig_ui_name]
script.clear()
if metarig.data.rigify_generate_mode == 'overwrite':
if metarig.data.rigify_rig_ui:
script = metarig.data.rigify_rig_ui
else:
if script_name in bpy.data.texts:
script = bpy.data.texts[script_name]
else:
script = bpy.data.texts.new(script_name)
else:
script = bpy.data.texts.new("rig_ui.py")

rig_ui_old_name = ""
if id_store.rigify_rig_basename:
rig_ui_old_name = script.name
script.name = id_store.rigify_rig_basename + "_rig_ui.py"
script.name = script_name

id_store.rigify_rig_ui = script.name
metarig.data.rigify_rig_ui = script

script.write(UI_SLIDERS % rig_id)
for s in ui_scripts:
Expand Down
44 changes: 15 additions & 29 deletions ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,65 +93,52 @@ def draw(self, context):
layout.operator("pose.rigify_upgrade_types", text="Upgrade Metarig")

row = layout.row()
armature_id_store = C.object.data

row.operator("pose.rigify_generate", text="Generate Rig", icon='POSE_HLT')
row.enabled = enable_generate_and_advanced

if id_store.rigify_advanced_generation:
if armature_id_store.rigify_advanced_generation:
icon = 'UNLOCKED'
else:
icon = 'LOCKED'

col = layout.column()
col.enabled = enable_generate_and_advanced
row = col.row()
row.prop(id_store, "rigify_advanced_generation", toggle=True, icon=icon)
row.prop(armature_id_store, "rigify_advanced_generation", toggle=True, icon=icon)

if id_store.rigify_advanced_generation:
if armature_id_store.rigify_advanced_generation:

row = col.row(align=True)
row.prop(id_store, "rigify_generate_mode", expand=True)
row.prop(armature_id_store, "rigify_generate_mode", expand=True)

main_row = col.row(align=True).split(percentage=0.3)
col1 = main_row.column()
col2 = main_row.column()
col1.label(text="Rig Name")
row = col1.row()
row.label(text="Target Rig")
row.enabled = (id_store.rigify_generate_mode == "overwrite")
row.enabled = (armature_id_store.rigify_generate_mode == "overwrite")
row = col1.row()
row.label(text="Target UI")
row.enabled = (id_store.rigify_generate_mode == "overwrite")
row.enabled = (armature_id_store.rigify_generate_mode == "overwrite")

row = col2.row(align=True)
row.prop(id_store, "rigify_rig_basename", text="", icon="SORTALPHA")
row.prop(armature_id_store, "rigify_rig_basename", text="", icon="SORTALPHA")

row = col2.row(align=True)
for i in range(0, len(id_store.rigify_target_rigs)):
id_store.rigify_target_rigs.remove(0)

for ob in context.scene.objects:
if type(ob.data) == bpy.types.Armature and "rig_id" in ob.data:
id_store.rigify_target_rigs.add()
id_store.rigify_target_rigs[-1].name = ob.name

row.prop_search(id_store, "rigify_target_rig", id_store, "rigify_target_rigs", text="",
icon='OUTLINER_OB_ARMATURE')
row.enabled = (id_store.rigify_generate_mode == "overwrite")
row.prop(armature_id_store, "rigify_target_rig", text="")
row.enabled = (armature_id_store.rigify_generate_mode == "overwrite")

for i in range(0, len(id_store.rigify_rig_uis)):
id_store.rigify_rig_uis.remove(0)

for t in bpy.data.texts:
id_store.rigify_rig_uis.add()
id_store.rigify_rig_uis[-1].name = t.name

row = col2.row()
row.prop_search(id_store, "rigify_rig_ui", id_store, "rigify_rig_uis", text="", icon='TEXT')
row.enabled = (id_store.rigify_generate_mode == "overwrite")
row.prop(armature_id_store, "rigify_rig_ui", text="")
row.enabled = (armature_id_store.rigify_generate_mode == "overwrite")

row = col.row()
row.prop(id_store, "rigify_force_widget_update")
if id_store.rigify_generate_mode == 'new':
row.prop(armature_id_store, "rigify_force_widget_update")
if armature_id_store.rigify_generate_mode == 'new':
row.enabled = False

elif obj.mode == 'EDIT':
Expand Down Expand Up @@ -1417,4 +1404,3 @@ def unregister():
bpy.utils.unregister_class(OBJECT_OT_Rot2Pole)

rot_mode.unregister()