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)"))