[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25080] trunk/blender/release/scripts/ modules/rigify/__init__.py: change bone storage class so __slots__ can be used for looping over attributes without getting functions

Campbell Barton ideasman42 at gmail.com
Wed Dec 2 20:13:55 CET 2009


Revision: 25080
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25080
Author:   campbellbarton
Date:     2009-12-02 20:13:54 +0100 (Wed, 02 Dec 2009)

Log Message:
-----------
change bone storage class so __slots__ can be used for looping over attributes without getting functions

Modified Paths:
--------------
    trunk/blender/release/scripts/modules/rigify/__init__.py

Modified: trunk/blender/release/scripts/modules/rigify/__init__.py
===================================================================
--- trunk/blender/release/scripts/modules/rigify/__init__.py	2009-12-02 18:35:44 UTC (rev 25079)
+++ trunk/blender/release/scripts/modules/rigify/__init__.py	2009-12-02 19:13:54 UTC (rev 25080)
@@ -24,12 +24,37 @@
 
 empty_layer = [False] * 32
 
-def auto_class(slots, name="ContainerClass"):
-    return type(name, (object,), {"__slots__":tuple(slots)})
+def auto_class(slots, name="ContainerClass", class_dict=None):
     
-def auto_class_instance(slots, name="ContainerClass"):
-    return auto_class(slots, name)()
+    if class_dict:
+        class_dict = class_dict.copy()
+    else:
+        class_dict = {}
 
+    class_dict["__slots__"] = tuple(slots)
+    
+    return type(name, (object,), class_dict)
+    
+def auto_class_instance(slots, name="ContainerClass", class_dict=None):
+    return auto_class(slots, name, class_dict)()
+
+
+def _bone_class_instance_update(self):
+    ''' Re-Assigns bones from the blender data
+    '''
+    arm = self.obj.data
+    bbones = arm.bones
+    pbones = self.obj.pose.bones
+    ebones = arm.edit_bones
+    
+    for member in self.__slots__:
+        if not member[-2] == "_":
+            name = getattr(self, member, None)
+            if name is not None:
+                setattr(self, member + "_b", bbones.get(name, None))
+                setattr(self, member + "_p", pbones.get(name, None))
+                setattr(self, member + "_e", ebones.get(name, None))
+
 def bone_class_instance(obj, slots, name="BoneContainer"):
     slots = slots[:] # dont modify the original
     for i in range(len(slots)):
@@ -37,35 +62,9 @@
         slots.append(member + "_b") # bone bone
         slots.append(member + "_p") # pose bone
         slots.append(member + "_e") # edit bone
-    
-    slots.extend(["obj", "update"])
-    
-    instance = auto_class_instance(slots, name)
-    
-    def update():
-        '''
-        Re-Assigns bones from the blender data
-        '''
-        arm = obj.data
-        
-        bbones = arm.bones
-        pbones = obj.pose.bones
-        ebones = arm.edit_bones
-        
-        for member in slots:
-            
-            if member in ("update", "obj"):
-                continue
-            
-            if not member[-2] == "_":
-                name = getattr(instance, member, None)
-                if name is not None:
-                    setattr(instance, member + "_b", bbones.get(name, None))
-                    setattr(instance, member + "_p", pbones.get(name, None))
-                    setattr(instance, member + "_e", ebones.get(name, None))
-        
-    instance.update = update
-    
+
+    class_dict = {"obj":obj, "update":_bone_class_instance_update}
+    instance = auto_class_instance(slots, name, class_dict)
     return instance
 
 def gen_none(obj, orig_bone_name):
@@ -241,7 +240,7 @@
     code = []
 
     code.append("def %s():" % func_name)
-
+    code.append("    # generated by rigify.write_meta_rig")
     bpy.ops.object.mode_set(mode='EDIT')
     code.append("    bpy.ops.object.mode_set(mode='EDIT')")
 
@@ -351,8 +350,8 @@
             path_png = fn + ".png"
             saved = graphviz_export.graph_armature(ob, path_dot, CONSTRAINTS=True, DRIVERS=True)
 
-            if saved:
-                os.system("dot -Tpng %s > %s; eog %s" % (path_dot, path_png, path_png))
+            #if saved:
+            #    os.system("dot -Tpng %s > %s; eog %s" % (path_dot, path_png, path_png))
     
 
 if __name__ == "__main__":





More information about the Bf-blender-cvs mailing list