[Durian-svn] [1473] Added a new python keying set for Durian animators.

nathan institute at blender.org
Wed Mar 24 13:56:50 CET 2010


Revision: 1473
          https://blenderinstitute.dyndns.org/durian-svn/?do=log&project=durian&path=/&rev=1473
Author:   nathan
Date:     2010-03-24 13:56:50 +0100 (Wed, 24 Mar 2010)
Log Message:
-----------
Added a new python keying set for Durian animators.  It keys loc/rot/scale and numerical custom properties on selected objects and bones.  It also ignores locked channels (good for keeping actions clean).

Added Paths:
-----------
    pro/scripts/ui/keying_sets.py

Added: pro/scripts/ui/keying_sets.py
===================================================================
--- pro/scripts/ui/keying_sets.py	                        (rev 0)
+++ pro/scripts/ui/keying_sets.py	2010-03-24 12:56:50 UTC (rev 1473)
@@ -0,0 +1,117 @@
+import bpy
+
+def path_add_property(path, prop):
+    if len(path):
+        return path + "." + prop
+    else:
+        return prop
+        
+
+
+
+def key_loc(id_block, path, data, group_method, grouping, ks):
+    """ Add unlocked translation channels to a keying set.
+    """
+    for i in range(0,3):
+        if not data.lock_location[i]:
+            ks.add_path(id_block, path_add_property(path, "location"), grouping_method=group_method, group_name=grouping, array_index=i, entire_array=False)
+
+
+def key_rot(id_block, path, data, group_method, grouping, ks):
+    """ Add unlocked rotation channels to a keying set.
+    """
+    locks_4d = [data.lock_rotation_w] + list(data.lock_rotation)
+    if data.rotation_mode == "QUATERNION":
+        for i in range(0,4):
+            if not locks_4d[i]:
+                ks.add_path(id_block, path_add_property(path, "rotation_quaternion"), grouping_method=group_method, group_name=grouping, array_index=i, entire_array=False)
+    elif data.rotation_mode == "AXIS_ANGLE":
+        for i in range(0,4):
+            if not locks_4d[i]:
+                ks.add_path(id_block, path_add_property(path, "rotation_axis_angle"), grouping_method=group_method, group_name=grouping, array_index=i, entire_array=False)
+    else:
+        for i in range(0,3):
+            if not data.lock_rotation[i]:
+                ks.add_path(id_block, path_add_property(path, "rotation_euler"), grouping_method=group_method, group_name=grouping, array_index=i, entire_array=False)
+
+
+def key_scale(id_block, path, data, group_method, grouping, ks):
+    """ Add unlocked scale channels to a keying set.
+    """
+    for i in range(0,3):
+        if not data.lock_scale[i]:
+            ks.add_path(id_block, path_add_property(path, "scale"), grouping_method=group_method, group_name=grouping, array_index=i, entire_array=False)
+
+
+
+    
+
+
+# LocRotScale
+class KSI_LocRotScaleProps(bpy.types.KeyingSetInfo):
+    bl_label = "LocRotScaleProps"
+    
+    
+    def poll(self, context):
+        """ Allow keying if there are selected objects.
+        """
+        return len(context.selected_objects) != 0
+    
+    
+    def iterator(self, context, ks):
+        """ Iterate over all selected objects and bones.
+        """
+        if (context.active_object) and (context.active_object.mode == 'POSE'):
+            for bone in context.selected_pose_bones:
+                self.generate(context, ks, bone)
+        else:
+            for ob in context.selected_objects:
+                self.generate(context, ks, ob)
+        
+        
+    def generate(self, context, ks, data):
+        """ Key unlocked transforms and custom properties.
+        """
+        id_block = data.id_data
+        try:
+            path = data.path_to_id()
+        except TypeError:
+            path = ""
+            grouping = None
+        else:
+            grouping = data.name
+        
+        # Custom properties
+        try:
+            data["_RNA_UI"]
+        except KeyError:
+            pass
+        else:
+            for prop in data["_RNA_UI"]:
+                if (type(data[prop]) is float) or (type(data[prop]) is int):
+                    ks.add_path(id_block, path + ('["%s"]' % prop), grouping_method='NONE')
+        
+        # Transforms
+        if grouping:
+            key_loc(id_block, path, data, 'NAMED', grouping, ks)
+            key_rot(id_block, path, data, 'NAMED', grouping, ks)
+            key_scale(id_block, path, data, 'NAMED', grouping, ks)
+        else:
+            key_loc(id_block, path, data, 'NONE', "", ks)
+            key_rot(id_block, path, data, 'NONE', "", ks)
+            key_scale(id_block, path, data, 'NONE', "", ks)
+        
+        
+
+
+
+def register():
+    bpy.types.register(KSI_LocRotScaleProps)
+
+
+def unregister():
+    bpy.types.unregister(KSI_LocRotScaleProps)
+
+if __name__ == "__main__":
+    register()
+    



More information about the Durian-svn mailing list