31 parser = argparse.ArgumentParser(description='Convert MaterialX documents to and from Protobuf format.')
32 parser.add_argument(dest="inputFile", help="Path of the input MaterialX document or folder.")
33 parser.add_argument("-j", "--json", action="store_true", help="Output JSON representation of the Protobuf document.")
34 parser.add_argument("-cb", "--convert_back", action="store_true", help="Convert back to MaterialX after Protobuf conversion.")
35 parser.add_argument("-wm", "--write_mermaid", action="store_true", help="Output Mermaid diagram of the Protobuf document.")
36 parser.add_argument('-of', '--output_folder', type=str, help='Output folder for converted files.')
37 parser.add_argument('-dbg', '--debug_pb_doc', type=int, default=0, help='Enable debug output.')
38
39 args = parser.parse_args()
40 input_file = args.inputFile
41
42 convert_from_mtlx = input_file.lower().endswith('.mtlx')
43 convert_from_protobuf = input_file.lower().endswith('.mxpb')
44 write_mermaid = args.write_mermaid if args.write_mermaid else False
45
46 pb_doc = None
47 write_json = args.json if args.json else False
48 output_folder = args.output_folder if args.output_folder else None
49
50
51 if convert_from_protobuf:
52 print('Reading Protobuf file:', input_file)
53 data = None
54 with open(input_file, 'rb') as f:
55 data = f.read()
56 pb_doc = Util.from_string(data)
57 if not pb_doc:
58 print('Error: Failed to parse Protobuf document.')
59 sys.exit(1)
60
61
62 converter = ProtobufToMaterialX()
63 pb_version = pb_doc.schema_version
64 mtlx_version = mx.getVersionString()
65 print(f'Converting Protobuf document using schema version {pb_version.major}.{pb_version.minor}.{pb_version.patch} and MaterialX {mtlx_version}...')
66 doc = converter.convert(pb_doc, mx)
67
68
69 new_doc_string = mx.writeToXmlString(doc)
70 write_file(input_file, output_folder, '_from_pb.mtlx', new_doc_string, True)
71
72
73 if convert_from_mtlx:
74 convert_back = args.convert_back if args.convert_back else False
75
76 print('Reading MaterialX file:', input_file)
77 doc = mx.createDocument()
78 mx.readFromXmlFile(doc, input_file)
79
80
81 converter = MaterialXToProtobuf()
82 print('Converting MaterialX document to Protobuf format...')
83 pb_doc = converter.convert(doc)
84 content = Util.to_string(pb_doc)
85 write_file(input_file, output_folder, '.mxpb', content, True, mode='wb')
86
87
88 if convert_back:
89 converter2 = ProtobufToMaterialX()
90 new_doc = converter2.convert(pb_doc, mx)
91 is_same, messages = compare_mtlx_documents(doc, new_doc)
92 new_doc_string = mx.writeToXmlString(new_doc)
93 write_file(input_file, output_folder, '_converted.mtlx', new_doc_string, True)
94
95 if pb_doc:
96 if write_mermaid:
97 mermaid_code = Util.generate_mermaid_diagram(pb_doc)
98
99 markdown = mermaid_code
100 write_file(input_file, output_folder, '_diagram.mmd', markdown, True)
101
102 if write_json:
103 json_str = Util.to_json(pb_doc, indent=2)
104 write_file(input_file, output_folder, '.json', json_str, True)
105
106 debug_pb_doc = args.debug_pb_doc if args.debug_pb_doc else False
107 if debug_pb_doc:
108 print("*" * 80)
109 if debug_pb_doc == 1:
110 Util.debug_inspect_simple(pb_doc)
111 elif debug_pb_doc == 2:
112 Util.debug_inspect_compact(pb_doc)
113 elif debug_pb_doc == 3:
114 Util.debug_inspect(pb_doc)
115 print("*" * 80)
116
117