Materialx Protobuf API 1.39.4
Serialization API to convert between MaterialX and Google Protobuf formats.
Loading...
Searching...
No Matches
main Namespace Reference

Functions

 write_file (input_path, output_folder, suffix, content, debug_print, mode='w')
 compare_mtlx_documents (doc1, doc2)
 main ()

Function Documentation

◆ compare_mtlx_documents()

main.compare_mtlx_documents ( doc1,
doc2 )
20def compare_mtlx_documents(doc1, doc2):
21 options = mx.ElementEquivalenceOptions()
22 is_same, differences = doc1.isEquivalent(doc2, options)
23 if not is_same:
24 print("Differences found between MaterialX documents:")
25 for diff in differences:
26 print(diff)
27 print("Documents are equivalent:", is_same)
28 return is_same, differences
29

◆ main()

main.main ( )
30def main():
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 # Protobuf to MaterialX conversion
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 # Convert to MaterialX
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 # Write out MaterialX file
69 new_doc_string = mx.writeToXmlString(doc)
70 write_file(input_file, output_folder, '_from_pb.mtlx', new_doc_string, True)
71
72 # MaterialX to Protobuf conversion
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 # Convert and save
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 # Convert back to MaterialX
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 #markdown = '\n```mermaid\n' + mermaid_code + '\n```\n'
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
Definition main.py:1

◆ write_file()

main.write_file ( input_path,
output_folder,
suffix,
content,
debug_print,
mode = 'w' )
6def write_file(input_path, output_folder, suffix, content, debug_print, mode='w'):
7 base_name = os.path.basename(input_path)
8 name, ext = os.path.splitext(base_name)
9 output_file = f"{name}{suffix}"
10 if output_folder:
11 output_file = os.path.join(output_folder, output_file)
12 else:
13 output_file = os.path.join(os.path.dirname(input_path), output_file)
14 if debug_print:
15 print(f'Writing file: {output_file}')
16 with open(output_file, mode) as f:
17 f.write(content)
18 return output_file
19