diff --git a/rigify/__init__.py b/rigify/__init__.py index 803c19c0b59fe14f8a39a697bd2e3d574fb85b9f..8363d037c66ffac04cfdb6d7d80d6234762f6553 100644 --- a/rigify/__init__.py +++ b/rigify/__init__.py @@ -20,7 +20,7 @@ bl_info = { "name": "Rigify", - "version": (0, 6, 0), + "version": (0, 6, 1), "author": "Nathan Vegdahl, Lucio Rossi, Ivan Cappiello, Alexander Gavrilov", "blender": (2, 81, 0), "description": "Automatic rigging from building-block components", @@ -520,7 +520,7 @@ def register(): IDStore.rigify_types = CollectionProperty(type=RigifyName) IDStore.rigify_active_type = IntProperty(name="Rigify Active Type", description="The selected rig type") - IDStore.rigify_advanced_generation = BoolProperty(name="Advanced Options", + bpy.types.Armature.rigify_advanced_generation = BoolProperty(name="Advanced Options", description="Enables/disables advanced options for Rigify rig generation", default=False) @@ -528,27 +528,26 @@ def register(): if self.rigify_generate_mode == 'new': self.rigify_force_widget_update = False - IDStore.rigify_generate_mode = EnumProperty(name="Rigify Generate Rig Mode", + bpy.types.Armature.rigify_generate_mode = 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 = BoolProperty(name="Force Widget Update", + bpy.types.Armature.rigify_force_widget_update = 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 = CollectionProperty(type=RigifyName) - IDStore.rigify_target_rig = StringProperty(name="Rigify Target Rig", + 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", - default="") + poll=lambda self, obj: obj.type == 'ARMATURE' and obj.data is not self) - IDStore.rigify_rig_uis = CollectionProperty(type=RigifyName) - IDStore.rigify_rig_ui = 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="") + bpy.types.Armature.rigify_rig_ui = PointerProperty(type=bpy.types.Text, + name="Rigify Target Rig UI", + description="Defines the UI to overwrite. If unset, 'rig_ui.py' will be used") - IDStore.rigify_rig_basename = StringProperty(name="Rigify Rig Name", + bpy.types.Armature.rigify_rig_basename = 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="") @@ -602,19 +601,17 @@ def unregister(): del ArmStore.rigify_colors_index del ArmStore.rigify_colors_lock del ArmStore.rigify_theme_to_add + del ArmStore.rigify_advanced_generation + del ArmStore.rigify_generate_mode + del ArmStore.rigify_force_widget_update + del ArmStore.rigify_target_rig + del ArmStore.rigify_rig_ui + del ArmStore.rigify_rig_basename IDStore = bpy.types.WindowManager del IDStore.rigify_collection del IDStore.rigify_types del IDStore.rigify_active_type - del IDStore.rigify_advanced_generation - del IDStore.rigify_generate_mode - del IDStore.rigify_force_widget_update - del IDStore.rigify_target_rig - del IDStore.rigify_target_rigs - del IDStore.rigify_rig_uis - del IDStore.rigify_rig_ui - del IDStore.rigify_rig_basename del IDStore.rigify_transfer_only_selected # Classes. diff --git a/rigify/generate.py b/rigify/generate.py index 88b216ed6eeefdbf7835afb07040b3ad148a9e51..295c1a503457d6680482609bb39f3c24ae0abdae 100644 --- a/rigify/generate.py +++ b/rigify/generate.py @@ -69,36 +69,45 @@ class Generator(base_generate.BaseGenerator): def __create_rig_object(self): scene = self.scene id_store = self.id_store + meta_data = self.metarig.data # Check if the generated rig already exists, so we can # regenerate in the same object. If not, create a new # object to generate the rig in. print("Fetch rig.") - if id_store.rigify_generate_mode == 'overwrite': - name = id_store.rigify_target_rig or "rig" - try: + self.rig_new_name = name = meta_data.rigify_rig_basename or "rig" + + obj = None + + if meta_data.rigify_generate_mode == 'overwrite': + obj = meta_data.rigify_target_rig + + if not obj and name in scene.objects: obj = scene.objects[name] - self.rig_old_name = name - obj.name = self.rig_new_name or name + + if obj: + self.rig_old_name = obj.name + + obj.name = name + obj.data.name = obj.name rig_collections = filter_layer_collections_by_object(self.usable_collections, obj) self.layer_collection = (rig_collections + [self.layer_collection])[0] self.collection = self.layer_collection.collection - except KeyError: - self.rig_old_name = name - name = self.rig_new_name or name - obj = bpy.data.objects.new(name, bpy.data.armatures.new(name)) - obj.display_type = 'WIRE' - self.collection.objects.link(obj) - else: - name = self.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 + elif name in bpy.data.objects: + obj = bpy.data.objects[name] + + if not obj: + obj = bpy.data.objects.new(name, bpy.data.armatures.new(name)) obj.display_type = 'WIRE' self.collection.objects.link(obj) - id_store.rigify_target_rig = obj.name + elif obj.name not in self.collection.objects: # rig exists but was deleted + self.collection.objects.link(obj) + + meta_data.rigify_target_rig = obj obj.data.pose_position = 'POSE' self.obj = obj @@ -114,8 +123,8 @@ class Generator(base_generate.BaseGenerator): self.widget_collection = ensure_widget_collection(context) # Remove wgts if force update is set - wgts_group_name = "WGTS_" + (self.rig_old_name or obj.name) - if wgts_group_name in scene.objects and id_store.rigify_force_widget_update: + wgts_group_name = "WGTS_" + (self.rig_old_name or self.obj.name) + if wgts_group_name in scene.objects and self.metarig.data.rigify_force_widget_update: bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.object.select_all(action='DESELECT') for wgt in bpy.data.objects[wgts_group_name].children: @@ -320,9 +329,6 @@ class Generator(base_generate.BaseGenerator): #------------------------------------------ # Create/find the rig object and set it up - if id_store.rigify_rig_basename: - self.rig_new_name = id_store.rigify_rig_basename + "_rig" - obj = self.__create_rig_object() # Get rid of anim data in case the rig already existed diff --git a/rigify/rig_ui_template.py b/rigify/rig_ui_template.py index d7c2e8704536b384424303f30ab25485a9483d2c..888f68711f4e6c93dfe58d84bb1e1511230697d6 100644 --- a/rigify/rig_ui_template.py +++ b/rigify/rig_ui_template.py @@ -1147,7 +1147,6 @@ class ScriptGenerator(base_generate.GeneratorPlugin): def finalize(self): metarig = self.generator.metarig - id_store = self.generator.id_store rig_id = self.generator.rig_id vis_layers = self.obj.data.layers @@ -1162,23 +1161,27 @@ class ScriptGenerator(base_generate.GeneratorPlugin): 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: + rig_ui_name = metarig.data.rigify_rig_basename + '_rig_ui.py' else: rig_ui_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() - else: - script = bpy.data.texts.new("rig_ui.py") + script = None + + if metarig.data.rigify_generate_mode == 'overwrite': + script = metarig.data.rigify_rig_ui + + if not script and rig_ui_name in bpy.data.texts: + script = bpy.data.texts[rig_ui_name] + + if script: + script.clear() + script.name = rig_ui_name - 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" + if script is None: + script = bpy.data.texts.new(rig_ui_name) - id_store.rigify_rig_ui = script.name + metarig.data.rigify_rig_ui = script for s in OrderedDict.fromkeys(self.ui_imports): script.write(s + "\n") diff --git a/rigify/ui.py b/rigify/ui.py index dacbd0a246bd46a32ffbc95fcd317b4c186b7082..7f59e4b422616ff8d12de260952fecb000bbf196 100644 --- a/rigify/ui.py +++ b/rigify/ui.py @@ -77,6 +77,7 @@ class DATA_PT_rigify_buttons(bpy.types.Panel): id_store = C.window_manager if obj.mode in {'POSE', 'OBJECT'}: + armature_id_store = C.object.data WARNING = "Warning: Some features may change after generation" show_warning = False @@ -127,7 +128,7 @@ class DATA_PT_rigify_buttons(bpy.types.Panel): row.enabled = enable_generate_and_advanced - if id_store.rigify_advanced_generation: + if armature_id_store.rigify_advanced_generation: icon = 'UNLOCKED' else: icon = 'LOCKED' @@ -135,12 +136,12 @@ class DATA_PT_rigify_buttons(bpy.types.Panel): 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(factor=0.3) col1 = main_row.column() @@ -148,41 +149,25 @@ class DATA_PT_rigify_buttons(bpy.types.Panel): 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") - - 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.prop(armature_id_store, "rigify_target_rig", text="") + row.enabled = (armature_id_store.rigify_generate_mode == "overwrite") 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="", icon='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':