5 constructor(socketLibrary, server) {
7 super(socketLibrary, server);
10 this.extractedEditor =
null;
11 this.materialsList = [];
12 this.materialNames = [];
13 this.materialCount = 0;
16 this.findMaterialByName = this.findMaterialByName.bind(
this);
17 this.populateForm = this.populateForm.bind(
this);
18 this.setupEventHandlers = this.setupEventHandlers.bind(
this);
19 this.setupXML = this.setupXML.bind(
this);
26 findMaterialByName(name) {
27 let foundMaterial =
null;
29 for (
const element of this.materialsList) {
30 let resultsArray = JSON.parse(element).results;
32 for (
const result of resultsArray) {
33 if (result.title === name) {
34 foundMaterial = result;
35 console.log(
'>>>>>>>>>> Popultate form:', result.title);
36 this.populateForm(result);
45 updateStatusInput(message, force =
false)
47 const inputDOM = document.getElementById(
'status_message');
48 if (inputDOM.value ==
'Status' || force)
49 inputDOM.value = message
51 inputDOM.value +=
'\n' + message
53 inputDOM.scrollTop = inputDOM.scrollHeight;
56 selectMaterialByName(name) {
57 const materialSelect = document.getElementById(
'materialSelect');
58 for (let i = 0; i < materialSelect.options.length; i++) {
59 if (materialSelect.options[i].text === name) {
60 materialSelect.selectedIndex = i;
66 highlightSelectedMaterialInGallery(name) {
67 const gallery = document.getElementById(
'material_gallery');
68 const cards = gallery.getElementsByClassName(
'material-card');
69 for (
const card of cards) {
70 if (card.dataset.materialId === name) {
71 card.style.backgroundColor =
'#007BFF';
72 card.style.color =
'#FFF';
73 card.classList.add(
'selected');
75 card.scrollIntoView({ behavior:
'smooth', block:
'center' });
77 card.style.backgroundColor =
'';
78 card.style.color =
'';
79 card.classList.remove(
'selected');
82 this.findMaterialByName(name);
85 handleMaterialXDownLoad(data)
87 const downloadSpinner = document.getElementById(
'download_spinner');
88 const downloadStatus = document.getElementById(
'download_status');
89 downloadSpinner.classList.add(
'd-none');
90 downloadStatus.innerText =
'Fetch Materials';
92 console.log(
'WEB: materialx downloaded event:', data);
93 this.materialCount = data.materialCount;
94 this.materialsList = data.materialsList;
95 this.materialNames = data.materialNames;
97 this.materialNames.sort((a, b) => a.localeCompare(b));
99 if (this.materialCount > 0) {
101 for (
const element of this.materialsList) {
102 listString += element +
'\n';
104 this.editor.setValue(listString);
107 const materialSelect = document.getElementById(
'materialSelect');
108 materialSelect.innerHTML =
'';
109 this.materialNames.forEach((name, index) => {
110 const option = document.createElement(
'option');
111 option.value = index + 1;
113 materialSelect.appendChild(option);
117 const firstMaterial = JSON.parse(this.materialsList[0]).results[0];
119 this.populateForm(firstMaterial);
123 const gallery = document.getElementById(
'material_gallery');
124 gallery.innerHTML =
'';
126 for (
const element of this.materialsList) {
127 let materials = JSON.parse(element).results;
130 materials.sort((a, b) => a.title.localeCompare(b.title));
131 for (
const material of materials)
135 firstTitle = material.title;
137 const col = document.createElement(
'div');
138 col.className =
'col-sm-4 col-md-3 col-lg-2 mb-4';
141 <div
class=
"card material-card" data-material-
id=
"${material.title}">
142 <img src=
"${material.url}" id=
"${material.title} Image" class=
"card-img-top material-img" alt=
"${material.title}">
143 <div
class=
"card-body">
144 <div style=
"font-size: 10px;" class=
"card-title">${material.title}</div>
150 col.querySelector(
'.card').addEventListener(
'click', () => {
151 this.highlightSelectedMaterialInGallery(material.title);
152 this.selectMaterialByName(material.title);
154 gallery.appendChild(col);
161 this.highlightSelectedMaterialInGallery(firstTitle);
162 this.selectMaterialByName(firstTitle);
167 handleMaterialXExtract(data)
169 const extractSpinner = document.getElementById(
'extract_spinner');
170 extractSpinner.classList.add(
'd-none');
171 const extractStatus = document.getElementById(
'extract_status');
172 extractStatus.innerText =
'Extract';
174 console.log(
'WEB: materialx extracted event:', data.extractedData);
175 const extractedData = data.extractedData[0];
176 if (!extractedData) {
177 console.log(
'No extracted data received');
180 const title = extractedData.title;
181 console.log(
'Title:', title);
183 const preview_url = extractedData.url;
184 console.log(
'URL:', preview_url);
186 const dataObj = extractedData.data;
187 const imageDOM = document.getElementById(
'extracted_images');
188 imageDOM.innerHTML =
'';
190 const mtlxDOM = document.getElementById(
'extracted_mtlx');
191 this.extractedEditor.setValue(
'');
195 let save_extracted = document.getElementById(
'save_extracted').checked;
196 let zip = save_extracted ?
new JSZip() :
null;
200 const imageContainer = document.createElement(
'div');
201 imageContainer.className =
'col-sm-4 col-md-3 col-lg-2 mb-4';
202 let key =
"Preview Render";
203 imageContainer.innerHTML = `
204 <div
class=
"card material-card" data-material-
id=
"${key}">
205 <img loading=
"lazy" src=
"${preview_url}" id=
"${key} Image" class=
"card-img-top material-img" alt=
"${key}">
206 <div
class=
"card-body">
207 <div style=
"font-size: 10px;" class=
"card-title">${key}</div>
215 const urlFile =
new File([preview_url],
"url.txt", { type:
'text/plain' });
216 zip.file(
"url.txt", urlFile);
219 imageDOM.appendChild(imageContainer);
222 for (
const key in dataObj) {
223 if (key.endsWith(
'.mtlx')) {
224 this.extractedEditor.setValue(dataObj[key]);
227 zip.file(key, dataObj[key]);
229 const base64String = dataObj[key];
230 const binary = atob(base64String);
231 const array =
new Uint8Array(binary.length);
232 for (let i = 0; i < binary.length; i++) {
233 array[i] = binary.charCodeAt(i);
235 const extension = key.split(
'.').pop();
236 const blob =
new Blob([array], { type: `image/${extension}` });
237 const url = URL.createObjectURL(blob);
240 const imageContainer = document.createElement(
'div');
241 imageContainer.className =
'col-sm-4 col-md-3 col-lg-2 mb-4';
242 imageContainer.innerHTML = `
243 <div
class=
"card material-card" data-material-
id=
"${key}">
244 <img src=
"${url}" id=
"${key} Image" class=
"card-img-top material-img" alt=
"${key}">
245 <div
class=
"card-body">
246 <div style=
"font-size: 10px;" class=
"card-title">${key}</div>
252 imageDOM.appendChild(imageContainer);
257 const imgFile =
new File([blob], key, { type:
'image/${extension}' });
258 zip.file(key, imgFile);
267 zip.generateAsync({ type:
'blob' }).then(
function(content) {
269 const link = document.createElement(
'a');
270 link.href = URL.createObjectURL(content);
271 link.download = title +
'.zip';
274 .
catch(
function(error) {
275 console.error(
'Error creating zip file:', error);
281 const extractSpinner = document.getElementById(
'extract_spinner');
282 const extractStatus = document.getElementById(
'extract_status');
283 extractSpinner.classList.remove(
'd-none');
284 extractStatus.innerText =
'Extracting...';
286 const materialSelect = document.getElementById(
'materialSelect');
287 const update_mtlx = document.getElementById(
'update_mtlx').checked;
288 let selectedItem = materialSelect.options[materialSelect.selectedIndex].text;
289 console.log(
"WEB: Emitting extract_material event");
290 this.emit(
'extract_material', { expression: selectedItem, update_materialx: update_mtlx });
293 downloadMaterials() {
294 console.log(
"WEB: Emitting download_materialx event");
295 let downloadSpinner = document.getElementById(
'download_spinner');
296 let downloadStatus = document.getElementById(
'download_status');
297 downloadSpinner.classList.remove(
'd-none');
298 downloadStatus.innerText =
'Fetching...';
299 let from_package = document.getElementById(
'download_from_package').checked;
300 this.emit(
'download_materialx', {
'frompackage': from_package });