AnimAll: Update panel Rename, Cleanup

Bumped version to 0.8.1
As a part of the task T50726:
Update the Panel rename code to a more generic one

PEP8 cleanup:
Tuple imports and use them for class types
instead of the star import
Consistent Scene props definitions

UI refresh when adding or removing keyframes
Fix crash when on delete when there is no keyframes
More extensive Clear Animation tooltip
Fix a misaligned prop
This commit is contained in:
Vuk Gardašević 2017-03-30 22:43:47 +02:00
parent 3a1b03b5a6
commit ac0c5a2cc1
1 changed files with 172 additions and 136 deletions

View File

@ -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()