Files
DianZhanDemo/app/utils/viewHelper.ts
ch197511161 ddce8fce18 init5
2025-12-11 01:29:41 +08:00

170 lines
3.9 KiB
TypeScript

/*
* File: \src\utils\viewHelper.ts
* Project: viewer_for_ruwei
* File Created: Tuesday, 10th September 2024 1:34:19 pm
* Author: Sun Jie (j.sun@supreium.com)
* -----
* Last Modified: Wednesday, 16th October 2024 3:43:00 pm
* Modified By: Sun Jie (j.sun@supreium.com)
* -----
* Description:
* -----
* Copyright (c) 2024 Supreium Co., Ltd , All Rights Reserved.
*/
import {
CadView,
RenderingEngine,
NodeBasedMeshVO,
SupVector,
View,
NodeBasedMesh,
SupColor,
MeshProp,
} from "poseidon-engine-core";
export type MeshPropertyType = {
name: string;
data: number[];
size: 1;
};
type PropertyType = {
prop: string;
index: number;
range: { max: number; min: number };
};
export class ViewHelper {
private _view_: View | null = null;
private engine: RenderingEngine | null = null;
inited = false;
private activeDiv: HTMLDivElement | null = null;
private parentDiv: HTMLDivElement | null = null;
private _meshVO: NodeBasedMeshVO | null = null;
private _propertyMap: Map<string, PropertyType>;
// private _activityProperty: string = "";
constructor() {
this._propertyMap = new Map();
}
async initView(div: HTMLDivElement, bgColor?: number) {
div.addEventListener("contextmenu", (e) => e.preventDefault());
this.parentDiv = div;
this.activeDiv = document.createElement("div");
this.activeDiv.style.width = "100%";
this.activeDiv.style.height = "100%";
this.parentDiv.appendChild(this.activeDiv);
const engine = new RenderingEngine();
engine.init(
this.activeDiv,
this.activeDiv.clientWidth,
this.activeDiv.clientHeight
);
this.engine = engine;
const cadView = new CadView();
cadView.bind(engine);
await cadView.init().catch((e: any) => console.error(e));
const view = new View();
view.bindEngine(cadView);
// 使用传入的背景色,默认为白色
view.setBgColor(new SupColor(bgColor || 0xffffff));
engine.startAnimate();
this._view_ = view;
this._view_!.legendMgr.legend.color = "#000000";
this._view_!.legendMgr.legend.title = "No Property";
this._view_!.legendMgr.legend.setColorMap("rainbow", 9);
this._view_?.activeLegend();
this.inited = true;
}
viewResize(width: number, height: number) {
if (!this.inited) {
throw new Error("ViewHelper not inited");
}
this.engine?.resize(width, height);
}
get view() {
return this._view_;
}
async loadMesh(meshData: any, properties: any[]) {
if (!this.inited) {
throw new Error("ViewHelper not inited");
}
const mesh = NodeBasedMesh.createFromData(meshData);
properties.forEach((property) => {
mesh.attachProperty(property.name, property.size, true, property.data);
});
this._meshVO = new NodeBasedMeshVO(mesh);
this._view_?.display(this._meshVO);
mesh.props.forEach((value: MeshProp) => {
this._propertyMap.set(value.name, {
prop: value.name,
index: 0,
range: { max: value.range.max[0], min: value.range.min[0] },
});
});
}
activeProperty(property: string) {
const prop = this._propertyMap.get(property);
if (prop) {
this._meshVO?.activeProperty(prop.prop, prop.index);
this._view_!.legendMgr.legend.range = prop.range;
this._view_!.legendMgr.legend.title = property;
}
}
get properties() {
return Array.from(this._propertyMap.keys());
}
async clear() {
if (!this.inited) {
return;
}
this._view_?.removeAll();
}
isometricView() {
if (!this.inited) {
throw new Error("ViewHelper not inited");
}
this._view_?.lookAt(
new SupVector(0, 0, 0),
new SupVector(-1, -1, -1),
new SupVector(1, 0, 0)
);
}
fitAll() {
if (!this.inited) {
throw new Error("ViewHelper not inited");
return;
}
this._view_?.fitAll();
}
static instance = new ViewHelper();
}