From 5202fca6d51f31fab102d3a925df02efd5c934f5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Sep 2014 11:06:18 +1000 Subject: Fix for rna2xml - follow references to Bone, Sequence, Node (non ID types) by name only. was causing infinite recursion. - add support to skip individual class properties. This can now write an entire blend-file. --- release/scripts/modules/rna_xml.py | 39 +++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'release/scripts/modules/rna_xml.py') diff --git a/release/scripts/modules/rna_xml.py b/release/scripts/modules/rna_xml.py index 08b60ebc6f8..9776993b74b 100644 --- a/release/scripts/modules/rna_xml.py +++ b/release/scripts/modules/rna_xml.py @@ -23,7 +23,7 @@ import bpy -def build_property_typemap(skip_classes): +def build_property_typemap(skip_classes, skip_typemap): property_typemap = {} @@ -42,6 +42,18 @@ def build_property_typemap(skip_classes): properties.remove("rna_type") property_typemap[attr] = properties + if skip_typemap: + for cls_name, properties_blacklist in skip_typemap.items(): + properties = property_typemap.get(cls_name) + if properties is not None: + for prop_id in properties_blacklist: + try: + properties.remove(prop_id) + except: + print("skip_typemap unknown prop_id '%s.%s'" % (cls_name, prop_id)) + else: + print("skip_typemap unknown class '%s'" % cls_name) + return property_typemap @@ -59,12 +71,27 @@ def rna2xml(fw=print_ln, bpy.types.Panel, bpy.types.KeyingSet, bpy.types.Header, + bpy.types.PropertyGroup, ), + skip_typemap=None, pretty_format=True, method='DATA'): from xml.sax.saxutils import quoteattr - property_typemap = build_property_typemap(skip_classes) + property_typemap = build_property_typemap(skip_classes, skip_typemap) + + # don't follow properties of this type, just reference them by name + # they MUST have a unique 'name' property. + # 'ID' covers most types + referenced_classes = ( + bpy.types.ID, + bpy.types.Bone, + bpy.types.ActionGroup, + bpy.types.PoseBone, + bpy.types.Node, + bpy.types.Sequence, + ) + def number_to_str(val, val_type): if val_type == int: @@ -107,7 +134,7 @@ def rna2xml(fw=print_ln, node_attrs.append("%s=%s" % (prop, quoteattr("{" + ",".join(list(subvalue)) + "}"))) elif subvalue is None: node_attrs.append("%s=\"NONE\"" % prop) - elif issubclass(subvalue_type, bpy.types.ID): + elif issubclass(subvalue_type, referenced_classes): # special case, ID's are always referenced. node_attrs.append("%s=%s" % (prop, quoteattr(subvalue_type.__name__ + "::" + subvalue.name))) else: @@ -361,7 +388,7 @@ def xml_file_run(context, filepath, rna_map): xml2rna(xml_node, root_rna=value) -def xml_file_write(context, filepath, rna_map): +def xml_file_write(context, filepath, rna_map, skip_typemap=None): file = open(filepath, "w", encoding="utf-8") fw = file.write @@ -375,7 +402,9 @@ def xml_file_write(context, filepath, rna_map): root_rna=value, method='ATTR', root_ident=" ", - ident_val=" ") + ident_val=" ", + skip_typemap=skip_typemap, + ) fw("\n") file.close() -- cgit v1.2.3