Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlijenstina <lijenstina@gmail.com>2017-03-30 23:43:47 +0300
committerlijenstina <lijenstina@gmail.com>2017-03-30 23:43:47 +0300
commitac0c5a2cc112de7d204c164b5219762f5a615bb7 (patch)
treed0708b5d34255b14184b65db8b69000ea1135aef /animation_animall.py
parent3a1b03b5a615614c63ead5a484ae33ce4a92f065 (diff)
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
Diffstat (limited to 'animation_animall.py')
-rw-r--r--animation_animall.py308
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()