Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-09-10 05:06:18 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-09-10 05:11:15 +0400
commit5202fca6d51f31fab102d3a925df02efd5c934f5 (patch)
tree87d5a25505887cb49078e7198b1c5c47c0ce74ed /release/scripts/modules/rna_xml.py
parent95db507effb9a7c211b0855973b0e17ffae8f16c (diff)
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.
Diffstat (limited to 'release/scripts/modules/rna_xml.py')
-rw-r--r--release/scripts/modules/rna_xml.py39
1 files changed, 34 insertions, 5 deletions
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("</bpy>\n")
file.close()