Files
TkAstral3D/packages/sdk/lib/dxf/offScreenCanvas.worker.ts
T
2025-10-04 23:36:07 +08:00

193 lines
4.3 KiB
TypeScript

import {EventDispatcher} from "three";
import * as DrawShare from "./drawShare";
function noop() {
}
class ElementProxyReceiver extends EventDispatcher {
// @ts-ignore
private style: {};
// @ts-ignore
private width: number;
// @ts-ignore
private height: number;
// @ts-ignore
private left: number;
// @ts-ignore
private top: number;
constructor() {
super();
// 因为OrbitControls尝试设置style.touchAction;
this.style = new Proxy({}, {
set(target: {}, p: string | symbol, newValue: any): boolean {
self.postMessage({
type: 'style',
data: {
key: p,
value: newValue
}
});
target[p] = newValue;
return true;
}
});
}
get clientWidth() {
return this.width;
}
get clientHeight() {
return this.height;
}
get offsetLeft() {
return this.left;
}
get offsetTop() {
return this.top;
}
// r132 版本的 OrbitControls 会调用这两个函数,也许我们应该实现一下
setPointerCapture() {
}
releasePointerCapture() {
}
getBoundingClientRect() {
return {
left: this.left,
top: this.top,
width: this.width,
height: this.height,
right: this.left + this.width,
bottom: this.top + this.height,
};
}
// 触发事件
handleEvent(data) {
if (data.type === 'size') {
this.left = data.left;
this.top = data.top;
this.width = data.width;
this.height = data.height;
return;
}
data.preventDefault = noop;
data.stopPropagation = noop;
// @ts-ignore
this.dispatchEvent(data);
}
focus() {
// no-op
}
// ----------------------- 2024/04/12 r163 版本 OrbitControls 新增的函数调用 ------------------------------
getRootNode(){
return this;
}
}
class ProxyManager {
private readonly targets: {};
constructor() {
this.targets = {};
this.handleEvent = this.handleEvent.bind(this);
}
/**
* 通过一个id,可以生成一个响应对应id信息的 ElementProxyReceiver 对象。
* @param data
*/
makeProxy(data: { id: number }) {
const {id} = data;
this.targets[id] = new ElementProxyReceiver();
}
getProxy(id: number) {
return this.targets[id];
}
handleEvent(data) {
this.targets[data.id].handleEvent(data.data);
}
}
/** ---------------- worker主体 ------------------ **/
const proxyManager = new ProxyManager();
const middleObject:any = new Proxy({}, {
set(target: {}, p: string | symbol, newValue: any): boolean {
self.postMessage({
type: 'middle',
data: {
key: p,
value: newValue
}
});
target[p] = newValue;
return true;
}
});
function start(data: { canvasId: number, canvas: HTMLCanvasElement, data: any,options,middleObject }) {
const proxy = proxyManager.getProxy(data.canvasId);
middleObject.markList = JSON.parse(data.middleObject.markList);
middleObject.selectedRectIndex = data.middleObject.selectedRectIndex;
DrawShare.main({
canvas: data.canvas,
inputElement: proxy,
data: data.data,
options:data.options,
onComplete: () => {
self.postMessage({
type: 'complete'
});
},
signal: (args: { type: 'add' | 'remove' | 'dispatch', name: string, data?: any }) => {
self.postMessage({
type: 'signal',
data: args
});
},
middleObject
});
}
function makeProxy(data: { id: number }) {
proxyManager.makeProxy(data);
}
const handlers = {
start,
makeProxy,
event: proxyManager.handleEvent,
};
self.onmessage = function ({data}) {
const fn = handlers[data.type] || DrawShare[data.type];
if (typeof fn !== 'function') {
throw new Error(`没有 ${data.type} 类型的处理程序!`);
}
fn(data.data);
};