[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31447] trunk/blender: utility function for updating animation system values when RNA changes.
Campbell Barton
ideasman42 at gmail.com
Wed Aug 18 20:00:53 CEST 2010
Revision: 31447
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31447
Author: campbellbarton
Date: 2010-08-18 20:00:52 +0200 (Wed, 18 Aug 2010)
Log Message:
-----------
utility function for updating animation system values when RNA changes.
- any numnber of attributes are supported for renaming, eg: modifiers["Foo.Bar"].prop.bar
- the path is resolved in blender so each attribute is type checked against the naming list.
- inherited properties are supported by recursively checking parent classes names aganst the name list.
- fcurves and drivers are currently supported.
Modified Paths:
--------------
trunk/blender/source/blender/editors/space_graph/graph_buttons.c
Added Paths:
-----------
trunk/blender/release/scripts/modules/animsys_refactor.py
Added: trunk/blender/release/scripts/modules/animsys_refactor.py
===================================================================
--- trunk/blender/release/scripts/modules/animsys_refactor.py (rev 0)
+++ trunk/blender/release/scripts/modules/animsys_refactor.py 2010-08-18 18:00:52 UTC (rev 31447)
@@ -0,0 +1,183 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+"""
+This module has utility functions for renaming
+rna values in fcurves and drivers.
+
+The main function to use is: update_data_paths(...)
+"""
+
+IS_TESTING = False
+
+class DataPathBuilder(object):
+ __slots__ = ("data_path", )
+ """ Dummy class used to parse fcurve and driver data paths.
+ """
+ def __init__(self, attrs):
+ self.data_path = attrs
+
+ def __getattr__(self, attr):
+ str_value = ".%s" % attr
+ return DataPathBuilder(self.data_path + (str_value, ))
+
+ def __getitem__(self, key):
+ str_value = '["%s"]' % key
+ return DataPathBuilder(self.data_path + (str_value, ))
+
+ def resolve(self, real_base):
+ """ Return (attribute, value) pairs.
+ """
+ pairs = []
+ base = real_base
+ for item in self.data_path:
+ if base is not Ellipsis:
+ try:
+ base = eval("base" + item)
+ except:
+ print("Failed to resolve data path:", self.data_path)
+ base = Ellipsis
+
+ pairs.append((item, base))
+ return pairs
+
+import bpy
+
+
+def id_iter():
+ type_iter = type(bpy.data.objects)
+
+ for attr in dir(bpy.data):
+ data_iter = getattr(bpy.data, attr, None)
+ if type(data_iter) == type_iter:
+ for id_data in data_iter:
+ if id_data.library is None:
+ yield id_data
+
+
+def anim_data_actions(anim_data):
+ actions = []
+ actions.append(anim_data.action)
+ for track in anim_data.nla_tracks:
+ for strip in track.strips:
+ actions.append(strip.action)
+
+ # filter out None
+ return [act for act in actions if act]
+
+
+def classes_recursive(base_type, clss=None):
+ if clss is None:
+ clss = [base_type]
+ else:
+ clss.append(base_type)
+
+ for base_type_iter in base_type.__bases__:
+ if base_type_iter is not object:
+ classes_recursive(base_type_iter, clss)
+
+ return clss
+
+
+def find_path_new(id_data, data_path, rna_update_dict):
+ # ignore ID props for now
+ if data_path.startswith("["):
+ return data_path
+
+ # recursive path fixing, likely will be one in most cases.
+ data_path_builder = eval("DataPathBuilder(tuple())." + data_path)
+ data_resolve = data_path_builder.resolve(id_data)
+
+ path_new = [pair[0] for pair in data_resolve]
+
+ # print(data_resolve)
+ data_base = id_data
+
+ for i, (attr, data) in enumerate(data_resolve):
+ if data is Ellipsis:
+ break
+
+ if attr.startswith("."):
+ # try all classes
+ for data_base_type in classes_recursive(type(data_base)):
+ attr_new = rna_update_dict.get(data_base_type.__name__, {}).get(attr[1:])
+ if attr_new:
+ path_new[i] = "." + attr_new
+
+ # set this as the base for further properties
+ data_base = data
+
+ data_path_new = "".join(path_new)[1:] # skip the first "."
+ return data_path_new
+
+
+def update_data_paths(rna_update):
+ ''' rna_update triple [(class_name, from, to), ...]
+ '''
+
+ # make a faster lookup dict
+ rna_update_dict = {}
+ for ren_class, ren_from, ren_to in rna_update:
+ rna_update_dict.setdefault(ren_class, {})[ren_from] = ren_to
+
+ for id_data in id_iter():
+ anim_data = getattr(id_data, "animation_data", None)
+ if anim_data is None:
+ continue
+
+ for fcurve in anim_data.drivers:
+ for var in fcurve.driver.variables:
+ if var.type == 'SINGLE_PROP':
+ for tar in var.targets:
+ id_data_other = tar.id
+ data_path = tar.data_path
+
+ if id_data_other and data_path:
+ data_path_new = find_path_new(id_data_other, data_path, rna_update_dict)
+ # print(data_path_new)
+ if data_path_new != data_path:
+ if not IS_TESTING:
+ tar.data_path = data_path_new
+ print("driver (%s): %s -> %s" % (id_data_other.name, data_path, data_path_new))
+
+
+
+ for action in anim_data_actions(anim_data):
+ for fcu in action.fcurves:
+ data_path = fcu.data_path
+ data_path_new = find_path_new(id_data, data_path, rna_update_dict)
+ # print(data_path_new)
+ if data_path_new != data_path:
+ if not IS_TESTING:
+ fcu.data_path = data_path_new
+ print("fcurve (%s): %s -> %s" % (id_data.name, data_path, data_path_new))
+
+
+if __name__ == "__main__":
+
+ # Example, should be called externally
+ # (class, from, to)
+ replace_ls = [
+ ('AnimVizMotionPaths', 'after_current', 'frame_after'),
+ ('AnimVizMotionPaths', 'before_current', 'frame_before'),
+ ('AnimVizOnionSkinning', 'after_current', 'frame_after'),
+ ]
+
+ update_data_paths(replace_ls)
Modified: trunk/blender/source/blender/editors/space_graph/graph_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/space_graph/graph_buttons.c 2010-08-18 15:36:37 UTC (rev 31446)
+++ trunk/blender/source/blender/editors/space_graph/graph_buttons.c 2010-08-18 18:00:52 UTC (rev 31447)
@@ -150,7 +150,7 @@
uiItemR(row, &sceneptr, "frame_current", 0, "Cursor X", 0);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_CFRA);
row= uiLayoutSplit(subcol, 0.7, 1);
- uiItemR(row, &spaceptr, "cursor_value", 0, "Cursor Y", 0);
+ uiItemR(row, &spaceptr, "cursor_position_y", 0, "Cursor Y", 0);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_VALUE);
}
More information about the Bf-blender-cvs
mailing list