Materialx Protobuf API 1.39.4
Serialization API to convert between MaterialX and Google Protobuf formats.
Loading...
Searching...
No Matches
materialx_serializer.ProtobufToMaterialX Class Reference

Converter class to transform Protobuf MaterialXDocument messages back into MaterialX document objects. More...

Public Member Functions

 convert (self, pb_doc, mx)
 Convert a Protobuf MaterialXDocument message to a MaterialX document object.

Protected Member Functions

 _check_version_and_upgrade (self, pb_doc, mx)
 Check schema version and perform upgrades if necessary.
 _convert_element (self, pb_elem, parent, mx)
 Recursively convert a Protobuf MaterialXElement to a MaterialX element.

Detailed Description

Converter class to transform Protobuf MaterialXDocument messages back into MaterialX document objects.

  • Traverses the Protobuf message structure and reconstructs the corresponding MaterialX document hierarchy.
  • Handles attributes and child elements recursively.
  • Requires the MaterialX Python API to create and manipulate document elements.
  • Usage: converter = ProtobufToMaterialX() mx_doc = converter.convert(pb_doc, mx)
  • Where pb_doc is a MaterialXDocument Protobuf message and mx is the MaterialX Python module.

Member Function Documentation

◆ _check_version_and_upgrade()

materialx_serializer.ProtobufToMaterialX._check_version_and_upgrade ( self,
pb_doc,
mx )
protected

Check schema version and perform upgrades if necessary.

Parameters
pb_docThe Protobuf MaterialXDocument message.
mxThe MaterialX Python module.
Returns
A new MaterialX document object.
115 def _check_version_and_upgrade(self, pb_doc, mx):
116 """
117 @brief Check schema version and perform upgrades if necessary.
118 @param pb_doc The Protobuf MaterialXDocument message.
119 @param mx The MaterialX Python module.
120 @return A new MaterialX document object.
121 """
122 doc = mx.createDocument()
123
124 # Check if version is set
125 if pb_doc.HasField('schema_version'):
126 major = pb_doc.schema_version.major
127 minor = pb_doc.schema_version.minor
128 patch = pb_doc.schema_version.patch
129
130 # Version compatibility check
131 if major > SCHEMA_VERSION_MAJOR:
132 raise ValueError(
133 f"Document schema version {major}.{minor}.{patch} is newer than "
134 f"supported version {SCHEMA_VERSION_MAJOR}.{SCHEMA_VERSION_MINOR}.{SCHEMA_VERSION_PATCH}. "
135 f"Please upgrade your software."
136 )
137
138 # Perform upgrades for older versions
139 if major < SCHEMA_VERSION_MAJOR:
140 print(f"Warning: Upgrading document from version {major}.{minor}.{patch} "
141 f"to {SCHEMA_VERSION_MAJOR}.{SCHEMA_VERSION_MINOR}.{SCHEMA_VERSION_PATCH}")
142 # Add upgrade logic here when needed
143 # self._upgrade_v0_to_v1(pb_doc)
144 else:
145 # No version info - assume oldest supported version
146 print("Warning: Document has no schema version information. Assuming legacy format.")
147
148 return doc
149

◆ _convert_element()

materialx_serializer.ProtobufToMaterialX._convert_element ( self,
pb_elem,
parent,
mx )
protected

Recursively convert a Protobuf MaterialXElement to a MaterialX element.

Parameters
pb_elemThe Protobuf MaterialXElement message to convert.
parentThe parent MaterialX element to which the new element will be added.
mxThe MaterialX Python module for element creation.
Returns
The newly created MaterialX element.
150 def _convert_element(self, pb_elem, parent, mx):
151 """
152 @brief Recursively convert a Protobuf MaterialXElement to a MaterialX element.
153 @param pb_elem The Protobuf MaterialXElement message to convert.
154 @param parent The parent MaterialX element to which the new element will be added.
155 @param mx The MaterialX Python module for element creation.
156 @return The newly created MaterialX element.
157 """
158 # Create element
159 #print('Creating element:', pb_elem.type, pb_elem.name)
160 mx_elem = parent.addChildOfCategory(pb_elem.type, pb_elem.name)
161
162 # Set all attributes preserving order
163 for attr in pb_elem.attributes:
164 #print(' Setting attribute:', attr.key, '=', attr.value)
165 mx_elem.setAttribute(attr.key, attr.value)
166
167 # Recursively convert children
168 for pb_child in pb_elem.children:
169 child_elem = self._convert_element(pb_child, mx_elem, mx)
170 #print(' Adding child element:', child_elem.getCategory(), child_elem.getName())
171
172 return mx_elem

◆ convert()

materialx_serializer.ProtobufToMaterialX.convert ( self,
pb_doc,
mx )

Convert a Protobuf MaterialXDocument message to a MaterialX document object.

Parameters
pb_docThe Protobuf MaterialXDocument message to convert.
mxThe MaterialX Python module for document creation.
Returns
The reconstructed MaterialX document object.
97 def convert(self, pb_doc, mx):
98 """
99 Convert a Protobuf MaterialXDocument message to a MaterialX document object.
100 @param pb_doc The Protobuf MaterialXDocument message to convert.
101 @param mx The MaterialX Python module for document creation.
102 @return The reconstructed MaterialX document object.
103 """
104 # Check version compatibility and upgrade if needed
105 doc = self._check_version_and_upgrade(pb_doc, mx)
106
107 for pb_attribute in pb_doc.attributes:
108 doc.setAttribute(pb_attribute.key, pb_attribute.value)
109
110 for pb_element in pb_doc.elements:
111 mx_element = self._convert_element(pb_element, doc, mx)
112
113 return doc
114

The documentation for this class was generated from the following file: