UNPKG

@inweb/viewer-core

Version:

3D CAD and BIM data Viewer core

364 lines (296 loc) 8.54 kB
/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2025, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a // license agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// import { EventEmitter2 } from "@inweb/eventemitter2"; import { CameraMode, defaultOptions, IOptions, RGB } from "./IOptions"; export class Options implements IOptions { protected _emitter?: EventEmitter2; protected _data: IOptions; constructor(emitter?: EventEmitter2) { this._emitter = emitter; this._data = defaultOptions(); this.loadFromStorage(); } static defaults(): IOptions { return defaultOptions(); } notifierChangeEvent(): void { console.warn( "Options.notifierChangeEvent() has been deprecated since 25.3 and will be removed in a future release, use Options.change() instead." ); this.change(); } change(): void { if (this._emitter !== undefined) { this.saveToStorage(); this._emitter.emit({ type: "optionschange", data: this }); } } saveToStorage(): void { if (typeof window !== "undefined") try { localStorage.setItem("od-client-settings", JSON.stringify(this.data)); } catch (error) { console.error("Cannot save client settings.", error); } } loadFromStorage(): void { if (typeof window !== "undefined") try { const item = localStorage.getItem("od-client-settings"); if (item) { const data = JSON.parse(item); this.data = { ...data }; } } catch (error) { console.error("Cannot load client settings.", error); } } /** * Resets options to default values. * * @param fields - Name of fields to be reset. Specify `undefined` to reset all. */ resetToDefaults(fields?: string[]): void { if (fields !== undefined) { const defaults = Options.defaults(); const resetData = fields.reduce((acc, field) => { acc[field] = defaults[field]; return acc; }, {}); this.data = { ...this.data, ...resetData }; } else { this.data = { ...this.data, ...Options.defaults() }; } } get data(): IOptions { return this._data; } set data(value: IOptions) { const enablePartialMode = value.enableStreamingMode ? value.enablePartialMode : false; const sceneGraph = enablePartialMode ? false : value.sceneGraph; this._data = { ...Options.defaults(), ...this._data, ...value, enablePartialMode, sceneGraph }; this.change(); } get showWCS(): boolean { return this._data.showWCS; } set showWCS(value: boolean) { this._data.showWCS = value; this.change(); } get cameraAnimation(): boolean { return this._data.cameraAnimation; } set cameraAnimation(value: boolean) { this._data.cameraAnimation = value; this.change(); } get antialiasing(): boolean | string { return this._data.antialiasing; } set antialiasing(value: boolean | string) { this._data.antialiasing = value; this.change(); } get groundShadow(): boolean { return this._data.groundShadow; } set groundShadow(value: boolean) { this._data.groundShadow = value; this.change(); } get shadows(): boolean { return this._data.shadows; } set shadows(value: boolean) { this._data.shadows = value; this.change(); } get cameraAxisXSpeed(): number { return this._data.cameraAxisXSpeed; } set cameraAxisXSpeed(value: number) { this._data.cameraAxisXSpeed = value; this.change(); } get cameraAxisYSpeed(): number { return this._data.cameraAxisYSpeed; } set cameraAxisYSpeed(value: number) { this.cameraAxisYSpeed = value; this.change(); } get ambientOcclusion(): boolean { return this._data.ambientOcclusion; } set ambientOcclusion(value: boolean) { this._data.ambientOcclusion = value; this.change(); } get enableStreamingMode(): boolean { return this._data.enableStreamingMode; } set enableStreamingMode(value: boolean) { this._data.enableStreamingMode = value; if (!value) this._data.enablePartialMode = false; this.change(); } get enablePartialMode(): boolean { return this._data.enablePartialMode; } set enablePartialMode(value: boolean) { this._data.enablePartialMode = value; if (value) { this._data.enableStreamingMode = true; this._data.sceneGraph = false; } this.change(); } get memoryLimit(): number { return this._data.memoryLimit; } set memoryLimit(value: number) { this._data.memoryLimit = value; this.change(); } get cuttingPlaneFillColor(): RGB { return this._data.cuttingPlaneFillColor; } set cuttingPlaneFillColor(value: RGB) { this._data.cuttingPlaneFillColor = value; this.change(); } get edgesColor() { return this._data.edgesColor; } set edgesColor(value) { this._data.edgesColor = value; this.change(); } get facesColor() { return this._data.facesColor; } set facesColor(value) { this._data.facesColor = value; this.change(); } get edgesVisibility() { return this._data.edgesVisibility; } set edgesVisibility(value) { this._data.edgesVisibility = value; this.change(); } get edgesOverlap() { return this._data.edgesOverlap; } set edgesOverlap(value) { this._data.edgesOverlap = value; this.change(); } get facesOverlap() { return this._data.facesOverlap; } set facesOverlap(value) { this._data.facesOverlap = value; this.change(); } get facesTransparancy() { return this._data.facesTransparancy; } set facesTransparancy(value) { this._data.facesTransparancy = value; this.change(); } get enableCustomHighlight() { return this._data.enableCustomHighlight; } set enableCustomHighlight(value) { this._data.enableCustomHighlight = value; this.change(); } get sceneGraph() { return this._data.sceneGraph; } set sceneGraph(value) { this._data.sceneGraph = value; if (value) this._data.enablePartialMode = false; this.change(); } get edgeModel() { return Boolean(this._data.edgeModel); } set edgeModel(value) { this._data.edgeModel = Boolean(value); this.change(); } get reverseZoomWheel() { return this._data.reverseZoomWheel; } set reverseZoomWheel(value: boolean) { this._data.reverseZoomWheel = !!value; this.change(); } get enableZoomWheel() { return this._data.enableZoomWheel; } set enableZoomWheel(value: boolean) { this._data.enableZoomWheel = !!value; this.change(); } get enableGestures() { return this._data.enableGestures; } set enableGestures(value: boolean) { this._data.enableGestures = !!value; this.change(); } get geometryType() { return this._data.geometryType; } set geometryType(value: string) { this._data.geometryType = value; this.change(); } get rulerUnit(): string { return this._data.rulerUnit; } set rulerUnit(value: string) { this._data.rulerUnit = value; this.change(); } get rulerPrecision(): any { return this._data.rulerPrecision; } set rulerPrecision(value: any) { this._data.rulerPrecision = value; this.change(); } get cameraMode(): CameraMode { return this._data.cameraMode || "perspective"; } set cameraMode(value: CameraMode) { this._data.cameraMode = value; this.change(); } }