[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31755] branches/bmesh/blender/release/ scripts/modules: more files
Joseph Eagar
joeedh at gmail.com
Sat Sep 4 21:01:14 CEST 2010
Revision: 31755
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31755
Author: joeedh
Date: 2010-09-04 21:01:14 +0200 (Sat, 04 Sep 2010)
Log Message:
-----------
more files
Added Paths:
-----------
branches/bmesh/blender/release/scripts/modules/animsys_refactor.py
branches/bmesh/blender/release/scripts/modules/bpyml.py
branches/bmesh/blender/release/scripts/modules/bpyml_ui.py
Added: branches/bmesh/blender/release/scripts/modules/animsys_refactor.py
===================================================================
--- branches/bmesh/blender/release/scripts/modules/animsys_refactor.py (rev 0)
+++ branches/bmesh/blender/release/scripts/modules/animsys_refactor.py 2010-09-04 19:01:14 UTC (rev 31755)
@@ -0,0 +1,201 @@
+# ##### 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, rna_update_from_map=None):
+ """ Return (attribute, value) pairs.
+ """
+ pairs = []
+ base = real_base
+ for item in self.data_path:
+ if base is not Ellipsis:
+ try:
+ # this only works when running with an old blender
+ # where the old path will resolve
+ base = eval("base" + item)
+ except:
+ base_new = Ellipsis
+ # guess the new name
+ if item.startswith("."):
+ for item_new in rna_update_from_map.get(item[1:], ()):
+ try:
+ print("base." + item_new)
+ base_new = eval("base." + item_new)
+ break # found, dont keep looking
+ except:
+ pass
+
+ if base_new is Ellipsis:
+ print("Failed to resolve data path:", self.data_path)
+ base = base_new
+
+ 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, rna_update_from_map):
+ # 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, rna_update_from_map)
+
+ 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
+
+ rna_update_from_map = {}
+ for ren_class, ren_from, ren_to in rna_update:
+ rna_update_from_map.setdefault(ren_from, []).append(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, rna_update_from_map)
+ # 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, rna_update_from_map)
+ # 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', 'frame_after', 'frame_after'),
+ ('AnimVizMotionPaths', 'frame_before', 'frame_before'),
+ ('AnimVizOnionSkinning', 'frame_after', 'frame_after'),
+ ]
+
+ update_data_paths(replace_ls)
Property changes on: branches/bmesh/blender/release/scripts/modules/animsys_refactor.py
___________________________________________________________________
Name: svn:executable
+ *
Added: branches/bmesh/blender/release/scripts/modules/bpyml.py
===================================================================
--- branches/bmesh/blender/release/scripts/modules/bpyml.py (rev 0)
+++ branches/bmesh/blender/release/scripts/modules/bpyml.py 2010-09-04 19:01:14 UTC (rev 31755)
@@ -0,0 +1,204 @@
+# ##### 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 translates a python like XML representation into XML
+or simple python blender/ui function calls.
+
+ sometag(arg=10) [
+ another()
+ another(key="value")
+ ]
+
+# converts into ...
+
+ <sometag arg="10">
+ <another/>
+ <another key="value" />
+ </sometag>
+
+"""
+
+TAG, ARGS, CHILDREN = range(3)
+class ReturnStore(tuple):
+ def __getitem__(self, key):
+
+ # single item get's
+ if type(key) is ReturnStore:
+ key = (key, )
+
+ if type(key) is tuple:
+ children = self[CHILDREN]
+ if children:
+ raise Exception("Only a single __getitem__ is allowed on the ReturnStore")
+ else:
+ children[:] = key
+ return self
+ else:
+ return tuple.__getitem__(self, key)
+
+
+class FunctionStore(object):
+ def __call__(self, **kwargs):
+ return ReturnStore((self.__class__.__name__, kwargs, []))
+
+
+def tag_vars(tags, module=__name__):
+ return {tag: type(tag, (FunctionStore, ), {"__module__": module})() for tag in tags}
+
+
+def tag_module(mod_name, tags):
+ import sys
+ from types import ModuleType
+ mod = ModuleType(mod_name)
+ sys.modules[mod_name] = mod
+ dict_values = tag_vars(tags, mod_name)
+ mod.__dict__.update(dict_values)
+ return mod
+
+
+def toxml(py_data, indent=" "):
+
+ if len(py_data) != 1 or type(py_data) != list:
+ raise Exception("Expected a list with one member")
+
+ def _to_xml(py_item, xml_node=None):
+ if xml_node is None:
+ xml_node = newdoc.createElement(py_item[TAG])
+
+ for key, value in py_item[ARGS].items():
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list