MaterialXWeb 0.0.2
Utilities for using MaterialX Packages with Web clients
Loading...
Searching...
No Matches
MaterialXGPUOpenApp.py
1'''
2@file app.py
3@brief A Flask application that connects with the GPUOpen MaterialX server to allow downloading and extracting of materials by regular expression.
4'''
5import argparse
6from flask import Flask, render_template
7from flask_socketio import SocketIO, emit
8from materialxMaterials import GPUOpenLoader as gpuo
9
10# Not required unless performing MaterialX operations on data
11#import MaterialX as mx
12
14 def __init__(self, home):
15 self.home = home
16
17 # Initialize Flask and SocketIO
18 self.app = Flask(__name__)
19 self.socketio = SocketIO(self.app)
20
21 # Register routes and events
22 self._register_routes()
25
27 """
28 Register HTTP routes.
29 """
30 @self.app.route('/')
31 def home():
32 """
33 Render the home page.
34 """
35 #status_message = f'Startup: Using MaterialX version: {mx.getVersionString()}'
36 #self._emit_status_message(status_message)
37 return render_template(self.home)
38
40 """Pure virtual method: Must be implemented by subclasses."""
41 raise NotImplementedError("Subclasses must implement _setup_event_handler_map")
42
44 """
45 Register SocketIO events.
46 """
47 # Dynamically register event handlers
48 for event_name, handler in self.event_handlers.items():
49 self.socketio.on_event(event_name, handler)
50
51 def run(self, host, port, debug=True):
52 """
53 Run the Flask server with SocketIO.
54 """
55 self.socketio.run(self.app, host, port, debug=debug)
56
57
59 '''
60 A Flask application that connects with the GPUOpen MaterialX server to allow downloading
61 and extracting of materials by regular expression.
62 '''
63 def __init__(self, homePage):
64 """
65 Initialize the Flask application and the MaterialX loader.
66 """
67 super().__init__(homePage)
68
69 # Material loader and associated attributes
70 self.loader = None
71 self.materials = None
72 self.material_names = None
74
75 def _emit_status_message(self, message):
76 """
77 Emit a status message to the client.
78 """
79 emit('materialx_status', { 'message': message }, broadcast=True)
80 print('Python:', message)
81
83 """
84 Handle the 'download_materialx' event, initialize the loader, and send materials data to the client.
85 """
86 status_message = f'Downloaded materials...'
87 self._emit_status_message(status_message)
88
89 # Initialize the loader and fetch materials
90 self.loader = gpuo.GPUOpenMaterialLoader()
91 self.materials = self.loader.getMaterials()
92 self.material_names = self.loader.getMaterialNames()
93
94 # Convert materials to JSON and get the count
95 materials_list = self.loader.getMaterialsAsJsonString()
97
98 # Emit a status message
99 status_message = f'Downloaded {self.material_count} materials.'
100 self._emit_status_message(status_message)
101
102 # Emit the data back to the client
103 emit('materialx_downloaded', {
104 'materialCount': self.material_countmaterial_count,
105 'materialNames': self.material_names,
106 'materialsList': materials_list
107 }, broadcast=True)
108
109 def handle_extract_material(self, data):
110 """
111 Handle the 'extract_material' event, extract material data, and send it back to the client.
112 """
113 if self.loader is None:
114 self._emit_status_message('Loader is not initialized. Download materials first.')
115 return
116
117 expression = data.get('expression', 'Default Expression')
118 data_items = self.loader.downloadPackageByExpression(expression)
119 return_list = []
120
121 for data_item in data_items:
122 status_message = f'Extracting material: {data_item[1]}'
123 self._emit_status_message(status_message)
124 package = data_item[0]
125 title = data_item[1]
126 extracted_data = self.loader.extractPackageData(package, None)
127 return_data = {}
128
129 if extracted_data:
130 for item in extracted_data:
131 file_name = item['file_name']
132 if item['type'] == 'mtlx':
133 self._emit_status_message(f'- MaterialX file {file_name}')
134 return_data[file_name] = item['data']
135 elif item["type"] == 'image':
136 self._emit_status_message(f'- Image file {file_name}')
137 image = item["data"]
138 image_base64 = self.loader.convertPilImageToBase64(image)
139 return_data[file_name] = image_base64
140
141 if len(return_data) > 0:
142 return_list.append({'title': title, 'data': return_data})
143
144 if len(return_list) == 0:
145 self._emit_status_message('No materials extracted')
146 else:
147 status_message = f'Extracted {len(return_list)} materials'
148 self._emit_status_message(status_message)
149 emit('materialx_extracted', {'extractedData': return_list}, broadcast=True)
150
152 """
153 Set up dictionary of mapping event names to their handlers
154 """
155 self.event_handlers = {
156 'download_materialx': self.handle_download_materialx,
157 'extract_material': self.handle_extract_material,
158 }
159
160# Main entry point
161def main():
162 parser = argparse.ArgumentParser(description="GPUOpen MaterialX Application")
163 parser.add_argument('--host', type=str, default='127.0.0.1', help="Host address to run the server on (default: 127.0.0.1)")
164 parser.add_argument('--port', type=int, default=8080, help="Port to run the server on (default: 8080)")
165 parser.add_argument('--home', type=str, default='MaterialXGPUOpenApp.html', help="Home page.")
166
167 args = parser.parse_args()
168
169 app = MaterialXGPUOpenApp(args.home)
170 app_host = args.host
171 app_port = args.port
172 app.run(host=app_host, port=app_port)
173
174if __name__ == '__main__':
175 main()
run(self, host, port, debug=True)
Run the Flask server with SocketIO.
_register_socket_events(self)
Register SocketIO events.
_register_routes(self)
Register HTTP routes.
_setup_event_handler_map(self)
Pure virtual method: Must be implemented by subclasses.
A Flask application that connects with the GPUOpen MaterialX server to allow downloading and extracti...
__init__(self, homePage)
Initialize the Flask application and the MaterialX loader.
handle_extract_material(self, data)
Handle the 'extract_material' event, extract material data, and send it back to the client.
_emit_status_message(self, message)
Emit a status message to the client.
handle_download_materialx(self, data)
Handle the 'download_materialx' event, initialize the loader, and send materials data to the client.
_setup_event_handler_map(self)
Set up dictionary of mapping event names to their handlers.