fix .STEP file load
This commit is contained in:
1 parent
00dfb36126
commit
18a19acf55
1 file changed
+70
-1
@@ -356,6 +356,46 @@ const replacements = [
|
|||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CDN builds load OCCT via a blob Worker + importScripts. That fails for
|
||||||
|
* self-hosted absolute paths in some browsers. Use a same-origin Worker URL.
|
||||||
|
*/
|
||||||
|
function patchCreateOcctWorker(source) {
|
||||||
|
const moduleRe =
|
||||||
|
/function CreateOcctWorker\s*\([^)]*\)\s*\{[\s\S]*?URL\.createObjectURL\s*\(\s*blob\s*\)[\s\S]*?\}\s*(?=\s*function LoadExternalLibrary)/;
|
||||||
|
const moduleNext = `function CreateOcctWorker (worker)
|
||||||
|
{
|
||||||
|
return new Promise ((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
if (occtWorkerUrl === null) {
|
||||||
|
occtWorkerUrl = '${O3DV_BASE}occt-import-js-worker.js';
|
||||||
|
}
|
||||||
|
resolve (new Worker (occtWorkerUrl));
|
||||||
|
} catch (error) {
|
||||||
|
reject (error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
`;
|
||||||
|
|
||||||
|
const minRe =
|
||||||
|
/function Wo\(r\)\{return new Promise\(\(e,t\)=>\{if\(vu!==null\)\{e\(new Worker\(vu\)\);return\}[\s\S]*?URL\.createObjectURL\(s\),e\(new Worker\(vu\)\)\}\)\.catch\(t\)\}\)\}/;
|
||||||
|
const minNext = `function Wo(r){return new Promise((e,t)=>{try{vu===null&&(vu="${O3DV_BASE}occt-import-js-worker.js"),e(new Worker(vu))}catch(n){t(n)}})}`;
|
||||||
|
|
||||||
|
let next = source;
|
||||||
|
let changed = false;
|
||||||
|
if (moduleRe.test(next)) {
|
||||||
|
next = next.replace(moduleRe, moduleNext);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
if (minRe.test(next)) {
|
||||||
|
next = next.replace(minRe, minNext);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
return { source: next, changed };
|
||||||
|
}
|
||||||
|
|
||||||
async function patchO3dvFile(relativePath) {
|
async function patchO3dvFile(relativePath) {
|
||||||
for (const candidate of resolvePackage(relativePath)) {
|
for (const candidate of resolvePackage(relativePath)) {
|
||||||
try {
|
try {
|
||||||
@@ -367,17 +407,46 @@ async function patchO3dvFile(relativePath) {
|
|||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const occt = patchCreateOcctWorker(source);
|
||||||
|
source = occt.source;
|
||||||
|
changed = changed || occt.changed;
|
||||||
if (changed) {
|
if (changed) {
|
||||||
await writeFile(candidate, source);
|
await writeFile(candidate, source);
|
||||||
console.log(`patched ${candidate}`);
|
console.log(`patched ${candidate}`);
|
||||||
|
} else if (!source.includes(`${O3DV_BASE}occt-import-js-worker.js`)) {
|
||||||
|
throw new Error(
|
||||||
|
`OCCT worker patch did not apply for ${candidate}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} catch {
|
} catch (error) {
|
||||||
|
if (error && /OCCT worker patch/.test(String(error.message))) throw error;
|
||||||
// try next path
|
// try next path
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new Error(`Could not patch ${relativePath}`);
|
throw new Error(`Could not patch ${relativePath}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await writeFile(
|
||||||
|
path.join(publicDir, 'viewer-assets/o3dv/occt-import-js-worker.js'),
|
||||||
|
[
|
||||||
|
`importScripts('${O3DV_BASE}occt-import-js.js');`,
|
||||||
|
'',
|
||||||
|
'onmessage = async function (ev)',
|
||||||
|
'{',
|
||||||
|
'\tlet modulOverrides = {',
|
||||||
|
'\t\tlocateFile: function (path) {',
|
||||||
|
`\t\t\treturn '${O3DV_BASE}' + String(path).split('/').pop();`,
|
||||||
|
'\t\t}',
|
||||||
|
'\t};',
|
||||||
|
'\tlet occt = await occtimportjs (modulOverrides);',
|
||||||
|
'\tlet result = occt.ReadFile (ev.data.format, ev.data.buffer, ev.data.params);',
|
||||||
|
'\tpostMessage (result);',
|
||||||
|
'};',
|
||||||
|
'',
|
||||||
|
].join('\n'),
|
||||||
|
);
|
||||||
|
console.log('wrote self-hosted occt-import-js-worker.js');
|
||||||
|
|
||||||
await patchO3dvFile('online-3d-viewer/build/engine/o3dv.module.js');
|
await patchO3dvFile('online-3d-viewer/build/engine/o3dv.module.js');
|
||||||
await patchO3dvFile('online-3d-viewer/build/engine/o3dv.min.js');
|
await patchO3dvFile('online-3d-viewer/build/engine/o3dv.min.js');
|
||||||
Reference in new issue
Block a user