diff options
-rw-r--r-- | animation_animall.py | 308 |
1 files changed, 172 insertions, 136 deletions
diff --git a/animation_animall.py b/animation_animall.py index 8c9c26c0..42760e86 100644 --- a/animation_animall.py +++ b/animation_animall.py @@ -19,96 +19,126 @@ bl_info = { "name": "AnimAll", "author": "Daniel Salazar <zanqdo@gmail.com>", - "version": (0, 8), + "version": (0, 8, 1), "blender": (2, 73), "location": "Tool bar > Animation tab > AnimAll", "description": "Allows animation of mesh, lattice, curve and surface data", "warning": "", - "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/" + "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/" "Scripts/Animation/AnimAll", "category": "Animation", } -"""------------------------------------------------------------------------- +""" Thanks to Campbell Barton and Joshua Leung for hes API additions and fixes Daniel 'ZanQdo' Salazar --------------------------------------------------------------------------""" +""" import bpy -from bpy.props import * +from bpy.types import ( + Operator, + Panel, + AddonPreferences, + ) +from bpy.props import ( + BoolProperty, + StringProperty, + ) -# # Property Definitions -# + bpy.types.WindowManager.key_shape = BoolProperty( name="Shape", description="Insert keyframes on active Shape Key layer", - default=False) - + default=False + ) bpy.types.WindowManager.key_uvs = BoolProperty( name="UVs", description="Insert keyframes on active UV coordinates", - default=False) - + default=False + ) bpy.types.WindowManager.key_ebevel = BoolProperty( name="E-Bevel", description="Insert keyframes on edge bevel weight", - default=False) - + default=False + ) bpy.types.WindowManager.key_vbevel = BoolProperty( name="V-Bevel", description="Insert keyframes on vertex bevel weight", - default=False) - + default=False + ) bpy.types.WindowManager.key_crease = BoolProperty( name="Crease", description="Insert keyframes on edge creases", - default=False) - + default=False + ) bpy.types.WindowManager.key_vcols = BoolProperty( name="V-Cols", description="Insert keyframes on active Vertex Color values", - default=False) - + default=False + ) bpy.types.WindowManager.key_vgroups = BoolProperty( name="V-Groups", description="Insert keyframes on active Vertex Group values", - default=False) - + default=False + ) bpy.types.WindowManager.key_points = BoolProperty( name="Points", description="Insert keyframes on point locations", - default=False) - + default=False + ) bpy.types.WindowManager.key_radius = BoolProperty( name="Radius", description="Insert keyframes on point radius (Shrink/Fatten)", - default=False) - + default=False + ) bpy.types.WindowManager.key_tilt = BoolProperty( name="Tilt", description="Insert keyframes on point tilt", - default=False) + default=False + ) + + +# Utility functions + +def refresh_ui_keyframes(): + try: + for area in bpy.context.screen.areas: + if area.type in ('TIMELINE', 'GRAPH_EDITOR', 'DOPESHEET_EDITOR'): + area.tag_redraw() + except: + pass + + +def insert_key(data, key): + try: + data.keyframe_insert(key) + except: + pass + + +def delete_key(data, key): + try: + data.keyframe_delete(key) + except: + pass + -# # GUI (Panel) -# -class VIEW3D_PT_animall(bpy.types.Panel): +class VIEW3D_PT_animall(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'TOOLS' bl_category = "Animation" bl_label = 'AnimAll' - #bl_options = {'DEFAULT_CLOSED'} + @classmethod def poll(self, context): if context.active_object and context.active_object.type in {'MESH', 'LATTICE', 'CURVE', 'SURFACE'}: return context.active_object.type - # draw the gui def draw(self, context): - Obj = context.active_object layout = self.layout @@ -125,12 +155,12 @@ class VIEW3D_PT_animall(bpy.types.Panel): row = col.row() row.prop(context.window_manager, "key_ebevel") row.prop(context.window_manager, "key_vbevel") - col.prop(context.window_manager, "key_crease") + row = col.row() + row.prop(context.window_manager, "key_crease") + row.prop(context.window_manager, "key_uvs") row = col.row() row.prop(context.window_manager, "key_vcols") row.prop(context.window_manager, "key_vgroups") - row = col.row() - row.prop(context.window_manager, "key_uvs") elif Obj.type == 'CURVE': row.prop(context.window_manager, "key_points") @@ -146,14 +176,14 @@ class VIEW3D_PT_animall(bpy.types.Panel): row.prop(context.window_manager, "key_radius") row.prop(context.window_manager, "key_tilt") - row = col.row() - row.operator('anim.insert_keyframe_animall', icon='KEY_HLT') - row.operator('anim.delete_keyframe_animall', icon='KEY_DEHLT') + layout.separator() + row = layout.row(align=True) + row.operator("anim.insert_keyframe_animall", icon="KEY_HLT") + row.operator("anim.delete_keyframe_animall", icon="KEY_DEHLT") row = layout.row() - row.operator('anim.clear_animation_animall', icon='X') + row.operator("anim.clear_animation_animall", icon="X") if context.window_manager.key_shape: - ShapeKey = Obj.active_shape_key ShapeKeyIndex = Obj.active_shape_key_index @@ -161,39 +191,34 @@ class VIEW3D_PT_animall(bpy.types.Panel): row = split.row() if ShapeKeyIndex > 0: - row.label(ShapeKey.name, icon='SHAPEKEY_DATA') + row.label(ShapeKey.name, icon="SHAPEKEY_DATA") row.prop(ShapeKey, "value", text="") row.prop(Obj, "show_only_shape_key", text="") if ShapeKey.value < 1: row = layout.row() - row.label('Maybe set "%s" to 1.0?' % ShapeKey.name, icon='INFO') + row.label('Maybe set "%s" to 1.0?' % ShapeKey.name, icon="INFO") elif ShapeKey: - row.label('Can not key on Basis Shape', icon='ERROR') + row.label("Can not key on Basis Shape", icon="ERROR") else: - row.label('No active Shape Key', icon='ERROR') + row.label("No active Shape Key", icon="ERROR") if context.window_manager.key_points and context.window_manager.key_shape: row = layout.row() - row.label('"Points" and "Shape" are redundant?', icon='INFO') + row.label('"Points" and "Shape" are redundant?', icon="INFO") -class ANIM_OT_insert_keyframe_animall(bpy.types.Operator): - bl_label = 'Insert' - bl_idname = 'anim.insert_keyframe_animall' - bl_description = 'Insert a Keyframe' +class ANIM_OT_insert_keyframe_animall(Operator): + bl_label = "Insert" + bl_idname = "anim.insert_keyframe_animall" + bl_description = "Insert a Keyframe" bl_options = {'REGISTER', 'UNDO'} - - # on mouse up: def invoke(self, context, event): - self.execute(context) return {'FINISHED'} - def execute(op, context): - Obj = context.active_object if Obj.type == 'MESH': @@ -207,38 +232,38 @@ class ANIM_OT_insert_keyframe_animall(bpy.types.Operator): if context.window_manager.key_shape: if Obj.active_shape_key_index > 0: for Vert in Obj.active_shape_key.data: - Vert.keyframe_insert('co') + insert_key(Vert, 'co') if context.window_manager.key_points: for Vert in Data.vertices: - Vert.keyframe_insert('co') + insert_key(Vert, 'co') if context.window_manager.key_ebevel: for Edge in Data.edges: - Edge.keyframe_insert('bevel_weight') + insert_key(Edge, 'bevel_weight') if context.window_manager.key_vbevel: for Vert in Data.vertices: - Vert.keyframe_insert('bevel_weight') + insert_key(Vert, 'bevel_weight') if context.window_manager.key_crease: for Edge in Data.edges: - Edge.keyframe_insert('crease') + insert_key(Edge, 'crease') if context.window_manager.key_vgroups: for Vert in Data.vertices: for Group in Vert.groups: - Group.keyframe_insert('weight') + insert_key(Group, 'weight') if context.window_manager.key_uvs: for UV in Data.uv_layers.active.data: - UV.keyframe_insert('uv') + insert_key(UV, 'uv') if context.window_manager.key_vcols: for VColLayer in Data.vertex_colors: - if VColLayer.active: # only insert in active VCol layer + if VColLayer.active: # only insert in active VCol layer for Data in VColLayer.data: - Data.keyframe_insert('color') + insert_key(Data, 'color') if Mode: bpy.ops.object.editmode_toggle() @@ -254,11 +279,11 @@ class ANIM_OT_insert_keyframe_animall(bpy.types.Operator): if context.window_manager.key_shape: if Obj.active_shape_key_index > 0: for Point in Obj.active_shape_key.data: - Point.keyframe_insert('co') + insert_key(Point, 'co') if context.window_manager.key_points: for Point in Data.points: - Point.keyframe_insert('co_deform') + insert_key(Point, 'co_deform') if Mode: bpy.ops.object.editmode_toggle() @@ -275,65 +300,56 @@ class ANIM_OT_insert_keyframe_animall(bpy.types.Operator): if context.window_manager.key_shape: if Obj.active_shape_key_index > 0: for CV in Obj.active_shape_key.data: - CV.keyframe_insert('co') - try: # in case spline has no handles - CV.keyframe_insert('handle_left') - CV.keyframe_insert('handle_right') - except: pass + insert_key(CV, 'co') + insert_key(CV, 'handle_left') + insert_key(CV, 'handle_right') for Spline in Data.splines: if Spline.type == 'BEZIER': for CV in Spline.bezier_points: - if context.window_manager.key_points: - CV.keyframe_insert('co') - CV.keyframe_insert('handle_left') - CV.keyframe_insert('handle_right') + insert_key(CV, 'co') + insert_key(CV, 'handle_left') + insert_key(CV, 'handle_right') if context.window_manager.key_radius: - CV.keyframe_insert('radius') + insert_key(CV, 'radius') if context.window_manager.key_tilt: - CV.keyframe_insert('tilt') + insert_key(CV, 'tilt') elif Spline.type == 'NURBS': - for CV in Spline.points: - if context.window_manager.key_points: - CV.keyframe_insert('co') + insert_key(CV, 'co') if context.window_manager.key_radius: - CV.keyframe_insert('radius') + insert_key(CV, 'radius') if context.window_manager.key_tilt: - CV.keyframe_insert('tilt') + insert_key(CV, 'tilt') if Mode: bpy.ops.object.editmode_toggle() + refresh_ui_keyframes() return {'FINISHED'} -class ANIM_OT_delete_keyframe_animall(bpy.types.Operator): - bl_label = 'Delete' - bl_idname = 'anim.delete_keyframe_animall' - bl_description = 'Delete a Keyframe' +class ANIM_OT_delete_keyframe_animall(Operator): + bl_label = "Delete" + bl_idname = "anim.delete_keyframe_animall" + bl_description = "Delete a Keyframe" bl_options = {'REGISTER', 'UNDO'} - - # on mouse up: def invoke(self, context, event): - self.execute(context) return {'FINISHED'} - def execute(op, context): - Obj = context.active_object if Obj.type == 'MESH': @@ -347,44 +363,43 @@ class ANIM_OT_delete_keyframe_animall(bpy.types.Operator): if context.window_manager.key_shape: if Obj.active_shape_key: for Vert in Obj.active_shape_key.data: - Vert.keyframe_delete('co') + delete_key(Vert, 'co') if context.window_manager.key_points: for Vert in Data.vertices: - Vert.keyframe_delete('co') + delete_key(Vert, 'co') if context.window_manager.key_ebevel: for Edge in Data.edges: - Edge.keyframe_delete('bevel_weight') + delete_key(Edge, 'bevel_weight') if context.window_manager.key_vbevel: for Vert in Data.vertices: - Vert.keyframe_delete('bevel_weight') + delete_key(Vert, 'bevel_weight') if context.window_manager.key_crease: for Edge in Data.edges: - Edge.keyframe_delete('crease') + delete_key(Edge, 'crease') if context.window_manager.key_vgroups: for Vert in Data.vertices: for Group in Vert.groups: - Group.keyframe_delete('weight') + delete_key(Group, 'weight') if context.window_manager.key_uvs: for UV in Data.uv_layers.active.data: - UV.keyframe_delete('uv') + delete_key(UV, 'uv') if context.window_manager.key_vcols: for VColLayer in Data.vertex_colors: - if VColLayer.active: # only delete in active VCol layer + if VColLayer.active: # only delete in active VCol layer for Data in VColLayer.data: - Data.keyframe_delete('color') + delete_key(Data, 'color') if Mode: bpy.ops.object.editmode_toggle() if Obj.type == 'LATTICE': - Mode = False if context.mode != 'OBJECT': Mode = not Mode @@ -395,11 +410,11 @@ class ANIM_OT_delete_keyframe_animall(bpy.types.Operator): if context.window_manager.key_shape: if Obj.active_shape_key: for Point in Obj.active_shape_key.data: - Point.keyframe_delete('co') + delete_key(Point, 'co') if context.window_manager.key_points: for Point in Data.points: - Point.keyframe_delete('co_deform') + delete_key(Point, 'co_deform') if Mode: bpy.ops.object.editmode_toggle() @@ -416,98 +431,119 @@ class ANIM_OT_delete_keyframe_animall(bpy.types.Operator): if context.window_manager.key_shape: if Obj.active_shape_key_index > 0: for CV in Obj.active_shape_key.data: - CV.keyframe_delete('co') - try: # in case spline has no handles - CV.keyframe_delete('handle_left') - CV.keyframe_delete('handle_right') - except: pass + delete_key(CV, 'co') + delete_key(CV, 'handle_left') + delete_key(CV, 'handle_right') for Spline in Data.splines: if Spline.type == 'BEZIER': for CV in Spline.bezier_points: if context.window_manager.key_points: - CV.keyframe_delete('co') - CV.keyframe_delete('handle_left') - CV.keyframe_delete('handle_right') + delete_key(CV, 'co') + delete_key(CV, 'handle_left') + delete_key(CV, 'handle_right') if context.window_manager.key_radius: - CV.keyframe_delete('radius') + delete_key(CV, 'radius') if context.window_manager.key_tilt: - CV.keyframe_delete('tilt') + delete_key(CV, 'tilt') elif Spline.type == 'NURBS': for CV in Spline.points: if context.window_manager.key_points: - CV.keyframe_delete('co') + delete_key(CV, 'co') if context.window_manager.key_radius: - CV.keyframe_delete('radius') + delete_key(CV, 'radius') if context.window_manager.key_tilt: - CV.keyframe_delete('tilt') + delete_key(CV, 'tilt') if Mode: bpy.ops.object.editmode_toggle() + refresh_ui_keyframes() return {'FINISHED'} -class ANIM_OT_clear_animation_animall(bpy.types.Operator): - bl_label = 'Clear Animation' - bl_idname = 'anim.clear_animation_animall' - bl_description = 'Delete all keyframes for this object' +class ANIM_OT_clear_animation_animall(Operator): + bl_label = "Clear Animation" + bl_idname = "anim.clear_animation_animall" + bl_description = ("Delete all keyframes for this object\n" + "If in a specific case it doesn't work\n" + "try to delete the keys manually") bl_options = {'REGISTER', 'UNDO'} - # on mouse up: def invoke(self, context, event): - wm = context.window_manager return wm.invoke_confirm(self, event) + def execute(self, context): + try: + Data = context.active_object.data + Data.animation_data_clear() + except: + self.report({'WARNING'}, "Clear Animation could not be performed") + return {'CANCELLED'} - def execute(op, context): - - Data = context.active_object.data - Data.animation_data_clear() + refresh_ui_keyframes() return {'FINISHED'} -## Addons Preferences Update Panel + +# Add-ons Preferences Update Panel + +# Define Panel classes for updating +panels = [ + VIEW3D_PT_animall + ] + + def update_panel(self, context): + message = "AnimAll: Updating Panel locations has failed" try: - bpy.utils.unregister_class(VIEW3D_PT_animall) - except: + for panel in panels: + if "bl_rna" in panel.__dict__: + bpy.utils.unregister_class(panel) + + for panel in panels: + panel.bl_category = context.user_preferences.addons[__name__].preferences.category + bpy.utils.register_class(panel) + + except Exception as e: + print("\n[{}]\n{}\n\nError:\n{}".format(__name__, message, e)) pass - VIEW3D_PT_animall.bl_category = context.user_preferences.addons[__name__].preferences.category - bpy.utils.register_class(VIEW3D_PT_animall) -class AnimallAddonPreferences(bpy.types.AddonPreferences): +class AnimallAddonPreferences(AddonPreferences): # this must match the addon name, use '__package__' # when defining this in a submodule of a python package. bl_idname = __name__ - category = bpy.props.StringProperty( + category = StringProperty( name="Tab Category", description="Choose a name for the category of the panel", default="Animation", - update=update_panel) + update=update_panel + ) def draw(self, context): - layout = self.layout row = layout.row() col = row.column() + col.label(text="Tab Category:") col.prop(self, "category", text="") + def register(): bpy.utils.register_module(__name__) - + update_panel(None, bpy.context) pass + def unregister(): bpy.utils.unregister_module(__name__) - pass + if __name__ == "__main__": register() |