Skip to content

Commit 12fd0cf

Browse files
committed
Store advanced settings in object data instead of wm
1 parent b791dff commit 12fd0cf

File tree

3 files changed

+87
-92
lines changed

3 files changed

+87
-92
lines changed

__init__.py

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"name": "Rigify",
2323
"version": (0, 5),
2424
"author": "Nathan Vegdahl, Lucio Rossi, Ivan Cappiello",
25-
"blender": (2, 78, 0),
25+
"blender": (2, 79, 0),
2626
"description": "Automatic rigging from building-block components",
2727
"location": "Armature properties, Bone properties, View3d tools panel, Armature Add menu",
2828
"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"
@@ -46,6 +46,7 @@
4646
from bpy.types import AddonPreferences
4747
from bpy.props import BoolProperty
4848
from bpy.props import StringProperty
49+
from bpy.props import PointerProperty
4950

5051

5152
class RigifyPreferences(AddonPreferences):
@@ -331,6 +332,39 @@ def register():
331332
('THEME20', 'THEME20', '')
332333
), name='Theme')
333334

335+
bpy.types.Armature.rigify_advanced_generation = bpy.props.BoolProperty(name="Advanced Options",
336+
description="Enables/disables advanced options for Rigify rig generation",
337+
default=False)
338+
339+
def update_mode(self, context):
340+
if self.rigify_generate_mode == 'new':
341+
self.rigify_force_widget_update = False
342+
343+
bpy.types.Armature.rigify_generate_mode = bpy.props.EnumProperty(name="Rigify Generate Rig Mode",
344+
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",
345+
update=update_mode,
346+
items=(('overwrite', 'overwrite', ''),
347+
('new', 'new', '')))
348+
349+
bpy.types.Armature.rigify_force_widget_update = bpy.props.BoolProperty(name="Force Widget Update",
350+
description="Forces Rigify to delete and rebuild all the rig widgets. if unset, only missing widgets will be created",
351+
default=False)
352+
353+
# bpy.types.Armature.rigify_target_rigs = bpy.props.CollectionProperty(type=RigifyName)
354+
bpy.types.Armature.rigify_target_rig = PointerProperty(type=bpy.types.Object,
355+
name="Rigify Target Rig",
356+
description="Defines which rig to overwrite. If unset, a new one called 'rig' will be created.",
357+
poll=lambda self, obj: obj.type == 'ARMATURE')
358+
359+
# bpy.types.Armature.rigify_rig_uis = bpy.props.CollectionProperty(type=RigifyName)
360+
bpy.types.Armature.rigify_rig_ui = PointerProperty(type=bpy.types.Text,
361+
name="Rigify Target Rig UI",
362+
description="Defines the UI to overwrite. It should always be the same as the target rig. If unset, 'rig_ui.py' will be used")
363+
364+
bpy.types.Armature.rigify_rig_basename = bpy.props.StringProperty(name="Rigify Rig Name",
365+
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",
366+
default="")
367+
334368
IDStore = bpy.types.WindowManager
335369
IDStore.rigify_collection = bpy.props.EnumProperty(items=rig_lists.col_enum_list, default="All",
336370
name="Rigify Active Collection",
@@ -339,38 +373,6 @@ def register():
339373
IDStore.rigify_types = bpy.props.CollectionProperty(type=RigifyName)
340374
IDStore.rigify_active_type = bpy.props.IntProperty(name="Rigify Active Type", description="The selected rig type")
341375

342-
IDStore.rigify_advanced_generation = bpy.props.BoolProperty(name="Advanced Options",
343-
description="Enables/disables advanced options for Rigify rig generation",
344-
default=False)
345-
346-
def update_mode(self, context):
347-
if self.rigify_generate_mode == 'new':
348-
self.rigify_force_widget_update = False
349-
350-
IDStore.rigify_generate_mode = bpy.props.EnumProperty(name="Rigify Generate Rig Mode",
351-
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",
352-
update=update_mode,
353-
items=(('overwrite', 'overwrite', ''),
354-
('new', 'new', '')))
355-
356-
IDStore.rigify_force_widget_update = bpy.props.BoolProperty(name="Force Widget Update",
357-
description="Forces Rigify to delete and rebuild all the rig widgets. if unset, only missing widgets will be created",
358-
default=False)
359-
360-
IDStore.rigify_target_rigs = bpy.props.CollectionProperty(type=RigifyName)
361-
IDStore.rigify_target_rig = bpy.props.StringProperty(name="Rigify Target Rig",
362-
description="Defines which rig to overwrite. If unset, a new one called 'rig' will be created.",
363-
default="")
364-
365-
IDStore.rigify_rig_uis = bpy.props.CollectionProperty(type=RigifyName)
366-
IDStore.rigify_rig_ui = bpy.props.StringProperty(name="Rigify Target Rig UI",
367-
description="Defines the UI to overwrite. It should always be the same as the target rig. If unset, 'rig_ui.py' will be used",
368-
default="")
369-
370-
IDStore.rigify_rig_basename = bpy.props.StringProperty(name="Rigify Rig Name",
371-
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",
372-
default="")
373-
374376
IDStore.rigify_transfer_only_selected = bpy.props.BoolProperty(name="Transfer Only Selected", description="Transfer selected bones only", default=True)
375377
IDStore.rigify_transfer_start_frame = bpy.props.IntProperty(name="Start Frame", description="First Frame to Transfer", default=0, min= 0)
376378
IDStore.rigify_transfer_end_frame = bpy.props.IntProperty(name="End Frame", description="Last Frame to Transfer", default=0, min= 0)

generate.py

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -83,28 +83,34 @@ def generate_rig(context, metarig):
8383

8484
rig_new_name = ""
8585
rig_old_name = ""
86-
if id_store.rigify_rig_basename:
87-
rig_new_name = id_store.rigify_rig_basename + "_rig"
86+
if metarig.data.rigify_rig_basename:
87+
rig_new_name = metarig.data.rigify_rig_basename + "_rig"
88+
else:
89+
rig_new_name = "rig"
8890

89-
if id_store.rigify_generate_mode == 'overwrite':
90-
name = id_store.rigify_target_rig or "rig"
91-
try:
92-
obj = scene.objects[name]
93-
rig_old_name = name
94-
obj.name = rig_new_name or name
95-
except KeyError:
96-
rig_old_name = name
97-
name = rig_new_name or name
98-
obj = bpy.data.objects.new(name, bpy.data.armatures.new(name))
99-
obj.draw_type = 'WIRE'
100-
scene.objects.link(obj)
91+
if metarig.data.rigify_generate_mode == 'overwrite':
92+
if metarig.data.rigify_target_rig is not None:
93+
rig_old_name = metarig.data.rigify_target_rig.name
94+
obj = metarig.data.rigify_target_rig
95+
obj.name = rig_new_name or obj.name
96+
else:
97+
name = rig_new_name
98+
if name in bpy.data.objects:
99+
obj = bpy.data.objects[name]
100+
else:
101+
obj = bpy.data.objects.new(name, bpy.data.armatures.new(name))
102+
obj.draw_type = 'WIRE'
103+
scene.objects.link(obj)
101104
else:
102-
name = rig_new_name or "rig"
103-
obj = bpy.data.objects.new(name, bpy.data.armatures.new(name)) # in case name 'rig' exists it will be rig.001
105+
name = rig_new_name
106+
obj = bpy.data.objects.new(name, bpy.data.armatures.new(name))
104107
obj.draw_type = 'WIRE'
105108
scene.objects.link(obj)
106109

107-
id_store.rigify_target_rig = obj.name
110+
if obj.name not in bpy.context.scene.objects: # rig exists but deleted
111+
bpy.context.scene.objects.link(obj)
112+
113+
metarig.data.rigify_target_rig = obj
108114
obj.data.pose_position = 'POSE'
109115

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

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

479484
# Generate the UI script
480-
if id_store.rigify_generate_mode == 'overwrite':
481-
rig_ui_name = id_store.rigify_rig_ui or 'rig_ui.py'
485+
if metarig.data.rigify_rig_basename:
486+
script_name = metarig.data.rigify_rig_basename + "_rig_ui.py"
482487
else:
483-
rig_ui_name = 'rig_ui.py'
488+
script_name = "rig_ui.py"
484489

485-
if id_store.rigify_generate_mode == 'overwrite' and rig_ui_name in bpy.data.texts.keys():
486-
script = bpy.data.texts[rig_ui_name]
487-
script.clear()
490+
if metarig.data.rigify_generate_mode == 'overwrite':
491+
if metarig.data.rigify_rig_ui:
492+
script = metarig.data.rigify_rig_ui
493+
else:
494+
if script_name in bpy.data.texts:
495+
script = bpy.data.texts[script_name]
496+
else:
497+
script = bpy.data.texts.new(script_name)
488498
else:
489499
script = bpy.data.texts.new("rig_ui.py")
490500

491-
rig_ui_old_name = ""
492-
if id_store.rigify_rig_basename:
493-
rig_ui_old_name = script.name
494-
script.name = id_store.rigify_rig_basename + "_rig_ui.py"
501+
script.name = script_name
495502

496-
id_store.rigify_rig_ui = script.name
503+
metarig.data.rigify_rig_ui = script
497504

498505
script.write(UI_SLIDERS % rig_id)
499506
for s in ui_scripts:

ui.py

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -93,65 +93,52 @@ def draw(self, context):
9393
layout.operator("pose.rigify_upgrade_types", text="Upgrade Metarig")
9494

9595
row = layout.row()
96+
armature_id_store = C.object.data
97+
9698
row.operator("pose.rigify_generate", text="Generate Rig", icon='POSE_HLT')
9799
row.enabled = enable_generate_and_advanced
98100

99-
if id_store.rigify_advanced_generation:
101+
if armature_id_store.rigify_advanced_generation:
100102
icon = 'UNLOCKED'
101103
else:
102104
icon = 'LOCKED'
103105

104106
col = layout.column()
105107
col.enabled = enable_generate_and_advanced
106108
row = col.row()
107-
row.prop(id_store, "rigify_advanced_generation", toggle=True, icon=icon)
109+
row.prop(armature_id_store, "rigify_advanced_generation", toggle=True, icon=icon)
108110

109-
if id_store.rigify_advanced_generation:
111+
if armature_id_store.rigify_advanced_generation:
110112

111113
row = col.row(align=True)
112-
row.prop(id_store, "rigify_generate_mode", expand=True)
114+
row.prop(armature_id_store, "rigify_generate_mode", expand=True)
113115

114116
main_row = col.row(align=True).split(percentage=0.3)
115117
col1 = main_row.column()
116118
col2 = main_row.column()
117119
col1.label(text="Rig Name")
118120
row = col1.row()
119121
row.label(text="Target Rig")
120-
row.enabled = (id_store.rigify_generate_mode == "overwrite")
122+
row.enabled = (armature_id_store.rigify_generate_mode == "overwrite")
121123
row = col1.row()
122124
row.label(text="Target UI")
123-
row.enabled = (id_store.rigify_generate_mode == "overwrite")
125+
row.enabled = (armature_id_store.rigify_generate_mode == "overwrite")
124126

125127
row = col2.row(align=True)
126-
row.prop(id_store, "rigify_rig_basename", text="", icon="SORTALPHA")
128+
row.prop(armature_id_store, "rigify_rig_basename", text="", icon="SORTALPHA")
127129

128130
row = col2.row(align=True)
129-
for i in range(0, len(id_store.rigify_target_rigs)):
130-
id_store.rigify_target_rigs.remove(0)
131-
132-
for ob in context.scene.objects:
133-
if type(ob.data) == bpy.types.Armature and "rig_id" in ob.data:
134-
id_store.rigify_target_rigs.add()
135-
id_store.rigify_target_rigs[-1].name = ob.name
136-
137-
row.prop_search(id_store, "rigify_target_rig", id_store, "rigify_target_rigs", text="",
138-
icon='OUTLINER_OB_ARMATURE')
139-
row.enabled = (id_store.rigify_generate_mode == "overwrite")
131+
row.prop(armature_id_store, "rigify_target_rig", text="")
132+
row.enabled = (armature_id_store.rigify_generate_mode == "overwrite")
140133

141-
for i in range(0, len(id_store.rigify_rig_uis)):
142-
id_store.rigify_rig_uis.remove(0)
143-
144-
for t in bpy.data.texts:
145-
id_store.rigify_rig_uis.add()
146-
id_store.rigify_rig_uis[-1].name = t.name
147134

148135
row = col2.row()
149-
row.prop_search(id_store, "rigify_rig_ui", id_store, "rigify_rig_uis", text="", icon='TEXT')
150-
row.enabled = (id_store.rigify_generate_mode == "overwrite")
136+
row.prop(armature_id_store, "rigify_rig_ui", text="")
137+
row.enabled = (armature_id_store.rigify_generate_mode == "overwrite")
151138

152139
row = col.row()
153-
row.prop(id_store, "rigify_force_widget_update")
154-
if id_store.rigify_generate_mode == 'new':
140+
row.prop(armature_id_store, "rigify_force_widget_update")
141+
if armature_id_store.rigify_generate_mode == 'new':
155142
row.enabled = False
156143

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

14191406
rot_mode.unregister()
1420-

0 commit comments

Comments
 (0)