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