diff --git a/utils/blend2json.py b/utils/blend2json.py
index 25f81a26c9f8719b068eea87a349bc7961eda6dd..53d643b6fd3d30832f43f3a1aee23e3749e1f1b4 100755
--- a/utils/blend2json.py
+++ b/utils/blend2json.py
@@ -88,12 +88,17 @@ import blendfile
##### Utils (own json formating) #####
-def bytes_to_json(b):
- return json.dumps(repr(b)[2:-1])
+
+def json_default(o):
+ if isinstance(o, bytes):
+ return repr(o)[2:-1]
+ elif i is ...:
+ return "<...>"
+ return o
def json_dumps(i):
- return bytes_to_json(i) if isinstance(i, bytes) else "<...>" if i is ... else json.dumps(i)
+ return json.dumps(i, default=json_default)
def keyval_to_json(kvs, indent, indent_step, compact_output=False):
@@ -101,7 +106,9 @@ def keyval_to_json(kvs, indent, indent_step, compact_output=False):
return ('{' + ', '.join('"%s": %s' % (k, v) for k, v in kvs) + '}')
else:
return ('{%s' % indent_step[:-1] +
- (',\n%s%s' % (indent, indent_step)).join('"%s": %s' % (k, v) for k, v in kvs) +
+ (',\n%s%s' % (indent, indent_step)).join(
+ ('"%s":\n%s%s%s' % (k, indent, indent_step, v) if (v[0] in {'[', '{'}) else
+ '"%s": %s' % (k, v)) for k, v in kvs) +
'\n%s}' % indent)
@@ -113,7 +120,7 @@ def list_to_json(lst, indent, indent_step, compact_output=False):
((',\n%s%s' % (indent, indent_step)).join(
('\n%s%s%s' % (indent, indent_step, l) if (i == 0 and l[0] in {'[', '{'}) else l)
for i, l in enumerate(lst))
- )+
+ ) +
'\n%s]' % indent)
@@ -202,7 +209,7 @@ def do_bblock_filter(filters, blend, block, meta_keyval, data_keyval):
def bblocks_to_json(args, fw, blend, indent, indent_step):
no_address = args.no_address
- full_data = False
+ full_data = args.full_data
def gen_meta_keyval(blend, block):
keyval = [
@@ -218,7 +225,7 @@ def bblocks_to_json(args, fw, blend, indent, indent_step):
return keyval
def gen_data_keyval(blend, block):
- return [(json_dumps(k), json_dumps(v)) for k, v in block.items()]
+ return [(json_dumps(k)[1:-1], json_dumps(v)) for k, v in block.items_recursive_iter()]
if args.block_filters:
for block in blend.blocks:
@@ -232,7 +239,11 @@ def bblocks_to_json(args, fw, blend, indent, indent_step):
is_first = True
for i, block in enumerate(blend.blocks):
if block.user_data is None or block.user_data > 0:
- keyval = keyval_to_json(gen_meta_keyval(blend, block), indent, indent_step, args.compact_output)
+ meta_keyval = gen_meta_keyval(blend, block)
+ if full_data:
+ meta_keyval.append(("data", keyval_to_json(gen_data_keyval(blend, block),
+ indent + indent_step, indent_step, args.compact_output)))
+ keyval = keyval_to_json(meta_keyval, indent, indent_step, args.compact_output)
fw('%s%s%s' % ('' if is_first else ',\n', indent, keyval))
is_first = False
@@ -247,11 +258,11 @@ def bdna_to_json(args, fw, blend, indent, indent_step):
lst = []
for i, field in enumerate(dna.fields):
keyval = (
- ("dna_name", bytes_to_json(field.dna_name.name_only)),
- ("dna_type_id", bytes_to_json(field.dna_type.dna_type_id)),
- ("is_pointer", json.dumps(field.dna_name.is_pointer)),
- ("is_method_pointer", json.dumps(field.dna_name.is_method_pointer)),
- ("array_size", json.dumps(field.dna_name.array_size)),
+ ("dna_name", json_dumps(field.dna_name.name_only)),
+ ("dna_type_id", json_dumps(field.dna_type.dna_type_id)),
+ ("is_pointer", json_dumps(field.dna_name.is_pointer)),
+ ("is_method_pointer", json_dumps(field.dna_name.is_method_pointer)),
+ ("array_size", json_dumps(field.dna_name.array_size)),
)
lst.append(keyval_to_json(keyval, indent + indent_step, indent_step))
return list_to_json(lst, indent, indent_step)
@@ -262,13 +273,13 @@ def bdna_to_json(args, fw, blend, indent, indent_step):
is_first = True
for dna in blend.structs:
keyval = [
- ("dna_type_id", bytes_to_json(dna.dna_type_id)),
- ("size", json.dumps(dna.size)),
+ ("dna_type_id", json_dumps(dna.dna_type_id)),
+ ("size", json_dumps(dna.size)),
]
if full_dna:
keyval += [("fields", bdna_fields_to_json(blend, dna, indent + indent_step, indent_step))]
else:
- keyval += [("nbr_fields", json.dumps(len(dna.fields)))]
+ keyval += [("nbr_fields", json_dumps(len(dna.fields)))]
keyval = keyval_to_json(keyval, indent, indent_step, args.compact_output)
fw('%s%s%s' % ('' if is_first else ',\n', indent, keyval))
is_first = False
@@ -326,9 +337,10 @@ def argparse_create():
parser.add_argument("--no-old-addresses", dest="no_address", default=False, action='store_true', required=False,
help=("Do not output old memory address of each block of data "
"(used as 'uuid' in .blend files, but change pretty noisily)"))
- #~ parser.add_argument("--full-data", dest="full_data",
- #~ default=False, action='store_true', required=False,
- #~ help=("Also put in JSon file data itself (WARNING! will generate *huge* verbose files)"))
+ parser.add_argument("--full-data", dest="full_data",
+ default=False, action='store_true', required=False,
+ help=("Also put in JSon file data itself "
+ "(WARNING! will generate *huge* verbose files - and is far from complete yet)"))
parser.add_argument("--full-dna", dest="full_dna", default=False, action='store_true', required=False,
help=("Also put in JSon file dna properties description (ignored when --compact-output is used)"))