@inweb/viewer-three 25.12.1 → 25.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/viewer-three.js +2617 -676
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +7 -1
- package/dist/viewer-three.module.js +494 -72
- package/dist/viewer-three.module.js.map +1 -1
- package/lib/Viewer/Viewer.d.ts +13 -6
- package/lib/Viewer/loaders/IFCXLoader.d.ts +8 -0
- package/lib/Viewer/loaders/USDZLoader2.d.ts +10 -0
- package/package.json +5 -5
- package/src/Viewer/Viewer.ts +54 -25
- package/src/Viewer/commands/SetDefaultViewPosition.ts +17 -4
- package/src/Viewer/components/DefaultPositionComponent.ts +1 -1
- package/src/Viewer/components/ExtentsComponent.ts +10 -1
- package/src/Viewer/loaders/IFCXLoader.ts +71 -0
- package/src/Viewer/loaders/USDZLoader2.ts +28 -0
- package/src/Viewer/loaders/render.mjs +585 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer-three.module.js","sources":["../../viewer-core/dist/viewer-core.module.js","../src/Viewer/commands/ApplyModelTransform.ts","../src/Viewer/commands/ClearMarkup.ts","../src/Viewer/components/SelectionComponent.ts","../src/Viewer/commands/ClearSelected.ts","../src/Viewer/commands/ClearSlices.ts","../src/Viewer/commands/CreatePreview.ts","../src/Viewer/commands/Explode.ts","../src/Viewer/commands/SetDefaultViewPosition.ts","../src/Viewer/commands/GetDefaultViewPositions.ts","../src/Viewer/commands/GetModels.ts","../src/Viewer/commands/GetSelected.ts","../src/Viewer/commands/HideSelected.ts","../src/Viewer/commands/IsolateSelected.ts","../src/Viewer/commands/RegenerateAll.ts","../src/Viewer/commands/ResetView.ts","../src/Viewer/commands/SelectModel.ts","../src/Viewer/commands/SetActiveDragger.ts","../src/Viewer/commands/SetMarkupColor.ts","../src/Viewer/commands/SetSelected.ts","../src/Viewer/commands/ShowAll.ts","../src/Viewer/commands/ZoomToExtents.ts","../src/Viewer/commands/ZoomToObjects.ts","../src/Viewer/commands/ZoomToSelected.ts","../src/Viewer/loaders/GLTFLoadingManager.ts","../../eventemitter2/dist/eventemitter2.module.js","../../markup/dist/markup.module.js","../src/Viewer/controls/OrbitControls.js","../src/Viewer/draggers/OrbitDragger.ts","../src/Viewer/draggers/PanDragger.ts","../src/Viewer/draggers/ZoomDragger.ts","../src/Viewer/controls/WalkControls.ts","../src/Viewer/draggers/WalkDragger.ts","../src/Viewer/helpers/PlaneHelper.ts","../src/Viewer/draggers/CuttingPlaneDragger.ts","../src/Viewer/draggers/CuttingPlaneXAxis.ts","../src/Viewer/draggers/CuttingPlaneYAxis.ts","../src/Viewer/draggers/CuttingPlaneZAxis.ts","../src/Viewer/draggers/MeasureLineDragger.ts","../src/Viewer/components/ExtentsComponent.ts","../src/Viewer/components/LightComponent.ts","../src/Viewer/components/BackgroundComponent.ts","../src/Viewer/components/DefaultPositionComponent.ts","../src/Viewer/components/ResizeCanvasComponent.ts","../src/Viewer/components/RenderLoopComponent.ts","../src/Viewer/helpers/WCSHelper.ts","../src/Viewer/components/WCSHelperComponent.ts","../src/Viewer/Viewer.ts"],"sourcesContent":["class Commands {\n constructor() {\n this._commands = new Map;\n }\n registerCommand(id, handler, description, thisArg) {\n this._commands.set(id, {\n id: id,\n handler: handler,\n thisArg: thisArg,\n description: description\n });\n }\n registerCommandAlias(id, alias) {\n this.registerCommand(alias, ((viewer, ...args) => this.executeCommand(id, viewer, ...args)));\n }\n getCommand(id) {\n return this._commands.get(id);\n }\n getCommands() {\n const map = new Map;\n this._commands.forEach(((value, key) => map.set(key, value)));\n return map;\n }\n executeCommand(id, viewer, ...args) {\n const command = this._commands.get(id);\n if (!command) {\n if (viewer) {\n const isDraggerCommand = viewer.draggers.includes(id);\n if (isDraggerCommand) return viewer.setActiveDragger(id);\n }\n console.warn(`Command '${id}' not found`);\n return undefined;\n }\n const {handler: handler, thisArg: thisArg} = command;\n const result = handler.apply(thisArg, [ viewer, ...args ]);\n viewer === null || viewer === void 0 ? void 0 : viewer.emit({\n type: \"command\",\n data: id,\n args: args\n });\n return result;\n }\n}\n\nconst _commands = new Map;\n\nfunction commands(viewerType = \"\") {\n let result = _commands.get(viewerType);\n if (!result) {\n result = new Commands;\n _commands.set(viewerType, result);\n }\n return result;\n}\n\ncommands(\"\").registerCommand(\"noop\", (() => {}));\n\ncommands(\"VisualizeJS\").registerCommand(\"noop\", (() => {}));\n\ncommands(\"ThreeJS\").registerCommand(\"noop\", (() => {}));\n\nfunction defaultOptions() {\n return {\n showWCS: true,\n cameraAnimation: true,\n antialiasing: true,\n groundShadow: false,\n shadows: false,\n cameraAxisXSpeed: 4,\n cameraAxisYSpeed: 1,\n ambientOcclusion: false,\n enableStreamingMode: true,\n enablePartialMode: false,\n memoryLimit: 3294967296,\n cuttingPlaneFillColor: {\n red: 255,\n green: 152,\n blue: 0\n },\n edgesColor: {\n r: 255,\n g: 152,\n b: 0\n },\n facesColor: {\n r: 255,\n g: 152,\n b: 0\n },\n edgesVisibility: true,\n edgesOverlap: true,\n facesOverlap: false,\n facesTransparancy: 200,\n enableCustomHighlight: true,\n sceneGraph: false,\n edgeModel: true,\n reverseZoomWheel: false,\n enableZoomWheel: true,\n enableGestures: true,\n geometryType: \"vsfx\",\n rulerUnit: \"Default\"\n };\n}\n\nclass Options {\n constructor(emitter) {\n this._emitter = emitter;\n this._data = defaultOptions();\n this.loadFromStorage();\n }\n static defaults() {\n return defaultOptions();\n }\n notifierChangeEvent() {\n console.warn(\"Options.notifierChangeEvent() has been deprecated since 25.3 and will be removed in a future release, use Options.change() instead.\");\n this.change();\n }\n change() {\n if (this._emitter !== undefined) {\n this.saveToStorage();\n this._emitter.emit({\n type: \"optionschange\",\n data: this\n });\n }\n }\n saveToStorage() {\n if (typeof window !== \"undefined\") try {\n localStorage.setItem(\"od-client-settings\", JSON.stringify(this.data));\n } catch (error) {\n console.error(\"Cannot save client settings.\", error);\n }\n }\n loadFromStorage() {\n if (typeof window !== \"undefined\") try {\n const item = localStorage.getItem(\"od-client-settings\");\n if (item) {\n const data = JSON.parse(item);\n this.data = {\n ...data\n };\n }\n } catch (error) {\n console.error(\"Cannot load client settings.\", error);\n }\n }\n resetToDefaults(fields) {\n if (fields !== undefined) {\n const defaults = Options.defaults();\n const resetData = fields.reduce(((acc, field) => {\n acc[field] = defaults[field];\n return acc;\n }), {});\n this.data = {\n ...this.data,\n ...resetData\n };\n } else {\n this.data = {\n ...this.data,\n ...Options.defaults()\n };\n }\n }\n get data() {\n return this._data;\n }\n set data(value) {\n const enablePartialMode = value.enableStreamingMode ? value.enablePartialMode : false;\n const sceneGraph = enablePartialMode ? false : value.sceneGraph;\n this._data = {\n ...Options.defaults(),\n ...this._data,\n ...value,\n enablePartialMode: enablePartialMode,\n sceneGraph: sceneGraph\n };\n this.change();\n }\n get showWCS() {\n return this._data.showWCS;\n }\n set showWCS(value) {\n this._data.showWCS = value;\n this.change();\n }\n get cameraAnimation() {\n return this._data.cameraAnimation;\n }\n set cameraAnimation(value) {\n this._data.cameraAnimation = value;\n this.change();\n }\n get antialiasing() {\n return this._data.antialiasing;\n }\n set antialiasing(value) {\n this._data.antialiasing = value;\n this.change();\n }\n get groundShadow() {\n return this._data.groundShadow;\n }\n set groundShadow(value) {\n this._data.groundShadow = value;\n this.change();\n }\n get shadows() {\n return this._data.shadows;\n }\n set shadows(value) {\n this._data.shadows = value;\n this.change();\n }\n get cameraAxisXSpeed() {\n return this._data.cameraAxisXSpeed;\n }\n set cameraAxisXSpeed(value) {\n this._data.cameraAxisXSpeed = value;\n this.change();\n }\n get cameraAxisYSpeed() {\n return this._data.cameraAxisYSpeed;\n }\n set cameraAxisYSpeed(value) {\n this.cameraAxisYSpeed = value;\n this.change();\n }\n get ambientOcclusion() {\n return this._data.ambientOcclusion;\n }\n set ambientOcclusion(value) {\n this._data.ambientOcclusion = value;\n this.change();\n }\n get enableStreamingMode() {\n return this._data.enableStreamingMode;\n }\n set enableStreamingMode(value) {\n this._data.enableStreamingMode = value;\n if (!value) this._data.enablePartialMode = false;\n this.change();\n }\n get enablePartialMode() {\n return this._data.enablePartialMode;\n }\n set enablePartialMode(value) {\n this._data.enablePartialMode = value;\n if (value) {\n this._data.enableStreamingMode = true;\n this._data.sceneGraph = false;\n }\n this.change();\n }\n get memoryLimit() {\n return this._data.memoryLimit;\n }\n set memoryLimit(value) {\n this._data.memoryLimit = value;\n this.change();\n }\n get cuttingPlaneFillColor() {\n return this._data.cuttingPlaneFillColor;\n }\n set cuttingPlaneFillColor(value) {\n this._data.cuttingPlaneFillColor = value;\n this.change();\n }\n get edgesColor() {\n return this._data.edgesColor;\n }\n set edgesColor(value) {\n this._data.edgesColor = value;\n this.change();\n }\n get facesColor() {\n return this._data.facesColor;\n }\n set facesColor(value) {\n this._data.facesColor = value;\n this.change();\n }\n get edgesVisibility() {\n return this._data.edgesVisibility;\n }\n set edgesVisibility(value) {\n this._data.edgesVisibility = value;\n this.change();\n }\n get edgesOverlap() {\n return this._data.edgesOverlap;\n }\n set edgesOverlap(value) {\n this._data.edgesOverlap = value;\n this.change();\n }\n get facesOverlap() {\n return this._data.facesOverlap;\n }\n set facesOverlap(value) {\n this._data.facesOverlap = value;\n this.change();\n }\n get facesTransparancy() {\n return this._data.facesTransparancy;\n }\n set facesTransparancy(value) {\n this._data.facesTransparancy = value;\n this.change();\n }\n get enableCustomHighlight() {\n return this._data.enableCustomHighlight;\n }\n set enableCustomHighlight(value) {\n this._data.enableCustomHighlight = value;\n this.change();\n }\n get sceneGraph() {\n return this._data.sceneGraph;\n }\n set sceneGraph(value) {\n this._data.sceneGraph = value;\n if (value) this._data.enablePartialMode = false;\n this.change();\n }\n get edgeModel() {\n return Boolean(this._data.edgeModel);\n }\n set edgeModel(value) {\n this._data.edgeModel = Boolean(value);\n this.change();\n }\n get reverseZoomWheel() {\n return this._data.reverseZoomWheel;\n }\n set reverseZoomWheel(value) {\n this._data.reverseZoomWheel = !!value;\n this.change();\n }\n get enableZoomWheel() {\n return this._data.enableZoomWheel;\n }\n set enableZoomWheel(value) {\n this._data.enableZoomWheel = !!value;\n this.change();\n }\n get enableGestures() {\n return this._data.enableGestures;\n }\n set enableGestures(value) {\n this._data.enableGestures = !!value;\n this.change();\n }\n get geometryType() {\n return this._data.geometryType;\n }\n set geometryType(value) {\n this._data.geometryType = value;\n this.change();\n }\n get rulerUnit() {\n return this._data.rulerUnit;\n }\n set rulerUnit(value) {\n this._data.rulerUnit = value;\n this.change();\n }\n}\n\nconst CanvasEvents = [ \"click\", \"contextmenu\", \"dblclick\", \"mousedown\", \"mouseleave\", \"mousemove\", \"mouseup\", \"pointercancel\", \"pointerdown\", \"pointerleave\", \"pointermove\", \"pointerup\", \"touchcancel\", \"touchend\", \"touchmove\", \"touchstart\", \"wheel\" ];\n\nconst CANVAS_EVENTS = CanvasEvents;\n\nclass Dragger {\n constructor(viewer) {\n this.name = \"\";\n }\n initialize() {}\n dispose() {}\n updatePreview() {}\n}\n\nexport { CANVAS_EVENTS, CanvasEvents, Dragger, Options, commands, defaultOptions };\n//# sourceMappingURL=viewer-core.module.js.map\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Model, File, Assembly } from \"@inweb/client\";\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\n// gltf root object don't have model handle\nfunction applyModelTransform(viewer: Viewer, model: Model | File | Assembly) {\n console.warn(\"applyModelTransform not implemented\");\n}\n\ncommands(\"ThreeJS\").registerCommand(\"applyModelTransform\", applyModelTransform);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"clearMarkup\", (viewer: Viewer) => viewer.clearOverlay());\ncommands(\"ThreeJS\").registerCommandAlias(\"clearMarkup\", \"clearOverlay\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Intersection, MeshBasicMaterial, Object3D, Raycaster, Vector2 } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class SelectionComponent implements IDisposable {\n protected viewer: Viewer;\n protected raycaster: Raycaster;\n protected downPosition: Vector2;\n protected facesMaterial: MeshBasicMaterial;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.raycaster = new Raycaster();\n this.downPosition = new Vector2();\n\n const { facesColor, facesTransparancy } = this.viewer.options;\n this.facesMaterial = new MeshBasicMaterial();\n this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n this.facesMaterial.opacity = (255 - facesTransparancy) / 255;\n this.facesMaterial.transparent = true;\n\n this.viewer.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.addEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.addEventListener(\"dblclick\", this.onDoubleClick);\n this.viewer.addEventListener(\"optionschange\", this.optionsChange);\n }\n\n dispose() {\n this.facesMaterial.dispose();\n\n this.viewer.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.removeEventListener(\"dblclick\", this.onDoubleClick);\n this.viewer.removeEventListener(\"optionschange\", this.optionsChange);\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (!event.isPrimary || event.button !== 0) return;\n\n this.getMousePosition(event, this.downPosition);\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (!event.isPrimary) return;\n\n const upPosition = this.getMousePosition(event, new Vector2());\n if (this.downPosition.distanceTo(upPosition) !== 0) return;\n\n const intersects = this.getPointerIntersects(upPosition);\n\n this.clearSelection();\n if (intersects.length > 0) this.select(intersects[0].object);\n\n this.viewer.update();\n this.viewer.emitEvent({ type: \"select\", data: undefined, handles: this.viewer.getSelected() });\n };\n\n onDoubleClick = (event: MouseEvent) => {\n if (event.button !== 0) return;\n\n this.viewer.executeCommand(\"zoomToSelected\");\n };\n\n getMousePosition(event: MouseEvent, target: Vector2): Vector2 {\n return target.set(event.clientX, event.clientY);\n }\n\n getPointerIntersects(mouse: Vector2): Array<Intersection<Object3D>> {\n const rect = this.viewer.canvas.getBoundingClientRect();\n const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;\n const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;\n\n const coords = new Vector2(x, y);\n this.raycaster.setFromCamera(coords, this.viewer.camera);\n\n const objects = [];\n this.viewer.scene.traverseVisible((child) => objects.push(child));\n\n this.raycaster.params = this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0.25 },\n Line2: { threshold: 0.25 },\n LOD: {},\n Points: { threshold: 0.1 },\n Sprite: {},\n };\n\n return this.raycaster.intersectObjects(objects, false);\n }\n\n select(object: any) {\n if (object.isSelected) return;\n\n object.isSelected = true;\n object.originalMaterial = object.material;\n object.material = this.facesMaterial;\n\n this.viewer.selected.push(object);\n }\n\n clearSelection() {\n this.viewer.selected.forEach((object: any) => {\n object.isSelected = false;\n object.material = object.originalMaterial;\n });\n this.viewer.selected.length = 0;\n }\n\n optionsChange = () => {\n const { facesColor, facesTransparancy } = this.viewer.options;\n this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n this.facesMaterial.opacity = (255 - facesTransparancy) / 255;\n\n this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction clearSelected(viewer: Viewer): void {\n const selection = new SelectionComponent(viewer);\n selection.clearSelection();\n selection.dispose();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: undefined, handles: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"clearSelected\", clearSelected);\ncommands(\"ThreeJS\").registerCommandAlias(\"clearSelected\", \"unselect\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"clearSlices\", (viewer: Viewer) => viewer.clearSlices());\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction createPreview(viewer: Viewer, type = \"image/jpeg\", encoderOptions = 0.25): string {\n viewer.update(true);\n return viewer.canvas.toDataURL(type, encoderOptions);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"createPreview\", createPreview);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Object3D, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction calcObjectDepth(object: Object3D, depth: number) {\n let res = depth;\n object.children.forEach((x) => {\n const objectDepth = calcObjectDepth(x, depth + 1);\n if (res < objectDepth) res = objectDepth;\n });\n\n (object as any).originalPosition = object.position.clone();\n\n return res;\n}\n\nfunction explodeScene(scene: Object3D, scale = 0) {\n scale /= 100;\n\n if (!(scene as any).maxDepth) (scene as any).maxDepth = calcObjectDepth(scene, 1);\n const maxDepth = (scene as any).maxDepth;\n\n let explodeDepth = scale * (maxDepth - 1) + 1;\n if (maxDepth === 1) explodeDepth = 1;\n\n function explodeObject(object: Object3D, depth: number, parentCenter: Vector3, parentOffset: Vector3) {\n const objectBox = new Box3().setFromObject(object);\n const objectCenter = objectBox.getCenter(new Vector3());\n\n const objectOffset = parentOffset.clone();\n if (depth > 0 && depth <= explodeDepth) {\n const offset = objectCenter.clone().sub(parentCenter).multiplyScalar(scale);\n objectOffset.add(offset);\n }\n\n object.children.forEach((object) => explodeObject(object, depth + 1, objectCenter, objectOffset));\n\n const originalPosition = (object as any).originalPosition;\n object.position.copy(originalPosition);\n if (scale > 0) {\n const direction = objectCenter.sub(parentCenter).normalize();\n object.position.add(direction.add(objectOffset));\n }\n }\n\n const sceneExtents = new Box3().setFromObject(scene);\n const sceneCenter = sceneExtents.getCenter(new Vector3());\n explodeObject(scene, 0, sceneCenter, new Vector3(0, 0, 0));\n}\n\nfunction explode(viewer: Viewer, index = 0): void {\n viewer.models.forEach((gltf) => explodeScene(gltf.scene, index));\n\n viewer.update();\n viewer.emitEvent({ type: \"explode\", data: index });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"explode\", explode);\ncommands(\"ThreeJS\").registerCommand(\"collect\", (viewer: any) => explode(viewer, 0));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport const defaultViewPositions = {\n top: new Vector3(0, 0, 1),\n bottom: new Vector3(0, 0, -1),\n left: new Vector3(-1, 0, 0),\n right: new Vector3(1, 0, 0),\n front: new Vector3(0, -1, 0),\n back: new Vector3(0, 1, 0),\n sw: new Vector3(-0.5, -0.5, 1.0).normalize(),\n se: new Vector3(0.5, -0.5, 1.0).normalize(),\n ne: new Vector3(0.5, 0.5, 1.0).normalize(),\n nw: new Vector3(-0.5, 0.5, 1.0).normalize(),\n};\n\nfunction setDefaultViewPosition(viewer: Viewer, position: string): void {\n const direction = defaultViewPositions[position] || defaultViewPositions[\"sw\"];\n\n const center = viewer.extents.getCenter(new Vector3());\n const sphere = viewer.extents.getBoundingSphere(new Sphere());\n const offet = direction.clone().multiplyScalar(sphere.radius);\n\n const camera = viewer.camera;\n camera.position.copy(center).add(offet);\n camera.lookAt(center);\n camera.updateProjectionMatrix();\n camera.updateMatrixWorld();\n\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emit({ type: \"viewposition\", data: position });\n\n viewer.executeCommand(\"zoomToExtents\");\n}\n\ncommands(\"ThreeJS\").registerCommand(\"setDefaultViewPosition\", setDefaultViewPosition);\ncommands(\"ThreeJS\").registerCommand(\"top\", (viewer) => setDefaultViewPosition(viewer, \"top\"));\ncommands(\"ThreeJS\").registerCommand(\"bottom\", (viewer) => setDefaultViewPosition(viewer, \"bottom\"));\ncommands(\"ThreeJS\").registerCommand(\"left\", (viewer) => setDefaultViewPosition(viewer, \"left\"));\ncommands(\"ThreeJS\").registerCommand(\"right\", (viewer) => setDefaultViewPosition(viewer, \"right\"));\ncommands(\"ThreeJS\").registerCommand(\"front\", (viewer) => setDefaultViewPosition(viewer, \"front\"));\ncommands(\"ThreeJS\").registerCommand(\"back\", (viewer) => setDefaultViewPosition(viewer, \"back\"));\ncommands(\"ThreeJS\").registerCommand(\"sw\", (viewer) => setDefaultViewPosition(viewer, \"sw\"));\ncommands(\"ThreeJS\").registerCommand(\"se\", (viewer) => setDefaultViewPosition(viewer, \"se\"));\ncommands(\"ThreeJS\").registerCommand(\"ne\", (viewer) => setDefaultViewPosition(viewer, \"ne\"));\ncommands(\"ThreeJS\").registerCommand(\"nw\", (viewer) => setDefaultViewPosition(viewer, \"nw\"));\n\ncommands(\"ThreeJS\").registerCommandAlias(\"top\", \"k3DViewTop\");\ncommands(\"ThreeJS\").registerCommandAlias(\"bottom\", \"k3DViewBottom\");\ncommands(\"ThreeJS\").registerCommandAlias(\"left\", \"k3DViewLeft\");\ncommands(\"ThreeJS\").registerCommandAlias(\"right\", \"k3DViewRight\");\ncommands(\"ThreeJS\").registerCommandAlias(\"front\", \"k3DViewFront\");\ncommands(\"ThreeJS\").registerCommandAlias(\"back\", \"k3DViewBack\");\ncommands(\"ThreeJS\").registerCommandAlias(\"se\", \"k3DViewSE\");\ncommands(\"ThreeJS\").registerCommandAlias(\"sw\", \"k3DViewSW\");\ncommands(\"ThreeJS\").registerCommandAlias(\"ne\", \"k3DViewNE\");\ncommands(\"ThreeJS\").registerCommandAlias(\"nw\", \"k3DViewNW\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport { defaultViewPositions } from \"./SetDefaultViewPosition\";\n\nfunction getDefaultViewPositions(): string[] {\n return Object.keys(defaultViewPositions);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getDefaultViewPositions\", getDefaultViewPositions);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction getModels(viewer: Viewer): string[] {\n const handles: string[] = viewer.models.map((model) => model.userData.handle || \"\").filter((handle) => handle);\n return handles;\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getModels\", getModels);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction getSelected(viewer: Viewer): string[] {\n return viewer.selected.map((object) => object.userData?.handle).filter((handle) => handle);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getSelected\", getSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction hideSelected(viewer: Viewer): void {\n viewer.selected.forEach((object) => (object.visible = false));\n\n const selection = new SelectionComponent(viewer);\n selection.clearSelection();\n selection.dispose();\n\n viewer.update();\n viewer.emitEvent({ type: \"hide\" });\n viewer.emitEvent({ type: \"select\", data: undefined, handles: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"hideSelected\", hideSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Object3D } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction isolateSelected(viewer: Viewer): void {\n const selectedSet = new Set(viewer.selected);\n\n function isolateObject(object: Object3D, depth: number): boolean {\n let canBeIsolated = true;\n object.children.forEach((object) => {\n if (selectedSet.has(object)) canBeIsolated = false;\n else isolateObject(object, depth + 1);\n });\n\n if (canBeIsolated && depth > 0) object.visible = false;\n\n return canBeIsolated;\n }\n\n isolateObject(viewer.scene, 0);\n\n viewer.update();\n viewer.emitEvent({ type: \"isolate\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"isolateSelected\", isolateSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction regenerateAll(viewer: Viewer): void {\n console.warn(\"regenerateAll not implemented\");\n viewer.emit({ type: \"regenerateall\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"regenerateAll\", regenerateAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction resetView(viewer: Viewer): void {\n viewer.executeCommand(\"setActiveDragger\");\n viewer.executeCommand(\"clearSlices\");\n viewer.executeCommand(\"clearOverlay\");\n viewer.executeCommand(\"setMarkupColor\");\n viewer.executeCommand(\"clearSelected\");\n viewer.executeCommand(\"showAll\");\n viewer.executeCommand(\"explode\", 0);\n viewer.executeCommand(\"zoomToExtents\", true);\n viewer.executeCommand(\"k3DViewSW\");\n\n viewer.emit({ type: \"resetview\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"resetView\", resetView);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction selectModel(viewer: Viewer, handle: string): void {\n console.warn(\"selectModel not implemented\");\n viewer.emit({ type: \"select\", data: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"selectModel\", selectModel);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"setActiveDragger\", (viewer: Viewer, dragger = \"\") => {\n viewer.setActiveDragger(dragger);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"setMarkupColor\", (viewer: Viewer, r = 255, g = 0, b = 0) => {\n console.warn(\"setMarkupColor not implemented\");\n // viewer.setMarkupColor(r, g, b);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction setSelected(viewer: Viewer, handles: string[] = []): void {\n const handleSet = new Set(handles);\n const objects = [];\n viewer.scene.traverseVisible((child) => {\n if (handleSet.has(child.userData?.handle)) objects.push(child);\n });\n\n const selection = new SelectionComponent(viewer);\n selection.clearSelection();\n objects.forEach((object) => selection.select(object));\n selection.dispose();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: undefined, handles });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"setSelected\", setSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction showAll(viewer: Viewer): void {\n viewer.scene.traverse((object) => (object.visible = true));\n\n viewer.update();\n viewer.emitEvent({ type: \"showall\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"showAll\", showAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction zoomToExtents(viewer: Viewer): void {\n if (viewer.extents.isEmpty()) return;\n\n const center = viewer.extents.getCenter(new Vector3());\n const distance = viewer.extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToExtents\", zoomToExtents);\ncommands(\"ThreeJS\").registerCommandAlias(\"zoomToExtents\", \"zoomExtents\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction zoomToObjects(viewer: Viewer, handles: string[] = []): void {\n const handleSet = new Set(handles);\n const objects = [];\n viewer.scene.traverseVisible((child) => {\n if (handleSet.has(child.userData?.handle)) objects.push(child);\n });\n\n const extents = objects.reduce((result: Box3, object) => result.expandByObject(object), new Box3());\n const center = extents.getCenter(new Vector3());\n const distance = extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToObjects\", zoomToObjects);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction zoomToSelected(viewer: Viewer): void {\n const extents = viewer.selected.reduce((result: Box3, object) => result.expandByObject(object), new Box3());\n\n if (extents.isEmpty()) extents.copy(viewer.extents);\n\n const center = extents.getCenter(new Vector3());\n const distance = extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToSelected\", zoomToSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { LoadingManager, LoaderUtils } from \"three\";\n\nexport class GLTFLoadingManager extends LoadingManager {\n public path = \"\";\n public resourcePath = \"\";\n public fileURL = \"\";\n public dataURLs = new Map();\n\n constructor(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | File | ArrayBuffer | Blob> = new Map(),\n params: { path?: string } = {}\n ) {\n super();\n\n this.path = params.path || \"\";\n\n if (typeof file === \"string\") {\n this.fileURL = file;\n this.resourcePath = LoaderUtils.extractUrlBase(file);\n } else {\n externalData.forEach((value, key) => (this.fileURL = value === file ? key : this.fileURL));\n externalData.set(this.fileURL, file);\n }\n\n externalData.forEach((value, key) => {\n let dataURL: string;\n if (typeof value === \"string\") dataURL = value;\n else dataURL = URL.createObjectURL(new Blob([value]));\n this.dataURLs.set(key, dataURL);\n });\n\n this.setURLModifier((url: string) => {\n const key = decodeURI(url)\n .replace(this.path, \"\")\n .replace(this.resourcePath, \"\")\n .replace(/^(\\.?\\/)/, \"\");\n const dataURL = this.dataURLs.get(key);\n return dataURL ?? url;\n });\n }\n\n dispose() {\n this.dataURLs.forEach(URL.revokeObjectURL);\n }\n}\n","class EventEmitter2 {\n constructor() {\n this._listeners = {};\n }\n addEventListener(type, listener) {\n if (this._listeners[type] === undefined) this._listeners[type] = [];\n this._listeners[type].push(listener);\n return this;\n }\n removeEventListener(type, listener) {\n if (this._listeners[type] === undefined) return this;\n const listeners = this._listeners[type].filter((x => x !== listener));\n if (listeners.length !== 0) this._listeners[type] = listeners; else delete this._listeners[type];\n return this;\n }\n removeAllListeners(type) {\n if (type) delete this._listeners[type]; else this._listeners = {};\n return this;\n }\n emitEvent(event) {\n if (this._listeners[event.type] === undefined) return false;\n const invoke = this._listeners[event.type].slice();\n invoke.forEach((listener => listener.call(this, event)));\n return true;\n }\n on(type, listener) {\n return this.addEventListener(type, listener);\n }\n off(type, listener) {\n return this.removeEventListener(type, listener);\n }\n emit(type, ...args) {\n if (typeof type === \"string\") return this.emitEvent({\n type: type,\n args: args\n }); else if (typeof type === \"object\") return this.emitEvent(type); else return false;\n }\n}\n\nexport { EventEmitter2 };\n//# sourceMappingURL=eventemitter2.module.js.map\n","import Konva from \"konva\";\n\nclass WorldTransform {\n screenToWorld(position) {\n return {\n x: position.x,\n y: position.y,\n z: 0\n };\n }\n worldToScreen(position) {\n return {\n x: position.x,\n y: position.y\n };\n }\n getScale() {\n return {\n x: 1,\n y: 1,\n z: 1\n };\n }\n}\n\nclass MarkupColor {\n constructor(r, g, b) {\n this.setColor(r, g, b);\n }\n asHex() {\n return \"#\" + this.HEX;\n }\n asRGB() {\n return {\n r: this.R,\n g: this.G,\n b: this.B\n };\n }\n setColor(r, g, b) {\n this.R = r;\n this.G = g;\n this.B = b;\n this.HEX = this.rgbToHex(r, g, b);\n }\n rgbToHex(r, g, b) {\n const valueToHex = c => {\n const hex = c.toString(16);\n return hex === \"0\" ? \"00\" : hex;\n };\n return valueToHex(r) + valueToHex(g) + valueToHex(b);\n }\n}\n\nconst LineTypeSpecs = new Map([ [ \"solid\", [] ], [ \"dot\", [ 30, 30, .001, 30 ] ], [ \"dash\", [ 30, 30 ] ] ]);\n\nclass KonvaLine {\n constructor(params, ref = null) {\n var _a, _b;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.points) params.points = [ {\n x: 50,\n y: 50\n }, {\n x: 100,\n y: 100\n } ];\n const konvaPoints = [];\n params.points.forEach((point => konvaPoints.push(point.x, point.y)));\n this._ref = new Konva.Line({\n stroke: (_a = params.color) !== null && _a !== void 0 ? _a : \"#ff0000\",\n strokeWidth: (_b = params.width) !== null && _b !== void 0 ? _b : 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: konvaPoints,\n draggable: true,\n strokeScaleEnabled: false,\n dash: LineTypeSpecs.get(params.type) || []\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n }));\n this._ref.id(this._ref._id.toString());\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Line\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getPoints() {\n return this._ref.points();\n }\n setLineWidth(size) {\n this._ref.strokeWidth(size);\n }\n getLineWidth() {\n return this._ref.strokeWidth();\n }\n getLineType() {\n const typeSpecs = this._ref.dash() || [];\n let type;\n switch (typeSpecs) {\n case LineTypeSpecs.get(\"dot\"):\n type = \"dot\";\n break;\n\n case LineTypeSpecs.get(\"dash\"):\n type = \"dash\";\n break;\n\n default:\n type = \"solid\";\n break;\n }\n return type;\n }\n setLineType(type) {\n const specs = LineTypeSpecs.get(type);\n if (specs) this._ref.dash(specs);\n }\n addPoints(points) {\n let newPoints = this._ref.points();\n points.forEach((point => {\n newPoints = newPoints.concat([ point.x, point.y ]);\n }));\n this._ref.points(newPoints);\n }\n}\n\nclass KonvaText {\n constructor(params, ref = null) {\n var _a, _b, _c;\n this.TEXT_FONT_FAMILY = \"Calibri\";\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 100,\n y: 100\n };\n if (!params.text) params.text = \"default\";\n this._ref = new Konva.Text({\n x: params.position.x,\n y: params.position.y,\n text: params.text,\n fontSize: (_a = params.fontSize) !== null && _a !== void 0 ? _a : 34,\n fontFamily: this.TEXT_FONT_FAMILY,\n fill: (_b = params.color) !== null && _b !== void 0 ? _b : \"#ff0000\",\n align: \"left\",\n draggable: true,\n rotation: (_c = params.rotation) !== null && _c !== void 0 ? _c : 0\n });\n this._ref.width(this._ref.getTextWidth());\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n const minWidth = 50;\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < Math.round(this.getFontSize())) newHeight = Math.round(this.getFontSize());\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.id(this._ref._id.toString());\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Text\";\n }\n getColor() {\n return this._ref.fill();\n }\n setColor(hex) {\n this._ref.fill(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getText() {\n return this._ref.text();\n }\n setText(text) {\n this._ref.text(text);\n }\n getPosition() {\n return this._ref.getPosition();\n }\n setPosition(x, y) {\n this._ref.setPosition({\n x: x,\n y: y\n });\n }\n getFontSize() {\n return this._ref.fontSize();\n }\n setFontSize(size) {\n this._ref.fontSize(size);\n }\n}\n\nclass KonvaRectangle {\n constructor(params, ref = null) {\n var _a, _b, _c, _d;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 100,\n y: 100\n };\n this._ref = new Konva.Rect({\n stroke: (_a = params.color) !== null && _a !== void 0 ? _a : \"#ff0000\",\n strokeWidth: (_b = params.lineWidth) !== null && _b !== void 0 ? _b : 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n width: (_c = params.width) !== null && _c !== void 0 ? _c : 200,\n height: (_d = params.height) !== null && _d !== void 0 ? _d : 200,\n draggable: true,\n strokeScaleEnabled: false\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n const minWidth = 50;\n const minHeight = 50;\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < minHeight) newHeight = minHeight;\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.id(this._ref._id.toString());\n }\n getPosition() {\n return this._ref.position();\n }\n getWidth() {\n return this._ref.width();\n }\n getHeigth() {\n return this._ref.height();\n }\n setWidth(w) {\n this._ref.width(w);\n }\n setHeight(h) {\n this._ref.height(h);\n }\n setPosition(x, y) {\n this._ref.setPosition({\n x: x,\n y: y\n });\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Rectangle\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n setLineWidth(size) {\n this._ref.strokeWidth(size);\n }\n getLineWidth() {\n return this._ref.strokeWidth();\n }\n}\n\nclass KonvaEllipse {\n constructor(params, ref = null) {\n var _a, _b;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 100,\n y: 100\n };\n if (!params.radius) params.radius = {\n x: 25,\n y: 25\n };\n this._ref = new Konva.Ellipse({\n stroke: (_a = params.color) !== null && _a !== void 0 ? _a : \"#ff0000\",\n strokeWidth: (_b = params.lineWidth) !== null && _b !== void 0 ? _b : 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n radiusX: params.radius.x,\n radiusY: params.radius.y,\n draggable: true,\n strokeScaleEnabled: false\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newRadiusX = this._ref.radiusX();\n if (scaleByX) newRadiusX *= attrs.scaleX;\n let newRadiusY = this._ref.radiusY();\n if (scaleByY) newRadiusY *= attrs.scaleY;\n const minRadiusX = 25;\n const minRadiusY = 25;\n if (newRadiusX < minRadiusX) newRadiusX = minRadiusX;\n if (newRadiusY < minRadiusY) newRadiusY = minRadiusY;\n if (e.evt.ctrlKey || e.evt.shiftKey) {\n if (scaleByX) {\n this._ref.radius({\n x: newRadiusX,\n y: newRadiusX\n });\n } else {\n this._ref.radius({\n x: newRadiusY,\n y: newRadiusY\n });\n }\n } else {\n this._ref.radius({\n x: newRadiusX,\n y: newRadiusY\n });\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.id(this._ref._id.toString());\n }\n getPosition() {\n return this._ref.position();\n }\n setPosition(x, y) {\n this._ref.setPosition({\n x: x,\n y: y\n });\n }\n getRadiusX() {\n return this._ref.radiusX();\n }\n setRadiusX(r) {\n this._ref.radiusX(r);\n }\n getRadiusY() {\n return this._ref.radiusY();\n }\n setRadiusY(r) {\n this._ref.radiusY(r);\n }\n getLineWidth() {\n return this._ref.strokeWidth();\n }\n setLineWidth(size) {\n this._ref.strokeWidth(size);\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Ellipse\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n}\n\nclass KonvaArrow {\n constructor(params, ref = null) {\n var _a, _b;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.start) params.start = {\n x: 50,\n y: 50\n };\n if (!params.end) params.end = {\n x: 100,\n y: 100\n };\n this._ref = new Konva.Arrow({\n stroke: (_a = params.color) !== null && _a !== void 0 ? _a : \"#ff0000\",\n fill: (_b = params.color) !== null && _b !== void 0 ? _b : \"#ff0000\",\n strokeWidth: 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: [ params.start.x, params.start.y, params.end.x, params.end.y ],\n draggable: true,\n strokeScaleEnabled: false\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n }));\n this._ref.id(this._ref._id.toString());\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Arrow\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n this._ref.fill(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getPoints() {\n const points = this._ref.points();\n return [ {\n x: points[0],\n y: points[1]\n }, {\n x: points[2],\n y: points[3]\n } ];\n }\n setPoints(points) {\n if (points.length === 2) {\n this._ref.points([ points[0].x, points[0].y, points[1].x, points[1].y ]);\n }\n }\n getStartPoint() {\n const points = this._ref.points();\n return {\n x: points[0],\n y: points[1]\n };\n }\n setStartPoint(x, y) {\n const points = this._ref.points();\n this._ref.points([ x, y, points[2], points[3] ]);\n }\n getEndPoint() {\n const points = this._ref.points();\n return {\n x: points[2],\n y: points[3]\n };\n }\n setEndPoint(x, y) {\n const points = this._ref.points();\n this._ref.points([ points[0], points[1], x, y ]);\n }\n}\n\nclass KonvaImage {\n constructor(params, ref = null) {\n var _a, _b;\n this._ratio = 1;\n this.EPSILON = 1e-5;\n this.BASE64_HEADER_START = \"data:image/\";\n this.BASE64_NOT_FOUND = \"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAADsAAAA7AF5KHG9AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAmhJREFUWIXtlr9rVEEQxz+H8RQUJIdeIopYm0vkCg0GBBtbG1NF7Kxt7dR/IGIw/uhTaBNLERURg2kCEUyCYCPi70b0InjGS57FzOZN3r19d+9HJIVfWO52dma/s7Mz8xa2KAaBCWAR+AkECWOmSOIdwC1gtQOpHc+NfQ8wClQ8+1d0vcdH/lQ3bSIRGAZ2pTjAqNovANXIWlXlAXA2zvi2Ln4AjqYgtagYEutENSLvjRoOImFv5iB32Ae8UrLXwFBk3h9ndF0VJnKSO9gTu3yKu5Z1LKnS8YIcABgw5Ks692JZFXcXRJ46Aq6kikCnHNi/mQ50WwVtfaIoBzL3gRk2drSscJ2wrc4VvUoe2wn/41/iBfoVLRnBGnDSY3AAKacy8AmYR+o7K1zCl6wgrgpOAc/MuhvfgMuk+1JGHQgSBcAloKXy78AjYBppJk5/noTulseBMZ23iD/piHFkEdgTQzKk+5wHjmHC3cmBg0BD5xcSTrFXyQPgIWFtDwMvab+2N8DpbhyY1v/3E8gdDgNfVX9SCVZ0/gW4B0wB71S2BpxLcuCM/jaQSHSDEeAX4VMuAG4gTzyHbcAVXXO6GxxwIX+vvxe7JHcYQ07nHqklj96UIW/YhSWzMKcep8VVtf8B1Dw6h4DfhB+sdbgn2R+gnoEc5NR3dZ+3QJ9H74HqXLPCGlJyTfI9y3YCs0owq3OLOpKkLeBI1HhSDT/mdKIPiUCARMTlQx34TMLjtww8IczmO8AJ/N/2JNSQXAiQ671JePePge0+wzJSQq4FFzlaenIvucUAkiQLhC/mLGNZ9xgn5s63BP4CCk0QDtm4BhoAAAAASUVORK5CYII=\";\n if (ref) {\n if (!ref.src || !ref.src.startsWith(this.BASE64_HEADER_START)) ref.src = this.BASE64_NOT_FOUND;\n if (ref.height() <= this.EPSILON) ref.height(32);\n if (ref.width() <= this.EPSILON) ref.width(32);\n this._ref = ref;\n this._canvasImage = ref.image();\n this._ratio = this._ref.height() <= this.EPSILON || this._ref.width() <= this.EPSILON ? 1 : this._ref.height() / this._ref.width();\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 50,\n y: 50\n };\n if (!params.src || !params.src.startsWith(this.BASE64_HEADER_START)) params.src = this.BASE64_NOT_FOUND;\n this._canvasImage = new Image;\n this._canvasImage.onload = () => {\n this._ref.image(this._canvasImage);\n if (this._ref.height() <= this.EPSILON) this._ref.height(this._canvasImage.height);\n if (this._ref.width() <= this.EPSILON) this._ref.width(this._canvasImage.width);\n this._ratio = this._ref.height() <= this.EPSILON || this._ref.width() <= this.EPSILON ? 1 : this._ref.height() / this._ref.width();\n if ((params.width <= this.EPSILON || params.height <= this.EPSILON) && (params.maxWidth >= this.EPSILON || params.maxWidth >= this.EPSILON)) {\n const heightOutOfCanvas = params.maxHeight - this._canvasImage.height;\n const widthOutOfCanvas = params.maxWidth - this._canvasImage.width;\n if (heightOutOfCanvas <= this.EPSILON || widthOutOfCanvas <= this.EPSILON) {\n if (widthOutOfCanvas <= this.EPSILON && widthOutOfCanvas < heightOutOfCanvas / this._ratio) {\n this._ref.height(params.maxWidth * this._ratio);\n this._ref.width(params.maxWidth);\n } else {\n this._ref.width(params.maxHeight / this._ratio);\n this._ref.height(params.maxHeight);\n }\n }\n }\n };\n this._canvasImage.onerror = () => {\n this._canvasImage.onerror = function() {};\n this._canvasImage.src = this.BASE64_NOT_FOUND;\n };\n this._canvasImage.src = params.src;\n this._ref = new Konva.Image({\n x: params.position.x,\n y: params.position.y,\n image: this._canvasImage,\n width: (_a = params.width) !== null && _a !== void 0 ? _a : 0,\n height: (_b = params.height) !== null && _b !== void 0 ? _b : 0,\n draggable: true\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n if (e.evt.ctrlKey || e.evt.shiftKey) {\n if (scaleByX) {\n this._ref.width(newWidth);\n this._ref.height(newWidth * this._ratio);\n } else {\n this._ref.width(newHeight / this._ratio);\n this._ref.height(newHeight);\n }\n } else {\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.id(this._ref._id.toString());\n }\n getSrc() {\n return this._canvasImage.src;\n }\n setSrc(src) {\n this._canvasImage.src = src;\n }\n getWidth() {\n return this._ref.width();\n }\n setWidth(w) {\n this._ref.width(w);\n this._ref.height(w * this._ratio);\n }\n getHeight() {\n return this._ref.height();\n }\n setHeight(h) {\n this._ref.height(h);\n this._ref.width(h / this._ratio);\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Image\";\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getPosition() {\n return this._ref.getPosition();\n }\n setPosition(x, y) {\n this._ref.setPosition({\n x: x,\n y: y\n });\n }\n}\n\nclass KonvaCloud {\n constructor(params, ref = null) {\n var _a, _b, _c, _d;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 100,\n y: 100\n };\n const arcRadius = 16;\n this._ref = new Konva.Shape({\n x: params.position.x,\n y: params.position.y,\n width: (_a = params.width) !== null && _a !== void 0 ? _a : 200,\n height: (_b = params.height) !== null && _b !== void 0 ? _b : 200,\n stroke: (_c = params.color) !== null && _c !== void 0 ? _c : \"#ff0000\",\n strokeWidth: (_d = params.lineWidth) !== null && _d !== void 0 ? _d : 4,\n draggable: true,\n strokeScaleEnabled: false,\n globalCompositeOperation: \"source-over\",\n sceneFunc: (context, shape) => {\n function calculateMidpoint(position, width, height) {\n const midX = position.x + width / 2;\n const midY = position.y + height / 2;\n return {\n x: midX,\n y: midY\n };\n }\n const points = [ {\n x: 0,\n y: 0\n }, {\n x: 0 + this._ref.width(),\n y: 0\n }, {\n x: 0 + this._ref.width(),\n y: 0 + this._ref.height()\n }, {\n x: 0,\n y: 0 + this._ref.height()\n }, {\n x: 0,\n y: 0\n } ];\n const midPoint = calculateMidpoint({\n x: 0,\n y: 0\n }, this._ref.width(), this._ref.height());\n const baseArcLength = 30;\n context.beginPath();\n for (let iPoint = 0; iPoint < points.length - 1; iPoint++) {\n let approxArcLength = baseArcLength;\n const dx = points[iPoint + 1].x - points[iPoint].x;\n const dy = points[iPoint + 1].y - points[iPoint].y;\n const length = Math.sqrt(dx * dx + dy * dy);\n const arcCount = Math.floor(length / approxArcLength);\n const lengthMod = length % approxArcLength;\n approxArcLength = baseArcLength + arcCount / lengthMod;\n let pX = points[iPoint].x + dx / arcCount / 2;\n let pY = points[iPoint].y + dy / arcCount / 2;\n const pEndX = points[iPoint + 1].x;\n const pEndY = points[iPoint + 1].y;\n const endAngle = Math.atan((pEndY - pY) / (pEndX - pX));\n const startAngle = endAngle + Math.PI;\n const counterClockwise = pX > midPoint.x && pY > midPoint.y;\n for (let iArc = 0; iArc < arcCount; iArc++) {\n if (counterClockwise) {\n context.arc(pX, pY, arcRadius, endAngle, startAngle);\n } else {\n context.arc(pX, pY, arcRadius, startAngle, endAngle);\n }\n pX += dx / arcCount;\n pY += dy / arcCount;\n }\n }\n context.closePath();\n context.fillStrokeShape(shape);\n }\n });\n this._ref.className = \"Cloud\";\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n const minWidth = 100;\n const minHeight = 100;\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < minHeight) newHeight = minHeight;\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.getSelfRect = () => ({\n x: 0 - arcRadius,\n y: 0 - arcRadius,\n width: this._ref.width() + 2 * arcRadius,\n height: this._ref.height() + 2 * arcRadius\n });\n this._ref.id(this._ref._id.toString());\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Cloud\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getPosition() {\n return this._ref.position();\n }\n setPosition(x, y) {\n this._ref.position({\n x: x,\n y: y\n });\n }\n getWidth() {\n return this._ref.width();\n }\n setWidth(w) {\n this._ref.width(w);\n }\n getHeigth() {\n return this._ref.height();\n }\n setHeight(h) {\n this._ref.height(h);\n }\n getLineWidth() {\n return this._ref.strokeWidth();\n }\n setLineWidth(size) {\n this._ref.strokeWidth(size);\n }\n}\n\nconst MarkupMode2Konva = {\n SelectMarkup: {\n name: \"SelectMarkup\",\n initializer: null\n },\n Line: {\n name: \"Line\",\n initializer: (ref, params = null) => new KonvaLine(params, ref)\n },\n Text: {\n name: \"Text\",\n initializer: (ref, params = null) => new KonvaText(params, ref)\n },\n Rectangle: {\n name: \"Rect\",\n initializer: (ref, params = null) => new KonvaRectangle(params, ref)\n },\n Ellipse: {\n name: \"Ellipse\",\n initializer: (ref, params = null) => new KonvaEllipse(params, ref)\n },\n Arrow: {\n name: \"Arrow\",\n initializer: (ref, params = null) => new KonvaArrow(params, ref)\n },\n Image: {\n name: \"Image\",\n initializer: (ref, params = null) => new KonvaImage(params, ref)\n },\n Cloud: {\n name: \"Cloud\",\n initializer: (ref, params = null) => new KonvaCloud(params, ref)\n }\n};\n\nclass KonvaMarkup {\n constructor() {\n this._containerEvents = [];\n this._markupIsActive = false;\n this._markupColor = new MarkupColor(255, 0, 0);\n this.lineWidth = 4;\n this.lineType = \"solid\";\n this.fontSize = 34;\n this.changeActiveDragger = event => {\n const draggerName = event.data;\n this._markupContainer.className = this._container.className.split(\" \").filter((x => !x.startsWith(\"oda-cursor-\"))).filter((x => x)).concat(`oda-cursor-${draggerName.toLowerCase()}`).join(\" \");\n this.removeTextInput();\n this.removeImageInput();\n this.enableEditMode(draggerName);\n };\n this.resizeContainer = entries => {\n const {width: width, height: height} = entries[0].contentRect;\n if (!width || !height) return;\n if (!this._konvaStage) return;\n this._konvaStage.width(width);\n this._konvaStage.height(height);\n };\n this.pan = event => {\n const newPos = {\n x: this._konvaStage.x() + event.dX,\n y: this._konvaStage.y() + event.dY\n };\n this._konvaStage.position(newPos);\n };\n this.zoomAt = event => {\n const newScale = this._konvaStage.scaleX() * event.data;\n this._konvaStage.scale({\n x: newScale,\n y: newScale\n });\n const newPos = {\n x: event.x - (event.x - this._konvaStage.x()) * event.data,\n y: event.y - (event.y - this._konvaStage.y()) * event.data\n };\n this._konvaStage.position(newPos);\n };\n this.redirectToViewer = event => {\n if (this._viewer) this._viewer.emit(event);\n };\n this.getRelativePointPosition = (point, node) => {\n const transform = node.getAbsoluteTransform().copy();\n transform.invert();\n return transform.point(point);\n };\n this.getRelativePointerPosition = node => this.getRelativePointPosition(node.getStage().getPointerPosition(), node);\n }\n initialize(container, containerEvents, viewer, worldTransformer) {\n if (!Konva) throw new Error('Markup error: Konva is not initialized. Forgot to add <script src=\"https://unpkg.com/konva@9/konva.min.js\"><\\/script> to your page?');\n this._viewer = viewer;\n this._worldTransformer = worldTransformer !== null && worldTransformer !== void 0 ? worldTransformer : new WorldTransform;\n this._container = container;\n this._containerEvents = containerEvents !== null && containerEvents !== void 0 ? containerEvents : [];\n this._markupContainer = document.createElement(\"div\");\n this._markupContainer.id = \"markup-container\";\n this._markupContainer.style.position = \"absolute\";\n this._markupContainer.style.top = \"0px\";\n this._markupContainer.style.left = \"0px\";\n this._markupContainer.style.outline = \"0px\";\n this._markupContainer.style.pointerEvents = \"none\";\n const parentDiv = this._container.parentElement;\n parentDiv.appendChild(this._markupContainer);\n this._resizeObserver = new ResizeObserver(this.resizeContainer);\n this._resizeObserver.observe(parentDiv);\n this._markupColor.setColor(255, 0, 0);\n this.initializeKonva();\n if (this._viewer) {\n this._viewer.addEventListener(\"changeactivedragger\", this.changeActiveDragger);\n this._viewer.addEventListener(\"pan\", this.pan);\n this._viewer.addEventListener(\"zoomat\", this.zoomAt);\n }\n }\n dispose() {\n var _a, _b;\n if (this._viewer) {\n this._viewer.removeEventListener(\"zoomat\", this.zoomAt);\n this._viewer.removeEventListener(\"pan\", this.pan);\n this._viewer.removeEventListener(\"changeactivedragger\", this.changeActiveDragger);\n }\n this.destroyKonva();\n (_a = this._resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\n this._resizeObserver = undefined;\n (_b = this._markupContainer) === null || _b === void 0 ? void 0 : _b.remove();\n this._markupContainer = undefined;\n this._container = undefined;\n this._viewer = undefined;\n this._worldTransformer = undefined;\n this._markupIsActive = false;\n }\n syncOverlay() {}\n clearOverlay() {\n this.removeTextInput();\n this.removeImageInput();\n this.clearSelected();\n this.getObjects().forEach((obj => obj.delete()));\n }\n getMarkupColor() {\n return this._markupColor.asRGB();\n }\n setMarkupColor(r, g, b) {\n this._markupColor.setColor(r, g, b);\n this._viewer.emit({\n type: \"changemarkupcolor\",\n data: {\n r: r,\n g: g,\n b: b\n }\n });\n }\n colorizeAllMarkup(r, g, b) {\n const hexColor = new MarkupColor(r, g, b).asHex();\n this.getObjects().filter((obj => {\n var _a;\n return (_a = obj.setColor) === null || _a === void 0 ? void 0 : _a.call(obj, hexColor);\n }));\n }\n colorizeSelectedMarkups(r, g, b) {\n const hexColor = new MarkupColor(r, g, b).asHex();\n this.getSelectedObjects().filter((obj => {\n var _a;\n return (_a = obj.setColor) === null || _a === void 0 ? void 0 : _a.call(obj, hexColor);\n }));\n }\n setViewpoint(viewpoint) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.clearSelected();\n this.removeTextInput();\n this.removeImageInput();\n this._konvaStage.scale({\n x: 1,\n y: 1\n });\n this._konvaStage.position({\n x: 0,\n y: 0\n });\n const markupColor = ((_a = viewpoint.custom_fields) === null || _a === void 0 ? void 0 : _a.markup_color) || {\n r: 255,\n g: 0,\n b: 0\n };\n this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);\n (_b = viewpoint.lines) === null || _b === void 0 ? void 0 : _b.forEach((line => {\n const linePoints = [];\n line.points.forEach((point => {\n const screenPoint = this._worldTransformer.worldToScreen(point);\n linePoints.push(screenPoint.x);\n linePoints.push(screenPoint.y);\n }));\n this.addLine(linePoints, line.color, line.type, line.width, line.id);\n }));\n (_c = viewpoint.texts) === null || _c === void 0 ? void 0 : _c.forEach((text => {\n const screenPoint = this._worldTransformer.worldToScreen(text.position);\n this.addText(text.text, screenPoint, text.angle, text.color, text.text_size, text.font_size, text.id);\n }));\n (_d = viewpoint.rectangles) === null || _d === void 0 ? void 0 : _d.forEach((rect => {\n const screenPoint = this._worldTransformer.worldToScreen(rect.position);\n this.addRectangle(screenPoint, rect.width, rect.height, rect.line_width, rect.color, rect.id);\n }));\n (_e = viewpoint.ellipses) === null || _e === void 0 ? void 0 : _e.forEach((ellipse => {\n const screenPoint = this._worldTransformer.worldToScreen(ellipse.position);\n this.addEllipse(screenPoint, ellipse.radius, ellipse.line_width, ellipse.color, ellipse.id);\n }));\n (_f = viewpoint.arrows) === null || _f === void 0 ? void 0 : _f.forEach((arrow => {\n const startPoint = this._worldTransformer.worldToScreen(arrow.start);\n const endPoint = this._worldTransformer.worldToScreen(arrow.end);\n this.addArrow(startPoint, endPoint, arrow.color, arrow.id);\n }));\n (_g = viewpoint.clouds) === null || _g === void 0 ? void 0 : _g.forEach((cloud => {\n const screenPoint = this._worldTransformer.worldToScreen(cloud.position);\n this.addCloud(screenPoint, cloud.width, cloud.height, cloud.line_width, cloud.color, cloud.id);\n }));\n (_h = viewpoint.images) === null || _h === void 0 ? void 0 : _h.forEach((image => {\n const screenPoint = this._worldTransformer.worldToScreen(image.position);\n this.addImage(screenPoint, image.src, image.width, image.height, image.id);\n }));\n }\n getViewpoint(viewpoint) {\n if (!viewpoint) viewpoint = {};\n viewpoint.lines = this.getMarkupLines();\n viewpoint.texts = this.getMarkupTexts();\n viewpoint.arrows = this.getMarkupArrows();\n viewpoint.clouds = this.getMarkupClouds();\n viewpoint.ellipses = this.getMarkupEllipses();\n viewpoint.images = this.getMarkupImages();\n viewpoint.rectangles = this.getMarkupRectangles();\n viewpoint.custom_fields = {\n markup_color: this.getMarkupColor()\n };\n viewpoint.snapshot = {\n data: this.combineMarkupWithDrawing()\n };\n return viewpoint;\n }\n enableEditMode(mode) {\n if (!mode || !MarkupMode2Konva[mode]) {\n this.clearSelected();\n this.removeTextInput();\n this.removeImageInput();\n this._markupContainer.style.pointerEvents = \"none\";\n this._markupIsActive = false;\n } else {\n this._markupMode = mode;\n this._markupContainer.style.pointerEvents = \"all\";\n this._markupIsActive = true;\n }\n return this;\n }\n createObject(type, params) {\n const konvaShape = MarkupMode2Konva[type];\n if (!konvaShape || !konvaShape.initializer) throw new Error(`Markup CreateObject - unsupported markup type ${type}`);\n const object = konvaShape.initializer(null, params);\n this.addObject(object);\n return object;\n }\n getObjects() {\n const objects = [];\n Object.keys(MarkupMode2Konva).forEach((type => {\n const konvaShape = MarkupMode2Konva[type];\n this.konvaLayerFind(type).forEach((ref => objects.push(konvaShape.initializer(ref))));\n }));\n return objects;\n }\n getSelectedObjects() {\n if (!this._konvaTransformer) return [];\n return this._konvaTransformer.nodes().map((ref => {\n const name = ref.className;\n const konvaShape = Object.values(MarkupMode2Konva).find((shape => shape.name === name));\n return konvaShape ? konvaShape.initializer(ref) : null;\n })).filter((x => x));\n }\n selectObjects(objects) {\n if (!this._konvaTransformer) return;\n const selectedObjs = this._konvaTransformer.nodes().concat(objects.map((x => x.ref())));\n this._konvaTransformer.nodes(selectedObjs);\n }\n clearSelected() {\n if (this._konvaTransformer) this._konvaTransformer.nodes([]);\n }\n addObject(object) {\n if (object.type() === \"Image\") this._groupImages.add(object.ref()); else if (object.type() === \"Text\") this._groupTexts.add(object.ref()); else this._groupGeometry.add(object.ref());\n }\n konvaLayerFind(type) {\n if (!this._konvaLayer) return [];\n const konvaShape = MarkupMode2Konva[type];\n if (!konvaShape || !konvaShape.initializer) return [];\n return this._konvaLayer.find(konvaShape.name).filter((ref => ref.parent === this._konvaLayer || ref.parent === this._groupImages || ref.parent === this._groupGeometry || ref.parent === this._groupTexts));\n }\n initializeKonva() {\n const stage = new Konva.Stage({\n container: this._markupContainer,\n width: this._container.clientWidth,\n height: this._container.clientHeight\n });\n this._konvaStage = stage;\n const layer = new Konva.Layer({\n pixelRation: window.devicePixelRatio\n });\n stage.add(layer);\n this._groupImages = new Konva.Group;\n layer.add(this._groupImages);\n this._groupGeometry = new Konva.Group;\n layer.add(this._groupGeometry);\n this._groupTexts = new Konva.Group;\n layer.add(this._groupTexts);\n this._konvaLayer = layer;\n const transformer = new Konva.Transformer({\n shouldOverdrawWholeArea: false,\n keepRatio: false,\n flipEnabled: false\n });\n layer.add(transformer);\n this._konvaTransformer = transformer;\n let isPaint = false;\n let lastLine;\n let mouseDownPos;\n let lastObj;\n stage.on(\"mousedown touchstart\", (e => {\n if (!this._markupIsActive || e.target !== stage || this._markupMode === \"Text\" || this._markupMode === \"Image\") return;\n if (e.target === stage && transformer.nodes().length > 0) {\n transformer.nodes([]);\n return;\n }\n const pos = this.getRelativePointerPosition(stage);\n mouseDownPos = pos;\n isPaint = [ \"Arrow\", \"Cloud\", \"Ellipse\", \"Line\", \"Rectangle\" ].some((m => m === this._markupMode));\n if (this._markupMode === \"Line\") {\n lastLine = this.addLine([ pos.x, pos.y, pos.x, pos.y ]);\n }\n }));\n stage.on(\"mouseup touchend\", (e => {\n if (!this._markupIsActive) return;\n if (isPaint) {\n const pos = this.getRelativePointerPosition(stage);\n const defParams = mouseDownPos && pos.x === mouseDownPos.x && pos.y === mouseDownPos.y;\n const startX = defParams ? mouseDownPos.x : Math.min(mouseDownPos.x, pos.x);\n const startY = defParams ? mouseDownPos.y : Math.min(mouseDownPos.y, pos.y);\n const dX = defParams ? 200 : Math.abs(mouseDownPos.x - pos.x);\n const dY = defParams ? 200 : Math.abs(mouseDownPos.y - pos.y);\n if (defParams) {\n if (this._markupMode === \"Rectangle\") {\n this.addRectangle({\n x: startX,\n y: startY\n }, dX, dY);\n } else if (this._markupMode === \"Ellipse\") {\n this.addEllipse({\n x: startX,\n y: startY\n }, {\n x: dX / 2,\n y: dY / 2\n });\n } else if (this._markupMode === \"Arrow\") {\n this.addArrow({\n x: mouseDownPos.x,\n y: mouseDownPos.y\n }, {\n x: defParams ? mouseDownPos.x + 200 : pos.x,\n y: defParams ? startY : pos.y\n });\n } else if (this._markupMode === \"Cloud\") {\n this.addCloud({\n x: startX,\n y: startY\n }, Math.max(100, dX), Math.max(100, dY));\n }\n }\n }\n lastObj = undefined;\n isPaint = false;\n }));\n stage.on(\"mousemove touchmove\", (e => {\n if (!this._markupIsActive) return;\n if (!isPaint) {\n return;\n }\n const pos = this.getRelativePointerPosition(stage);\n const defParams = mouseDownPos && pos.x === mouseDownPos.x && pos.y === mouseDownPos.y;\n const startX = defParams ? mouseDownPos.x : Math.min(mouseDownPos.x, pos.x);\n const startY = defParams ? mouseDownPos.y : Math.min(mouseDownPos.y, pos.y);\n const dX = defParams ? 200 : Math.abs(mouseDownPos.x - pos.x);\n const dY = defParams ? 200 : Math.abs(mouseDownPos.y - pos.y);\n if (this._markupMode === \"Line\") {\n lastLine.addPoints([ {\n x: pos.x,\n y: pos.y\n } ]);\n } else if (this._markupMode === \"Arrow\") {\n if (lastObj) lastObj.setEndPoint(pos.x, pos.y); else lastObj = this.addArrow({\n x: mouseDownPos.x,\n y: mouseDownPos.y\n }, {\n x: pos.x,\n y: pos.y\n });\n } else if (this._markupMode === \"Rectangle\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setWidth(dX);\n lastObj.setHeight(dY);\n } else lastObj = this.addRectangle({\n x: startX,\n y: startY\n }, dX, dY);\n } else if (this._markupMode === \"Ellipse\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setRadiusX(dX);\n lastObj.setRadiusY(dY);\n } else lastObj = this.addEllipse({\n x: startX,\n y: startY\n }, {\n x: dX,\n y: dY\n });\n } else if (this._markupMode === \"Cloud\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setWidth(Math.max(100, dX));\n lastObj.setHeight(Math.max(100, dY));\n } else lastObj = this.addCloud({\n x: startX,\n y: startY\n }, dX, dY);\n }\n }));\n stage.on(\"click tap\", (e => {\n if (!this._markupIsActive) return;\n if (e.target === stage) {\n if (this._markupMode === \"Text\") {\n if (this._textInputRef && this._textInputRef.value) this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle); else if (transformer.nodes().length === 0) {\n const pos = this.getRelativePointerPosition(stage);\n this.createTextInput(pos, e.evt.pageX, e.evt.pageY, 0, null);\n }\n } else if (this._markupMode === \"Image\") {\n if (this._imageInputRef && this._imageInputRef.value) this.addImage({\n x: this._imageInputPos.x,\n y: this._imageInputPos.y\n }, this._imageInputRef.value, 0, 0, this._imageInputRef.value); else if (transformer.nodes().length === 0) {\n const pos = this.getRelativePointerPosition(stage);\n this.createImageInput(pos);\n }\n }\n transformer.nodes([]);\n return;\n }\n if (this._markupMode === \"Text\" || this._markupMode === \"SelectMarkup\") {\n if (e.target.className === \"Text\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._textInputRef && this._textInputRef.value) this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle); else this.createTextInput({\n x: e.target.attrs.x,\n y: e.target.attrs.y\n }, e.evt.pageX, e.evt.pageY, e.target.attrs.rotation, e.target.attrs.text);\n return;\n } else {\n this.removeTextInput();\n }\n }\n if (this._markupMode === \"Image\" || this._markupMode === \"SelectMarkup\") {\n if (e.target.className === \"Image\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._imageInputRef && this._imageInputRef.value) this.addImage(this._imageInputPos, this._imageInputRef.value, 0, 0); else this.createImageInput({\n x: e.target.attrs.x,\n y: e.target.attrs.y\n });\n return;\n } else {\n this.removeImageInput();\n }\n }\n if (transformer.nodes().filter((x => x.className === \"Cloud\" || x.className === \"Image\")).length > 0 || e.target.className === \"Cloud\" || e.target.className === \"Image\") {\n transformer.rotateEnabled(false);\n } else {\n transformer.rotateEnabled(true);\n }\n const metaPressed = e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey;\n const isSelected = transformer.nodes().indexOf(e.target) >= 0;\n if (!metaPressed && !isSelected) {\n transformer.nodes([ e.target ]);\n } else if (metaPressed && isSelected) {\n const nodes = transformer.nodes().slice();\n nodes.splice(nodes.indexOf(e.target), 1);\n transformer.nodes(nodes);\n } else if (metaPressed && !isSelected) {\n const nodes = transformer.nodes().concat([ e.target ]);\n transformer.nodes(nodes);\n }\n }));\n const container = stage.container();\n container.tabIndex = 1;\n container.focus();\n container.addEventListener(\"keydown\", (e => {\n if (!this._markupIsActive) return;\n if (e.code === \"Delete\") {\n this.getSelectedObjects().forEach((obj => obj.delete()));\n this.clearSelected();\n return;\n }\n e.preventDefault();\n }));\n }\n destroyKonva() {\n var _a;\n this.removeTextInput();\n this.removeImageInput();\n this.clearOverlay();\n (_a = this._konvaStage) === null || _a === void 0 ? void 0 : _a.destroy();\n this._groupImages = undefined;\n this._groupGeometry = undefined;\n this._groupTexts = undefined;\n this._konvaLayer = undefined;\n this._konvaTransformer = undefined;\n this._konvaStage = undefined;\n }\n getMarkupLines() {\n const lines = [];\n this.konvaLayerFind(\"Line\").forEach((ref => {\n const linePoints = ref.points();\n if (!linePoints) return;\n const worldPoints = [];\n const absoluteTransform = ref.getAbsoluteTransform();\n for (let i = 0; i < linePoints.length; i += 2) {\n const atPoint = absoluteTransform.point({\n x: linePoints[i],\n y: linePoints[i + 1]\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n worldPoints.push(worldPoint);\n }\n const konvaLine = new KonvaLine(null, ref);\n const line = {\n id: konvaLine.id(),\n points: worldPoints,\n color: konvaLine.getColor() || \"#ff0000\",\n type: konvaLine.getLineType() || this.lineType,\n width: konvaLine.getLineWidth() || this.lineWidth\n };\n lines.push(line);\n }));\n return lines;\n }\n getMarkupTexts() {\n const texts = [];\n this.konvaLayerFind(\"Text\").forEach((ref => {\n const textSize = .02;\n const textScale = this._worldTransformer.getScale();\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const shape = new KonvaText(null, ref);\n const text = {\n id: shape.id(),\n position: worldPoint,\n text: shape.getText(),\n text_size: textSize * textScale.y,\n angle: shape.getRotation(),\n color: shape.getColor(),\n font_size: shape.getFontSize() * stageAbsoluteTransform.getMatrix()[0]\n };\n texts.push(text);\n }));\n return texts;\n }\n getMarkupRectangles() {\n const rectangles = [];\n this.konvaLayerFind(\"Rectangle\").forEach((ref => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n const shape = new KonvaRectangle(null, ref);\n const rectangle = {\n id: shape.id(),\n position: worldPoint,\n width: shape.getWidth() * scale,\n height: shape.getHeigth() * scale,\n line_width: shape.getLineWidth(),\n color: shape.getColor()\n };\n rectangles.push(rectangle);\n }));\n return rectangles;\n }\n getMarkupEllipses() {\n const ellipses = [];\n this.konvaLayerFind(\"Ellipse\").forEach((ref => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n const shape = new KonvaEllipse(null, ref);\n const ellipse = {\n id: shape.id(),\n position: worldPoint,\n radius: {\n x: ref.getRadiusX() * scale,\n y: ref.getRadiusY() * scale\n },\n line_width: shape.getLineWidth(),\n color: shape.getColor()\n };\n ellipses.push(ellipse);\n }));\n return ellipses;\n }\n getMarkupArrows() {\n const arrows = [];\n this.konvaLayerFind(\"Arrow\").forEach((ref => {\n const absoluteTransform = ref.getAbsoluteTransform();\n const atStartPoint = absoluteTransform.point({\n x: ref.points()[0],\n y: ref.points()[1]\n });\n const worldStartPoint = this._worldTransformer.screenToWorld(atStartPoint);\n const atEndPoint = absoluteTransform.point({\n x: ref.points()[2],\n y: ref.points()[3]\n });\n const worldEndPoint = this._worldTransformer.screenToWorld(atEndPoint);\n const shape = new KonvaArrow(null, ref);\n const arrow = {\n id: shape.id(),\n start: worldStartPoint,\n end: worldEndPoint,\n color: shape.getColor()\n };\n arrows.push(arrow);\n }));\n return arrows;\n }\n getMarkupImages() {\n const images = [];\n this.konvaLayerFind(\"Image\").forEach((ref => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n const shape = new KonvaImage(null, ref);\n const image = {\n id: shape.id(),\n position: worldPoint,\n src: shape.getSrc(),\n width: shape.getWidth() * scale,\n height: shape.getHeight() * scale\n };\n images.push(image);\n }));\n return images;\n }\n getMarkupClouds() {\n const clouds = [];\n this.konvaLayerFind(\"Cloud\").forEach((ref => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n const shape = new KonvaCloud(null, ref);\n const cloud = {\n id: shape.id(),\n position: worldPoint,\n width: shape.getWidth() * scale,\n height: shape.getHeigth() * scale,\n line_width: shape.getLineWidth(),\n color: shape.getColor()\n };\n clouds.push(cloud);\n }));\n return clouds;\n }\n combineMarkupWithDrawing() {\n this.clearSelected();\n const tempCanvas = document.createElement(\"canvas\");\n if (this._konvaStage) {\n tempCanvas.width = this._konvaStage.width();\n tempCanvas.height = this._konvaStage.height();\n const ctx = tempCanvas.getContext(\"2d\");\n if (this._container instanceof HTMLCanvasElement) ctx.drawImage(this._container, 0, 0);\n ctx.drawImage(this._konvaStage.toCanvas({\n pixelRatio: window.devicePixelRatio\n }), 0, 0);\n }\n return tempCanvas.toDataURL(\"image/jpeg\", .25);\n }\n addLine(linePoints, color, type, width, id) {\n if (!linePoints || linePoints.length === 0) return;\n const points = [];\n for (let i = 0; i < linePoints.length; i += 2) {\n points.push({\n x: linePoints[i],\n y: linePoints[i + 1]\n });\n }\n const konvaLine = new KonvaLine({\n points: points,\n type: type || this.lineType,\n width: width || this.lineWidth,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaLine);\n return konvaLine;\n }\n createTextInput(pos, inputX, inputY, angle, text) {\n if (!this._textInputRef) {\n this._textInputPos = pos;\n this._textInputAngle = angle;\n this._textInputRef = document.createElement(\"textarea\");\n this._textInputRef.style.zIndex = \"9999\";\n this._textInputRef.style.position = \"absolute\";\n this._textInputRef.style.display = \"block\";\n this._textInputRef.style.top = inputY + \"px\";\n this._textInputRef.style.left = inputX + \"px\";\n this._textInputRef.style.fontSize = `${this.fontSize}px`;\n this._textInputRef.style.color = `${this._markupColor.asHex()}`;\n this._textInputRef.style.fontFamily = \"Calibri\";\n this._textInputRef.onkeydown = event => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n this.removeTextInput();\n }\n };\n if (text) this._textInputRef.value = text;\n document.body.appendChild(this._textInputRef);\n setTimeout((() => {\n this._textInputRef.focus();\n }), 50);\n } else {\n this.removeTextInput();\n }\n }\n removeTextInput() {\n var _a;\n (_a = this._textInputRef) === null || _a === void 0 ? void 0 : _a.remove();\n this._textInputRef = null;\n this._textInputPos = null;\n this._textInputAngle = 0;\n }\n createImageInput(pos) {\n if (!this._imageInputRef) {\n const convertBase64 = file => new Promise(((resolve, reject) => {\n const fileReader = new FileReader;\n fileReader.readAsDataURL(file);\n fileReader.onload = () => {\n resolve(fileReader.result);\n };\n fileReader.onerror = error => {\n reject(error);\n };\n }));\n this._imageInputPos = pos;\n this._imageInputRef = document.createElement(\"input\");\n this._imageInputRef.style.display = \"none\";\n this._imageInputRef.type = \"file\";\n this._imageInputRef.accept = \"image/png, image/jpeg\";\n this._imageInputRef.onchange = async event => {\n const file = event.target.files[0];\n const base64 = await convertBase64(file);\n this.addImage({\n x: this._imageInputPos.x,\n y: this._imageInputPos.y\n }, base64.toString(), 0, 0);\n };\n this._imageInputRef.oncancel = event => {\n this.removeImageInput();\n };\n document.body.appendChild(this._imageInputRef);\n setTimeout((() => {\n this._imageInputRef.click();\n }), 50);\n } else {\n this.removeImageInput();\n }\n }\n removeImageInput() {\n var _a;\n (_a = this._imageInputRef) === null || _a === void 0 ? void 0 : _a.remove();\n this._imageInputRef = null;\n this._imageInputPos = null;\n }\n addText(text, position, angle, color, textSize, fontSize, id) {\n var _a;\n if (!text) return;\n (_a = this.getSelectedObjects().at(0)) === null || _a === void 0 ? void 0 : _a.delete();\n this.clearSelected();\n this.removeTextInput();\n const tolerance = 1e-6;\n if (textSize && textSize > tolerance && (!fontSize || fontSize < tolerance)) {\n const size = .02;\n const scale = this._worldTransformer.getScale();\n fontSize = textSize / (scale.y / size) / 34;\n }\n const konvaText = new KonvaText({\n position: {\n x: position.x,\n y: position.y\n },\n text: text,\n rotation: angle,\n fontSize: fontSize || this.fontSize,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaText);\n return konvaText;\n }\n addRectangle(position, width, height, lineWidth, color, id) {\n if (!position) return;\n const konvaRectangle = new KonvaRectangle({\n position: position,\n width: width,\n height: height,\n lineWidth: lineWidth || this.lineWidth,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaRectangle);\n return konvaRectangle;\n }\n addEllipse(position, radius, lineWidth, color, id) {\n if (!position) return;\n const konvaEllipse = new KonvaEllipse({\n position: position,\n radius: radius,\n lineWidth: lineWidth,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaEllipse);\n return konvaEllipse;\n }\n addArrow(start, end, color, id) {\n if (!start || !end) return;\n const konvaArrow = new KonvaArrow({\n start: start,\n end: end,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaArrow);\n return konvaArrow;\n }\n addCloud(position, width, height, lineWidth, color, id) {\n if (!position || !width || !height) return;\n const konvaCloud = new KonvaCloud({\n position: position,\n width: width,\n height: height,\n color: color || this._markupColor.asHex(),\n lineWidth: lineWidth || this.lineWidth,\n id: id\n });\n this.addObject(konvaCloud);\n return konvaCloud;\n }\n addImage(position, src, width, height, id) {\n var _a;\n if (!position || !src) return;\n (_a = this.getSelectedObjects().at(0)) === null || _a === void 0 ? void 0 : _a.delete();\n this.clearSelected();\n this.removeImageInput();\n const konvaImage = new KonvaImage({\n position: position,\n src: src,\n width: width,\n height: height,\n maxWidth: this._konvaStage.width() - position.x,\n maxHeight: this._konvaStage.height() - position.y,\n id: id\n });\n this.addObject(konvaImage);\n return konvaImage;\n }\n}\n\nexport { KonvaMarkup as Markup };\n//# sourceMappingURL=markup.module.js.map\n","import { EventDispatcher, MOUSE, Quaternion, Spherical, TOUCH, Vector2, Vector3 } from \"three\";\n\n// OrbitControls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: \"change\" };\nconst _startEvent = { type: \"start\" };\nconst _endEvent = { type: \"end\" };\n\nconst STATE = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6,\n};\n\nclass OrbitControls extends EventDispatcher {\n constructor(object, domElement) {\n super();\n\n this.object = object;\n this.domElement = domElement;\n this.domElement.style.touchAction = \"none\"; // disable touch scroll\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n this.minAzimuthAngle = -Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.05;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.panSpeed = 1.0;\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n this.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n // The four arrow keys\n this.keys = { LEFT: \"ArrowLeft\", UP: \"ArrowUp\", RIGHT: \"ArrowRight\", BOTTOM: \"ArrowDown\" };\n\n // Mouse buttons\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n // Touch fingers\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // the target DOM element for key events\n this._domElementKeyEvents = null;\n\n //\n // public methods\n //\n\n this.getPolarAngle = function () {\n return spherical.phi;\n };\n\n this.getAzimuthalAngle = function () {\n return spherical.theta;\n };\n\n this.getDistance = function () {\n return this.object.position.distanceTo(this.target);\n };\n\n this.listenToKeyEvents = function (domElement) {\n domElement.addEventListener(\"keydown\", onKeyDown);\n this._domElementKeyEvents = domElement;\n };\n\n this.stopListenToKeyEvents = function () {\n this._domElementKeyEvents.removeEventListener(\"keydown\", onKeyDown);\n this._domElementKeyEvents = null;\n };\n\n this.saveState = function () {\n scope.target0.copy(scope.target);\n scope.position0.copy(scope.object.position);\n scope.zoom0 = scope.object.zoom;\n };\n\n this.reset = function () {\n scope.target.copy(scope.target0);\n scope.object.position.copy(scope.position0);\n scope.object.zoom = scope.zoom0;\n\n scope.object.updateProjectionMatrix();\n scope.dispatchEvent(_changeEvent);\n\n scope.update();\n\n scope.state = STATE.NONE;\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = (function () {\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0));\n const quatInverse = quat.clone().invert();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n const lastTargetPosition = new Vector3();\n\n const twoPI = 2 * Math.PI;\n\n return function update() {\n const position = scope.object.position;\n\n offset.copy(position).sub(scope.target);\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat);\n\n // angle from z-axis around y-axis\n spherical.setFromVector3(offset);\n\n if (scope.autoRotate && scope.state === STATE.NONE) {\n rotateLeft(getAutoRotationAngle());\n }\n\n if (scope.enableDamping) {\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\n } else {\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle;\n let max = scope.maxAzimuthAngle;\n\n if (isFinite(min) && isFinite(max)) {\n if (min < -Math.PI) min += twoPI;\n else if (min > Math.PI) min -= twoPI;\n\n if (max < -Math.PI) max += twoPI;\n else if (max > Math.PI) max -= twoPI;\n\n if (min <= max) {\n spherical.theta = Math.max(min, Math.min(max, spherical.theta));\n } else {\n spherical.theta =\n spherical.theta > (min + max) / 2 ? Math.max(min, spherical.theta) : Math.min(max, spherical.theta);\n }\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\n spherical.makeSafe();\n\n spherical.radius *= scope.scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\n // move target to panned location\n\n if (scope.enableDamping === true) {\n scope.target.addScaledVector(scope.panOffset, scope.dampingFactor);\n } else {\n scope.target.add(scope.panOffset);\n }\n\n offset.setFromSpherical(spherical);\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse);\n\n position.copy(scope.target).add(offset);\n\n scope.object.lookAt(scope.target);\n\n if (scope.enableDamping === true) {\n sphericalDelta.theta *= 1 - scope.dampingFactor;\n sphericalDelta.phi *= 1 - scope.dampingFactor;\n\n scope.panOffset.multiplyScalar(1 - scope.dampingFactor);\n } else {\n sphericalDelta.set(0, 0, 0);\n\n scope.panOffset.set(0, 0, 0);\n }\n\n scope.scale = 1;\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (\n scope.zoomChanged ||\n lastPosition.distanceToSquared(scope.object.position) > EPS ||\n 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS ||\n lastTargetPosition.distanceToSquared(scope.target) > 0\n ) {\n scope.dispatchEvent(_changeEvent);\n\n lastPosition.copy(scope.object.position);\n lastQuaternion.copy(scope.object.quaternion);\n lastTargetPosition.copy(scope.target);\n\n scope.zoomChanged = false;\n\n return true;\n }\n\n return false;\n };\n })();\n\n this.dispose = function () {\n scope.domElement.removeEventListener(\"contextmenu\", onContextMenu);\n\n scope.domElement.removeEventListener(\"pointerdown\", onPointerDown);\n scope.domElement.removeEventListener(\"pointercancel\", onPointerUp);\n scope.domElement.removeEventListener(\"wheel\", onMouseWheel);\n\n scope.domElement.removeEventListener(\"pointermove\", onPointerMove);\n scope.domElement.removeEventListener(\"pointerup\", onPointerUp);\n\n if (scope._domElementKeyEvents !== null) {\n scope._domElementKeyEvents.removeEventListener(\"keydown\", onKeyDown);\n scope._domElementKeyEvents = null;\n }\n\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n };\n\n //\n // internals\n //\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const scope = this;\n\n scope.state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n scope.scale = 1;\n scope.panOffset = new Vector3();\n scope.zoomChanged = false;\n\n scope.rotateStart = new Vector2();\n scope.rotateEnd = new Vector2();\n scope.rotateDelta = new Vector2();\n\n scope.panStart = new Vector2();\n scope.panEnd = new Vector2();\n scope.panDelta = new Vector2();\n\n scope.dollyStart = new Vector2();\n scope.dollyEnd = new Vector2();\n scope.dollyDelta = new Vector2();\n scope.dollyScale = 0;\n\n scope.pointers = [];\n scope.pointerPositions = {};\n\n function getAutoRotationAngle() {\n return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed;\n }\n\n function getZoomScale() {\n return Math.pow(0.95, scope.zoomSpeed);\n }\n\n function rotateLeft(angle) {\n sphericalDelta.theta -= angle;\n }\n\n function rotateUp(angle) {\n sphericalDelta.phi -= angle;\n }\n\n const panLeft = (function () {\n const v = new Vector3();\n\n return function panLeft(distance, objectMatrix) {\n v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n v.multiplyScalar(-distance);\n\n scope.panOffset.add(v);\n };\n })();\n\n const panUp = (function () {\n const v = new Vector3();\n\n return function panUp(distance, objectMatrix) {\n if (scope.screenSpacePanning === true) {\n v.setFromMatrixColumn(objectMatrix, 1);\n } else {\n v.setFromMatrixColumn(objectMatrix, 0);\n v.crossVectors(scope.object.up, v);\n }\n\n v.multiplyScalar(distance);\n\n scope.panOffset.add(v);\n };\n })();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = (function () {\n const offset = new Vector3();\n\n return function pan(deltaX, deltaY) {\n const element = scope.domElement;\n\n if (scope.object.isPerspectiveCamera) {\n // perspective\n const position = scope.object.position;\n offset.copy(position).sub(scope.target);\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0);\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft((2 * deltaX * targetDistance) / element.clientHeight, scope.object.matrix);\n panUp((2 * deltaY * targetDistance) / element.clientHeight, scope.object.matrix);\n } else if (scope.object.isOrthographicCamera) {\n // orthographic\n panLeft(\n (deltaX * (scope.object.right - scope.object.left)) / scope.object.zoom / element.clientWidth,\n scope.object.matrix\n );\n panUp(\n (deltaY * (scope.object.top - scope.object.bottom)) / scope.object.zoom / element.clientHeight,\n scope.object.matrix\n );\n } else {\n // camera neither orthographic nor perspective\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n scope.enablePan = false;\n }\n };\n })();\n\n function dollyOut(dollyScale) {\n if (scope.object.isPerspectiveCamera) {\n scope.scale /= dollyScale;\n } else if (scope.object.isOrthographicCamera) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n scope.object.updateProjectionMatrix();\n scope.zoomChanged = true;\n } else {\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n scope.enableZoom = false;\n }\n }\n\n function dollyIn(dollyScale) {\n if (scope.object.isPerspectiveCamera) {\n scope.scale *= dollyScale;\n } else if (scope.object.isOrthographicCamera) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n scope.object.updateProjectionMatrix();\n scope.zoomChanged = true;\n } else {\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n scope.enableZoom = false;\n }\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate(event) {\n scope.rotateStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseDownDolly(event) {\n scope.dollyStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseDownPan(event) {\n scope.panStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseMoveRotate(event) {\n scope.rotateEnd.set(event.clientX, event.clientY);\n\n scope.rotateDelta.subVectors(scope.rotateEnd, scope.rotateStart).multiplyScalar(scope.rotateSpeed);\n\n const element = scope.domElement;\n\n rotateLeft((2 * Math.PI * scope.rotateDelta.x) / element.clientHeight); // yes, height\n\n rotateUp((2 * Math.PI * scope.rotateDelta.y) / element.clientHeight);\n\n scope.rotateStart.copy(scope.rotateEnd);\n\n scope.update();\n }\n\n function handleMouseMoveDolly(event) {\n scope.dollyEnd.set(event.clientX, event.clientY);\n\n scope.dollyDelta.subVectors(scope.dollyEnd, scope.dollyStart);\n\n if (scope.dollyDelta.y < 0) {\n scope.dollyScale = 1 / getZoomScale();\n dollyOut(getZoomScale());\n } else if (scope.dollyDelta.y > 0) {\n scope.dollyScale = getZoomScale();\n dollyIn(getZoomScale());\n }\n\n scope.dollyStart.copy(scope.dollyEnd);\n\n scope.update();\n }\n\n function handleMouseMovePan(event) {\n scope.panEnd.set(event.clientX, event.clientY);\n\n scope.panDelta.subVectors(scope.panEnd, scope.panStart).multiplyScalar(scope.panSpeed);\n\n pan(scope.panDelta.x, scope.panDelta.y);\n\n scope.panStart.copy(scope.panEnd);\n\n scope.update();\n }\n\n function handleMouseWheel(event) {\n scope.dollyEnd.set(scope.domElement.clientWidth / 2, scope.domElement.clientHeight / 2);\n\n scope.dollyDelta.set(event.deltaX, event.deltaY);\n\n if (event.deltaY < 0) {\n scope.dollyScale = 1 / getZoomScale();\n dollyIn(getZoomScale());\n } else if (event.deltaY > 0) {\n scope.dollyScale = getZoomScale();\n dollyOut(getZoomScale());\n }\n\n scope.dollyStart.copy(scope.dollyEnd);\n\n scope.update();\n\n if (event.deltaY !== 0) {\n scope.state = STATE.DOLLY;\n scope.dispatchEvent(_changeEvent);\n scope.state = STATE.NONE;\n }\n }\n\n function handleKeyDown(event) {\n let needsUpdate = false;\n\n switch (event.code) {\n case scope.keys.UP:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateUp((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(0, scope.keyPanSpeed);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.BOTTOM:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateUp((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(0, -scope.keyPanSpeed);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.LEFT:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateLeft((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(scope.keyPanSpeed, 0);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.RIGHT:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateLeft((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(-scope.keyPanSpeed, 0);\n }\n\n needsUpdate = true;\n break;\n }\n\n if (needsUpdate) {\n // prevent the browser from scrolling on cursor keys\n event.preventDefault();\n\n scope.update();\n }\n }\n\n function handleTouchStartRotate() {\n if (scope.pointers.length === 1) {\n scope.rotateStart.set(scope.pointers[0].pageX, scope.pointers[0].pageY);\n } else {\n const x = 0.5 * (scope.pointers[0].pageX + scope.pointers[1].pageX);\n const y = 0.5 * (scope.pointers[0].pageY + scope.pointers[1].pageY);\n\n scope.rotateStart.set(x, y);\n }\n }\n\n function handleTouchStartPan() {\n if (scope.pointers.length === 1) {\n scope.panStart.set(scope.pointers[0].pageX, scope.pointers[0].pageY);\n } else {\n const x = 0.5 * (scope.pointers[0].pageX + scope.pointers[1].pageX);\n const y = 0.5 * (scope.pointers[0].pageY + scope.pointers[1].pageY);\n\n scope.panStart.set(x, y);\n }\n }\n\n function handleTouchStartDolly() {\n const dx = scope.pointers[0].pageX - scope.pointers[1].pageX;\n const dy = scope.pointers[0].pageY - scope.pointers[1].pageY;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n scope.dollyStart.set(0, distance);\n }\n\n function handleTouchStartDollyPan() {\n if (scope.enableZoom) handleTouchStartDolly();\n\n if (scope.enablePan) handleTouchStartPan();\n }\n\n function handleTouchStartDollyRotate() {\n if (scope.enableZoom) handleTouchStartDolly();\n\n if (scope.enableRotate) handleTouchStartRotate();\n }\n\n function handleTouchMoveRotate(event) {\n if (scope.pointers.length == 1) {\n scope.rotateEnd.set(event.pageX, event.pageY);\n } else {\n const position = getSecondPointerPosition(event);\n\n const x = 0.5 * (event.pageX + position.x);\n const y = 0.5 * (event.pageY + position.y);\n\n scope.rotateEnd.set(x, y);\n }\n\n scope.rotateDelta.subVectors(scope.rotateEnd, scope.rotateStart).multiplyScalar(scope.rotateSpeed);\n\n const element = scope.domElement;\n\n rotateLeft((2 * Math.PI * scope.rotateDelta.x) / element.clientHeight); // yes, height\n\n rotateUp((2 * Math.PI * scope.rotateDelta.y) / element.clientHeight);\n\n scope.rotateStart.copy(scope.rotateEnd);\n }\n\n function handleTouchMovePan(event) {\n if (scope.pointers.length === 1) {\n scope.panEnd.set(event.pageX, event.pageY);\n } else {\n const position = getSecondPointerPosition(event);\n\n const x = 0.5 * (event.pageX + position.x);\n const y = 0.5 * (event.pageY + position.y);\n\n scope.panEnd.set(x, y);\n }\n\n scope.panDelta.subVectors(scope.panEnd, scope.panStart).multiplyScalar(scope.panSpeed);\n\n pan(scope.panDelta.x, scope.panDelta.y);\n\n scope.panStart.copy(scope.panEnd);\n }\n\n function handleTouchMoveDolly(event) {\n const position = getSecondPointerPosition(event);\n\n const dx = event.pageX - position.x;\n const dy = event.pageY - position.y;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n scope.dollyEnd.set(0, distance);\n\n scope.dollyDelta.set(0, Math.pow(scope.dollyEnd.y / scope.dollyStart.y, scope.zoomSpeed));\n\n dollyOut(scope.dollyDelta.y);\n\n scope.dollyStart.copy(scope.dollyEnd);\n }\n\n function handleTouchMoveDollyPan(event) {\n if (scope.enableZoom) handleTouchMoveDolly(event);\n\n if (scope.enablePan) handleTouchMovePan(event);\n }\n\n function handleTouchMoveDollyRotate(event) {\n if (scope.enableZoom) handleTouchMoveDolly(event);\n\n if (scope.enableRotate) handleTouchMoveRotate(event);\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown(event) {\n if (scope.enabled === false) return;\n\n if (scope.pointers.length === 0) {\n scope.domElement.setPointerCapture(event.pointerId);\n\n scope.domElement.addEventListener(\"pointermove\", onPointerMove);\n scope.domElement.addEventListener(\"pointerup\", onPointerUp);\n }\n\n //\n\n addPointer(event);\n\n if (event.pointerType === \"touch\") {\n onTouchStart(event);\n } else {\n onMouseDown(event);\n }\n }\n\n function onPointerMove(event) {\n if (scope.enabled === false) return;\n\n if (event.pointerType === \"touch\") {\n onTouchMove(event);\n } else {\n onMouseMove(event);\n }\n }\n\n function onPointerUp(event) {\n removePointer(event);\n\n if (scope.pointers.length === 0) {\n scope.domElement.releasePointerCapture(event.pointerId);\n\n scope.domElement.removeEventListener(\"pointermove\", onPointerMove);\n scope.domElement.removeEventListener(\"pointerup\", onPointerUp);\n }\n\n scope.dispatchEvent(_endEvent);\n\n scope.state = STATE.NONE;\n }\n\n function onMouseDown(event) {\n let mouseAction;\n\n switch (event.button) {\n case 0:\n mouseAction = scope.mouseButtons.LEFT;\n break;\n\n case 1:\n mouseAction = scope.mouseButtons.MIDDLE;\n break;\n\n case 2:\n mouseAction = scope.mouseButtons.RIGHT;\n break;\n\n default:\n mouseAction = -1;\n }\n\n switch (mouseAction) {\n case MOUSE.DOLLY:\n if (scope.enableZoom === false) return;\n\n handleMouseDownDolly(event);\n\n scope.state = STATE.DOLLY;\n\n break;\n\n case MOUSE.ROTATE:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n scope.state = STATE.PAN;\n } else {\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n scope.state = STATE.ROTATE;\n }\n\n break;\n\n case MOUSE.PAN:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n scope.state = STATE.ROTATE;\n } else {\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n scope.state = STATE.PAN;\n }\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n if (scope.state !== STATE.NONE) {\n scope.dispatchEvent(_startEvent);\n }\n }\n\n function onMouseMove(event) {\n switch (scope.state) {\n case STATE.ROTATE:\n if (scope.enableRotate === false) return;\n\n handleMouseMoveRotate(event);\n\n break;\n\n case STATE.DOLLY:\n if (scope.enableZoom === false) return;\n\n handleMouseMoveDolly(event);\n\n break;\n\n case STATE.PAN:\n if (scope.enablePan === false) return;\n\n handleMouseMovePan(event);\n\n break;\n }\n }\n\n function onMouseWheel(event) {\n if (scope.enabled === false || scope.enableZoom === false || scope.state !== STATE.NONE) return;\n\n event.preventDefault();\n\n scope.dispatchEvent(_startEvent);\n\n handleMouseWheel(event);\n\n scope.dispatchEvent(_endEvent);\n }\n\n function onKeyDown(event) {\n if (scope.enabled === false || scope.enablePan === false) return;\n\n handleKeyDown(event);\n }\n\n function onTouchStart(event) {\n trackPointer(event);\n\n switch (scope.pointers.length) {\n case 1:\n switch (scope.touches.ONE) {\n case TOUCH.ROTATE:\n if (scope.enableRotate === false) return;\n\n handleTouchStartRotate();\n\n scope.state = STATE.TOUCH_ROTATE;\n\n break;\n\n case TOUCH.PAN:\n if (scope.enablePan === false) return;\n\n handleTouchStartPan();\n\n scope.state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n break;\n\n case 2:\n switch (scope.touches.TWO) {\n case TOUCH.DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return;\n\n handleTouchStartDollyPan();\n\n scope.state = STATE.TOUCH_DOLLY_PAN;\n\n break;\n\n case TOUCH.DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return;\n\n handleTouchStartDollyRotate();\n\n scope.state = STATE.TOUCH_DOLLY_ROTATE;\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n if (scope.state !== STATE.NONE) {\n scope.dispatchEvent(_startEvent);\n }\n }\n\n function onTouchMove(event) {\n trackPointer(event);\n\n switch (scope.state) {\n case STATE.TOUCH_ROTATE:\n if (scope.enableRotate === false) return;\n\n handleTouchMoveRotate(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_PAN:\n if (scope.enablePan === false) return;\n\n handleTouchMovePan(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return;\n\n handleTouchMoveDollyPan(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return;\n\n handleTouchMoveDollyRotate(event);\n\n scope.update();\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n }\n\n function onContextMenu(event) {\n if (scope.enabled === false) return;\n\n event.preventDefault();\n }\n\n function addPointer(event) {\n scope.pointers.push(event);\n }\n\n function removePointer(event) {\n delete scope.pointerPositions[event.pointerId];\n\n for (let i = 0; i < scope.pointers.length; i++) {\n if (scope.pointers[i].pointerId == event.pointerId) {\n scope.pointers.splice(i, 1);\n return;\n }\n }\n }\n\n function trackPointer(event) {\n let position = scope.pointerPositions[event.pointerId];\n\n if (position === undefined) {\n position = new Vector2();\n scope.pointerPositions[event.pointerId] = position;\n }\n\n position.set(event.pageX, event.pageY);\n }\n\n function getSecondPointerPosition(event) {\n const pointer = event.pointerId === scope.pointers[0].pointerId ? scope.pointers[1] : scope.pointers[0];\n\n return scope.pointerPositions[pointer.pointerId];\n }\n\n //\n\n scope.domElement.addEventListener(\"contextmenu\", onContextMenu);\n\n scope.domElement.addEventListener(\"pointerdown\", onPointerDown);\n scope.domElement.addEventListener(\"pointercancel\", onPointerUp);\n scope.domElement.addEventListener(\"wheel\", onMouseWheel, { passive: false });\n\n // force an update at start\n\n this.update();\n }\n}\n\nexport { OrbitControls, STATE };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE, TOUCH } from \"three\";\n\nimport type { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\nimport { OrbitControls, STATE } from \"../controls/OrbitControls.js\";\n\nexport class OrbitDragger implements IDisposable {\n protected viewer: Viewer;\n protected orbit: OrbitControls;\n protected changed: boolean;\n\n constructor(viewer: Viewer) {\n this.orbit = new OrbitControls(viewer.camera, viewer.canvas);\n this.orbit.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n this.orbit.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n this.orbit.screenSpacePanning = true;\n this.orbit.rotateSpeed = 0.33;\n this.orbit.addEventListener(\"start\", this.controlsStart);\n this.orbit.addEventListener(\"change\", this.controlsChange);\n this.changed = false;\n this.viewer = viewer;\n this.viewer.on(\"geometryend\", this.updateControls);\n this.viewer.on(\"viewposition\", this.updateControls);\n this.viewer.on(\"zoom\", this.updateControls);\n this.viewer.on(\"drawviewpoint\", this.updateControls);\n this.viewer.on(\"contextmenu\", this.stopContextMenu);\n this.updateControls();\n }\n\n dispose(): void {\n this.viewer.off(\"geometryend\", this.updateControls);\n this.viewer.off(\"viewposition\", this.updateControls);\n this.viewer.off(\"zoom\", this.updateControls);\n this.viewer.off(\"drawviewpoint\", this.updateControls);\n this.viewer.off(\"contextmenu\", this.stopContextMenu);\n\n this.orbit.removeEventListener(\"change\", this.controlsChange);\n this.orbit.dispose();\n }\n\n updateControls = () => {\n this.orbit.maxDistance = this.viewer.camera.far;\n this.orbit.minDistance = this.viewer.camera.near;\n this.orbit.target.copy(this.viewer.target);\n this.orbit.update();\n };\n\n controlsStart = () => {\n this.changed = false;\n };\n\n controlsChange = () => {\n this.viewer.target.copy(this.orbit.target);\n this.viewer.update();\n\n switch (this.orbit.state) {\n case STATE.PAN:\n case STATE.TOUCH_PAN:\n this.viewer.emitEvent({\n type: \"pan\",\n x: this.orbit.panEnd.x,\n y: this.orbit.panEnd.y,\n dX: this.orbit.panDelta.x,\n dY: this.orbit.panDelta.y,\n });\n break;\n\n case STATE.DOLLY:\n this.viewer.emitEvent({\n type: \"zoomat\",\n data: this.orbit.dollyScale,\n x: this.orbit.dollyEnd.x,\n y: this.orbit.dollyEnd.y,\n });\n break;\n }\n\n this.changed = true;\n };\n\n stopContextMenu = (event: PointerEvent) => {\n if (this.changed) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE } from \"three\";\n\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class PanDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.orbit.mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n // this.controls.touches = { ONE: TOUCH.PAN, TWO: TOUCH.DOLLY_ROTATE };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE } from \"three\";\n\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ZoomDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.orbit.mouseButtons = { LEFT: MOUSE.DOLLY, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n // this.controls.touches = { ONE: TOUCH.DOLLY_PAN, TWO: TOUCH.DOLLY_PAN };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Clock, Camera, Controls, Quaternion, Vector2, Vector3 } from \"three\";\n\ninterface WalkControlsEventMap {\n change: { type: \"change\" };\n walkspeedchange: { type: \"walkspeedchange\"; data: number };\n}\n\nexport class WalkControls extends Controls<WalkControlsEventMap> {\n public movementSpeed = 0.2;\n public lookSpeed = 5;\n public multiplier = 5;\n\n private moveKeys: Set<string>;\n private moveWheel = 0;\n private moveClock: Clock;\n\n private quaternion: Quaternion;\n private downPosition: Vector2;\n private mouseDragOn = false;\n public rotateDelta: Vector2;\n\n constructor(camera: Camera, canvas: HTMLElement) {\n super(camera, canvas);\n\n this.moveKeys = new Set();\n this.moveClock = new Clock();\n\n this.quaternion = camera.quaternion.clone();\n this.downPosition = new Vector2(0, 0);\n this.rotateDelta = new Vector2(0, 0);\n\n this.domElement.addEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.addEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.addEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.addEventListener(\"wheel\", this.onWheel);\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n override dispose() {\n this.domElement.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.removeEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.removeEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.removeEventListener(\"wheel\", this.onWheel);\n\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.domElement.setPointerCapture(event.pointerId);\n this.downPosition.set(event.clientX, event.clientY);\n this.quaternion.copy(this.object.quaternion);\n this.mouseDragOn = true;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (!this.mouseDragOn) return;\n\n const movePosition = new Vector2(event.clientX, event.clientY);\n if (this.downPosition.distanceTo(movePosition) === 0) return;\n\n this.rotateDelta.copy(this.downPosition).sub(movePosition);\n this.rotateCamera(this.rotateDelta);\n this.dispatchEvent({ type: \"change\" });\n };\n\n onPointerUp = (event: PointerEvent) => {\n this.domElement.releasePointerCapture(event.pointerId);\n this.mouseDragOn = false;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.domElement.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onWheel = (event: WheelEvent) => {\n this.moveWheel = event.deltaY;\n this.update();\n };\n\n onKeyDown = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"NumpadSubtract\":\n case \"Minus\":\n if (this.multiplier > 1) {\n this.multiplier = this.multiplier - 1;\n this.dispatchEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"NumpadAdd\":\n case \"Equal\":\n if (this.multiplier < 10) {\n this.multiplier = this.multiplier + 1;\n this.dispatchEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"KeyW\":\n case \"KeyS\":\n case \"KeyA\":\n case \"KeyD\":\n case \"KeyQ\":\n case \"KeyE\":\n this.moveKeys.add(event.code);\n this.update();\n break;\n }\n };\n\n onKeyUp = (event: KeyboardEvent) => {\n if (this.moveKeys.delete(event.code)) this.update();\n };\n\n override update() {\n if (this.moveKeys.size > 0) {\n const timeDelta = this.moveClock.getDelta();\n const moveDelta = timeDelta * this.movementSpeed * this.multiplier;\n\n if (this.moveKeys.has(\"KeyW\")) this.object.translateZ(-moveDelta);\n if (this.moveKeys.has(\"KeyS\")) this.object.translateZ(moveDelta);\n\n if (this.moveKeys.has(\"KeyA\")) this.object.translateX(-moveDelta);\n if (this.moveKeys.has(\"KeyD\")) this.object.translateX(moveDelta);\n\n if (this.moveKeys.has(\"KeyQ\")) this.object.translateY(moveDelta);\n if (this.moveKeys.has(\"KeyE\")) this.object.translateY(-moveDelta);\n\n const lookDelta = this.lookSpeed + (this.multiplier - 1);\n\n if (this.moveKeys.has(\"ArrowUp\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, -lookDelta / 2)));\n if (this.moveKeys.has(\"ArrowDown\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, lookDelta / 2)));\n\n if (this.moveKeys.has(\"ArrowLeft\")) this.rotateCamera(this.rotateDelta.add(new Vector2(lookDelta, 0)));\n if (this.moveKeys.has(\"ArrowRight\")) this.rotateCamera(this.rotateDelta.add(new Vector2(-lookDelta, 0)));\n\n this.moveWheel = 0;\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveWheel !== 0) {\n const moveDelta = this.moveWheel * 0.0001 * this.movementSpeed * this.multiplier;\n\n this.object.translateZ(-moveDelta);\n this.moveWheel += -1 * Math.sign(this.moveWheel);\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveKeys.size === 0 && this.moveWheel === 0) {\n this.moveClock.stop();\n this.moveClock.autoStart = true;\n }\n }\n\n rotateCamera(delta: Vector2) {\n const rotateX = (Math.PI * delta.x) / this.domElement.clientWidth;\n const rotateY = (Math.PI * delta.y) / this.domElement.clientHeight;\n\n const xRotation = new Quaternion();\n xRotation.setFromAxisAngle(this.object.up, rotateX);\n\n const yRotation = new Quaternion();\n yRotation.setFromAxisAngle(new Vector3(1, 0, 0), rotateY);\n\n const quaternion = this.quaternion.clone();\n quaternion.premultiply(xRotation).multiply(yRotation).normalize();\n\n this.object.setRotationFromQuaternion(quaternion);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { WalkControls } from \"../controls/WalkControls\";\n\nexport class WalkDragger {\n protected viewer: Viewer;\n public controls: WalkControls;\n\n constructor(viewer: Viewer) {\n this.controls = new WalkControls(viewer.camera, viewer.canvas);\n this.controls.addEventListener(\"change\", this.controlsChange);\n this.controls.addEventListener(\"walkspeedchange\", this.walkspeedChange);\n this.viewer = viewer;\n this.viewer.on(\"render\", this.viewerRender);\n this.viewer.on(\"zoom\", this.viewerZoom);\n this.updateControls();\n }\n\n dispose() {\n this.viewer.off(\"render\", this.viewerRender);\n this.viewer.off(\"zoom\", this.viewerZoom);\n this.controls.removeEventListener(\"walkspeedchange\", this.walkspeedChange);\n this.controls.removeEventListener(\"change\", this.controlsChange);\n this.controls.dispose();\n }\n\n updateControls = () => {\n const size = this.viewer.extents.getSize(new Vector3());\n this.controls.movementSpeed = Math.min(size.x, size.y, size.z) / 2;\n };\n\n controlsChange = () => {\n this.viewer.update();\n };\n\n walkspeedChange = (event: any) => {\n this.viewer.emitEvent(event);\n };\n\n viewerRender = () => {\n this.controls.update();\n };\n\n viewerZoom = () => {\n this.controls.rotateDelta.set(0, 0);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n BufferGeometry,\n DoubleSide,\n Float32BufferAttribute,\n Line,\n LineBasicMaterial,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Plane,\n Vector3,\n} from \"three\";\n\nclass PlaneHelper extends Line {\n public plane: Plane;\n public size: number;\n public offset: Vector3;\n public helper: Object3D;\n\n constructor(plane: Plane, size = 1, color = 0xffff00, offset: Vector3 = new Vector3()) {\n // const positions = [1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];\n const positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];\n\n const geometry = new BufferGeometry();\n geometry.setAttribute(\"position\", new Float32BufferAttribute(positions, 3));\n geometry.computeBoundingSphere();\n\n super(geometry, new LineBasicMaterial({ color, toneMapped: false }));\n\n (this as any).type = \"PlaneHelper\";\n\n this.plane = plane;\n this.size = size;\n this.offset = offset;\n\n const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];\n\n const geometry2 = new BufferGeometry();\n geometry2.setAttribute(\"position\", new Float32BufferAttribute(positions2, 3));\n geometry2.computeBoundingSphere();\n\n this.helper = new Mesh(\n geometry2,\n new MeshBasicMaterial({\n color,\n opacity: 0.2,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n side: DoubleSide,\n })\n );\n this.add(this.helper);\n }\n\n dispose() {\n this.geometry.dispose();\n (this.material as any).dispose();\n (this.children[0] as any).geometry.dispose();\n (this.children[0] as any).material.dispose();\n }\n\n override updateMatrixWorld(force: boolean) {\n this.position.set(0, 0, 0);\n this.lookAt(this.plane.normal);\n\n this.position.copy(this.offset);\n this.translateZ(-(this.offset.dot(this.plane.normal) + this.plane.constant));\n\n this.scale.set(0.5 * this.size, 0.5 * this.size, 1);\n\n super.updateMatrixWorld(force);\n }\n}\n\nexport { PlaneHelper };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Object3D, Plane, Vector3 } from \"three\";\nimport { TransformControls } from \"three/examples/jsm/controls/TransformControls.js\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { PlaneHelper } from \"../helpers/PlaneHelper\";\nimport { OrbitDragger } from \"./OrbitDragger\";\n\nexport class CuttingPlaneDragger extends OrbitDragger {\n protected plane: Plane;\n protected planeCenter: Object3D;\n protected planeHelper: PlaneHelper;\n protected transform: TransformControls;\n\n constructor(viewer: Viewer, normal: Vector3, color: number) {\n super(viewer);\n\n const size = viewer.extents.getSize(new Vector3()).length();\n const center = viewer.extents.getCenter(new Vector3());\n const constant = -center.dot(normal);\n\n this.plane = new Plane(normal, constant);\n\n if (!viewer.renderer.clippingPlanes) viewer.renderer.clippingPlanes = [];\n viewer.renderer.clippingPlanes.push(this.plane);\n\n this.planeHelper = new PlaneHelper(this.plane, size, color, center);\n this.viewer.helpers.add(this.planeHelper);\n\n this.planeCenter = new Object3D();\n this.planeCenter.position.copy(viewer.extents.getCenter(new Vector3()));\n this.viewer.helpers.add(this.planeCenter);\n\n this.transform = new TransformControls(viewer.camera, viewer.canvas);\n this.transform.showX = !!normal.x;\n this.transform.showY = !!normal.y;\n this.transform.showZ = !!normal.z;\n this.transform.attach(this.planeCenter);\n this.transform.addEventListener(\"change\", this.transformChange);\n this.transform.addEventListener(\"dragging-changed\", this.transformDrag);\n this.viewer.helpers.add(this.transform.getHelper());\n\n this.viewer.on(\"explode\", this.viewerExplode);\n this.viewer.canvas.addEventListener(\"dblclick\", this.onDoubleClick, true);\n this.viewer.update();\n }\n\n override dispose() {\n this.viewer.off(\"explode\", this.viewerExplode);\n this.viewer.canvas.removeEventListener(\"dblclick\", this.onDoubleClick, true);\n\n this.transform.removeEventListener(\"change\", this.transformChange);\n this.transform.removeEventListener(\"dragging-changed\", this.transformDrag);\n this.transform.getHelper().removeFromParent();\n this.transform.detach();\n this.transform.dispose();\n\n this.planeHelper.removeFromParent();\n this.planeHelper.dispose();\n\n this.planeCenter.removeFromParent();\n\n // this.viewer.renderer.clippingPlanes = this.viewer.renderer.clippingPlanes.filter((plane) => plane !== this.plane);\n // this.viewer.update();\n\n super.dispose();\n }\n\n transformChange = () => {\n this.plane.constant = -this.planeCenter.position.dot(this.plane.normal);\n this.viewer.update();\n };\n\n transformDrag = (event) => {\n this.orbit.enabled = !event.value;\n };\n\n viewerExplode = () => {\n this.planeHelper.size = this.viewer.extents.getSize(new Vector3()).length();\n this.viewer.update();\n };\n\n onDoubleClick = (event: PointerEvent) => {\n event.stopPropagation();\n\n this.plane.negate();\n this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneXAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(1, 0, 0), 0xff0000);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneYAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(0, 1, 0), 0x00ff00);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneZAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(0, 0, 1), 0x0000ff);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Camera, Matrix4, Object3D, Scene, Raycaster, Vector2, Vector3, Vector4 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { OrbitDragger } from \"./OrbitDragger\";\n\nconst PRECISION = 0.01;\n\nexport class MeasureLineDragger extends OrbitDragger {\n private overlay: MeasureOverlay;\n private line: MeasureLine;\n private snapper: MeasureSnapper;\n\n constructor(viewer: Viewer) {\n super(viewer);\n\n this.overlay = new MeasureOverlay(viewer.camera, viewer.canvas);\n this.overlay.attach();\n\n this.line = new MeasureLine(this.overlay);\n this.overlay.addLine(this.line);\n\n this.snapper = new MeasureSnapper(viewer.camera, viewer.canvas);\n this.snapper.update(viewer.scene);\n\n this.viewer.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.viewer.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.canvas.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.viewer.canvas.addEventListener(\"pointerleave\", this.onPointerLeave);\n\n this.viewer.addEventListener(\"render\", this.renderOverlay);\n this.viewer.addEventListener(\"hide\", this.updateSnapper);\n this.viewer.addEventListener(\"isolate\", this.updateSnapper);\n this.viewer.addEventListener(\"showall\", this.updateSnapper);\n }\n\n override dispose() {\n this.viewer.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.viewer.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.canvas.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.viewer.canvas.removeEventListener(\"pointerleave\", this.onPointerLeave);\n\n this.viewer.removeEventListener(\"render\", this.renderOverlay);\n this.viewer.removeEventListener(\"hide\", this.updateSnapper);\n this.viewer.removeEventListener(\"isolate\", this.updateSnapper);\n this.viewer.removeEventListener(\"showall\", this.updateSnapper);\n\n this.overlay.detach();\n this.overlay.dispose();\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.line.startPoint = this.snapper.getSnapPoint(event);\n this.line.render();\n\n this.viewer.canvas.setPointerCapture(event.pointerId);\n this.orbit.enabled = !this.line.startPoint;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (this.orbit.enabled && this.orbit.state !== -1) return;\n\n this.line.endPoint = this.snapper.getSnapPoint(event);\n this.line.render();\n\n if (this.line.startPoint) this.changed = true; // <- to prevent context menu\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (this.line.startPoint && this.line.endPoint && this.line.getDistance() >= PRECISION) {\n this.line = new MeasureLine(this.overlay);\n this.overlay.addLine(this.line);\n } else {\n this.line.startPoint = undefined;\n this.line.endPoint = undefined;\n this.line.render();\n }\n\n this.viewer.canvas.releasePointerCapture(event.pointerId);\n this.orbit.enabled = true;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.viewer.canvas.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onPointerLeave = () => {\n this.line.endPoint = undefined;\n this.line.render();\n };\n\n renderOverlay = () => {\n this.overlay.render();\n };\n\n updateSnapper = () => {\n this.snapper.update(this.viewer.scene);\n };\n}\n\nclass MeasureSnapper {\n private camera: Camera;\n private canvas: HTMLCanvasElement;\n private objects: Object3D[] = [];\n private raycaster: Raycaster;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n this.raycaster = new Raycaster();\n }\n\n getSnapPoint(event: PointerEvent): Vector3 | undefined {\n const mouse = new Vector2(event.clientX, event.clientY);\n\n const rect = this.canvas.getBoundingClientRect();\n const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;\n const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;\n\n const coords = new Vector2(x, y);\n this.raycaster.setFromCamera(coords, this.camera);\n\n this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0.25 },\n Line2: { threshold: 0.25 },\n LOD: {},\n Points: { threshold: 0.1 },\n Sprite: {},\n };\n\n const intersects = this.raycaster.intersectObjects(this.objects, false);\n if (intersects.length === 0) return undefined;\n\n return intersects[0].point;\n }\n\n update(scene: Scene) {\n this.objects = [];\n scene.traverseVisible((child) => this.objects.push(child));\n }\n}\n\nclass MeasureOverlay {\n public camera: Camera;\n public canvas: HTMLCanvasElement;\n public container: HTMLElement;\n public lines: MeasureLine[] = [];\n public projector: MeasureProjector;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n this.projector = new MeasureProjector(camera, canvas);\n }\n\n attach() {\n this.container = document.createElement(\"div\");\n this.container.id = \"measure-container\";\n this.container.style.background = \"rgba(0,0,0,0)\";\n this.container.style.position = \"absolute\";\n this.container.style.top = \"0px\";\n this.container.style.left = \"0px\";\n this.container.style.width = \"100%\";\n this.container.style.height = \"100%\";\n this.container.style.outline = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.overflow = \"hidden\";\n\n this.canvas.parentElement.appendChild(this.container);\n }\n\n dispose() {\n this.clear();\n }\n\n detach() {\n this.container.remove();\n this.container = undefined;\n }\n\n clear() {\n this.lines.forEach((line) => line.dispose());\n this.lines = [];\n }\n\n render() {\n this.projector.updateProjectionMatrix();\n this.lines.forEach((line) => line.render());\n }\n\n update() {\n this.lines.forEach((line) => line.update());\n }\n\n addLine(line: MeasureLine) {\n this.lines.push(line);\n }\n\n removeLine(line: MeasureLine) {\n this.lines = this.lines.filter((x) => x !== line);\n }\n}\n\nconst _middlePoint = new Vector3();\n\nclass MeasureLine {\n private overlay: MeasureOverlay;\n\n private elementStartPoint: HTMLElement;\n private elementEndPoint: HTMLElement;\n private elementLine: HTMLElement;\n private elementLabel: HTMLElement;\n\n public startPoint: Vector3;\n public endPoint: Vector3;\n\n public id = Date.now();\n public unit = \"\";\n public scale = 1.0;\n public size = 10.0;\n public lineWidth = 2;\n\n public style = {\n border: \"2px solid #FFFFFF\",\n background: \"#009bff\",\n boxShadow: \"0 0 10px rgba(0,0,0,0.5)\",\n color: \"white\",\n font: \"1rem system-ui\",\n };\n\n constructor(overlay: MeasureOverlay) {\n this.overlay = overlay;\n\n this.elementStartPoint = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementEndPoint = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementLine = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementLabel = overlay.container.appendChild(document.createElement(\"div\"));\n\n this.update();\n }\n\n dispose() {\n this.elementStartPoint.remove();\n this.elementEndPoint.remove();\n this.elementLine.remove();\n this.elementLabel.remove();\n }\n\n render() {\n const projector = this.overlay.projector;\n\n if (this.startPoint) {\n const { point, visible } = projector.projectPoint(this.startPoint);\n\n this.elementStartPoint.style.display = visible ? \"block\" : \"none\";\n this.elementStartPoint.style.left = `${point.x}px`;\n this.elementStartPoint.style.top = `${point.y}px`;\n } else {\n this.elementStartPoint.style.display = \"none\";\n }\n\n if (this.endPoint) {\n const { point, visible } = projector.projectPoint(this.endPoint);\n\n this.elementEndPoint.style.display = visible ? \"block\" : \"none\";\n this.elementEndPoint.style.left = `${point.x}px`;\n this.elementEndPoint.style.top = `${point.y}px`;\n } else {\n this.elementEndPoint.style.display = \"none\";\n }\n\n if (this.startPoint && this.endPoint) {\n const { point1, point2, visible } = projector.projectLine(this.startPoint, this.endPoint);\n\n point2.sub(point1);\n const angle = point2.angle();\n const width = point2.length();\n\n this.elementLine.style.display = visible ? \"block\" : \"none\";\n this.elementLine.style.left = `${point1.x}px`;\n this.elementLine.style.top = `${point1.y}px`;\n this.elementLine.style.width = `${width}px`;\n this.elementLine.style.transform = `translate(0px, ${-this.lineWidth / 2}px) rotate(${angle}rad)`;\n } else {\n this.elementLine.style.display = \"none\";\n }\n\n if (this.startPoint && this.endPoint) {\n _middlePoint.lerpVectors(this.startPoint, this.endPoint, 0.5);\n const { point, visible } = projector.projectPoint(_middlePoint);\n\n const distance = this.getDistance();\n\n this.elementLabel.style.display = visible && distance >= PRECISION ? \"block\" : \"none\";\n this.elementLabel.style.left = `${point.x}px`;\n this.elementLabel.style.top = `${point.y}px`;\n this.elementLabel.innerHTML = `${distance.toFixed(2)} ${this.unit}`;\n } else {\n this.elementLabel.style.display = \"none\";\n }\n }\n\n update() {\n this.elementStartPoint.id = `markup-dot-start-${this.id}`;\n this.elementStartPoint.style.position = \"absolute\";\n this.elementStartPoint.style.zIndex = \"2\";\n this.elementStartPoint.style.width = `${this.size}px`;\n this.elementStartPoint.style.height = `${this.size}px`;\n this.elementStartPoint.style.border = this.style.border;\n this.elementStartPoint.style.borderRadius = `${this.size}px`;\n this.elementStartPoint.style.background = this.style.background;\n this.elementStartPoint.style.boxShadow = this.style.boxShadow;\n this.elementStartPoint.style.transform = \"translate(-50%, -50%)\";\n\n this.elementEndPoint.id = `markup-dot-end-${this.id}`;\n this.elementEndPoint.style.position = \"absolute\";\n this.elementEndPoint.style.zIndex = \"2\";\n this.elementEndPoint.style.width = `${this.size}px`;\n this.elementEndPoint.style.height = `${this.size}px`;\n this.elementEndPoint.style.border = this.style.border;\n this.elementEndPoint.style.borderRadius = `${this.size}px`;\n this.elementEndPoint.style.background = this.style.background;\n this.elementEndPoint.style.boxShadow = this.style.boxShadow;\n this.elementEndPoint.style.transform = \"translate(-50%, -50%)\";\n\n this.elementLine.id = `markup-line-${this.id}`;\n this.elementLine.style.position = \"absolute\";\n this.elementLine.style.zIndex = \"1\";\n this.elementLine.style.height = `${this.lineWidth}px`;\n this.elementLine.style.background = this.style.background;\n this.elementLine.style.boxShadow = this.style.boxShadow;\n this.elementLine.style.transformOrigin = `0px ${this.lineWidth / 2}px`;\n\n this.elementLabel.id = `markup-label-${this.id}`;\n this.elementLabel.style.position = \"absolute\";\n this.elementLabel.style.zIndex = \"3\";\n this.elementLabel.style.padding = \"2px\";\n this.elementLabel.style.paddingInline = \"5px\";\n this.elementLabel.style.borderRadius = \"5px\";\n this.elementLabel.style.background = this.style.background;\n this.elementLabel.style.boxShadow = this.style.boxShadow;\n this.elementLabel.style.color = this.style.color;\n this.elementLabel.style.font = this.style.font;\n this.elementLabel.style.transform = \"translate(-50%, -50%)\";\n }\n\n getDistance(): number {\n return this.startPoint.distanceTo(this.endPoint) / this.scale;\n }\n}\n\nlet _widthHalf: number;\nlet _heightHalf: number;\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _vector = new Vector3();\nconst _vector1 = new Vector4();\nconst _vector2 = new Vector4();\nconst point = new Vector2();\nconst point1 = new Vector2();\nconst point2 = new Vector2();\n\nclass MeasureProjector {\n private camera: Camera;\n private canvas: HTMLElement;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n }\n\n updateProjectionMatrix() {\n const rect = this.canvas.getBoundingClientRect();\n _widthHalf = rect.width / 2;\n _heightHalf = rect.height / 2;\n\n _viewMatrix.copy(this.camera.matrixWorldInverse);\n _viewProjectionMatrix.multiplyMatrices(this.camera.projectionMatrix, _viewMatrix);\n }\n\n projectPoint(p: Vector3) {\n _vector.copy(p).applyMatrix4(_viewProjectionMatrix);\n const visible = _vector.z >= -1 && _vector.z <= 1;\n\n point.x = (_vector.x + 1) * _widthHalf;\n point.y = (-_vector.y + 1) * _heightHalf;\n\n return { point, visible };\n }\n\n projectLine(p1: Vector3, p2: Vector3) {\n let visible: boolean;\n\n _vector1.copy(p1 as any).applyMatrix4(_viewProjectionMatrix);\n _vector2.copy(p2 as any).applyMatrix4(_viewProjectionMatrix);\n\n // see three/examples/jsm/renderers/Projector.js/clipLine for more details\n\n const bc1near = _vector1.z + _vector1.w;\n const bc2near = _vector2.z + _vector2.w;\n const bc1far = -_vector1.z + _vector1.w;\n const bc2far = -_vector2.z + _vector2.w;\n\n if (bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0) visible = true;\n else if ((bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0)) visible = false;\n else {\n let alpha1 = 0;\n let alpha2 = 1;\n\n if (bc1near < 0) alpha1 = Math.max(alpha1, bc1near / (bc1near - bc2near));\n else if (bc2near < 0) alpha2 = Math.min(alpha2, bc1near / (bc1near - bc2near));\n\n if (bc1far < 0) alpha1 = Math.max(alpha1, bc1far / (bc1far - bc2far));\n else if (bc2far < 0) alpha2 = Math.min(alpha2, bc1far / (bc1far - bc2far));\n\n visible = alpha2 >= alpha1;\n\n if (visible) {\n _vector1.lerp(_vector2, alpha1);\n _vector2.lerp(_vector1, 1 - alpha2);\n }\n }\n\n _vector1.multiplyScalar(1 / _vector1.w);\n _vector2.multiplyScalar(1 / _vector2.w);\n\n point1.x = (_vector1.x + 1) * _widthHalf;\n point1.y = (-_vector1.y + 1) * _heightHalf;\n\n point2.x = (_vector2.x + 1) * _widthHalf;\n point2.y = (-_vector2.y + 1) * _heightHalf;\n\n return { point1, point2, visible };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Vector3 } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ExtentsComponent implements IDisposable {\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"geometryend\", this.syncExtents);\n this.viewer.addEventListener(\"clear\", this.syncExtents);\n this.viewer.on(\"explode\", this.syncExtents);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"geometryend\", this.syncExtents);\n this.viewer.removeEventListener(\"clear\", this.syncExtents);\n this.viewer.off(\"explode\", this.syncExtents);\n }\n\n syncExtents = () => {\n const extents = this.viewer.models.reduce((result: Box3, gltf) => result.expandByObject(gltf.scene), new Box3());\n\n this.viewer.extents.copy(extents);\n this.viewer.target.copy(extents.getCenter(new Vector3()));\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { AmbientLight, DirectionalLight } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class LightComponent implements IDisposable {\n protected viewer: Viewer;\n protected ambientLight: AmbientLight;\n protected directionalLight: DirectionalLight;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.ambientLight = new AmbientLight(0xffffff, 0);\n this.viewer.camera.add(this.ambientLight);\n\n this.directionalLight = new DirectionalLight(0xffffff, 1);\n this.directionalLight.position.set(0.5, 0, 0.866); // ~60º\n this.viewer.camera.add(this.directionalLight);\n }\n\n dispose(): void {\n this.ambientLight.removeFromParent();\n this.ambientLight = undefined;\n\n this.directionalLight.removeFromParent();\n this.directionalLight = undefined;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Color, PMREMGenerator } from \"three\";\nimport { RoomEnvironment } from \"three/examples/jsm/environments/RoomEnvironment.js\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class BackgroundComponent implements IDisposable {\n protected viewer: Viewer;\n protected backgroundColor: Color;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.backgroundColor = new Color(0xffffff);\n\n const environment = new RoomEnvironment();\n const pmremGenerator = new PMREMGenerator(this.viewer.renderer);\n\n this.viewer.renderer.setClearColor(this.backgroundColor);\n this.viewer.scene.background = this.backgroundColor;\n this.viewer.scene.environment = pmremGenerator.fromScene(environment).texture;\n this.viewer.addEventListener(\"optionschange\", this.syncOptions);\n\n environment.dispose();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"optionschange\", this.syncOptions);\n this.viewer.scene.environment = undefined;\n this.viewer.scene.background = undefined;\n }\n\n syncOptions = () => {\n this.backgroundColor.setHex(0xffffff);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport { GeometryEndEvent } from \"@inweb/viewer-core\";\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class DefaultPositionComponent implements IDisposable {\n protected viewer: Viewer;\n public defaultCameraPositions: any;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"geometryend\", this.geometryEnd);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"geometryend\", this.geometryEnd);\n }\n\n geometryEnd = (event: GeometryEndEvent) => {\n const box = this.viewer.extents;\n const size = box.getSize(new Vector3()).length();\n\n this.viewer.camera.near = size / 100;\n this.viewer.camera.far = size * 100;\n this.viewer.camera.updateMatrixWorld();\n this.viewer.camera.updateProjectionMatrix();\n\n this.viewer.executeCommand(\"setDefaultViewPosition\", \"sw\");\n this.viewer.executeCommand(\"zoomToExtents\");\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ResizeCanvasComponent implements IDisposable {\n protected viewer: Viewer;\n protected resizeObserver: ResizeObserver;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.resizeObserver = new ResizeObserver(this.resizeViewer);\n this.resizeObserver.observe(viewer.canvas.parentElement);\n }\n\n dispose() {\n this.resizeObserver.disconnect();\n }\n\n resizeViewer = (entries: ResizeObserverEntry[]) => {\n const { width, height } = entries[0].contentRect;\n\n if (!width || !height) return; // <- invisible viewer, or viewer with parent removed\n\n this.viewer.camera.aspect = width / height;\n this.viewer.camera.updateProjectionMatrix();\n this.viewer.renderer.setSize(width, height, true);\n\n this.viewer.update(true);\n this.viewer.emitEvent({ type: \"resize\", width, height });\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class RenderLoopComponent implements IDisposable {\n protected viewer: Viewer;\n protected requestId: number;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.animate();\n }\n\n dispose() {\n cancelAnimationFrame(this.requestId);\n }\n\n animate = (time = 0) => {\n this.requestId = requestAnimationFrame(this.animate);\n this.viewer.render(time);\n };\n}\n","import {\n Camera,\n CylinderGeometry,\n CanvasTexture,\n Color,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n OrthographicCamera,\n Sprite,\n SpriteMaterial,\n SRGBColorSpace,\n Vector4,\n WebGLRenderer,\n} from \"three\";\n\nexport class WCSHelper extends Object3D {\n private camera: Camera;\n private orthoCamera: OrthographicCamera;\n public size: number;\n\n constructor(camera: Camera) {\n super();\n\n this.camera = camera;\n this.size = 160;\n\n this.orthoCamera = new OrthographicCamera(-2, 2, 2, -2, 0, 4);\n this.orthoCamera.position.set(0, 0, 2);\n\n const matRed = new MeshBasicMaterial({ toneMapped: false, color: \"#aa0000\" });\n const matGreen = new MeshBasicMaterial({ toneMapped: false, color: \"#00aa00\" });\n const matBlue = new MeshBasicMaterial({ toneMapped: false, color: \"#0000aa\" });\n\n const spriteRed = this.getSpriteMaterial(matRed.color, \"X\");\n const spriteGreen = this.getSpriteMaterial(matGreen.color, \"Y\");\n const spriteBlue = this.getSpriteMaterial(matBlue.color, \"Z\");\n\n const lineGeometry = new CylinderGeometry(0.01, 0.01, 1, 3);\n lineGeometry.translate(0, 0.5, 0);\n\n const arrowGeometry = new CylinderGeometry(0, 0.1, 0.25, 12);\n arrowGeometry.translate(0, 0.625, 0);\n\n const axesMap = {\n X: [\n [new Mesh(arrowGeometry, matRed), [0.5, 0, 0], [0, 0, -Math.PI / 2]],\n [new Mesh(lineGeometry, matRed), [0, 0, 0], [0, 0, -Math.PI / 2]],\n [new Sprite(spriteRed), [1.55, 0, 0]],\n ],\n Y: [\n [new Mesh(arrowGeometry, matGreen), [0, 0.5, 0], null],\n [new Mesh(lineGeometry, matGreen), null, null],\n [new Sprite(spriteGreen), [0, 1.55, 0]],\n ],\n Z: [\n [new Mesh(arrowGeometry, matBlue), [0, 0, 0.5], [Math.PI / 2, 0, 0]],\n [new Mesh(lineGeometry, matBlue), null, [Math.PI / 2, 0, 0]],\n [new Sprite(spriteBlue), [0, 0, 1.55]],\n ],\n };\n\n Object.keys(axesMap).forEach((key) => {\n axesMap[key].forEach((objects: any) => {\n const object = objects[0];\n const position = objects[1];\n const rotation = objects[2];\n\n object.name = key;\n if (position) object.position.set(position[0], position[1], position[2]);\n if (rotation) object.rotation.set(rotation[0], rotation[1], rotation[2]);\n object.updateMatrixWorld();\n\n this.add(object);\n });\n });\n }\n\n dispose() {\n this.traverse((object: any) => {\n if (object.geometry) object.geometry.dispose();\n if (object.material) object.material.dispose();\n });\n }\n\n getSpriteMaterial(color: Color, text: string) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 64;\n canvas.height = 64;\n\n const context = canvas.getContext(\"2d\");\n context.clearRect(0, 0, 64, 64);\n context.font = \"24px Arial\";\n context.textAlign = \"center\";\n context.fillStyle = color.getStyle();\n context.fillText(text, 32, 41);\n\n const texture = new CanvasTexture(canvas);\n texture.colorSpace = SRGBColorSpace;\n\n return new SpriteMaterial({ map: texture, toneMapped: false });\n }\n\n render(renderer: WebGLRenderer) {\n this.quaternion.copy(this.camera.quaternion).invert();\n this.updateMatrixWorld();\n\n const clippingPlanes = renderer.clippingPlanes;\n const viewport = renderer.getViewport(new Vector4());\n\n renderer.setViewport(this.position.x, this.position.y, this.size, this.size);\n renderer.clippingPlanes = [];\n renderer.clearDepth();\n renderer.render(this, this.orthoCamera);\n\n renderer.setViewport(viewport);\n renderer.clippingPlanes = clippingPlanes;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\nimport { WCSHelper } from \"../helpers/WCSHelper\";\n\nexport class WCSHelperComponent implements IDisposable {\n private wcsHelper: WCSHelper;\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.wcsHelper = new WCSHelper(viewer.camera);\n this.viewer = viewer;\n this.viewer.addEventListener(\"render\", this.viewerRender);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.wcsHelper.dispose();\n }\n\n viewerRender = () => {\n if (!this.viewer.options.showWCS) return;\n if (this.viewer.extents.isEmpty()) return;\n\n this.wcsHelper.render(this.viewer.renderer);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, LinearToneMapping, Object3D, PerspectiveCamera, Plane, Scene, Vector3, WebGLRenderer } from \"three\";\nimport { GLTF, GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { GLTFLoadingManager } from \"./loaders/GLTFLoadingManager\";\n\nimport { EventEmitter2 } from \"@inweb/eventemitter2\";\nimport { Assembly, Client, Model, File } from \"@inweb/client\";\nimport {\n CANVAS_EVENTS,\n CanvasEventMap,\n commands,\n IClippingPlane,\n IComponent,\n IDragger,\n IOptions,\n IPerspectiveCamera,\n IPoint,\n IViewer,\n IViewpoint,\n Options,\n OptionsEventMap,\n ViewerEventMap,\n} from \"@inweb/viewer-core\";\nimport { IMarkup, IWorldTransform, Markup } from \"@inweb/markup\";\n\nimport { PanDragger } from \"./draggers/PanDragger\";\nimport { OrbitDragger } from \"./draggers/OrbitDragger\";\nimport { ZoomDragger } from \"./draggers/ZoomDragger\";\nimport { WalkDragger } from \"./draggers/WalkDragger\";\nimport { CuttingPlaneXAxisDragger } from \"./draggers/CuttingPlaneXAxis\";\nimport { CuttingPlaneYAxisDragger } from \"./draggers/CuttingPlaneYAxis\";\nimport { CuttingPlaneZAxisDragger } from \"./draggers/CuttingPlaneZAxis\";\nimport { MeasureLineDragger } from \"./draggers/MeasureLineDragger\";\n\nimport { IDisposable } from \"./IDisposable\";\nimport { ExtentsComponent } from \"./components/ExtentsComponent\";\nimport { LightComponent } from \"./components/LightComponent\";\nimport { BackgroundComponent } from \"./components/BackgroundComponent\";\nimport { DefaultPositionComponent } from \"./components/DefaultPositionComponent\";\nimport { ResizeCanvasComponent } from \"./components/ResizeCanvasComponent\";\nimport { RenderLoopComponent } from \"./components/RenderLoopComponent\";\nimport { SelectionComponent } from \"./components/SelectionComponent\";\n// import { ViewPositionComponent } from \"./components/ViewPositionComponent\";\nimport { WCSHelperComponent } from \"./components/WCSHelperComponent\";\n// import { AxesHelperComponent } from \"./components/AxesHelperComponent\";\n// import { ExtentsHelperComponent } from \"./components/ExtentsHelperComponent\";\n\n/**\n * 3D viewer powered by {@link https://threejs.org/ | Three.js}.\n */\nexport class Viewer\n extends EventEmitter2<ViewerEventMap & CanvasEventMap & OptionsEventMap>\n implements IViewer, IWorldTransform\n{\n public client: Client | undefined;\n protected _options: Options;\n\n private canvaseventlistener: (event: any) => void;\n\n public canvas: HTMLCanvasElement | undefined;\n public canvasEvents: string[];\n\n public scene: Scene | undefined;\n public helpers: Scene | undefined;\n public camera: PerspectiveCamera | undefined;\n public renderer: WebGLRenderer | undefined;\n public models: Array<GLTF>;\n public selected: Array<Object3D>;\n public extents: Box3;\n public target: Vector3;\n\n private draggerFactory: Record<string, any>;\n private _activeDragger: IDragger | null;\n\n private components: Array<IDisposable>;\n\n private renderNeeded: boolean;\n private renderTime: DOMHighResTimeStamp;\n\n private _markup: IMarkup;\n\n /**\n * @param client - The `Client` instance that is used to load model reference files from the\n * Open Cloud Server. Do not specify `Client` if you need a standalone viewer instance to\n * view `glTF` files from the web or from local computer.\n */\n constructor(client?: Client) {\n super();\n this._options = new Options(this);\n\n this.client = client;\n\n this.canvasEvents = CANVAS_EVENTS;\n this.canvaseventlistener = (event: Event) => this.emit(event);\n\n this.extents = new Box3();\n this.target = new Vector3();\n\n this.draggerFactory = {\n Pan: PanDragger,\n Zoom: ZoomDragger,\n Orbit: OrbitDragger,\n Walk: WalkDragger,\n CuttingPlaneXAxis: CuttingPlaneXAxisDragger,\n CuttingPlaneYAxis: CuttingPlaneYAxisDragger,\n CuttingPlaneZAxis: CuttingPlaneZAxisDragger,\n MeasureLine: MeasureLineDragger,\n };\n this._activeDragger = null;\n\n this.models = [];\n this.components = [];\n this.selected = [];\n\n this.renderTime = 0;\n\n this.render = this.render.bind(this);\n this.update = this.update.bind(this);\n\n this._markup = new Markup();\n }\n\n get options(): IOptions {\n return this._options;\n }\n\n get draggers(): string[] {\n return Object.keys(this.draggerFactory);\n }\n\n /**\n * 2D markup core instance used to create markups.\n *\n * @readonly\n */\n get markup(): IMarkup {\n return this._markup;\n }\n\n initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent<EventTarget>) => void): Promise<this> {\n this.addEventListener(\"optionschange\", (event) => this.syncOptions(event.data));\n\n this.scene = new Scene();\n this.helpers = new Scene();\n\n const rect = canvas.parentElement.getBoundingClientRect();\n const width = rect.width || 1;\n const height = rect.height || 1;\n this.camera = new PerspectiveCamera(45, width / height, 0.01, 1000);\n this.camera.up.set(0, 0, 1);\n\n this.renderer = new WebGLRenderer({ canvas, antialias: true, preserveDrawingBuffer: true });\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.setSize(width, height);\n this.renderer.toneMapping = LinearToneMapping;\n\n this.canvas = canvas;\n this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));\n\n this._markup.initialize(this.canvas, this.canvasEvents, this, this);\n\n this.components.push(new ExtentsComponent(this));\n this.components.push(new LightComponent(this));\n this.components.push(new BackgroundComponent(this));\n // this.components.push(new ViewPositionComponent(this));\n this.components.push(new DefaultPositionComponent(this));\n this.components.push(new ResizeCanvasComponent(this));\n this.components.push(new RenderLoopComponent(this));\n this.components.push(new SelectionComponent(this));\n this.components.push(new WCSHelperComponent(this));\n // this.components.push(new AxesHelperComponent(this));\n // this.components.push(new ExtentsHelperComponent(this));\n\n this.syncOptions();\n this.syncOverlay();\n\n this.renderTime = performance.now();\n this.render(this.renderTime);\n\n if (typeof onProgress === \"function\")\n onProgress(new ProgressEvent(\"progress\", { lengthComputable: true, loaded: 1, total: 1 }));\n\n this.emitEvent({ type: \"initializeprogress\", data: 1, loaded: 1, total: 1 });\n this.emitEvent({ type: \"initialize\" });\n\n return Promise.resolve(this);\n }\n\n dispose(): this {\n this.cancel();\n this.emitEvent({ type: \"dispose\" });\n\n this.components.forEach((component: IDisposable) => component.dispose());\n this.components = [];\n\n this.setActiveDragger();\n this.removeAllListeners();\n\n this.clear();\n\n this._markup.dispose();\n\n if (this.canvas) {\n this.canvasEvents.forEach((x) => this.canvas.removeEventListener(x, this.canvaseventlistener));\n this.canvas = undefined;\n }\n\n if (this.renderer) this.renderer.dispose();\n\n this.renderer = undefined;\n this.camera = undefined;\n this.scene = undefined;\n this.helpers = undefined;\n\n return this;\n }\n\n isInitialized(): boolean {\n return !!this.renderer;\n }\n\n public render(time: DOMHighResTimeStamp): void {\n if (!this.renderNeeded) return;\n if (!this.renderer) return;\n\n this.renderNeeded = false;\n\n this.renderer.setViewport(0, 0, this.canvas.offsetWidth, this.canvas.offsetHeight);\n this.renderer.autoClear = true;\n this.renderer.render(this.scene, this.camera);\n\n const clippingPlanes = this.renderer.clippingPlanes;\n this.renderer.clippingPlanes = [];\n this.renderer.autoClear = false;\n this.renderer.render(this.helpers, this.camera);\n this.renderer.clippingPlanes = clippingPlanes;\n\n const deltaTime = (time - this.renderTime) / 1000;\n this.renderTime = time;\n this.emitEvent({ type: \"render\", time, deltaTime });\n }\n\n public update(force = false): void {\n this.renderNeeded = true;\n if (force) this.render(performance.now());\n this.emitEvent({ type: \"update\", data: force });\n }\n\n public syncOptions(options: IOptions = this.options): void {\n // this.update();\n }\n\n loadReferences(model: Model | File | Assembly): Promise<this> {\n // todo: load reference as text fonts\n return Promise.resolve(this);\n }\n\n /**\n * Loads a file from Open Cloud Server into the viewer.\n *\n * The file geometry data on the server must be converted to `glTF` format.\n *\n * This method requires a `Client` instance to be specified when creating the viewer to load\n * model reference files from the Open Cloud Server. For a standalone viewer instance use\n * {@link openGltfFile | openGltfFile()}.\n *\n * If there was an active dragger before opening the file, it will be deactivated. After\n * opening the file, you must manually activate the required dragger.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryChunkEvent | geometrychunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File, assembly or specific model to load. If a `File` instance with multiple\n * models is specified, the default model will be loaded. If there is no default model,\n * first availiable model will be loaded.\n */\n async open(file: Model | File | Assembly): Promise<this> {\n if (!this.renderer) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", file, model: file });\n\n let model: Model | undefined = undefined;\n if (file) {\n const models = (await file.getModels()) || [];\n model = models.find((model: Model) => model.default) || models[0];\n }\n if (!model) throw new Error(\"No default model found\");\n\n const geometryType = model.database.split(\".\").pop();\n if (geometryType !== \"gltf\") throw new Error(`Unknown geometry type: ${geometryType}`);\n\n const url = `${model.httpClient.serverUrl}${model.path}/${model.database}`;\n const params = { requestHeader: model.httpClient.headers };\n\n await this.loadReferences(model);\n await this.loadGltfFile(url, undefined, params);\n\n return this;\n }\n\n cancel(): this {\n this.emitEvent({ type: \"cancel\" });\n return this;\n }\n\n /**\n * Loads a `glTF` file into the viewer.\n *\n * If there was an active dragger before opening the file, it will be deactivated. After\n * opening the file, you must manually activate the required dragger.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File URL or binary data buffer to load.\n * @param externalData - External resource map such as binary data buffers or images. Each\n * resource should be represented by a `uri` and a corresponding resource URL, or\n * {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object, or\n * {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}\n * or {@link https://developer.mozilla.org/docs/Web/API/Blob/Blob | Blob}, or\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string,\n * @param params - Loader parameters.\n * @param params.path - The base path from which to find subsequent glTF resources such as\n * textures and .bin data files. If not defined, the base path of the file URL will be used.\n * @param params.requestHeader - The\n * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used\n * in HTTP request.\n * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the url\n * from a different domain that allows CORS. Default is `anonymous`.\n * @param params.withCredentials - Whether the XMLHttpRequest uses credentials such as\n * cookies, authorization headers or TLS client certificates. See\n * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.\n */\n openGltfFile(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | globalThis.File | ArrayBuffer | Blob> = new Map(),\n params: {\n path?: string;\n requestHeader?: HeadersInit;\n crossOrigin?: string;\n withCredentials?: boolean;\n } = {}\n ): Promise<this> {\n if (!this.renderer) return Promise.resolve(this);\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\" });\n\n return this.loadGltfFile(file, externalData, params);\n }\n\n /**\n * Appends a `glTF` file to the existing opened file.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File URL or binary data buffer to load.\n * @param externalData - External resource map such as binary data buffers or images. Each\n * resource should be represented by a `uri` and a corresponding resource URL, or\n * {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object, or\n * {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}\n * or {@link https://developer.mozilla.org/docs/Web/API/Blob/Blob | Blob}, or\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string,\n * @param params - Loader parameters.\n * @param params.path - The base path from which to find subsequent glTF resources such as\n * textures and .bin data files.\n * @param params.requestHeader - The\n * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used\n * in HTTP request.\n * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the url\n * from a different domain that allows CORS. Default is `anonymous`.\n * @param params.withCredentials - Whether the XMLHttpRequest uses credentials such as\n * cookies, authorization headers or TLS client certificates. See\n * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.\n */\n async loadGltfFile(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | globalThis.File | ArrayBuffer | Blob> = new Map(),\n params: {\n path?: string;\n requestHeader?: HeadersInit;\n crossOrigin?: string;\n withCredentials?: boolean;\n } = {}\n ): Promise<this> {\n const manager = new GLTFLoadingManager(file, externalData, params);\n try {\n this.emitEvent({ type: \"geometrystart\" });\n\n const loader = new GLTFLoader(manager);\n loader.setPath(manager.path);\n loader.setRequestHeader(params.requestHeader as any);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const gltf = await loader.loadAsync(manager.fileURL, (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.emitEvent({ type: \"geometryprogress\", data: progress });\n });\n\n if (!this.scene) return this;\n if (!gltf.scene) throw new Error(\"No glTF scene found\");\n\n this.models.push(gltf);\n this.scene.add(gltf.scene);\n\n this.syncOptions();\n this.syncOverlay();\n this.update();\n\n this.emitEvent({ type: \"databasechunk\" });\n this.emitEvent({ type: \"geometryend\", data: gltf.scene });\n } catch (error) {\n this.emitEvent({ type: \"geometryerror\", data: error });\n throw error;\n } finally {\n manager.dispose();\n }\n\n return this;\n }\n\n clear(): this {\n if (!this.renderer) return this;\n\n function disposeMaterial(material: any) {\n const materials = Array.isArray(material) ? material : [material];\n materials.forEach((material: any) => {\n // Object.keys(material).forEach((key) => material[key]?.dispose?.());\n material.dispose();\n });\n }\n\n function disposeObject(object: any) {\n if (object.geometry) object.geometry.dispose();\n if (object.material) disposeMaterial(object.material);\n }\n\n this.setActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n this.clearSelected();\n\n this.helpers.traverse(disposeObject);\n this.helpers.clear();\n\n this.models.forEach((gltf) => gltf.scene.traverse(disposeObject));\n this.models.forEach((gltf) => gltf.scene.removeFromParent());\n this.models = [];\n\n this.scene.clear();\n\n this.syncOptions();\n this.syncOverlay();\n this.update(true);\n\n this.emitEvent({ type: \"clear\" });\n\n return this;\n }\n\n syncOverlay(): void {\n if (!this.renderer) return;\n\n this._markup.syncOverlay();\n this.update();\n }\n\n clearOverlay(): void {\n if (!this.renderer) return;\n\n this._markup.clearOverlay();\n this.update();\n }\n\n clearSlices(): void {\n if (!this.renderer) return;\n\n this.renderer.clippingPlanes = [];\n this.update();\n }\n\n getSelected(): string[] {\n return this.executeCommand(\"getSelected\");\n }\n\n setSelected(handles?: string[]): void {\n this.executeCommand(\"setSelected\", handles);\n }\n\n clearSelected(): void {\n this.executeCommand(\"clearSelected\");\n }\n\n hideSelected(): void {\n this.executeCommand(\"hideSelected\");\n }\n\n isolateSelected(): void {\n this.executeCommand(\"isolateSelected\");\n }\n\n showAll(): void {\n this.executeCommand(\"showAll\");\n }\n\n explode(index = 0): void {\n this.executeCommand(\"explode\", index);\n }\n\n collect(): void {\n this.executeCommand(\"collect\");\n }\n\n activeDragger(): IDragger | null {\n return this._activeDragger;\n }\n\n setActiveDragger(name = \"\"): IDragger | null {\n if (!this._activeDragger || this._activeDragger.name !== name) {\n if (this._activeDragger) {\n this._activeDragger.dispose();\n this._activeDragger = null;\n }\n if (this.isInitialized()) {\n const Constructor = this.draggerFactory[name];\n if (Constructor) {\n this._activeDragger = new Constructor(this);\n this._activeDragger.name = name;\n }\n }\n const canvas = this.canvas;\n if (canvas) {\n canvas.className = canvas.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${name.toLowerCase()}`)\n .join(\" \");\n }\n this.emitEvent({ type: \"changeactivedragger\", data: name });\n this.update();\n }\n return this._activeDragger;\n }\n\n resetActiveDragger(): void {\n const dragger = this._activeDragger;\n if (dragger) {\n this.setActiveDragger();\n this.setActiveDragger(dragger.name);\n }\n }\n\n is3D(): boolean {\n return true;\n }\n\n screenToWorld(position: { x: number; y: number }): { x: number; y: number; z: number } {\n if (!this.renderer) return { x: position.x, y: position.y, z: 0 };\n\n const rect = this.canvas.getBoundingClientRect();\n const x = position.x / (rect.width / 2) - 1;\n const y = -position.y / (rect.height / 2) + 1;\n\n const point = new Vector3(x, y, -1);\n point.unproject(this.camera);\n\n return { x: point.x, y: point.y, z: point.z };\n }\n\n worldToScreen(position: { x: number; y: number; z: number }): { x: number; y: number } {\n if (!this.renderer) return { x: position.x, y: position.y };\n\n const point = new Vector3(position.x, position.y, position.z);\n point.project(this.camera);\n\n const rect = this.canvas.getBoundingClientRect();\n const x = (point.x + 1) * (rect.width / 2);\n const y = (-point.y + 1) * (rect.height / 2);\n\n return { x, y };\n }\n\n getScale(): { x: number; y: number; z: number } {\n return { x: 1, y: 1, z: 1 };\n }\n\n executeCommand(id: string, ...args: any[]): any {\n return commands(\"ThreeJS\").executeCommand(id, this, ...args);\n }\n\n getComponent(type): any {\n return this.components.find((component) => component instanceof type);\n }\n\n drawViewpoint(viewpoint: IViewpoint): void {\n if (!this.renderer) return;\n\n const getVector3FromPoint3d = ({ x, y, z }): Vector3 => new Vector3(x, y, z);\n\n const setPerspectiveCamera = (camera: IPerspectiveCamera) => {\n if (camera) {\n this.camera.up.copy(getVector3FromPoint3d(camera.up_vector));\n this.camera.fov = camera.field_of_view;\n this.camera.position.copy(getVector3FromPoint3d(camera.view_point));\n this.camera.lookAt(getVector3FromPoint3d(camera.direction).add(this.camera.position));\n this.camera.updateMatrixWorld();\n this.camera.updateProjectionMatrix();\n }\n };\n\n const setClippingPlanes = (clipping_planes: IClippingPlane[]) => {\n clipping_planes?.forEach((clipping_plane) => {\n const plane = new Plane();\n plane.setFromNormalAndCoplanarPoint(\n getVector3FromPoint3d(clipping_plane.direction),\n getVector3FromPoint3d(clipping_plane.location)\n );\n\n this.renderer.clippingPlanes.push(plane);\n });\n };\n\n const setSelection = (selection: IComponent[]) => {\n this.setSelected(selection?.map((component) => component.handle));\n };\n\n const draggerName = this._activeDragger?.name;\n\n this.setActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n\n this.clearSelected();\n this.showAll();\n this.explode();\n\n setPerspectiveCamera(viewpoint.perspective_camera);\n setClippingPlanes(viewpoint.clipping_planes);\n setSelection(viewpoint.selection);\n this._markup.setViewpoint(viewpoint);\n\n this.target = getVector3FromPoint3d(viewpoint.custom_fields?.camera_target ?? this.target);\n\n this.setActiveDragger(draggerName);\n this.emitEvent({ type: \"drawviewpoint\", data: viewpoint });\n this.update();\n }\n\n createViewpoint(): IViewpoint {\n if (!this.renderer) return {};\n\n const getPoint3dFromVector3 = ({ x, y, z }): IPoint => ({ x, y, z });\n\n const getPerspectiveCamera = (): IPerspectiveCamera => {\n return {\n view_point: getPoint3dFromVector3(this.camera.position),\n direction: getPoint3dFromVector3(this.camera.getWorldDirection(new Vector3())),\n up_vector: getPoint3dFromVector3(this.camera.up),\n field_of_view: this.camera.fov,\n };\n };\n\n const getClippingPlanes = (): IClippingPlane[] => {\n const clipping_planes = [];\n this.renderer.clippingPlanes.forEach((plane: Plane) => {\n const clipping_plane = {\n location: getPoint3dFromVector3(plane.coplanarPoint(new Vector3())),\n direction: getPoint3dFromVector3(plane.normal),\n };\n clipping_planes.push(clipping_plane);\n });\n return clipping_planes;\n };\n\n const getSelection = (): IComponent[] => {\n return this.getSelected().map((handle) => ({ handle }));\n };\n\n const viewpoint: IViewpoint = { custom_fields: {} };\n\n viewpoint.perspective_camera = getPerspectiveCamera();\n viewpoint.clipping_planes = getClippingPlanes();\n viewpoint.selection = getSelection();\n viewpoint.description = new Date().toDateString();\n this._markup.getViewpoint(viewpoint);\n\n viewpoint.custom_fields.camera_target = getPoint3dFromVector3(this.target);\n\n this.emitEvent({ type: \"createviewpoint\", data: viewpoint });\n\n return viewpoint;\n }\n}\n"],"names":["Commands","constructor","this","_commands","Map","registerCommand","id","handler","description","thisArg","set","registerCommandAlias","alias","viewer","args","executeCommand","getCommand","get","getCommands","map","forEach","value","key","command","isDraggerCommand","draggers","includes","setActiveDragger","console","warn","undefined","result","apply","emit","type","data","commands","viewerType","defaultOptions","showWCS","cameraAnimation","antialiasing","groundShadow","shadows","cameraAxisXSpeed","cameraAxisYSpeed","ambientOcclusion","enableStreamingMode","enablePartialMode","memoryLimit","cuttingPlaneFillColor","red","green","blue","edgesColor","r","g","b","facesColor","edgesVisibility","edgesOverlap","facesOverlap","facesTransparancy","enableCustomHighlight","sceneGraph","edgeModel","reverseZoomWheel","enableZoomWheel","enableGestures","geometryType","rulerUnit","Options","emitter","_emitter","_data","loadFromStorage","defaults","notifierChangeEvent","change","saveToStorage","window","localStorage","setItem","JSON","stringify","error","item","getItem","parse","resetToDefaults","fields","resetData","reduce","acc","field","Boolean","CanvasEvents","CANVAS_EVENTS","Dragger","name","initialize","dispose","updatePreview","applyModelTransform","model","clearOverlay","SelectionComponent","onPointerDown","event","isPrimary","button","getMousePosition","downPosition","onPointerUp","upPosition","Vector2","distanceTo","intersects","getPointerIntersects","clearSelection","length","select","object","update","emitEvent","handles","getSelected","onDoubleClick","optionsChange","options","facesMaterial","color","setRGB","opacity","raycaster","Raycaster","MeshBasicMaterial","transparent","addEventListener","removeEventListener","target","clientX","clientY","mouse","rect","canvas","getBoundingClientRect","x","left","width","y","top","height","coords","setFromCamera","camera","objects","scene","traverseVisible","child","push","params","Mesh","Line","threshold","Line2","LOD","Points","Sprite","intersectObjects","isSelected","originalMaterial","material","selected","clearSelected","selection","clearSlices","createPreview","encoderOptions","toDataURL","calcObjectDepth","depth","res","children","objectDepth","originalPosition","position","clone","explodeScene","scale","maxDepth","explodeDepth","explodeObject","parentCenter","parentOffset","objectBox","Box3","setFromObject","objectCenter","getCenter","Vector3","objectOffset","offset","sub","multiplyScalar","add","copy","direction","normalize","sceneExtents","sceneCenter","explode","index","models","gltf","defaultViewPositions","bottom","right","front","back","sw","se","ne","nw","setDefaultViewPosition","center","extents","sphere","getBoundingSphere","Sphere","offet","radius","lookAt","updateProjectionMatrix","updateMatrixWorld","getDefaultViewPositions","Object","keys","getModels","userData","handle","filter","_a","hideSelected","visible","isolateSelected","selectedSet","Set","isolateObject","canBeIsolated","has","regenerateAll","resetView","selectModel","dragger","setSelected","handleSet","showAll","traverse","zoomToExtents","isEmpty","distance","delta","applyQuaternion","quaternion","zoomToObjects","expandByObject","zoomToSelected","GLTFLoadingManager","LoadingManager","file","externalData","super","path","resourcePath","fileURL","dataURLs","LoaderUtils","extractUrlBase","dataURL","URL","createObjectURL","Blob","setURLModifier","url","decodeURI","replace","revokeObjectURL","EventEmitter2","_listeners","listener","listeners","removeAllListeners","invoke","slice","call","on","off","WorldTransform","screenToWorld","z","worldToScreen","getScale","MarkupColor","setColor","asHex","HEX","asRGB","R","G","B","rgbToHex","valueToHex","c","hex","toString","LineTypeSpecs","KonvaLine","ref","_b","_ref","points","konvaPoints","point","Konva","stroke","strokeWidth","globalCompositeOperation","lineCap","lineJoin","draggable","strokeScaleEnabled","dash","e","attrs","rotation","_id","enableMouseEditing","getColor","getRotation","setRotation","degrees","getZIndex","zIndex","setZIndex","destroy","getPoints","setLineWidth","size","getLineWidth","getLineType","typeSpecs","setLineType","specs","addPoints","newPoints","concat","KonvaText","_c","TEXT_FONT_FAMILY","text","Text","fontSize","fontFamily","fill","align","getTextWidth","scaleByX","Math","abs","scaleX","scaleByY","scaleY","newWidth","newHeight","minWidth","round","getFontSize","getText","setText","getPosition","setPosition","setFontSize","KonvaRectangle","_d","Rect","lineWidth","minHeight","getWidth","getHeigth","setWidth","w","setHeight","h","KonvaEllipse","Ellipse","radiusX","radiusY","newRadiusX","newRadiusY","minRadiusX","minRadiusY","evt","ctrlKey","shiftKey","getRadiusX","setRadiusX","getRadiusY","setRadiusY","KonvaArrow","start","end","Arrow","setPoints","getStartPoint","setStartPoint","getEndPoint","setEndPoint","KonvaImage","_ratio","EPSILON","BASE64_HEADER_START","BASE64_NOT_FOUND","src","startsWith","_canvasImage","image","Image","onload","maxWidth","heightOutOfCanvas","maxHeight","widthOutOfCanvas","onerror","getSrc","setSrc","getHeight","KonvaCloud","arcRadius","Shape","sceneFunc","context","shape","calculateMidpoint","midX","midY","midPoint","baseArcLength","beginPath","iPoint","approxArcLength","dx","dy","sqrt","arcCount","floor","lengthMod","pX","pY","pEndX","pEndY","endAngle","atan","startAngle","PI","counterClockwise","iArc","arc","closePath","fillStrokeShape","className","getSelfRect","MarkupMode2Konva","SelectMarkup","initializer","Rectangle","Cloud","KonvaMarkup","_containerEvents","_markupIsActive","_markupColor","lineType","changeActiveDragger","draggerName","_markupContainer","_container","split","toLowerCase","join","removeTextInput","removeImageInput","enableEditMode","resizeContainer","entries","contentRect","_konvaStage","pan","newPos","dX","dY","zoomAt","newScale","redirectToViewer","_viewer","getRelativePointPosition","node","transform","getAbsoluteTransform","invert","getRelativePointerPosition","getStage","getPointerPosition","container","containerEvents","worldTransformer","Error","_worldTransformer","document","createElement","style","outline","pointerEvents","parentDiv","parentElement","appendChild","_resizeObserver","ResizeObserver","observe","initializeKonva","destroyKonva","disconnect","remove","syncOverlay","getObjects","obj","delete","getMarkupColor","setMarkupColor","colorizeAllMarkup","hexColor","colorizeSelectedMarkups","getSelectedObjects","setViewpoint","viewpoint","_e","_f","_g","_h","markupColor","custom_fields","markup_color","lines","line","linePoints","screenPoint","addLine","texts","addText","angle","text_size","font_size","rectangles","addRectangle","line_width","ellipses","ellipse","addEllipse","arrows","arrow","startPoint","endPoint","addArrow","clouds","cloud","addCloud","images","addImage","getViewpoint","getMarkupLines","getMarkupTexts","getMarkupArrows","getMarkupClouds","getMarkupEllipses","getMarkupImages","getMarkupRectangles","snapshot","combineMarkupWithDrawing","mode","_markupMode","createObject","konvaShape","addObject","konvaLayerFind","_konvaTransformer","nodes","values","find","selectObjects","selectedObjs","_groupImages","_groupTexts","_groupGeometry","_konvaLayer","parent","stage","Stage","clientWidth","clientHeight","layer","Layer","pixelRation","devicePixelRatio","Group","transformer","Transformer","shouldOverdrawWholeArea","keepRatio","flipEnabled","isPaint","lastLine","mouseDownPos","lastObj","pos","some","m","defParams","startX","min","startY","max","_textInputRef","_textInputPos","_textInputAngle","createTextInput","pageX","pageY","_imageInputRef","_imageInputPos","createImageInput","rotateEnabled","metaPressed","metaKey","indexOf","splice","tabIndex","focus","code","preventDefault","worldPoints","absoluteTransform","i","atPoint","worldPoint","konvaLine","textSize","textScale","stageAbsoluteTransform","getMatrix","rectangle","atStartPoint","worldStartPoint","atEndPoint","worldEndPoint","tempCanvas","ctx","getContext","HTMLCanvasElement","drawImage","toCanvas","pixelRatio","inputX","inputY","display","onkeydown","body","setTimeout","convertBase64","Promise","resolve","reject","fileReader","FileReader","readAsDataURL","accept","onchange","async","files","base64","oncancel","click","at","tolerance","konvaText","konvaRectangle","konvaEllipse","konvaArrow","konvaCloud","konvaImage","_changeEvent","_startEvent","_endEvent","STATE","NONE","ROTATE","DOLLY","PAN","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","TOUCH_DOLLY_ROTATE","OrbitControls","EventDispatcher","domElement","touchAction","enabled","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","panSpeed","screenSpacePanning","keyPanSpeed","autoRotate","autoRotateSpeed","LEFT","UP","RIGHT","BOTTOM","mouseButtons","MOUSE","MIDDLE","touches","ONE","TOUCH","TWO","DOLLY_PAN","target0","position0","zoom0","zoom","_domElementKeyEvents","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","getDistance","listenToKeyEvents","onKeyDown","stopListenToKeyEvents","saveState","scope","reset","dispatchEvent","state","quat","Quaternion","setFromUnitVectors","up","quatInverse","lastPosition","lastQuaternion","lastTargetPosition","twoPI","setFromVector3","rotateLeft","getAutoRotationAngle","sphericalDelta","isFinite","makeSafe","addScaledVector","panOffset","setFromSpherical","zoomChanged","distanceToSquared","EPS","dot","onContextMenu","onMouseWheel","onPointerMove","Spherical","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","dollyScale","pointers","pointerPositions","getZoomScale","pow","rotateUp","panLeft","v","objectMatrix","setFromMatrixColumn","panUp","crossVectors","deltaX","deltaY","element","isPerspectiveCamera","targetDistance","tan","fov","matrix","isOrthographicCamera","dollyOut","dollyIn","handleMouseDownRotate","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","needsUpdate","handleTouchStartRotate","handleTouchStartPan","handleTouchStartDolly","handleTouchStartDollyPan","handleTouchStartDollyRotate","handleTouchMoveRotate","getSecondPointerPosition","handleTouchMovePan","handleTouchMoveDolly","handleTouchMoveDollyPan","handleTouchMoveDollyRotate","setPointerCapture","pointerId","addPointer","pointerType","onTouchStart","onMouseDown","onTouchMove","onMouseMove","removePointer","releasePointerCapture","mouseAction","trackPointer","DOLLY_ROTATE","pointer","passive","OrbitDragger","updateControls","orbit","far","near","controlsStart","changed","controlsChange","stopContextMenu","stopPropagation","PanDragger","ZoomDragger","WalkControls","Controls","movementSpeed","lookSpeed","multiplier","moveWheel","mouseDragOn","movePosition","rotateCamera","onPointerCancel","PointerEvent","onWheel","moveKeys","onKeyUp","moveClock","Clock","timeDelta","getDelta","moveDelta","translateZ","translateX","translateY","lookDelta","sign","stop","autoStart","rotateX","rotateY","xRotation","setFromAxisAngle","yRotation","premultiply","multiply","setRotationFromQuaternion","WalkDragger","getSize","controls","walkspeedChange","viewerRender","viewerZoom","PlaneHelper","plane","positions","geometry","BufferGeometry","setAttribute","Float32BufferAttribute","computeBoundingSphere","LineBasicMaterial","toneMapped","positions2","geometry2","helper","depthWrite","side","DoubleSide","force","normal","constant","CuttingPlaneDragger","transformChange","planeCenter","transformDrag","viewerExplode","planeHelper","negate","Plane","renderer","clippingPlanes","helpers","Object3D","TransformControls","showX","showY","showZ","attach","getHelper","removeFromParent","detach","CuttingPlaneXAxisDragger","CuttingPlaneYAxisDragger","CuttingPlaneZAxisDragger","PRECISION","MeasureLineDragger","snapper","getSnapPoint","render","MeasureLine","overlay","onPointerLeave","renderOverlay","updateSnapper","MeasureOverlay","MeasureSnapper","projector","MeasureProjector","background","overflow","clear","removeLine","_middlePoint","Date","now","unit","border","boxShadow","font","elementStartPoint","elementEndPoint","elementLine","elementLabel","projectPoint","point1","point2","projectLine","lerpVectors","innerHTML","toFixed","borderRadius","transformOrigin","padding","paddingInline","_widthHalf","_heightHalf","_viewMatrix","Matrix4","_viewProjectionMatrix","_vector","_vector1","Vector4","_vector2","matrixWorldInverse","multiplyMatrices","projectionMatrix","p","applyMatrix4","p1","p2","bc1near","bc2near","bc1far","bc2far","alpha1","alpha2","lerp","ExtentsComponent","syncExtents","LightComponent","ambientLight","AmbientLight","directionalLight","DirectionalLight","BackgroundComponent","syncOptions","backgroundColor","setHex","Color","environment","RoomEnvironment","pmremGenerator","PMREMGenerator","setClearColor","fromScene","texture","DefaultPositionComponent","geometryEnd","box","ResizeCanvasComponent","resizeViewer","aspect","setSize","resizeObserver","RenderLoopComponent","animate","time","requestId","requestAnimationFrame","cancelAnimationFrame","WCSHelper","orthoCamera","OrthographicCamera","matRed","matGreen","matBlue","spriteRed","getSpriteMaterial","spriteGreen","spriteBlue","lineGeometry","CylinderGeometry","translate","arrowGeometry","axesMap","X","Y","Z","clearRect","textAlign","fillStyle","getStyle","fillText","CanvasTexture","colorSpace","SRGBColorSpace","SpriteMaterial","viewport","getViewport","setViewport","clearDepth","WCSHelperComponent","wcsHelper","Viewer","client","_options","canvasEvents","canvaseventlistener","draggerFactory","Pan","Zoom","Orbit","Walk","CuttingPlaneXAxis","CuttingPlaneYAxis","CuttingPlaneZAxis","_activeDragger","components","renderTime","bind","_markup","Markup","markup","onProgress","Scene","PerspectiveCamera","WebGLRenderer","antialias","preserveDrawingBuffer","setPixelRatio","toneMapping","LinearToneMapping","performance","ProgressEvent","lengthComputable","loaded","total","cancel","component","isInitialized","renderNeeded","offsetWidth","offsetHeight","autoClear","deltaTime","loadReferences","open","default","database","pop","httpClient","serverUrl","requestHeader","headers","loadGltfFile","openGltfFile","manager","loader","GLTFLoader","setPath","setRequestHeader","setCrossOrigin","crossOrigin","setWithCredentials","withCredentials","loadAsync","progress","disposeMaterial","materials","Array","isArray","disposeObject","collect","activeDragger","Constructor","resetActiveDragger","is3D","unproject","project","getComponent","drawViewpoint","getVector3FromPoint3d","setPerspectiveCamera","up_vector","field_of_view","view_point","setClippingPlanes","clipping_planes","clipping_plane","setFromNormalAndCoplanarPoint","location","setSelection","perspective_camera","camera_target","createViewpoint","getPoint3dFromVector3","getPerspectiveCamera","getWorldDirection","getClippingPlanes","coplanarPoint","getSelection","toDateString"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"viewer-three.module.js","sources":["../../viewer-core/dist/viewer-core.module.js","../src/Viewer/commands/ApplyModelTransform.ts","../src/Viewer/commands/ClearMarkup.ts","../src/Viewer/components/SelectionComponent.ts","../src/Viewer/commands/ClearSelected.ts","../src/Viewer/commands/ClearSlices.ts","../src/Viewer/commands/CreatePreview.ts","../src/Viewer/commands/Explode.ts","../src/Viewer/commands/SetDefaultViewPosition.ts","../src/Viewer/commands/GetDefaultViewPositions.ts","../src/Viewer/commands/GetModels.ts","../src/Viewer/commands/GetSelected.ts","../src/Viewer/commands/HideSelected.ts","../src/Viewer/commands/IsolateSelected.ts","../src/Viewer/commands/RegenerateAll.ts","../src/Viewer/commands/ResetView.ts","../src/Viewer/commands/SelectModel.ts","../src/Viewer/commands/SetActiveDragger.ts","../src/Viewer/commands/SetMarkupColor.ts","../src/Viewer/commands/SetSelected.ts","../src/Viewer/commands/ShowAll.ts","../src/Viewer/commands/ZoomToExtents.ts","../src/Viewer/commands/ZoomToObjects.ts","../src/Viewer/commands/ZoomToSelected.ts","../src/Viewer/loaders/GLTFLoadingManager.ts","../src/Viewer/loaders/USDZLoader2.ts","../src/Viewer/loaders/render.mjs","../src/Viewer/loaders/IFCXLoader.ts","../../eventemitter2/dist/eventemitter2.module.js","../../markup/dist/markup.module.js","../src/Viewer/controls/OrbitControls.js","../src/Viewer/draggers/OrbitDragger.ts","../src/Viewer/draggers/PanDragger.ts","../src/Viewer/draggers/ZoomDragger.ts","../src/Viewer/controls/WalkControls.ts","../src/Viewer/draggers/WalkDragger.ts","../src/Viewer/helpers/PlaneHelper.ts","../src/Viewer/draggers/CuttingPlaneDragger.ts","../src/Viewer/draggers/CuttingPlaneXAxis.ts","../src/Viewer/draggers/CuttingPlaneYAxis.ts","../src/Viewer/draggers/CuttingPlaneZAxis.ts","../src/Viewer/draggers/MeasureLineDragger.ts","../src/Viewer/components/ExtentsComponent.ts","../src/Viewer/components/LightComponent.ts","../src/Viewer/components/BackgroundComponent.ts","../src/Viewer/components/DefaultPositionComponent.ts","../src/Viewer/components/ResizeCanvasComponent.ts","../src/Viewer/components/RenderLoopComponent.ts","../src/Viewer/helpers/WCSHelper.ts","../src/Viewer/components/WCSHelperComponent.ts","../src/Viewer/Viewer.ts"],"sourcesContent":["class Commands {\n constructor() {\n this._commands = new Map;\n }\n registerCommand(id, handler, description, thisArg) {\n this._commands.set(id, {\n id: id,\n handler: handler,\n thisArg: thisArg,\n description: description\n });\n }\n registerCommandAlias(id, alias) {\n this.registerCommand(alias, ((viewer, ...args) => this.executeCommand(id, viewer, ...args)));\n }\n getCommand(id) {\n return this._commands.get(id);\n }\n getCommands() {\n const map = new Map;\n this._commands.forEach(((value, key) => map.set(key, value)));\n return map;\n }\n executeCommand(id, viewer, ...args) {\n const command = this._commands.get(id);\n if (!command) {\n if (viewer) {\n const isDraggerCommand = viewer.draggers.includes(id);\n if (isDraggerCommand) return viewer.setActiveDragger(id);\n }\n console.warn(`Command '${id}' not found`);\n return undefined;\n }\n const {handler: handler, thisArg: thisArg} = command;\n const result = handler.apply(thisArg, [ viewer, ...args ]);\n viewer === null || viewer === undefined ? undefined : viewer.emit({\n type: \"command\",\n data: id,\n args: args\n });\n return result;\n }\n}\n\nconst _commands = new Map;\n\nfunction commands(viewerType = \"\") {\n let result = _commands.get(viewerType);\n if (!result) {\n result = new Commands;\n _commands.set(viewerType, result);\n }\n return result;\n}\n\ncommands(\"\").registerCommand(\"noop\", (() => {}));\n\ncommands(\"VisualizeJS\").registerCommand(\"noop\", (() => {}));\n\ncommands(\"ThreeJS\").registerCommand(\"noop\", (() => {}));\n\nfunction defaultOptions() {\n return {\n showWCS: true,\n cameraAnimation: true,\n antialiasing: true,\n groundShadow: false,\n shadows: false,\n cameraAxisXSpeed: 4,\n cameraAxisYSpeed: 1,\n ambientOcclusion: false,\n enableStreamingMode: true,\n enablePartialMode: false,\n memoryLimit: 3294967296,\n cuttingPlaneFillColor: {\n red: 255,\n green: 152,\n blue: 0\n },\n edgesColor: {\n r: 255,\n g: 152,\n b: 0\n },\n facesColor: {\n r: 255,\n g: 152,\n b: 0\n },\n edgesVisibility: true,\n edgesOverlap: true,\n facesOverlap: false,\n facesTransparancy: 200,\n enableCustomHighlight: true,\n sceneGraph: false,\n edgeModel: true,\n reverseZoomWheel: false,\n enableZoomWheel: true,\n enableGestures: true,\n geometryType: \"vsfx\",\n rulerUnit: \"Default\"\n };\n}\n\nclass Options {\n constructor(emitter) {\n this._emitter = emitter;\n this._data = defaultOptions();\n this.loadFromStorage();\n }\n static defaults() {\n return defaultOptions();\n }\n notifierChangeEvent() {\n console.warn(\"Options.notifierChangeEvent() has been deprecated since 25.3 and will be removed in a future release, use Options.change() instead.\");\n this.change();\n }\n change() {\n if (this._emitter !== undefined) {\n this.saveToStorage();\n this._emitter.emit({\n type: \"optionschange\",\n data: this\n });\n }\n }\n saveToStorage() {\n if (typeof window !== \"undefined\") try {\n localStorage.setItem(\"od-client-settings\", JSON.stringify(this.data));\n } catch (error) {\n console.error(\"Cannot save client settings.\", error);\n }\n }\n loadFromStorage() {\n if (typeof window !== \"undefined\") try {\n const item = localStorage.getItem(\"od-client-settings\");\n if (item) {\n const data = JSON.parse(item);\n this.data = {\n ...data\n };\n }\n } catch (error) {\n console.error(\"Cannot load client settings.\", error);\n }\n }\n resetToDefaults(fields) {\n if (fields !== undefined) {\n const defaults = Options.defaults();\n const resetData = fields.reduce(((acc, field) => {\n acc[field] = defaults[field];\n return acc;\n }), {});\n this.data = {\n ...this.data,\n ...resetData\n };\n } else {\n this.data = {\n ...this.data,\n ...Options.defaults()\n };\n }\n }\n get data() {\n return this._data;\n }\n set data(value) {\n const enablePartialMode = value.enableStreamingMode ? value.enablePartialMode : false;\n const sceneGraph = enablePartialMode ? false : value.sceneGraph;\n this._data = {\n ...Options.defaults(),\n ...this._data,\n ...value,\n enablePartialMode: enablePartialMode,\n sceneGraph: sceneGraph\n };\n this.change();\n }\n get showWCS() {\n return this._data.showWCS;\n }\n set showWCS(value) {\n this._data.showWCS = value;\n this.change();\n }\n get cameraAnimation() {\n return this._data.cameraAnimation;\n }\n set cameraAnimation(value) {\n this._data.cameraAnimation = value;\n this.change();\n }\n get antialiasing() {\n return this._data.antialiasing;\n }\n set antialiasing(value) {\n this._data.antialiasing = value;\n this.change();\n }\n get groundShadow() {\n return this._data.groundShadow;\n }\n set groundShadow(value) {\n this._data.groundShadow = value;\n this.change();\n }\n get shadows() {\n return this._data.shadows;\n }\n set shadows(value) {\n this._data.shadows = value;\n this.change();\n }\n get cameraAxisXSpeed() {\n return this._data.cameraAxisXSpeed;\n }\n set cameraAxisXSpeed(value) {\n this._data.cameraAxisXSpeed = value;\n this.change();\n }\n get cameraAxisYSpeed() {\n return this._data.cameraAxisYSpeed;\n }\n set cameraAxisYSpeed(value) {\n this.cameraAxisYSpeed = value;\n this.change();\n }\n get ambientOcclusion() {\n return this._data.ambientOcclusion;\n }\n set ambientOcclusion(value) {\n this._data.ambientOcclusion = value;\n this.change();\n }\n get enableStreamingMode() {\n return this._data.enableStreamingMode;\n }\n set enableStreamingMode(value) {\n this._data.enableStreamingMode = value;\n if (!value) this._data.enablePartialMode = false;\n this.change();\n }\n get enablePartialMode() {\n return this._data.enablePartialMode;\n }\n set enablePartialMode(value) {\n this._data.enablePartialMode = value;\n if (value) {\n this._data.enableStreamingMode = true;\n this._data.sceneGraph = false;\n }\n this.change();\n }\n get memoryLimit() {\n return this._data.memoryLimit;\n }\n set memoryLimit(value) {\n this._data.memoryLimit = value;\n this.change();\n }\n get cuttingPlaneFillColor() {\n return this._data.cuttingPlaneFillColor;\n }\n set cuttingPlaneFillColor(value) {\n this._data.cuttingPlaneFillColor = value;\n this.change();\n }\n get edgesColor() {\n return this._data.edgesColor;\n }\n set edgesColor(value) {\n this._data.edgesColor = value;\n this.change();\n }\n get facesColor() {\n return this._data.facesColor;\n }\n set facesColor(value) {\n this._data.facesColor = value;\n this.change();\n }\n get edgesVisibility() {\n return this._data.edgesVisibility;\n }\n set edgesVisibility(value) {\n this._data.edgesVisibility = value;\n this.change();\n }\n get edgesOverlap() {\n return this._data.edgesOverlap;\n }\n set edgesOverlap(value) {\n this._data.edgesOverlap = value;\n this.change();\n }\n get facesOverlap() {\n return this._data.facesOverlap;\n }\n set facesOverlap(value) {\n this._data.facesOverlap = value;\n this.change();\n }\n get facesTransparancy() {\n return this._data.facesTransparancy;\n }\n set facesTransparancy(value) {\n this._data.facesTransparancy = value;\n this.change();\n }\n get enableCustomHighlight() {\n return this._data.enableCustomHighlight;\n }\n set enableCustomHighlight(value) {\n this._data.enableCustomHighlight = value;\n this.change();\n }\n get sceneGraph() {\n return this._data.sceneGraph;\n }\n set sceneGraph(value) {\n this._data.sceneGraph = value;\n if (value) this._data.enablePartialMode = false;\n this.change();\n }\n get edgeModel() {\n return Boolean(this._data.edgeModel);\n }\n set edgeModel(value) {\n this._data.edgeModel = Boolean(value);\n this.change();\n }\n get reverseZoomWheel() {\n return this._data.reverseZoomWheel;\n }\n set reverseZoomWheel(value) {\n this._data.reverseZoomWheel = !!value;\n this.change();\n }\n get enableZoomWheel() {\n return this._data.enableZoomWheel;\n }\n set enableZoomWheel(value) {\n this._data.enableZoomWheel = !!value;\n this.change();\n }\n get enableGestures() {\n return this._data.enableGestures;\n }\n set enableGestures(value) {\n this._data.enableGestures = !!value;\n this.change();\n }\n get geometryType() {\n return this._data.geometryType;\n }\n set geometryType(value) {\n this._data.geometryType = value;\n this.change();\n }\n get rulerUnit() {\n return this._data.rulerUnit;\n }\n set rulerUnit(value) {\n this._data.rulerUnit = value;\n this.change();\n }\n}\n\nconst CanvasEvents = [ \"click\", \"contextmenu\", \"dblclick\", \"mousedown\", \"mouseleave\", \"mousemove\", \"mouseup\", \"pointercancel\", \"pointerdown\", \"pointerleave\", \"pointermove\", \"pointerup\", \"touchcancel\", \"touchend\", \"touchmove\", \"touchstart\", \"wheel\" ];\n\nconst CANVAS_EVENTS = CanvasEvents;\n\nclass Dragger {\n constructor(viewer) {\n this.name = \"\";\n }\n initialize() {}\n dispose() {}\n updatePreview() {}\n}\n\nexport { CANVAS_EVENTS, CanvasEvents, Dragger, Options, commands, defaultOptions };\n//# sourceMappingURL=viewer-core.module.js.map\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Model, File, Assembly } from \"@inweb/client\";\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\n// gltf root object don't have model handle\nfunction applyModelTransform(viewer: Viewer, model: Model | File | Assembly) {\n console.warn(\"applyModelTransform not implemented\");\n}\n\ncommands(\"ThreeJS\").registerCommand(\"applyModelTransform\", applyModelTransform);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"clearMarkup\", (viewer: Viewer) => viewer.clearOverlay());\ncommands(\"ThreeJS\").registerCommandAlias(\"clearMarkup\", \"clearOverlay\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Intersection, MeshBasicMaterial, Object3D, Raycaster, Vector2 } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class SelectionComponent implements IDisposable {\n protected viewer: Viewer;\n protected raycaster: Raycaster;\n protected downPosition: Vector2;\n protected facesMaterial: MeshBasicMaterial;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.raycaster = new Raycaster();\n this.downPosition = new Vector2();\n\n const { facesColor, facesTransparancy } = this.viewer.options;\n this.facesMaterial = new MeshBasicMaterial();\n this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n this.facesMaterial.opacity = (255 - facesTransparancy) / 255;\n this.facesMaterial.transparent = true;\n\n this.viewer.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.addEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.addEventListener(\"dblclick\", this.onDoubleClick);\n this.viewer.addEventListener(\"optionschange\", this.optionsChange);\n }\n\n dispose() {\n this.facesMaterial.dispose();\n\n this.viewer.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.removeEventListener(\"dblclick\", this.onDoubleClick);\n this.viewer.removeEventListener(\"optionschange\", this.optionsChange);\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (!event.isPrimary || event.button !== 0) return;\n\n this.getMousePosition(event, this.downPosition);\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (!event.isPrimary) return;\n\n const upPosition = this.getMousePosition(event, new Vector2());\n if (this.downPosition.distanceTo(upPosition) !== 0) return;\n\n const intersects = this.getPointerIntersects(upPosition);\n\n this.clearSelection();\n if (intersects.length > 0) this.select(intersects[0].object);\n\n this.viewer.update();\n this.viewer.emitEvent({ type: \"select\", data: undefined, handles: this.viewer.getSelected() });\n };\n\n onDoubleClick = (event: MouseEvent) => {\n if (event.button !== 0) return;\n\n this.viewer.executeCommand(\"zoomToSelected\");\n };\n\n getMousePosition(event: MouseEvent, target: Vector2): Vector2 {\n return target.set(event.clientX, event.clientY);\n }\n\n getPointerIntersects(mouse: Vector2): Array<Intersection<Object3D>> {\n const rect = this.viewer.canvas.getBoundingClientRect();\n const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;\n const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;\n\n const coords = new Vector2(x, y);\n this.raycaster.setFromCamera(coords, this.viewer.camera);\n\n const objects = [];\n this.viewer.scene.traverseVisible((child) => objects.push(child));\n\n this.raycaster.params = this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0.25 },\n Line2: { threshold: 0.25 },\n LOD: {},\n Points: { threshold: 0.1 },\n Sprite: {},\n };\n\n return this.raycaster.intersectObjects(objects, false);\n }\n\n select(object: any) {\n if (object.isSelected) return;\n\n object.isSelected = true;\n object.originalMaterial = object.material;\n object.material = this.facesMaterial;\n\n this.viewer.selected.push(object);\n }\n\n clearSelection() {\n this.viewer.selected.forEach((object: any) => {\n object.isSelected = false;\n object.material = object.originalMaterial;\n });\n this.viewer.selected.length = 0;\n }\n\n optionsChange = () => {\n const { facesColor, facesTransparancy } = this.viewer.options;\n this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);\n this.facesMaterial.opacity = (255 - facesTransparancy) / 255;\n\n this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction clearSelected(viewer: Viewer): void {\n const selection = new SelectionComponent(viewer);\n selection.clearSelection();\n selection.dispose();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: undefined, handles: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"clearSelected\", clearSelected);\ncommands(\"ThreeJS\").registerCommandAlias(\"clearSelected\", \"unselect\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"clearSlices\", (viewer: Viewer) => viewer.clearSlices());\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction createPreview(viewer: Viewer, type = \"image/jpeg\", encoderOptions = 0.25): string {\n viewer.update(true);\n return viewer.canvas.toDataURL(type, encoderOptions);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"createPreview\", createPreview);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Object3D, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction calcObjectDepth(object: Object3D, depth: number) {\n let res = depth;\n object.children.forEach((x) => {\n const objectDepth = calcObjectDepth(x, depth + 1);\n if (res < objectDepth) res = objectDepth;\n });\n\n (object as any).originalPosition = object.position.clone();\n\n return res;\n}\n\nfunction explodeScene(scene: Object3D, scale = 0) {\n scale /= 100;\n\n if (!(scene as any).maxDepth) (scene as any).maxDepth = calcObjectDepth(scene, 1);\n const maxDepth = (scene as any).maxDepth;\n\n let explodeDepth = scale * (maxDepth - 1) + 1;\n if (maxDepth === 1) explodeDepth = 1;\n\n function explodeObject(object: Object3D, depth: number, parentCenter: Vector3, parentOffset: Vector3) {\n const objectBox = new Box3().setFromObject(object);\n const objectCenter = objectBox.getCenter(new Vector3());\n\n const objectOffset = parentOffset.clone();\n if (depth > 0 && depth <= explodeDepth) {\n const offset = objectCenter.clone().sub(parentCenter).multiplyScalar(scale);\n objectOffset.add(offset);\n }\n\n object.children.forEach((object) => explodeObject(object, depth + 1, objectCenter, objectOffset));\n\n const originalPosition = (object as any).originalPosition;\n object.position.copy(originalPosition);\n if (scale > 0) {\n const direction = objectCenter.sub(parentCenter).normalize();\n object.position.add(direction.add(objectOffset));\n }\n }\n\n const sceneExtents = new Box3().setFromObject(scene);\n const sceneCenter = sceneExtents.getCenter(new Vector3());\n explodeObject(scene, 0, sceneCenter, new Vector3(0, 0, 0));\n}\n\nfunction explode(viewer: Viewer, index = 0): void {\n viewer.models.forEach((gltf) => explodeScene(gltf.scene, index));\n\n viewer.update();\n viewer.emitEvent({ type: \"explode\", data: index });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"explode\", explode);\ncommands(\"ThreeJS\").registerCommand(\"collect\", (viewer: any) => explode(viewer, 0));\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nexport const defaultViewPositions = {\n top: new Vector3(0, 1, 0),\n bottom: new Vector3(0, -1, 0),\n left: new Vector3(-1, 0, 0),\n right: new Vector3(1, 0, 0),\n front: new Vector3(0, 0, 1),\n back: new Vector3(0, 0, -1),\n sw: new Vector3(-0.5, -0.5, 1.0).normalize(),\n se: new Vector3(0.5, -0.5, 1.0).normalize(),\n ne: new Vector3(0.5, 0.5, 1.0).normalize(),\n nw: new Vector3(-0.5, 0.5, 1.0).normalize(),\n};\n\n// export const defaultViewPositions = {\n// top: new Vector3(0, 0, 1),\n// bottom: new Vector3(0, 0, -1),\n// left: new Vector3(-1, 0, 0),\n// right: new Vector3(1, 0, 0),\n// front: new Vector3(0, -1, 0),\n// back: new Vector3(0, 1, 0),\n// sw: new Vector3(-0.5, -0.5, 1.0).normalize(),\n// se: new Vector3(0.5, -0.5, 1.0).normalize(),\n// ne: new Vector3(0.5, 0.5, 1.0).normalize(),\n// nw: new Vector3(-0.5, 0.5, 1.0).normalize(),\n// };\n\nfunction setDefaultViewPosition(viewer: Viewer, position: string): void {\n const direction = defaultViewPositions[position] || defaultViewPositions[\"sw\"];\n\n const center = viewer.extents.getCenter(new Vector3());\n const sphere = viewer.extents.getBoundingSphere(new Sphere());\n const offet = direction.clone().multiplyScalar(sphere.radius);\n\n const camera = viewer.camera;\n camera.position.copy(center).add(offet);\n camera.lookAt(center);\n camera.updateProjectionMatrix();\n camera.updateMatrixWorld();\n\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emit({ type: \"viewposition\", data: position });\n\n viewer.executeCommand(\"zoomToExtents\");\n}\n\ncommands(\"ThreeJS\").registerCommand(\"setDefaultViewPosition\", setDefaultViewPosition);\ncommands(\"ThreeJS\").registerCommand(\"top\", (viewer) => setDefaultViewPosition(viewer, \"top\"));\ncommands(\"ThreeJS\").registerCommand(\"bottom\", (viewer) => setDefaultViewPosition(viewer, \"bottom\"));\ncommands(\"ThreeJS\").registerCommand(\"left\", (viewer) => setDefaultViewPosition(viewer, \"left\"));\ncommands(\"ThreeJS\").registerCommand(\"right\", (viewer) => setDefaultViewPosition(viewer, \"right\"));\ncommands(\"ThreeJS\").registerCommand(\"front\", (viewer) => setDefaultViewPosition(viewer, \"front\"));\ncommands(\"ThreeJS\").registerCommand(\"back\", (viewer) => setDefaultViewPosition(viewer, \"back\"));\ncommands(\"ThreeJS\").registerCommand(\"sw\", (viewer) => setDefaultViewPosition(viewer, \"sw\"));\ncommands(\"ThreeJS\").registerCommand(\"se\", (viewer) => setDefaultViewPosition(viewer, \"se\"));\ncommands(\"ThreeJS\").registerCommand(\"ne\", (viewer) => setDefaultViewPosition(viewer, \"ne\"));\ncommands(\"ThreeJS\").registerCommand(\"nw\", (viewer) => setDefaultViewPosition(viewer, \"nw\"));\n\ncommands(\"ThreeJS\").registerCommandAlias(\"top\", \"k3DViewTop\");\ncommands(\"ThreeJS\").registerCommandAlias(\"bottom\", \"k3DViewBottom\");\ncommands(\"ThreeJS\").registerCommandAlias(\"left\", \"k3DViewLeft\");\ncommands(\"ThreeJS\").registerCommandAlias(\"right\", \"k3DViewRight\");\ncommands(\"ThreeJS\").registerCommandAlias(\"front\", \"k3DViewFront\");\ncommands(\"ThreeJS\").registerCommandAlias(\"back\", \"k3DViewBack\");\ncommands(\"ThreeJS\").registerCommandAlias(\"se\", \"k3DViewSE\");\ncommands(\"ThreeJS\").registerCommandAlias(\"sw\", \"k3DViewSW\");\ncommands(\"ThreeJS\").registerCommandAlias(\"ne\", \"k3DViewNE\");\ncommands(\"ThreeJS\").registerCommandAlias(\"nw\", \"k3DViewNW\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport { defaultViewPositions } from \"./SetDefaultViewPosition\";\n\nfunction getDefaultViewPositions(): string[] {\n return Object.keys(defaultViewPositions);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getDefaultViewPositions\", getDefaultViewPositions);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction getModels(viewer: Viewer): string[] {\n const handles: string[] = viewer.models.map((model) => model.userData.handle || \"\").filter((handle) => handle);\n return handles;\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getModels\", getModels);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction getSelected(viewer: Viewer): string[] {\n return viewer.selected.map((object) => object.userData?.handle).filter((handle) => handle);\n}\n\ncommands(\"ThreeJS\").registerCommand(\"getSelected\", getSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction hideSelected(viewer: Viewer): void {\n viewer.selected.forEach((object) => (object.visible = false));\n\n const selection = new SelectionComponent(viewer);\n selection.clearSelection();\n selection.dispose();\n\n viewer.update();\n viewer.emitEvent({ type: \"hide\" });\n viewer.emitEvent({ type: \"select\", data: undefined, handles: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"hideSelected\", hideSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Object3D } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction isolateSelected(viewer: Viewer): void {\n const selectedSet = new Set(viewer.selected);\n\n function isolateObject(object: Object3D, depth: number): boolean {\n let canBeIsolated = true;\n object.children.forEach((object) => {\n if (selectedSet.has(object)) canBeIsolated = false;\n else isolateObject(object, depth + 1);\n });\n\n if (canBeIsolated && depth > 0) object.visible = false;\n\n return canBeIsolated;\n }\n\n isolateObject(viewer.scene, 0);\n\n viewer.update();\n viewer.emitEvent({ type: \"isolate\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"isolateSelected\", isolateSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction regenerateAll(viewer: Viewer): void {\n console.warn(\"regenerateAll not implemented\");\n viewer.emit({ type: \"regenerateall\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"regenerateAll\", regenerateAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction resetView(viewer: Viewer): void {\n viewer.executeCommand(\"setActiveDragger\");\n viewer.executeCommand(\"clearSlices\");\n viewer.executeCommand(\"clearOverlay\");\n viewer.executeCommand(\"setMarkupColor\");\n viewer.executeCommand(\"clearSelected\");\n viewer.executeCommand(\"showAll\");\n viewer.executeCommand(\"explode\", 0);\n viewer.executeCommand(\"zoomToExtents\", true);\n viewer.executeCommand(\"k3DViewSW\");\n\n viewer.emit({ type: \"resetview\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"resetView\", resetView);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction selectModel(viewer: Viewer, handle: string): void {\n console.warn(\"selectModel not implemented\");\n viewer.emit({ type: \"select\", data: [] });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"selectModel\", selectModel);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"setActiveDragger\", (viewer: Viewer, dragger = \"\") => {\n viewer.setActiveDragger(dragger);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\ncommands(\"ThreeJS\").registerCommand(\"setMarkupColor\", (viewer: Viewer, r = 255, g = 0, b = 0) => {\n console.warn(\"setMarkupColor not implemented\");\n // viewer.setMarkupColor(r, g, b);\n});\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\nimport { SelectionComponent } from \"../components/SelectionComponent\";\n\nfunction setSelected(viewer: Viewer, handles: string[] = []): void {\n const handleSet = new Set(handles);\n const objects = [];\n viewer.scene.traverseVisible((child) => {\n if (handleSet.has(child.userData?.handle)) objects.push(child);\n });\n\n const selection = new SelectionComponent(viewer);\n selection.clearSelection();\n objects.forEach((object) => selection.select(object));\n selection.dispose();\n\n viewer.update();\n viewer.emitEvent({ type: \"select\", data: undefined, handles });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"setSelected\", setSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction showAll(viewer: Viewer): void {\n viewer.scene.traverse((object) => (object.visible = true));\n\n viewer.update();\n viewer.emitEvent({ type: \"showall\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"showAll\", showAll);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction zoomToExtents(viewer: Viewer): void {\n if (viewer.extents.isEmpty()) return;\n\n const center = viewer.extents.getCenter(new Vector3());\n const distance = viewer.extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToExtents\", zoomToExtents);\ncommands(\"ThreeJS\").registerCommandAlias(\"zoomToExtents\", \"zoomExtents\");\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction zoomToObjects(viewer: Viewer, handles: string[] = []): void {\n const handleSet = new Set(handles);\n const objects = [];\n viewer.scene.traverseVisible((child) => {\n if (handleSet.has(child.userData?.handle)) objects.push(child);\n });\n\n const extents = objects.reduce((result: Box3, object) => result.expandByObject(object), new Box3());\n const center = extents.getCenter(new Vector3());\n const distance = extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToObjects\", zoomToObjects);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Sphere, Vector3 } from \"three\";\n\nimport { commands } from \"@inweb/viewer-core\";\nimport type { Viewer } from \"../Viewer\";\n\nfunction zoomToSelected(viewer: Viewer): void {\n const extents = viewer.selected.reduce((result: Box3, object) => result.expandByObject(object), new Box3());\n\n if (extents.isEmpty()) extents.copy(viewer.extents);\n\n const center = extents.getCenter(new Vector3());\n const distance = extents.getBoundingSphere(new Sphere()).radius;\n\n const delta = new Vector3(0, 0, 1);\n delta.applyQuaternion(viewer.camera.quaternion);\n delta.multiplyScalar(distance * 3);\n\n viewer.camera.position.copy(center).add(delta);\n viewer.target.copy(center);\n\n viewer.update();\n viewer.emitEvent({ type: \"zoom\" });\n}\n\ncommands(\"ThreeJS\").registerCommand(\"zoomToSelected\", zoomToSelected);\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { LoadingManager, LoaderUtils } from \"three\";\n\nexport class GLTFLoadingManager extends LoadingManager {\n public path = \"\";\n public resourcePath = \"\";\n public fileURL = \"\";\n public dataURLs = new Map();\n\n constructor(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | File | ArrayBuffer | Blob> = new Map(),\n params: { path?: string } = {}\n ) {\n super();\n\n this.path = params.path || \"\";\n\n if (typeof file === \"string\") {\n this.fileURL = file;\n this.resourcePath = LoaderUtils.extractUrlBase(file);\n } else {\n externalData.forEach((value, key) => (this.fileURL = value === file ? key : this.fileURL));\n externalData.set(this.fileURL, file);\n }\n\n externalData.forEach((value, key) => {\n let dataURL: string;\n if (typeof value === \"string\") dataURL = value;\n else dataURL = URL.createObjectURL(new Blob([value]));\n this.dataURLs.set(key, dataURL);\n });\n\n this.setURLModifier((url: string) => {\n const key = decodeURI(url)\n .replace(this.path, \"\")\n .replace(this.resourcePath, \"\")\n .replace(/^(\\.?\\/)/, \"\");\n const dataURL = this.dataURLs.get(key);\n return dataURL ?? url;\n });\n }\n\n dispose() {\n this.dataURLs.forEach(URL.revokeObjectURL);\n }\n}\n","import { Group } from \"three\";\nimport { USDZLoader } from \"three/examples/jsm/loaders/USDZLoader.js\";\n\nexport interface USDZ {\n scene: Group;\n animations: boolean;\n}\n\nexport class USDZLoader2 extends USDZLoader {\n override parse(buffer) {\n const scene = super.parse(buffer);\n let handle = 0;\n scene.traverse((object) => {\n object.userData = { ...object.userData, handle };\n handle++;\n });\n return scene;\n }\n\n override load(\n url: string,\n onLoad: (data: any) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (err: unknown) => void\n ) {\n super.load(url, (scene) => onLoad({ scene }), onProgress, onError);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n/* eslint-disable no-extra-semi */\n/* eslint-disable no-prototype-builtins */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable prefer-const */\n\nimport {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n} from \"three\";\n\nconst THREE = {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n};\n\n// https://github.com/buildingSMART/IFC5-development/docs/viewer/render.mjs\n\n// (C) buildingSMART International\n// published under MIT license \n\nlet controls, renderer, scene, camera;\nlet datas = [];\nlet autoCamera = true;\n\nfunction init() {\n scene = new THREE.Scene();\n camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100);\n\n camera.up.set(0, 0, 1);\n camera.position.set(50, 50, 50);\n camera.lookAt(0, 0, 0);\n\n // const nd = document.querySelector('.viewport');\n // renderer = new THREE.WebGLRenderer({\n // alpha: true\n // });\n\n // renderer.setSize(nd.offsetWidth, nd.offsetHeight);\n\n // controls = new THREE.OrbitControls(camera, renderer.domElement);\n // controls.enableDamping = true;\n // controls.dampingFactor = 0.25;\n\n // nd.appendChild(renderer.domElement);\n\n return scene;\n}\n\nfunction getChildByName(root, childName, skip=0) {\n let fragments = childName.replace(/^<\\/|^\\/|>$/g, '').split('/');\n for (let i = 0; i < skip; ++i) {\n fragments.shift();\n }\n while (fragments.length && root) {\n let f = fragments.shift();\n root = root.children.find(i => i.name.split('/').reverse()[0] === f);\n }\n return root;\n}\n\nfunction createMaterialFromParent(parent, root) {\n let reference = parent.attributes['UsdShade:MaterialBindingAPI:material:binding'];\n let material = {\n color: new THREE.Color(0.6, 0.6, 0.6)\n };\n if (reference) {\n const materialNode = getChildByName(root, reference.ref);\n let shader = materialNode.children.find(i => i.type === 'UsdShade:Shader');\n let color = shader.attributes['inputs:diffuseColor'];\n material.color = new THREE.Color(...color);\n if (shader.attributes['inputs:opacity']) {\n material.transparent = true;\n material.opacity = shader.attributes['inputs:opacity'];\n }\n }\n return material;\n}\n\nfunction createCurveFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes['UsdGeom:BasisCurves:points'].flat());\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.BufferAttribute(points, 3));\n const material = createMaterialFromParent(parent, root);\n let lineMaterial = new THREE.LineBasicMaterial({...material});\n // Make lines a little darker, otherwise they have the same color as meshes\n lineMaterial.color.multiplyScalar(0.8)\n return new THREE.Line(geometry, lineMaterial);\n}\n\n\nfunction createMeshFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes['UsdGeom:Mesh:points'].flat());\n let indices = new Uint16Array(node.attributes['UsdGeom:Mesh:faceVertexIndices']);\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.BufferAttribute(points, 3));\n geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n geometry.computeVertexNormals();\n\n const material = createMaterialFromParent(parent, root);\n let meshMaterial = new THREE.MeshBasicMaterial({...material});\n\n return new THREE.Mesh(geometry, meshMaterial);\n}\n\nfunction traverseTree(node, parent, root, parentNode) {\n let elem;\n if (node.type === \"UsdGeom:Xform\") {\n elem = new THREE.Group();\n } else if (node.type === \"UsdGeom:Mesh\" || node.type === \"UsdGeom:BasisCurves\") {\n if (node.attributes[\"UsdGeom:VisibilityAPI:visibility:visibility\"] === 'invisible') {\n return;\n }\n if (node.type === \"UsdGeom:Mesh\") {\n elem = createMeshFromJson(node, parentNode, root);\n } else {\n elem = createCurveFromJson(node, parentNode, root);\n }\n } else if (node !== root) {\n return;\n }\n\n if (node !== root) {\n parent.add(elem);\n elem.matrixAutoUpdate = false;\n\n let matrixNode = node.attributes && node.attributes['xformOp:transform'] ? node.attributes['xformOp:transform'].flat() : null;\n if (matrixNode) {\n let matrix = new THREE.Matrix4();\n matrix.set(...matrixNode);\n matrix.transpose();\n elem.matrix = matrix;\n }\n }\n\n (node.children || []).forEach(child => traverseTree(child, elem || parent, root, node));\n}\n\nfunction* collectNames(node) {\n yield node.name;\n // @todo assert node.name matches path\n for (const child of node.children || []) {\n yield* collectNames(child);\n }\n}\n\nfunction compose(datas) {\n // Composition, the naive way:\n // - flatten tree to list of <path, object> pairs\n // - group objects with among layers with the same path\n // - apply inheritance relationships\n // - recompose into hierarchical structure\n\n let compositionEdges = {};\n\n // Undo the attribute namespace of over prims introduced in 'ECS'.\n function flattenAttributes(prim) {\n if (prim.name !== 'Shader' && prim.attributes) {\n const [k, vs] = Object.entries(prim.attributes)[0];\n const attrs = Object.fromEntries(Object.entries(vs).map(([kk, vv]) => [`${k}:${kk}`, vv]));\n return {\n ...prim,\n attributes: attrs\n };\n } else {\n return {\n ...prim\n };\n }\n }\n\n function addEdge(a, b) {\n (compositionEdges[a] = compositionEdges[a] || []).push(b);\n }\n\n // Traverse forest and yield paths as a map of str -> dict\n function collectPaths(nodes) {\n const paths = {};\n\n function traverse(node, parentPathStr) {\n if (node.name) {\n // Fully qualified means an over on a full path like /Project/Site/Something/Body. These\n // are applied differntly. on non-root nodes we don't assemble immutably bottom up, but rather mutate top down.\n const isFullyQualified = node.name.split('/').length > 2;\n const reverseWhenFullyQualified = isFullyQualified ? (a => a.reverse()) : (a => a);\n \n const pathStr = `${parentPathStr}/${node.name.replace(/^\\//, '')}`\n \n let nodeId = pathStr;\n \n // 'complete' refers to the composition lifecycle when all overs are applied and the prim is ready\n // to be inherited from or used as a subprim.\n let nodeIdComplete = `${pathStr} complete`;\n \n const N = flattenAttributes(node);\n N.name = pathStr;\n \n if (node.def === 'over') {\n nodeId = `${pathStr} over`;\n addEdge(...reverseWhenFullyQualified([nodeId, pathStr]));\n addEdge(nodeIdComplete, nodeId);\n }\n \n addEdge(nodeIdComplete, pathStr);\n\n // Store in map\n (paths[nodeId] = paths[nodeId] || []).push(N);\n\n // Add inheritance edges\n for (let ih of node.inherits || []) {\n const target = ih.substring(1, ih.length - 1);\n addEdge(nodeId, `${target} complete`)\n }\n\n // Add subprim edges\n (node.children || []).forEach(child => {\n // We only instantiate def'ed children, not classes\n if (child.name && child.def === 'def') {\n const childName = `${pathStr}/${child.name}`;\n addEdge(...reverseWhenFullyQualified([pathStr, `${childName} complete`]));\n if (nodeId.endsWith('over')) {\n // when we have an over on a deeper namespace we need to make sure the root is already built\n if (pathStr.split('/').length > 2) {\n addEdge(childName, `/${pathStr.split('/')[1]}`);\n }\n }\n }\n traverse(child, pathStr);\n });\n }\n }\n\n // Create the pseudo root and connect to its children\n nodes.forEach((n) => traverse(n, ''));\n nodes.filter(n => n.name && n.def === 'def').forEach(n => {\n addEdge('', `/${n.name} complete`);\n });\n\n return paths;\n }\n\n // This is primarily for children, loading the same layer multiple times should not have an effect\n // so the child composition edges should not be duplicated. Applying overs should be idempotent.\n function removeDuplicates(map_of_arrays) {\n return Object.fromEntries(Object.entries(map_of_arrays).map(([k, vs]) => [k, vs.filter((value, index, array) => \n array.indexOf(value) === index\n )]));\n }\n\n // Prim storage based on path for the various lauers\n const maps = datas.map(collectPaths);\n\n let compositionEdgesOrig = removeDuplicates(compositionEdges);\n \n // Reduction function to override prim attributes\n // Assumes 'unpacked' attribute namespaces\n function composePrim(right, left) {\n return {\n def: left.def || (right !== null ? right.def : null),\n type: left.type || (right !== null ? right.type : null),\n name: right ? right.name : left.name,\n attributes: {\n ...((right !== null) ? right.attributes : {}),\n ...((left !== null) ? left.attributes : {})\n },\n children: (left.children || []).concat(right ? (right.children || []) : [])\n }\n }\n\n // Copy the input to avoid modifying it.\n // Discard self-dependencies and copy two levels deep.\n compositionEdges = Object.fromEntries(\n Object.entries(compositionEdgesOrig).map(([item, dep]) => [\n item,\n new Set([...dep].filter((e) => e !== item)),\n ])\n );\n\n // Find all items that don't depend on anything.\n const extraItemsInDeps = new Set(\n [...Object.values(compositionEdges).map(st => Array.from(st)).flat()].filter((value) => !compositionEdges.hasOwnProperty(value))\n );\n\n // Add empty dependencies where needed.\n extraItemsInDeps.forEach((item) => {\n if (maps.map(m => m[item]).some(i => i)) {\n // only add defined things, not overs on concatenated paths that don't exist yet which need to be the result of actual composition steps\n compositionEdges[item] = new Set();\n }\n });\n\n const composed = {};\n const built = new Set();\n\n Object.keys(compositionEdges).forEach(p => {\n const opinions = maps.map(m => m[p]).filter(a => a).flat(1);\n if (p == '') {\n composed[p] = {name: p};\n } else if (opinions.length === 0) {\n return;\n } else if (opinions.length == 1) {\n composed[p] = composePrim(null, opinions[0]);\n } else {\n composed[p] = opinions.reverse().reduce(composePrim);\n }\n delete composed[p].children;\n });\n\n const updateName = (oldPrefix, newPrefix, prim) => {\n return {\n ...prim,\n name: prim.name.replace(new RegExp(`^${oldPrefix}(?=/)`), newPrefix),\n children: prim.children.map(c => updateName(oldPrefix, newPrefix, c))\n }\n };\n\n // Essentially we do an 'interactive' topological sort. Where we process the composition edges for\n // those prims that do not have any dependencies left. However, as a consequence of composition,\n // novel prim paths can also be formed which can resolve the dependencies for other prims.\n let maxIterations = 100;\n while (maxIterations --) {\n const bottomRankNodes = Object.entries(compositionEdges).filter(([_, dep]) => dep.size === 0 && (composed[_] || built.has(_) || _.endsWith(' complete'))).map(([k, v]) => k);\n console.log('Bottom rank prims to resolve:', ...bottomRankNodes);\n\n if (bottomRankNodes.length === 0) {\n break;\n }\n\n const definedPrims = new Set();\n\n // Apply edges in dependency order\n bottomRankNodes.forEach(k => {\n (Array.from(compositionEdgesOrig[k] || [])).forEach(v => {\n // We don't have typed edges because of the somewhat primitive type system in JS.\n // (An array does not really function as a tuple). So we need to reverse engineer\n // the type of the edge (and therefore what composition action to apply) based on\n // the names of the vertices.\n console.log('Processing edge:', k, ' --- ', v);\n if (k.endsWith(' complete') && v.endsWith(' over')) {\n // Only for life cycle dependency management, no action associated\n } else if (v.startsWith(k + '/')) {\n // If k is a subpath of v it's a subPrim relationship\n if (k.split('/').length > 2) {\n // this should not occur\n } else {\n v = v.replace(/ complete$/, '');\n\n composed[k].children = composed[k].children || [];\n composed[k].children.push(composed[v]);\n Array.from(collectNames(composed[k])).forEach(a => definedPrims.add(a.substring(k.length)));\n }\n } else if (k.startsWith(v + '/')) {\n // reversed child definition for top-down over application\n if (k.endsWith(' complete')) {\n // @todo immutability\n let child = getChildByName(composed[`/${v.split('/')[1]}`], v, /*skip=*/ 1);\n if (child) {\n k = k.replace(/ complete$/, '');\n child.children.push(composed[k]);\n } else {\n console.error(v, '-->', k, 'not applied');\n }\n Array.from(collectNames(child)).forEach(a => definedPrims.add(a.substring(child.name.length)));\n }\n } else if (k.search(/over$/) !== -1) {\n if (k.split('/').length > 2) {\n // @todo immutability\n let child = getChildByName(composed[`/${v.split('/')[1]}`], k.split(' ')[0], /*skip=*/ 1);\n if (child) {\n Object.assign(child.attributes, composed[k].attributes);\n } else {\n console.error(k, '-->', v, 'not applied');\n }\n } else {\n composed[v] = composePrim(composed[v], composed[k]);\n }\n } else if (v.search(/over$/) !== -1) {\n // reversed top-down over\n if (v.split('/').length > 2) {\n // @todo immutability\n let child = getChildByName(composed[`/${k.split('/')[1]}`], v.split(' ')[0], /*skip=*/ 1);\n if (child) {\n Object.assign(child.attributes, composed[v].attributes);\n } else {\n console.error(v, '-->', k, 'not registered');\n }\n } else {\n composed[k] = composePrim(composed[k], composed[v]);\n }\n } else {\n // Else it's an inheritance relationship\n if (v.endsWith('complete')) {\n // only when ends with complete, otherwise it could be the dependency edge between a concatenated-prim over and its root.\n v = v.replace(/ complete$/, '');\n composed[k] = updateName(composed[v].name, composed[k].name, composePrim(composed[k], composed[v]));\n Array.from(collectNames(composed[k])).forEach(a => definedPrims.add(a.substring(k.length)));\n }\n }\n });\n });\n\n console.log('Constructed prims:', ...definedPrims);\n\n Array.from(definedPrims).forEach(a => built.add(a));\n\n let orderedSet = new Set(bottomRankNodes);\n compositionEdges = Object.fromEntries(\n Object.entries(compositionEdges)\n .filter(([item]) => !orderedSet.has(item))\n .map(([item, dep]) => [item, new Set([...dep].filter((d) => (!orderedSet.has(d) && !definedPrims.has(d))))])\n );\n }\n\n if (Object.keys(compositionEdges).length !== 0) {\n console.error(\"Unresolved nodes:\", ...Object.keys(compositionEdges));\n }\n\n console.log(composed['']);\n return composed[''];\n}\n\nfunction encodeHtmlEntities(str) {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n};\n\nconst icons = {\n 'UsdGeom:Mesh:points': 'deployed_code', \n 'UsdGeom:BasisCurves:points': 'line_curve',\n 'UsdShade:Material:outputs:surface.connect': 'line_style'\n};\n\nfunction buildDomTree(prim, node) {\n const elem = document.createElement('div');\n let span;\n elem.appendChild(document.createTextNode(prim.name ? prim.name.split('/').reverse()[0] : 'root'));\n elem.appendChild(span = document.createElement('span'));\n Object.entries(icons).forEach(([k, v]) => span.innerText += (prim.attributes || {})[k] ? v : ' ');\n span.className = \"material-symbols-outlined\";\n elem.onclick = (evt) => {\n let rows = [['name', prim.name]].concat(Object.entries(prim.attributes)).map(([k, v]) => `<tr><td>${encodeHtmlEntities(k)}</td><td>${encodeHtmlEntities(typeof v === 'object' ? JSON.stringify(v) : v)}</td>`).join('');\n document.querySelector('.attributes .table').innerHTML = `<table border=\"0\">${rows}</table>`;\n evt.stopPropagation();\n };\n node.appendChild(elem);\n (prim.children || []).forEach(p => buildDomTree(p, elem));\n}\n\nexport function composeAndRender() {\n if (scene) {\n // @todo does this actually free up resources?\n scene.children = [];\n }\n\n // document.querySelector('.tree').innerHTML = '';\n\n if (datas.length === 0) {\n return;\n }\n\n const tree = compose(datas.map(arr => arr[1]));\n if (!tree) {\n console.error(\"No result from composition\");\n return;\n }\n\n traverseTree(tree, scene || init(), tree);\n\n if (autoCamera) {\n const boundingBox = new THREE.Box3();\n boundingBox.setFromObject(scene);\n if (!boundingBox.isEmpty()) {\n let avg = boundingBox.min.clone().add(boundingBox.max).multiplyScalar(0.5);\n let ext = boundingBox.max.clone().sub(boundingBox.min).length();\n camera.position.copy(avg.clone().add(new THREE.Vector3(1,1,1).normalize().multiplyScalar(ext)));\n camera.far = ext * 3;\n camera.updateProjectionMatrix();\n // controls.target.copy(avg);\n // controls.update();\n \n // only on first successful load\n autoCamera = false;\n }\n }\n\n\n // buildDomTree(tree, document.querySelector('.tree'));\n // animate();\n}\n\nfunction createLayerDom() {\n document.querySelector('.layers div').innerHTML = '';\n datas.forEach(([name, _], index) => {\n const elem = document.createElement('div');\n elem.appendChild(document.createTextNode(name));\n ['\\u25B3', '\\u25BD', '\\u00D7'].reverse().forEach((lbl, cmd) => {\n const btn = document.createElement('span');\n btn.onclick = (evt) => {\n evt.stopPropagation();\n if (cmd === 2) {\n if (index > 0) {\n [datas[index], datas[index - 1]] = [datas[index - 1], datas[index]];\n }\n } else if (cmd === 1) {\n if (index < datas.length - 1) {\n [datas[index], datas[index + 1]] = [datas[index + 1], datas[index]];\n }\n } else if (cmd === 0) {\n datas.splice(index, 1);\n }\n composeAndRender();\n createLayerDom();\n }\n btn.appendChild(document.createTextNode(lbl));\n elem.appendChild(btn);\n });\n document.querySelector('.layers div').appendChild(elem);\n });\n}\n\nexport default function addModel(name, m) {\n datas.push([name, m]);\n // createLayerDom();\n composeAndRender();\n return scene;\n}\n\nfunction animate() {\n // requestAnimationFrame(animate);\n // controls.update();\n // renderer.render(scene, camera);\n}\n\nexport function clear() {\n scene = undefined;\n camera = undefined;\n datas.length = 0;\n autoCamera = true;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { FileLoader, Group, Loader } from \"three\";\nimport addModel, { clear } from \"./render.mjs\";\n\nexport interface IFCX {\n scene: Group;\n}\n\nclass IFCXLoader extends Loader<IFCX> {\n override load(\n url: any,\n onLoad: (ifc: IFCX) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (event: ErrorEvent) => void\n ) {\n const loader = new FileLoader(this.manager);\n loader.setPath(this.path);\n loader.setResponseType(\"json\");\n loader.setRequestHeader(this.requestHeader);\n loader.setWithCredentials(this.withCredentials);\n loader.load(\n url,\n (buffer) => {\n try {\n const scene = addModel(\"\", buffer);\n let handle = 0;\n scene.traverse((object) => {\n object.userData = { ...object.userData, handle };\n handle++;\n });\n onLoad({ scene });\n } catch (e: any) {\n if (onError) {\n onError(e);\n } else {\n console.error(e);\n }\n this.manager.itemError(url);\n } finally {\n clear();\n }\n },\n onProgress,\n onError\n );\n }\n}\n\nexport { IFCXLoader };\n","class EventEmitter2 {\n constructor() {\n this._listeners = {};\n }\n addEventListener(type, listener) {\n if (this._listeners[type] === undefined) this._listeners[type] = [];\n this._listeners[type].push(listener);\n return this;\n }\n removeEventListener(type, listener) {\n if (this._listeners[type] === undefined) return this;\n const listeners = this._listeners[type].filter((x => x !== listener));\n if (listeners.length !== 0) this._listeners[type] = listeners; else delete this._listeners[type];\n return this;\n }\n removeAllListeners(type) {\n if (type) delete this._listeners[type]; else this._listeners = {};\n return this;\n }\n emitEvent(event) {\n if (this._listeners[event.type] === undefined) return false;\n const invoke = this._listeners[event.type].slice();\n invoke.forEach((listener => listener.call(this, event)));\n return true;\n }\n on(type, listener) {\n return this.addEventListener(type, listener);\n }\n off(type, listener) {\n return this.removeEventListener(type, listener);\n }\n emit(type, ...args) {\n if (typeof type === \"string\") return this.emitEvent({\n type: type,\n args: args\n }); else if (typeof type === \"object\") return this.emitEvent(type); else return false;\n }\n}\n\nexport { EventEmitter2 };\n//# sourceMappingURL=eventemitter2.module.js.map\n","import Konva from \"konva\";\n\nclass WorldTransform {\n screenToWorld(position) {\n return {\n x: position.x,\n y: position.y,\n z: 0\n };\n }\n worldToScreen(position) {\n return {\n x: position.x,\n y: position.y\n };\n }\n getScale() {\n return {\n x: 1,\n y: 1,\n z: 1\n };\n }\n}\n\nclass MarkupColor {\n constructor(r, g, b) {\n this.setColor(r, g, b);\n }\n asHex() {\n return \"#\" + this.HEX;\n }\n asRGB() {\n return {\n r: this.R,\n g: this.G,\n b: this.B\n };\n }\n setColor(r, g, b) {\n this.R = r;\n this.G = g;\n this.B = b;\n this.HEX = this.rgbToHex(r, g, b);\n }\n rgbToHex(r, g, b) {\n const valueToHex = c => {\n const hex = c.toString(16);\n return hex === \"0\" ? \"00\" : hex;\n };\n return valueToHex(r) + valueToHex(g) + valueToHex(b);\n }\n}\n\nconst LineTypeSpecs = new Map([ [ \"solid\", [] ], [ \"dot\", [ 30, 30, .001, 30 ] ], [ \"dash\", [ 30, 30 ] ] ]);\n\nclass KonvaLine {\n constructor(params, ref = null) {\n var _a, _b;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.points) params.points = [ {\n x: 50,\n y: 50\n }, {\n x: 100,\n y: 100\n } ];\n const konvaPoints = [];\n params.points.forEach((point => konvaPoints.push(point.x, point.y)));\n this._ref = new Konva.Line({\n stroke: (_a = params.color) !== null && _a !== undefined ? _a : \"#ff0000\",\n strokeWidth: (_b = params.width) !== null && _b !== undefined ? _b : 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: konvaPoints,\n draggable: true,\n strokeScaleEnabled: false,\n dash: LineTypeSpecs.get(params.type) || []\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n }));\n this._ref.id(this._ref._id.toString());\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Line\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getPoints() {\n return this._ref.points();\n }\n setLineWidth(size) {\n this._ref.strokeWidth(size);\n }\n getLineWidth() {\n return this._ref.strokeWidth();\n }\n getLineType() {\n const typeSpecs = this._ref.dash() || [];\n let type;\n switch (typeSpecs) {\n case LineTypeSpecs.get(\"dot\"):\n type = \"dot\";\n break;\n\n case LineTypeSpecs.get(\"dash\"):\n type = \"dash\";\n break;\n\n default:\n type = \"solid\";\n break;\n }\n return type;\n }\n setLineType(type) {\n const specs = LineTypeSpecs.get(type);\n if (specs) this._ref.dash(specs);\n }\n addPoints(points) {\n let newPoints = this._ref.points();\n points.forEach((point => {\n newPoints = newPoints.concat([ point.x, point.y ]);\n }));\n this._ref.points(newPoints);\n }\n}\n\nclass KonvaText {\n constructor(params, ref = null) {\n var _a, _b, _c;\n this.TEXT_FONT_FAMILY = \"Calibri\";\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 100,\n y: 100\n };\n if (!params.text) params.text = \"default\";\n this._ref = new Konva.Text({\n x: params.position.x,\n y: params.position.y,\n text: params.text,\n fontSize: (_a = params.fontSize) !== null && _a !== undefined ? _a : 34,\n fontFamily: this.TEXT_FONT_FAMILY,\n fill: (_b = params.color) !== null && _b !== undefined ? _b : \"#ff0000\",\n align: \"left\",\n draggable: true,\n rotation: (_c = params.rotation) !== null && _c !== undefined ? _c : 0\n });\n this._ref.width(this._ref.getTextWidth());\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n const minWidth = 50;\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < Math.round(this.getFontSize())) newHeight = Math.round(this.getFontSize());\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.id(this._ref._id.toString());\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Text\";\n }\n getColor() {\n return this._ref.fill();\n }\n setColor(hex) {\n this._ref.fill(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getText() {\n return this._ref.text();\n }\n setText(text) {\n this._ref.text(text);\n }\n getPosition() {\n return this._ref.getPosition();\n }\n setPosition(x, y) {\n this._ref.setPosition({\n x: x,\n y: y\n });\n }\n getFontSize() {\n return this._ref.fontSize();\n }\n setFontSize(size) {\n this._ref.fontSize(size);\n }\n}\n\nclass KonvaRectangle {\n constructor(params, ref = null) {\n var _a, _b, _c, _d;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 100,\n y: 100\n };\n this._ref = new Konva.Rect({\n stroke: (_a = params.color) !== null && _a !== undefined ? _a : \"#ff0000\",\n strokeWidth: (_b = params.lineWidth) !== null && _b !== undefined ? _b : 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n width: (_c = params.width) !== null && _c !== undefined ? _c : 200,\n height: (_d = params.height) !== null && _d !== undefined ? _d : 200,\n draggable: true,\n strokeScaleEnabled: false\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n const minWidth = 50;\n const minHeight = 50;\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < minHeight) newHeight = minHeight;\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.id(this._ref._id.toString());\n }\n getPosition() {\n return this._ref.position();\n }\n getWidth() {\n return this._ref.width();\n }\n getHeigth() {\n return this._ref.height();\n }\n setWidth(w) {\n this._ref.width(w);\n }\n setHeight(h) {\n this._ref.height(h);\n }\n setPosition(x, y) {\n this._ref.setPosition({\n x: x,\n y: y\n });\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Rectangle\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n setLineWidth(size) {\n this._ref.strokeWidth(size);\n }\n getLineWidth() {\n return this._ref.strokeWidth();\n }\n}\n\nclass KonvaEllipse {\n constructor(params, ref = null) {\n var _a, _b;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 100,\n y: 100\n };\n if (!params.radius) params.radius = {\n x: 25,\n y: 25\n };\n this._ref = new Konva.Ellipse({\n stroke: (_a = params.color) !== null && _a !== undefined ? _a : \"#ff0000\",\n strokeWidth: (_b = params.lineWidth) !== null && _b !== undefined ? _b : 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n radiusX: params.radius.x,\n radiusY: params.radius.y,\n draggable: true,\n strokeScaleEnabled: false\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newRadiusX = this._ref.radiusX();\n if (scaleByX) newRadiusX *= attrs.scaleX;\n let newRadiusY = this._ref.radiusY();\n if (scaleByY) newRadiusY *= attrs.scaleY;\n const minRadiusX = 25;\n const minRadiusY = 25;\n if (newRadiusX < minRadiusX) newRadiusX = minRadiusX;\n if (newRadiusY < minRadiusY) newRadiusY = minRadiusY;\n if (e.evt.ctrlKey || e.evt.shiftKey) {\n if (scaleByX) {\n this._ref.radius({\n x: newRadiusX,\n y: newRadiusX\n });\n } else {\n this._ref.radius({\n x: newRadiusY,\n y: newRadiusY\n });\n }\n } else {\n this._ref.radius({\n x: newRadiusX,\n y: newRadiusY\n });\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.id(this._ref._id.toString());\n }\n getPosition() {\n return this._ref.position();\n }\n setPosition(x, y) {\n this._ref.setPosition({\n x: x,\n y: y\n });\n }\n getRadiusX() {\n return this._ref.radiusX();\n }\n setRadiusX(r) {\n this._ref.radiusX(r);\n }\n getRadiusY() {\n return this._ref.radiusY();\n }\n setRadiusY(r) {\n this._ref.radiusY(r);\n }\n getLineWidth() {\n return this._ref.strokeWidth();\n }\n setLineWidth(size) {\n this._ref.strokeWidth(size);\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Ellipse\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n}\n\nclass KonvaArrow {\n constructor(params, ref = null) {\n var _a, _b;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.start) params.start = {\n x: 50,\n y: 50\n };\n if (!params.end) params.end = {\n x: 100,\n y: 100\n };\n this._ref = new Konva.Arrow({\n stroke: (_a = params.color) !== null && _a !== undefined ? _a : \"#ff0000\",\n fill: (_b = params.color) !== null && _b !== undefined ? _b : \"#ff0000\",\n strokeWidth: 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: [ params.start.x, params.start.y, params.end.x, params.end.y ],\n draggable: true,\n strokeScaleEnabled: false\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n }));\n this._ref.id(this._ref._id.toString());\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Arrow\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n this._ref.fill(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getPoints() {\n const points = this._ref.points();\n return [ {\n x: points[0],\n y: points[1]\n }, {\n x: points[2],\n y: points[3]\n } ];\n }\n setPoints(points) {\n if (points.length === 2) {\n this._ref.points([ points[0].x, points[0].y, points[1].x, points[1].y ]);\n }\n }\n getStartPoint() {\n const points = this._ref.points();\n return {\n x: points[0],\n y: points[1]\n };\n }\n setStartPoint(x, y) {\n const points = this._ref.points();\n this._ref.points([ x, y, points[2], points[3] ]);\n }\n getEndPoint() {\n const points = this._ref.points();\n return {\n x: points[2],\n y: points[3]\n };\n }\n setEndPoint(x, y) {\n const points = this._ref.points();\n this._ref.points([ points[0], points[1], x, y ]);\n }\n}\n\nclass KonvaImage {\n constructor(params, ref = null) {\n var _a, _b;\n this._ratio = 1;\n this.EPSILON = 1e-5;\n this.BASE64_HEADER_START = \"data:image/\";\n this.BASE64_NOT_FOUND = \"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAADsAAAA7AF5KHG9AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAmhJREFUWIXtlr9rVEEQxz+H8RQUJIdeIopYm0vkCg0GBBtbG1NF7Kxt7dR/IGIw/uhTaBNLERURg2kCEUyCYCPi70b0InjGS57FzOZN3r19d+9HJIVfWO52dma/s7Mz8xa2KAaBCWAR+AkECWOmSOIdwC1gtQOpHc+NfQ8wClQ8+1d0vcdH/lQ3bSIRGAZ2pTjAqNovANXIWlXlAXA2zvi2Ln4AjqYgtagYEutENSLvjRoOImFv5iB32Ae8UrLXwFBk3h9ndF0VJnKSO9gTu3yKu5Z1LKnS8YIcABgw5Ks692JZFXcXRJ46Aq6kikCnHNi/mQ50WwVtfaIoBzL3gRk2drSscJ2wrc4VvUoe2wn/41/iBfoVLRnBGnDSY3AAKacy8AmYR+o7K1zCl6wgrgpOAc/MuhvfgMuk+1JGHQgSBcAloKXy78AjYBppJk5/noTulseBMZ23iD/piHFkEdgTQzKk+5wHjmHC3cmBg0BD5xcSTrFXyQPgIWFtDwMvab+2N8DpbhyY1v/3E8gdDgNfVX9SCVZ0/gW4B0wB71S2BpxLcuCM/jaQSHSDEeAX4VMuAG4gTzyHbcAVXXO6GxxwIX+vvxe7JHcYQ07nHqklj96UIW/YhSWzMKcep8VVtf8B1Dw6h4DfhB+sdbgn2R+gnoEc5NR3dZ+3QJ9H74HqXLPCGlJyTfI9y3YCs0owq3OLOpKkLeBI1HhSDT/mdKIPiUCARMTlQx34TMLjtww8IczmO8AJ/N/2JNSQXAiQ671JePePge0+wzJSQq4FFzlaenIvucUAkiQLhC/mLGNZ9xgn5s63BP4CCk0QDtm4BhoAAAAASUVORK5CYII=\";\n if (ref) {\n if (!ref.src || !ref.src.startsWith(this.BASE64_HEADER_START)) ref.src = this.BASE64_NOT_FOUND;\n if (ref.height() <= this.EPSILON) ref.height(32);\n if (ref.width() <= this.EPSILON) ref.width(32);\n this._ref = ref;\n this._canvasImage = ref.image();\n this._ratio = this._ref.height() <= this.EPSILON || this._ref.width() <= this.EPSILON ? 1 : this._ref.height() / this._ref.width();\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 50,\n y: 50\n };\n if (!params.src || !params.src.startsWith(this.BASE64_HEADER_START)) params.src = this.BASE64_NOT_FOUND;\n this._canvasImage = new Image;\n this._canvasImage.onload = () => {\n this._ref.image(this._canvasImage);\n if (this._ref.height() <= this.EPSILON) this._ref.height(this._canvasImage.height);\n if (this._ref.width() <= this.EPSILON) this._ref.width(this._canvasImage.width);\n this._ratio = this._ref.height() <= this.EPSILON || this._ref.width() <= this.EPSILON ? 1 : this._ref.height() / this._ref.width();\n if ((params.width <= this.EPSILON || params.height <= this.EPSILON) && (params.maxWidth >= this.EPSILON || params.maxWidth >= this.EPSILON)) {\n const heightOutOfCanvas = params.maxHeight - this._canvasImage.height;\n const widthOutOfCanvas = params.maxWidth - this._canvasImage.width;\n if (heightOutOfCanvas <= this.EPSILON || widthOutOfCanvas <= this.EPSILON) {\n if (widthOutOfCanvas <= this.EPSILON && widthOutOfCanvas < heightOutOfCanvas / this._ratio) {\n this._ref.height(params.maxWidth * this._ratio);\n this._ref.width(params.maxWidth);\n } else {\n this._ref.width(params.maxHeight / this._ratio);\n this._ref.height(params.maxHeight);\n }\n }\n }\n };\n this._canvasImage.onerror = () => {\n this._canvasImage.onerror = function() {};\n this._canvasImage.src = this.BASE64_NOT_FOUND;\n };\n this._canvasImage.src = params.src;\n this._ref = new Konva.Image({\n x: params.position.x,\n y: params.position.y,\n image: this._canvasImage,\n width: (_a = params.width) !== null && _a !== undefined ? _a : 0,\n height: (_b = params.height) !== null && _b !== undefined ? _b : 0,\n draggable: true\n });\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n if (e.evt.ctrlKey || e.evt.shiftKey) {\n if (scaleByX) {\n this._ref.width(newWidth);\n this._ref.height(newWidth * this._ratio);\n } else {\n this._ref.width(newHeight / this._ratio);\n this._ref.height(newHeight);\n }\n } else {\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.id(this._ref._id.toString());\n }\n getSrc() {\n return this._canvasImage.src;\n }\n setSrc(src) {\n this._canvasImage.src = src;\n }\n getWidth() {\n return this._ref.width();\n }\n setWidth(w) {\n this._ref.width(w);\n this._ref.height(w * this._ratio);\n }\n getHeight() {\n return this._ref.height();\n }\n setHeight(h) {\n this._ref.height(h);\n this._ref.width(h / this._ratio);\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Image\";\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getPosition() {\n return this._ref.getPosition();\n }\n setPosition(x, y) {\n this._ref.setPosition({\n x: x,\n y: y\n });\n }\n}\n\nclass KonvaCloud {\n constructor(params, ref = null) {\n var _a, _b, _c, _d;\n if (ref) {\n this._ref = ref;\n return;\n }\n if (!params) params = {};\n if (!params.position) params.position = {\n x: 100,\n y: 100\n };\n const arcRadius = 16;\n this._ref = new Konva.Shape({\n x: params.position.x,\n y: params.position.y,\n width: (_a = params.width) !== null && _a !== undefined ? _a : 200,\n height: (_b = params.height) !== null && _b !== undefined ? _b : 200,\n stroke: (_c = params.color) !== null && _c !== undefined ? _c : \"#ff0000\",\n strokeWidth: (_d = params.lineWidth) !== null && _d !== undefined ? _d : 4,\n draggable: true,\n strokeScaleEnabled: false,\n globalCompositeOperation: \"source-over\",\n sceneFunc: (context, shape) => {\n function calculateMidpoint(position, width, height) {\n const midX = position.x + width / 2;\n const midY = position.y + height / 2;\n return {\n x: midX,\n y: midY\n };\n }\n const points = [ {\n x: 0,\n y: 0\n }, {\n x: 0 + this._ref.width(),\n y: 0\n }, {\n x: 0 + this._ref.width(),\n y: 0 + this._ref.height()\n }, {\n x: 0,\n y: 0 + this._ref.height()\n }, {\n x: 0,\n y: 0\n } ];\n const midPoint = calculateMidpoint({\n x: 0,\n y: 0\n }, this._ref.width(), this._ref.height());\n const baseArcLength = 30;\n context.beginPath();\n for (let iPoint = 0; iPoint < points.length - 1; iPoint++) {\n let approxArcLength = baseArcLength;\n const dx = points[iPoint + 1].x - points[iPoint].x;\n const dy = points[iPoint + 1].y - points[iPoint].y;\n const length = Math.sqrt(dx * dx + dy * dy);\n const arcCount = Math.floor(length / approxArcLength);\n const lengthMod = length % approxArcLength;\n approxArcLength = baseArcLength + arcCount / lengthMod;\n let pX = points[iPoint].x + dx / arcCount / 2;\n let pY = points[iPoint].y + dy / arcCount / 2;\n const pEndX = points[iPoint + 1].x;\n const pEndY = points[iPoint + 1].y;\n const endAngle = Math.atan((pEndY - pY) / (pEndX - pX));\n const startAngle = endAngle + Math.PI;\n const counterClockwise = pX > midPoint.x && pY > midPoint.y;\n for (let iArc = 0; iArc < arcCount; iArc++) {\n if (counterClockwise) {\n context.arc(pX, pY, arcRadius, endAngle, startAngle);\n } else {\n context.arc(pX, pY, arcRadius, startAngle, endAngle);\n }\n pX += dx / arcCount;\n pY += dy / arcCount;\n }\n }\n context.closePath();\n context.fillStrokeShape(shape);\n }\n });\n this._ref.className = \"Cloud\";\n this._ref.on(\"transform\", (e => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n const scaleByX = Math.abs(attrs.scaleX - 1) > 1e-5;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 1e-5;\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n const minWidth = 100;\n const minHeight = 100;\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < minHeight) newHeight = minHeight;\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n this._ref.scale({\n x: 1,\n y: 1\n });\n }));\n this._ref.getSelfRect = () => ({\n x: 0 - arcRadius,\n y: 0 - arcRadius,\n width: this._ref.width() + 2 * arcRadius,\n height: this._ref.height() + 2 * arcRadius\n });\n this._ref.id(this._ref._id.toString());\n }\n ref() {\n return this._ref;\n }\n id() {\n return this._ref.id();\n }\n enableMouseEditing(value) {\n this._ref.draggable(value);\n }\n type() {\n return \"Cloud\";\n }\n getColor() {\n return this._ref.stroke();\n }\n setColor(hex) {\n this._ref.stroke(hex);\n }\n getRotation() {\n return this._ref.rotation();\n }\n setRotation(degrees) {\n this._ref.rotation(degrees);\n }\n getZIndex() {\n return this._ref.zIndex();\n }\n setZIndex(zIndex) {\n this._ref.zIndex(zIndex);\n }\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n getPosition() {\n return this._ref.position();\n }\n setPosition(x, y) {\n this._ref.position({\n x: x,\n y: y\n });\n }\n getWidth() {\n return this._ref.width();\n }\n setWidth(w) {\n this._ref.width(w);\n }\n getHeigth() {\n return this._ref.height();\n }\n setHeight(h) {\n this._ref.height(h);\n }\n getLineWidth() {\n return this._ref.strokeWidth();\n }\n setLineWidth(size) {\n this._ref.strokeWidth(size);\n }\n}\n\nconst MarkupMode2Konva = {\n SelectMarkup: {\n name: \"SelectMarkup\",\n initializer: null\n },\n Line: {\n name: \"Line\",\n initializer: (ref, params = null) => new KonvaLine(params, ref)\n },\n Text: {\n name: \"Text\",\n initializer: (ref, params = null) => new KonvaText(params, ref)\n },\n Rectangle: {\n name: \"Rect\",\n initializer: (ref, params = null) => new KonvaRectangle(params, ref)\n },\n Ellipse: {\n name: \"Ellipse\",\n initializer: (ref, params = null) => new KonvaEllipse(params, ref)\n },\n Arrow: {\n name: \"Arrow\",\n initializer: (ref, params = null) => new KonvaArrow(params, ref)\n },\n Image: {\n name: \"Image\",\n initializer: (ref, params = null) => new KonvaImage(params, ref)\n },\n Cloud: {\n name: \"Cloud\",\n initializer: (ref, params = null) => new KonvaCloud(params, ref)\n }\n};\n\nclass KonvaMarkup {\n constructor() {\n this._containerEvents = [];\n this._markupIsActive = false;\n this._markupColor = new MarkupColor(255, 0, 0);\n this.lineWidth = 4;\n this.lineType = \"solid\";\n this.fontSize = 34;\n this.changeActiveDragger = event => {\n const draggerName = event.data;\n this._markupContainer.className = this._container.className.split(\" \").filter((x => !x.startsWith(\"oda-cursor-\"))).filter((x => x)).concat(`oda-cursor-${draggerName.toLowerCase()}`).join(\" \");\n this.removeTextInput();\n this.removeImageInput();\n this.enableEditMode(draggerName);\n };\n this.resizeContainer = entries => {\n const {width: width, height: height} = entries[0].contentRect;\n if (!width || !height) return;\n if (!this._konvaStage) return;\n this._konvaStage.width(width);\n this._konvaStage.height(height);\n };\n this.pan = event => {\n const newPos = {\n x: this._konvaStage.x() + event.dX,\n y: this._konvaStage.y() + event.dY\n };\n this._konvaStage.position(newPos);\n };\n this.zoomAt = event => {\n const newScale = this._konvaStage.scaleX() * event.data;\n this._konvaStage.scale({\n x: newScale,\n y: newScale\n });\n const newPos = {\n x: event.x - (event.x - this._konvaStage.x()) * event.data,\n y: event.y - (event.y - this._konvaStage.y()) * event.data\n };\n this._konvaStage.position(newPos);\n };\n this.redirectToViewer = event => {\n if (this._viewer) this._viewer.emit(event);\n };\n this.getRelativePointPosition = (point, node) => {\n const transform = node.getAbsoluteTransform().copy();\n transform.invert();\n return transform.point(point);\n };\n this.getRelativePointerPosition = node => this.getRelativePointPosition(node.getStage().getPointerPosition(), node);\n }\n initialize(container, containerEvents, viewer, worldTransformer) {\n if (!Konva) throw new Error('Markup error: Konva is not initialized. Forgot to add <script src=\"https://unpkg.com/konva@9/konva.min.js\"><\\/script> to your page?');\n this._viewer = viewer;\n this._worldTransformer = worldTransformer !== null && worldTransformer !== undefined ? worldTransformer : new WorldTransform;\n this._container = container;\n this._containerEvents = containerEvents !== null && containerEvents !== undefined ? containerEvents : [];\n this._markupContainer = document.createElement(\"div\");\n this._markupContainer.id = \"markup-container\";\n this._markupContainer.style.position = \"absolute\";\n this._markupContainer.style.top = \"0px\";\n this._markupContainer.style.left = \"0px\";\n this._markupContainer.style.outline = \"0px\";\n this._markupContainer.style.pointerEvents = \"none\";\n const parentDiv = this._container.parentElement;\n parentDiv.appendChild(this._markupContainer);\n this._resizeObserver = new ResizeObserver(this.resizeContainer);\n this._resizeObserver.observe(parentDiv);\n this._markupColor.setColor(255, 0, 0);\n this.initializeKonva();\n if (this._viewer) {\n this._viewer.addEventListener(\"changeactivedragger\", this.changeActiveDragger);\n this._viewer.addEventListener(\"pan\", this.pan);\n this._viewer.addEventListener(\"zoomat\", this.zoomAt);\n }\n }\n dispose() {\n var _a, _b;\n if (this._viewer) {\n this._viewer.removeEventListener(\"zoomat\", this.zoomAt);\n this._viewer.removeEventListener(\"pan\", this.pan);\n this._viewer.removeEventListener(\"changeactivedragger\", this.changeActiveDragger);\n }\n this.destroyKonva();\n (_a = this._resizeObserver) === null || _a === undefined ? undefined : _a.disconnect();\n this._resizeObserver = undefined;\n (_b = this._markupContainer) === null || _b === undefined ? undefined : _b.remove();\n this._markupContainer = undefined;\n this._container = undefined;\n this._viewer = undefined;\n this._worldTransformer = undefined;\n this._markupIsActive = false;\n }\n syncOverlay() {}\n clearOverlay() {\n this.removeTextInput();\n this.removeImageInput();\n this.clearSelected();\n this.getObjects().forEach((obj => obj.delete()));\n }\n getMarkupColor() {\n return this._markupColor.asRGB();\n }\n setMarkupColor(r, g, b) {\n this._markupColor.setColor(r, g, b);\n this._viewer.emit({\n type: \"changemarkupcolor\",\n data: {\n r: r,\n g: g,\n b: b\n }\n });\n }\n colorizeAllMarkup(r, g, b) {\n const hexColor = new MarkupColor(r, g, b).asHex();\n this.getObjects().filter((obj => {\n var _a;\n return (_a = obj.setColor) === null || _a === undefined ? undefined : _a.call(obj, hexColor);\n }));\n }\n colorizeSelectedMarkups(r, g, b) {\n const hexColor = new MarkupColor(r, g, b).asHex();\n this.getSelectedObjects().filter((obj => {\n var _a;\n return (_a = obj.setColor) === null || _a === undefined ? undefined : _a.call(obj, hexColor);\n }));\n }\n setViewpoint(viewpoint) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.clearSelected();\n this.removeTextInput();\n this.removeImageInput();\n this._konvaStage.scale({\n x: 1,\n y: 1\n });\n this._konvaStage.position({\n x: 0,\n y: 0\n });\n const markupColor = ((_a = viewpoint.custom_fields) === null || _a === undefined ? undefined : _a.markup_color) || {\n r: 255,\n g: 0,\n b: 0\n };\n this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);\n (_b = viewpoint.lines) === null || _b === undefined ? undefined : _b.forEach((line => {\n const linePoints = [];\n line.points.forEach((point => {\n const screenPoint = this._worldTransformer.worldToScreen(point);\n linePoints.push(screenPoint.x);\n linePoints.push(screenPoint.y);\n }));\n this.addLine(linePoints, line.color, line.type, line.width, line.id);\n }));\n (_c = viewpoint.texts) === null || _c === undefined ? undefined : _c.forEach((text => {\n const screenPoint = this._worldTransformer.worldToScreen(text.position);\n this.addText(text.text, screenPoint, text.angle, text.color, text.text_size, text.font_size, text.id);\n }));\n (_d = viewpoint.rectangles) === null || _d === undefined ? undefined : _d.forEach((rect => {\n const screenPoint = this._worldTransformer.worldToScreen(rect.position);\n this.addRectangle(screenPoint, rect.width, rect.height, rect.line_width, rect.color, rect.id);\n }));\n (_e = viewpoint.ellipses) === null || _e === undefined ? undefined : _e.forEach((ellipse => {\n const screenPoint = this._worldTransformer.worldToScreen(ellipse.position);\n this.addEllipse(screenPoint, ellipse.radius, ellipse.line_width, ellipse.color, ellipse.id);\n }));\n (_f = viewpoint.arrows) === null || _f === undefined ? undefined : _f.forEach((arrow => {\n const startPoint = this._worldTransformer.worldToScreen(arrow.start);\n const endPoint = this._worldTransformer.worldToScreen(arrow.end);\n this.addArrow(startPoint, endPoint, arrow.color, arrow.id);\n }));\n (_g = viewpoint.clouds) === null || _g === undefined ? undefined : _g.forEach((cloud => {\n const screenPoint = this._worldTransformer.worldToScreen(cloud.position);\n this.addCloud(screenPoint, cloud.width, cloud.height, cloud.line_width, cloud.color, cloud.id);\n }));\n (_h = viewpoint.images) === null || _h === undefined ? undefined : _h.forEach((image => {\n const screenPoint = this._worldTransformer.worldToScreen(image.position);\n this.addImage(screenPoint, image.src, image.width, image.height, image.id);\n }));\n }\n getViewpoint(viewpoint) {\n if (!viewpoint) viewpoint = {};\n viewpoint.lines = this.getMarkupLines();\n viewpoint.texts = this.getMarkupTexts();\n viewpoint.arrows = this.getMarkupArrows();\n viewpoint.clouds = this.getMarkupClouds();\n viewpoint.ellipses = this.getMarkupEllipses();\n viewpoint.images = this.getMarkupImages();\n viewpoint.rectangles = this.getMarkupRectangles();\n viewpoint.custom_fields = {\n markup_color: this.getMarkupColor()\n };\n viewpoint.snapshot = {\n data: this.combineMarkupWithDrawing()\n };\n return viewpoint;\n }\n enableEditMode(mode) {\n if (!mode || !MarkupMode2Konva[mode]) {\n this.clearSelected();\n this.removeTextInput();\n this.removeImageInput();\n this._markupContainer.style.pointerEvents = \"none\";\n this._markupIsActive = false;\n } else {\n this._markupMode = mode;\n this._markupContainer.style.pointerEvents = \"all\";\n this._markupIsActive = true;\n }\n return this;\n }\n createObject(type, params) {\n const konvaShape = MarkupMode2Konva[type];\n if (!konvaShape || !konvaShape.initializer) throw new Error(`Markup CreateObject - unsupported markup type ${type}`);\n const object = konvaShape.initializer(null, params);\n this.addObject(object);\n return object;\n }\n getObjects() {\n const objects = [];\n Object.keys(MarkupMode2Konva).forEach((type => {\n const konvaShape = MarkupMode2Konva[type];\n this.konvaLayerFind(type).forEach((ref => objects.push(konvaShape.initializer(ref))));\n }));\n return objects;\n }\n getSelectedObjects() {\n if (!this._konvaTransformer) return [];\n return this._konvaTransformer.nodes().map((ref => {\n const name = ref.className;\n const konvaShape = Object.values(MarkupMode2Konva).find((shape => shape.name === name));\n return konvaShape ? konvaShape.initializer(ref) : null;\n })).filter((x => x));\n }\n selectObjects(objects) {\n if (!this._konvaTransformer) return;\n const selectedObjs = this._konvaTransformer.nodes().concat(objects.map((x => x.ref())));\n this._konvaTransformer.nodes(selectedObjs);\n }\n clearSelected() {\n if (this._konvaTransformer) this._konvaTransformer.nodes([]);\n }\n addObject(object) {\n if (object.type() === \"Image\") this._groupImages.add(object.ref()); else if (object.type() === \"Text\") this._groupTexts.add(object.ref()); else this._groupGeometry.add(object.ref());\n }\n konvaLayerFind(type) {\n if (!this._konvaLayer) return [];\n const konvaShape = MarkupMode2Konva[type];\n if (!konvaShape || !konvaShape.initializer) return [];\n return this._konvaLayer.find(konvaShape.name).filter((ref => ref.parent === this._konvaLayer || ref.parent === this._groupImages || ref.parent === this._groupGeometry || ref.parent === this._groupTexts));\n }\n initializeKonva() {\n const stage = new Konva.Stage({\n container: this._markupContainer,\n width: this._container.clientWidth,\n height: this._container.clientHeight\n });\n this._konvaStage = stage;\n const layer = new Konva.Layer({\n pixelRation: window.devicePixelRatio\n });\n stage.add(layer);\n this._groupImages = new Konva.Group;\n layer.add(this._groupImages);\n this._groupGeometry = new Konva.Group;\n layer.add(this._groupGeometry);\n this._groupTexts = new Konva.Group;\n layer.add(this._groupTexts);\n this._konvaLayer = layer;\n const transformer = new Konva.Transformer({\n shouldOverdrawWholeArea: false,\n keepRatio: false,\n flipEnabled: false\n });\n layer.add(transformer);\n this._konvaTransformer = transformer;\n let isPaint = false;\n let lastLine;\n let mouseDownPos;\n let lastObj;\n stage.on(\"mousedown touchstart\", (e => {\n if (!this._markupIsActive || e.target !== stage || this._markupMode === \"Text\" || this._markupMode === \"Image\") return;\n if (e.target === stage && transformer.nodes().length > 0) {\n transformer.nodes([]);\n return;\n }\n const pos = this.getRelativePointerPosition(stage);\n mouseDownPos = pos;\n isPaint = [ \"Arrow\", \"Cloud\", \"Ellipse\", \"Line\", \"Rectangle\" ].some((m => m === this._markupMode));\n if (this._markupMode === \"Line\") {\n lastLine = this.addLine([ pos.x, pos.y, pos.x, pos.y ]);\n }\n }));\n stage.on(\"mouseup touchend\", (e => {\n if (!this._markupIsActive) return;\n if (isPaint) {\n const pos = this.getRelativePointerPosition(stage);\n const defParams = mouseDownPos && pos.x === mouseDownPos.x && pos.y === mouseDownPos.y;\n const startX = defParams ? mouseDownPos.x : Math.min(mouseDownPos.x, pos.x);\n const startY = defParams ? mouseDownPos.y : Math.min(mouseDownPos.y, pos.y);\n const dX = defParams ? 200 : Math.abs(mouseDownPos.x - pos.x);\n const dY = defParams ? 200 : Math.abs(mouseDownPos.y - pos.y);\n if (defParams) {\n if (this._markupMode === \"Rectangle\") {\n this.addRectangle({\n x: startX,\n y: startY\n }, dX, dY);\n } else if (this._markupMode === \"Ellipse\") {\n this.addEllipse({\n x: startX,\n y: startY\n }, {\n x: dX / 2,\n y: dY / 2\n });\n } else if (this._markupMode === \"Arrow\") {\n this.addArrow({\n x: mouseDownPos.x,\n y: mouseDownPos.y\n }, {\n x: defParams ? mouseDownPos.x + 200 : pos.x,\n y: defParams ? startY : pos.y\n });\n } else if (this._markupMode === \"Cloud\") {\n this.addCloud({\n x: startX,\n y: startY\n }, Math.max(100, dX), Math.max(100, dY));\n }\n }\n }\n lastObj = undefined;\n isPaint = false;\n }));\n stage.on(\"mousemove touchmove\", (e => {\n if (!this._markupIsActive) return;\n if (!isPaint) {\n return;\n }\n const pos = this.getRelativePointerPosition(stage);\n const defParams = mouseDownPos && pos.x === mouseDownPos.x && pos.y === mouseDownPos.y;\n const startX = defParams ? mouseDownPos.x : Math.min(mouseDownPos.x, pos.x);\n const startY = defParams ? mouseDownPos.y : Math.min(mouseDownPos.y, pos.y);\n const dX = defParams ? 200 : Math.abs(mouseDownPos.x - pos.x);\n const dY = defParams ? 200 : Math.abs(mouseDownPos.y - pos.y);\n if (this._markupMode === \"Line\") {\n lastLine.addPoints([ {\n x: pos.x,\n y: pos.y\n } ]);\n } else if (this._markupMode === \"Arrow\") {\n if (lastObj) lastObj.setEndPoint(pos.x, pos.y); else lastObj = this.addArrow({\n x: mouseDownPos.x,\n y: mouseDownPos.y\n }, {\n x: pos.x,\n y: pos.y\n });\n } else if (this._markupMode === \"Rectangle\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setWidth(dX);\n lastObj.setHeight(dY);\n } else lastObj = this.addRectangle({\n x: startX,\n y: startY\n }, dX, dY);\n } else if (this._markupMode === \"Ellipse\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setRadiusX(dX);\n lastObj.setRadiusY(dY);\n } else lastObj = this.addEllipse({\n x: startX,\n y: startY\n }, {\n x: dX,\n y: dY\n });\n } else if (this._markupMode === \"Cloud\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setWidth(Math.max(100, dX));\n lastObj.setHeight(Math.max(100, dY));\n } else lastObj = this.addCloud({\n x: startX,\n y: startY\n }, dX, dY);\n }\n }));\n stage.on(\"click tap\", (e => {\n if (!this._markupIsActive) return;\n if (e.target === stage) {\n if (this._markupMode === \"Text\") {\n if (this._textInputRef && this._textInputRef.value) this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle); else if (transformer.nodes().length === 0) {\n const pos = this.getRelativePointerPosition(stage);\n this.createTextInput(pos, e.evt.pageX, e.evt.pageY, 0, null);\n }\n } else if (this._markupMode === \"Image\") {\n if (this._imageInputRef && this._imageInputRef.value) this.addImage({\n x: this._imageInputPos.x,\n y: this._imageInputPos.y\n }, this._imageInputRef.value, 0, 0, this._imageInputRef.value); else if (transformer.nodes().length === 0) {\n const pos = this.getRelativePointerPosition(stage);\n this.createImageInput(pos);\n }\n }\n transformer.nodes([]);\n return;\n }\n if (this._markupMode === \"Text\" || this._markupMode === \"SelectMarkup\") {\n if (e.target.className === \"Text\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._textInputRef && this._textInputRef.value) this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle); else this.createTextInput({\n x: e.target.attrs.x,\n y: e.target.attrs.y\n }, e.evt.pageX, e.evt.pageY, e.target.attrs.rotation, e.target.attrs.text);\n return;\n } else {\n this.removeTextInput();\n }\n }\n if (this._markupMode === \"Image\" || this._markupMode === \"SelectMarkup\") {\n if (e.target.className === \"Image\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._imageInputRef && this._imageInputRef.value) this.addImage(this._imageInputPos, this._imageInputRef.value, 0, 0); else this.createImageInput({\n x: e.target.attrs.x,\n y: e.target.attrs.y\n });\n return;\n } else {\n this.removeImageInput();\n }\n }\n if (transformer.nodes().filter((x => x.className === \"Cloud\" || x.className === \"Image\")).length > 0 || e.target.className === \"Cloud\" || e.target.className === \"Image\") {\n transformer.rotateEnabled(false);\n } else {\n transformer.rotateEnabled(true);\n }\n const metaPressed = e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey;\n const isSelected = transformer.nodes().indexOf(e.target) >= 0;\n if (!metaPressed && !isSelected) {\n transformer.nodes([ e.target ]);\n } else if (metaPressed && isSelected) {\n const nodes = transformer.nodes().slice();\n nodes.splice(nodes.indexOf(e.target), 1);\n transformer.nodes(nodes);\n } else if (metaPressed && !isSelected) {\n const nodes = transformer.nodes().concat([ e.target ]);\n transformer.nodes(nodes);\n }\n }));\n const container = stage.container();\n container.tabIndex = 1;\n container.focus();\n container.addEventListener(\"keydown\", (e => {\n if (!this._markupIsActive) return;\n if (e.code === \"Delete\") {\n this.getSelectedObjects().forEach((obj => obj.delete()));\n this.clearSelected();\n return;\n }\n e.preventDefault();\n }));\n }\n destroyKonva() {\n var _a;\n this.removeTextInput();\n this.removeImageInput();\n this.clearOverlay();\n (_a = this._konvaStage) === null || _a === undefined ? undefined : _a.destroy();\n this._groupImages = undefined;\n this._groupGeometry = undefined;\n this._groupTexts = undefined;\n this._konvaLayer = undefined;\n this._konvaTransformer = undefined;\n this._konvaStage = undefined;\n }\n getMarkupLines() {\n const lines = [];\n this.konvaLayerFind(\"Line\").forEach((ref => {\n const linePoints = ref.points();\n if (!linePoints) return;\n const worldPoints = [];\n const absoluteTransform = ref.getAbsoluteTransform();\n for (let i = 0; i < linePoints.length; i += 2) {\n const atPoint = absoluteTransform.point({\n x: linePoints[i],\n y: linePoints[i + 1]\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n worldPoints.push(worldPoint);\n }\n const konvaLine = new KonvaLine(null, ref);\n const line = {\n id: konvaLine.id(),\n points: worldPoints,\n color: konvaLine.getColor() || \"#ff0000\",\n type: konvaLine.getLineType() || this.lineType,\n width: konvaLine.getLineWidth() || this.lineWidth\n };\n lines.push(line);\n }));\n return lines;\n }\n getMarkupTexts() {\n const texts = [];\n this.konvaLayerFind(\"Text\").forEach((ref => {\n const textSize = .02;\n const textScale = this._worldTransformer.getScale();\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const shape = new KonvaText(null, ref);\n const text = {\n id: shape.id(),\n position: worldPoint,\n text: shape.getText(),\n text_size: textSize * textScale.y,\n angle: shape.getRotation(),\n color: shape.getColor(),\n font_size: shape.getFontSize() * stageAbsoluteTransform.getMatrix()[0]\n };\n texts.push(text);\n }));\n return texts;\n }\n getMarkupRectangles() {\n const rectangles = [];\n this.konvaLayerFind(\"Rectangle\").forEach((ref => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n const shape = new KonvaRectangle(null, ref);\n const rectangle = {\n id: shape.id(),\n position: worldPoint,\n width: shape.getWidth() * scale,\n height: shape.getHeigth() * scale,\n line_width: shape.getLineWidth(),\n color: shape.getColor()\n };\n rectangles.push(rectangle);\n }));\n return rectangles;\n }\n getMarkupEllipses() {\n const ellipses = [];\n this.konvaLayerFind(\"Ellipse\").forEach((ref => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n const shape = new KonvaEllipse(null, ref);\n const ellipse = {\n id: shape.id(),\n position: worldPoint,\n radius: {\n x: ref.getRadiusX() * scale,\n y: ref.getRadiusY() * scale\n },\n line_width: shape.getLineWidth(),\n color: shape.getColor()\n };\n ellipses.push(ellipse);\n }));\n return ellipses;\n }\n getMarkupArrows() {\n const arrows = [];\n this.konvaLayerFind(\"Arrow\").forEach((ref => {\n const absoluteTransform = ref.getAbsoluteTransform();\n const atStartPoint = absoluteTransform.point({\n x: ref.points()[0],\n y: ref.points()[1]\n });\n const worldStartPoint = this._worldTransformer.screenToWorld(atStartPoint);\n const atEndPoint = absoluteTransform.point({\n x: ref.points()[2],\n y: ref.points()[3]\n });\n const worldEndPoint = this._worldTransformer.screenToWorld(atEndPoint);\n const shape = new KonvaArrow(null, ref);\n const arrow = {\n id: shape.id(),\n start: worldStartPoint,\n end: worldEndPoint,\n color: shape.getColor()\n };\n arrows.push(arrow);\n }));\n return arrows;\n }\n getMarkupImages() {\n const images = [];\n this.konvaLayerFind(\"Image\").forEach((ref => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n const shape = new KonvaImage(null, ref);\n const image = {\n id: shape.id(),\n position: worldPoint,\n src: shape.getSrc(),\n width: shape.getWidth() * scale,\n height: shape.getHeight() * scale\n };\n images.push(image);\n }));\n return images;\n }\n getMarkupClouds() {\n const clouds = [];\n this.konvaLayerFind(\"Cloud\").forEach((ref => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({\n x: position.x,\n y: position.y\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n const shape = new KonvaCloud(null, ref);\n const cloud = {\n id: shape.id(),\n position: worldPoint,\n width: shape.getWidth() * scale,\n height: shape.getHeigth() * scale,\n line_width: shape.getLineWidth(),\n color: shape.getColor()\n };\n clouds.push(cloud);\n }));\n return clouds;\n }\n combineMarkupWithDrawing() {\n this.clearSelected();\n const tempCanvas = document.createElement(\"canvas\");\n if (this._konvaStage) {\n tempCanvas.width = this._konvaStage.width();\n tempCanvas.height = this._konvaStage.height();\n const ctx = tempCanvas.getContext(\"2d\");\n if (this._container instanceof HTMLCanvasElement) ctx.drawImage(this._container, 0, 0);\n ctx.drawImage(this._konvaStage.toCanvas({\n pixelRatio: window.devicePixelRatio\n }), 0, 0);\n }\n return tempCanvas.toDataURL(\"image/jpeg\", .25);\n }\n addLine(linePoints, color, type, width, id) {\n if (!linePoints || linePoints.length === 0) return;\n const points = [];\n for (let i = 0; i < linePoints.length; i += 2) {\n points.push({\n x: linePoints[i],\n y: linePoints[i + 1]\n });\n }\n const konvaLine = new KonvaLine({\n points: points,\n type: type || this.lineType,\n width: width || this.lineWidth,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaLine);\n return konvaLine;\n }\n createTextInput(pos, inputX, inputY, angle, text) {\n if (!this._textInputRef) {\n this._textInputPos = pos;\n this._textInputAngle = angle;\n this._textInputRef = document.createElement(\"textarea\");\n this._textInputRef.style.zIndex = \"9999\";\n this._textInputRef.style.position = \"absolute\";\n this._textInputRef.style.display = \"block\";\n this._textInputRef.style.top = inputY + \"px\";\n this._textInputRef.style.left = inputX + \"px\";\n this._textInputRef.style.fontSize = `${this.fontSize}px`;\n this._textInputRef.style.color = `${this._markupColor.asHex()}`;\n this._textInputRef.style.fontFamily = \"Calibri\";\n this._textInputRef.onkeydown = event => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n this.removeTextInput();\n }\n };\n if (text) this._textInputRef.value = text;\n document.body.appendChild(this._textInputRef);\n setTimeout((() => {\n this._textInputRef.focus();\n }), 50);\n } else {\n this.removeTextInput();\n }\n }\n removeTextInput() {\n var _a;\n (_a = this._textInputRef) === null || _a === undefined ? undefined : _a.remove();\n this._textInputRef = null;\n this._textInputPos = null;\n this._textInputAngle = 0;\n }\n createImageInput(pos) {\n if (!this._imageInputRef) {\n const convertBase64 = file => new Promise(((resolve, reject) => {\n const fileReader = new FileReader;\n fileReader.readAsDataURL(file);\n fileReader.onload = () => {\n resolve(fileReader.result);\n };\n fileReader.onerror = error => {\n reject(error);\n };\n }));\n this._imageInputPos = pos;\n this._imageInputRef = document.createElement(\"input\");\n this._imageInputRef.style.display = \"none\";\n this._imageInputRef.type = \"file\";\n this._imageInputRef.accept = \"image/png, image/jpeg\";\n this._imageInputRef.onchange = async event => {\n const file = event.target.files[0];\n const base64 = await convertBase64(file);\n this.addImage({\n x: this._imageInputPos.x,\n y: this._imageInputPos.y\n }, base64.toString(), 0, 0);\n };\n this._imageInputRef.oncancel = event => {\n this.removeImageInput();\n };\n document.body.appendChild(this._imageInputRef);\n setTimeout((() => {\n this._imageInputRef.click();\n }), 50);\n } else {\n this.removeImageInput();\n }\n }\n removeImageInput() {\n var _a;\n (_a = this._imageInputRef) === null || _a === undefined ? undefined : _a.remove();\n this._imageInputRef = null;\n this._imageInputPos = null;\n }\n addText(text, position, angle, color, textSize, fontSize, id) {\n var _a;\n if (!text) return;\n (_a = this.getSelectedObjects().at(0)) === null || _a === undefined ? undefined : _a.delete();\n this.clearSelected();\n this.removeTextInput();\n const tolerance = 1e-6;\n if (textSize && textSize > tolerance && (!fontSize || fontSize < tolerance)) {\n const size = .02;\n const scale = this._worldTransformer.getScale();\n fontSize = textSize / (scale.y / size) / 34;\n }\n const konvaText = new KonvaText({\n position: {\n x: position.x,\n y: position.y\n },\n text: text,\n rotation: angle,\n fontSize: fontSize || this.fontSize,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaText);\n return konvaText;\n }\n addRectangle(position, width, height, lineWidth, color, id) {\n if (!position) return;\n const konvaRectangle = new KonvaRectangle({\n position: position,\n width: width,\n height: height,\n lineWidth: lineWidth || this.lineWidth,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaRectangle);\n return konvaRectangle;\n }\n addEllipse(position, radius, lineWidth, color, id) {\n if (!position) return;\n const konvaEllipse = new KonvaEllipse({\n position: position,\n radius: radius,\n lineWidth: lineWidth,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaEllipse);\n return konvaEllipse;\n }\n addArrow(start, end, color, id) {\n if (!start || !end) return;\n const konvaArrow = new KonvaArrow({\n start: start,\n end: end,\n color: color || this._markupColor.asHex(),\n id: id\n });\n this.addObject(konvaArrow);\n return konvaArrow;\n }\n addCloud(position, width, height, lineWidth, color, id) {\n if (!position || !width || !height) return;\n const konvaCloud = new KonvaCloud({\n position: position,\n width: width,\n height: height,\n color: color || this._markupColor.asHex(),\n lineWidth: lineWidth || this.lineWidth,\n id: id\n });\n this.addObject(konvaCloud);\n return konvaCloud;\n }\n addImage(position, src, width, height, id) {\n var _a;\n if (!position || !src) return;\n (_a = this.getSelectedObjects().at(0)) === null || _a === undefined ? undefined : _a.delete();\n this.clearSelected();\n this.removeImageInput();\n const konvaImage = new KonvaImage({\n position: position,\n src: src,\n width: width,\n height: height,\n maxWidth: this._konvaStage.width() - position.x,\n maxHeight: this._konvaStage.height() - position.y,\n id: id\n });\n this.addObject(konvaImage);\n return konvaImage;\n }\n}\n\nexport { KonvaMarkup as Markup };\n//# sourceMappingURL=markup.module.js.map\n","import { EventDispatcher, MOUSE, Quaternion, Spherical, TOUCH, Vector2, Vector3 } from \"three\";\n\n// OrbitControls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: \"change\" };\nconst _startEvent = { type: \"start\" };\nconst _endEvent = { type: \"end\" };\n\nconst STATE = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6,\n};\n\nclass OrbitControls extends EventDispatcher {\n constructor(object, domElement) {\n super();\n\n this.object = object;\n this.domElement = domElement;\n this.domElement.style.touchAction = \"none\"; // disable touch scroll\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n this.minAzimuthAngle = -Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.05;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.panSpeed = 1.0;\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n this.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n // The four arrow keys\n this.keys = { LEFT: \"ArrowLeft\", UP: \"ArrowUp\", RIGHT: \"ArrowRight\", BOTTOM: \"ArrowDown\" };\n\n // Mouse buttons\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n // Touch fingers\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // the target DOM element for key events\n this._domElementKeyEvents = null;\n\n //\n // public methods\n //\n\n this.getPolarAngle = function () {\n return spherical.phi;\n };\n\n this.getAzimuthalAngle = function () {\n return spherical.theta;\n };\n\n this.getDistance = function () {\n return this.object.position.distanceTo(this.target);\n };\n\n this.listenToKeyEvents = function (domElement) {\n domElement.addEventListener(\"keydown\", onKeyDown);\n this._domElementKeyEvents = domElement;\n };\n\n this.stopListenToKeyEvents = function () {\n this._domElementKeyEvents.removeEventListener(\"keydown\", onKeyDown);\n this._domElementKeyEvents = null;\n };\n\n this.saveState = function () {\n scope.target0.copy(scope.target);\n scope.position0.copy(scope.object.position);\n scope.zoom0 = scope.object.zoom;\n };\n\n this.reset = function () {\n scope.target.copy(scope.target0);\n scope.object.position.copy(scope.position0);\n scope.object.zoom = scope.zoom0;\n\n scope.object.updateProjectionMatrix();\n scope.dispatchEvent(_changeEvent);\n\n scope.update();\n\n scope.state = STATE.NONE;\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = (function () {\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0));\n const quatInverse = quat.clone().invert();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n const lastTargetPosition = new Vector3();\n\n const twoPI = 2 * Math.PI;\n\n return function update() {\n const position = scope.object.position;\n\n offset.copy(position).sub(scope.target);\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat);\n\n // angle from z-axis around y-axis\n spherical.setFromVector3(offset);\n\n if (scope.autoRotate && scope.state === STATE.NONE) {\n rotateLeft(getAutoRotationAngle());\n }\n\n if (scope.enableDamping) {\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\n } else {\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle;\n let max = scope.maxAzimuthAngle;\n\n if (isFinite(min) && isFinite(max)) {\n if (min < -Math.PI) min += twoPI;\n else if (min > Math.PI) min -= twoPI;\n\n if (max < -Math.PI) max += twoPI;\n else if (max > Math.PI) max -= twoPI;\n\n if (min <= max) {\n spherical.theta = Math.max(min, Math.min(max, spherical.theta));\n } else {\n spherical.theta =\n spherical.theta > (min + max) / 2 ? Math.max(min, spherical.theta) : Math.min(max, spherical.theta);\n }\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\n spherical.makeSafe();\n\n spherical.radius *= scope.scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\n // move target to panned location\n\n if (scope.enableDamping === true) {\n scope.target.addScaledVector(scope.panOffset, scope.dampingFactor);\n } else {\n scope.target.add(scope.panOffset);\n }\n\n offset.setFromSpherical(spherical);\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse);\n\n position.copy(scope.target).add(offset);\n\n scope.object.lookAt(scope.target);\n\n if (scope.enableDamping === true) {\n sphericalDelta.theta *= 1 - scope.dampingFactor;\n sphericalDelta.phi *= 1 - scope.dampingFactor;\n\n scope.panOffset.multiplyScalar(1 - scope.dampingFactor);\n } else {\n sphericalDelta.set(0, 0, 0);\n\n scope.panOffset.set(0, 0, 0);\n }\n\n scope.scale = 1;\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (\n scope.zoomChanged ||\n lastPosition.distanceToSquared(scope.object.position) > EPS ||\n 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS ||\n lastTargetPosition.distanceToSquared(scope.target) > 0\n ) {\n scope.dispatchEvent(_changeEvent);\n\n lastPosition.copy(scope.object.position);\n lastQuaternion.copy(scope.object.quaternion);\n lastTargetPosition.copy(scope.target);\n\n scope.zoomChanged = false;\n\n return true;\n }\n\n return false;\n };\n })();\n\n this.dispose = function () {\n scope.domElement.removeEventListener(\"contextmenu\", onContextMenu);\n\n scope.domElement.removeEventListener(\"pointerdown\", onPointerDown);\n scope.domElement.removeEventListener(\"pointercancel\", onPointerUp);\n scope.domElement.removeEventListener(\"wheel\", onMouseWheel);\n\n scope.domElement.removeEventListener(\"pointermove\", onPointerMove);\n scope.domElement.removeEventListener(\"pointerup\", onPointerUp);\n\n if (scope._domElementKeyEvents !== null) {\n scope._domElementKeyEvents.removeEventListener(\"keydown\", onKeyDown);\n scope._domElementKeyEvents = null;\n }\n\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n };\n\n //\n // internals\n //\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const scope = this;\n\n scope.state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n scope.scale = 1;\n scope.panOffset = new Vector3();\n scope.zoomChanged = false;\n\n scope.rotateStart = new Vector2();\n scope.rotateEnd = new Vector2();\n scope.rotateDelta = new Vector2();\n\n scope.panStart = new Vector2();\n scope.panEnd = new Vector2();\n scope.panDelta = new Vector2();\n\n scope.dollyStart = new Vector2();\n scope.dollyEnd = new Vector2();\n scope.dollyDelta = new Vector2();\n scope.dollyScale = 0;\n\n scope.pointers = [];\n scope.pointerPositions = {};\n\n function getAutoRotationAngle() {\n return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed;\n }\n\n function getZoomScale() {\n return Math.pow(0.95, scope.zoomSpeed);\n }\n\n function rotateLeft(angle) {\n sphericalDelta.theta -= angle;\n }\n\n function rotateUp(angle) {\n sphericalDelta.phi -= angle;\n }\n\n const panLeft = (function () {\n const v = new Vector3();\n\n return function panLeft(distance, objectMatrix) {\n v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n v.multiplyScalar(-distance);\n\n scope.panOffset.add(v);\n };\n })();\n\n const panUp = (function () {\n const v = new Vector3();\n\n return function panUp(distance, objectMatrix) {\n if (scope.screenSpacePanning === true) {\n v.setFromMatrixColumn(objectMatrix, 1);\n } else {\n v.setFromMatrixColumn(objectMatrix, 0);\n v.crossVectors(scope.object.up, v);\n }\n\n v.multiplyScalar(distance);\n\n scope.panOffset.add(v);\n };\n })();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = (function () {\n const offset = new Vector3();\n\n return function pan(deltaX, deltaY) {\n const element = scope.domElement;\n\n if (scope.object.isPerspectiveCamera) {\n // perspective\n const position = scope.object.position;\n offset.copy(position).sub(scope.target);\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0);\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft((2 * deltaX * targetDistance) / element.clientHeight, scope.object.matrix);\n panUp((2 * deltaY * targetDistance) / element.clientHeight, scope.object.matrix);\n } else if (scope.object.isOrthographicCamera) {\n // orthographic\n panLeft(\n (deltaX * (scope.object.right - scope.object.left)) / scope.object.zoom / element.clientWidth,\n scope.object.matrix\n );\n panUp(\n (deltaY * (scope.object.top - scope.object.bottom)) / scope.object.zoom / element.clientHeight,\n scope.object.matrix\n );\n } else {\n // camera neither orthographic nor perspective\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\");\n scope.enablePan = false;\n }\n };\n })();\n\n function dollyOut(dollyScale) {\n if (scope.object.isPerspectiveCamera) {\n scope.scale /= dollyScale;\n } else if (scope.object.isOrthographicCamera) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n scope.object.updateProjectionMatrix();\n scope.zoomChanged = true;\n } else {\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n scope.enableZoom = false;\n }\n }\n\n function dollyIn(dollyScale) {\n if (scope.object.isPerspectiveCamera) {\n scope.scale *= dollyScale;\n } else if (scope.object.isOrthographicCamera) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n scope.object.updateProjectionMatrix();\n scope.zoomChanged = true;\n } else {\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\");\n scope.enableZoom = false;\n }\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate(event) {\n scope.rotateStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseDownDolly(event) {\n scope.dollyStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseDownPan(event) {\n scope.panStart.set(event.clientX, event.clientY);\n }\n\n function handleMouseMoveRotate(event) {\n scope.rotateEnd.set(event.clientX, event.clientY);\n\n scope.rotateDelta.subVectors(scope.rotateEnd, scope.rotateStart).multiplyScalar(scope.rotateSpeed);\n\n const element = scope.domElement;\n\n rotateLeft((2 * Math.PI * scope.rotateDelta.x) / element.clientHeight); // yes, height\n\n rotateUp((2 * Math.PI * scope.rotateDelta.y) / element.clientHeight);\n\n scope.rotateStart.copy(scope.rotateEnd);\n\n scope.update();\n }\n\n function handleMouseMoveDolly(event) {\n scope.dollyEnd.set(event.clientX, event.clientY);\n\n scope.dollyDelta.subVectors(scope.dollyEnd, scope.dollyStart);\n\n if (scope.dollyDelta.y < 0) {\n scope.dollyScale = 1 / getZoomScale();\n dollyOut(getZoomScale());\n } else if (scope.dollyDelta.y > 0) {\n scope.dollyScale = getZoomScale();\n dollyIn(getZoomScale());\n }\n\n scope.dollyStart.copy(scope.dollyEnd);\n\n scope.update();\n }\n\n function handleMouseMovePan(event) {\n scope.panEnd.set(event.clientX, event.clientY);\n\n scope.panDelta.subVectors(scope.panEnd, scope.panStart).multiplyScalar(scope.panSpeed);\n\n pan(scope.panDelta.x, scope.panDelta.y);\n\n scope.panStart.copy(scope.panEnd);\n\n scope.update();\n }\n\n function handleMouseWheel(event) {\n scope.dollyEnd.set(scope.domElement.clientWidth / 2, scope.domElement.clientHeight / 2);\n\n scope.dollyDelta.set(event.deltaX, event.deltaY);\n\n if (event.deltaY < 0) {\n scope.dollyScale = 1 / getZoomScale();\n dollyIn(getZoomScale());\n } else if (event.deltaY > 0) {\n scope.dollyScale = getZoomScale();\n dollyOut(getZoomScale());\n }\n\n scope.dollyStart.copy(scope.dollyEnd);\n\n scope.update();\n\n if (event.deltaY !== 0) {\n scope.state = STATE.DOLLY;\n scope.dispatchEvent(_changeEvent);\n scope.state = STATE.NONE;\n }\n }\n\n function handleKeyDown(event) {\n let needsUpdate = false;\n\n switch (event.code) {\n case scope.keys.UP:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateUp((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(0, scope.keyPanSpeed);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.BOTTOM:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateUp((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(0, -scope.keyPanSpeed);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.LEFT:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateLeft((2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(scope.keyPanSpeed, 0);\n }\n\n needsUpdate = true;\n break;\n\n case scope.keys.RIGHT:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n rotateLeft((-2 * Math.PI * scope.rotateSpeed) / scope.domElement.clientHeight);\n } else {\n pan(-scope.keyPanSpeed, 0);\n }\n\n needsUpdate = true;\n break;\n }\n\n if (needsUpdate) {\n // prevent the browser from scrolling on cursor keys\n event.preventDefault();\n\n scope.update();\n }\n }\n\n function handleTouchStartRotate() {\n if (scope.pointers.length === 1) {\n scope.rotateStart.set(scope.pointers[0].pageX, scope.pointers[0].pageY);\n } else {\n const x = 0.5 * (scope.pointers[0].pageX + scope.pointers[1].pageX);\n const y = 0.5 * (scope.pointers[0].pageY + scope.pointers[1].pageY);\n\n scope.rotateStart.set(x, y);\n }\n }\n\n function handleTouchStartPan() {\n if (scope.pointers.length === 1) {\n scope.panStart.set(scope.pointers[0].pageX, scope.pointers[0].pageY);\n } else {\n const x = 0.5 * (scope.pointers[0].pageX + scope.pointers[1].pageX);\n const y = 0.5 * (scope.pointers[0].pageY + scope.pointers[1].pageY);\n\n scope.panStart.set(x, y);\n }\n }\n\n function handleTouchStartDolly() {\n const dx = scope.pointers[0].pageX - scope.pointers[1].pageX;\n const dy = scope.pointers[0].pageY - scope.pointers[1].pageY;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n scope.dollyStart.set(0, distance);\n }\n\n function handleTouchStartDollyPan() {\n if (scope.enableZoom) handleTouchStartDolly();\n\n if (scope.enablePan) handleTouchStartPan();\n }\n\n function handleTouchStartDollyRotate() {\n if (scope.enableZoom) handleTouchStartDolly();\n\n if (scope.enableRotate) handleTouchStartRotate();\n }\n\n function handleTouchMoveRotate(event) {\n if (scope.pointers.length == 1) {\n scope.rotateEnd.set(event.pageX, event.pageY);\n } else {\n const position = getSecondPointerPosition(event);\n\n const x = 0.5 * (event.pageX + position.x);\n const y = 0.5 * (event.pageY + position.y);\n\n scope.rotateEnd.set(x, y);\n }\n\n scope.rotateDelta.subVectors(scope.rotateEnd, scope.rotateStart).multiplyScalar(scope.rotateSpeed);\n\n const element = scope.domElement;\n\n rotateLeft((2 * Math.PI * scope.rotateDelta.x) / element.clientHeight); // yes, height\n\n rotateUp((2 * Math.PI * scope.rotateDelta.y) / element.clientHeight);\n\n scope.rotateStart.copy(scope.rotateEnd);\n }\n\n function handleTouchMovePan(event) {\n if (scope.pointers.length === 1) {\n scope.panEnd.set(event.pageX, event.pageY);\n } else {\n const position = getSecondPointerPosition(event);\n\n const x = 0.5 * (event.pageX + position.x);\n const y = 0.5 * (event.pageY + position.y);\n\n scope.panEnd.set(x, y);\n }\n\n scope.panDelta.subVectors(scope.panEnd, scope.panStart).multiplyScalar(scope.panSpeed);\n\n pan(scope.panDelta.x, scope.panDelta.y);\n\n scope.panStart.copy(scope.panEnd);\n }\n\n function handleTouchMoveDolly(event) {\n const position = getSecondPointerPosition(event);\n\n const dx = event.pageX - position.x;\n const dy = event.pageY - position.y;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n scope.dollyEnd.set(0, distance);\n\n scope.dollyDelta.set(0, Math.pow(scope.dollyEnd.y / scope.dollyStart.y, scope.zoomSpeed));\n\n dollyOut(scope.dollyDelta.y);\n\n scope.dollyStart.copy(scope.dollyEnd);\n }\n\n function handleTouchMoveDollyPan(event) {\n if (scope.enableZoom) handleTouchMoveDolly(event);\n\n if (scope.enablePan) handleTouchMovePan(event);\n }\n\n function handleTouchMoveDollyRotate(event) {\n if (scope.enableZoom) handleTouchMoveDolly(event);\n\n if (scope.enableRotate) handleTouchMoveRotate(event);\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown(event) {\n if (scope.enabled === false) return;\n\n if (scope.pointers.length === 0) {\n scope.domElement.setPointerCapture(event.pointerId);\n\n scope.domElement.addEventListener(\"pointermove\", onPointerMove);\n scope.domElement.addEventListener(\"pointerup\", onPointerUp);\n }\n\n //\n\n addPointer(event);\n\n if (event.pointerType === \"touch\") {\n onTouchStart(event);\n } else {\n onMouseDown(event);\n }\n }\n\n function onPointerMove(event) {\n if (scope.enabled === false) return;\n\n if (event.pointerType === \"touch\") {\n onTouchMove(event);\n } else {\n onMouseMove(event);\n }\n }\n\n function onPointerUp(event) {\n removePointer(event);\n\n if (scope.pointers.length === 0) {\n scope.domElement.releasePointerCapture(event.pointerId);\n\n scope.domElement.removeEventListener(\"pointermove\", onPointerMove);\n scope.domElement.removeEventListener(\"pointerup\", onPointerUp);\n }\n\n scope.dispatchEvent(_endEvent);\n\n scope.state = STATE.NONE;\n }\n\n function onMouseDown(event) {\n let mouseAction;\n\n switch (event.button) {\n case 0:\n mouseAction = scope.mouseButtons.LEFT;\n break;\n\n case 1:\n mouseAction = scope.mouseButtons.MIDDLE;\n break;\n\n case 2:\n mouseAction = scope.mouseButtons.RIGHT;\n break;\n\n default:\n mouseAction = -1;\n }\n\n switch (mouseAction) {\n case MOUSE.DOLLY:\n if (scope.enableZoom === false) return;\n\n handleMouseDownDolly(event);\n\n scope.state = STATE.DOLLY;\n\n break;\n\n case MOUSE.ROTATE:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n scope.state = STATE.PAN;\n } else {\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n scope.state = STATE.ROTATE;\n }\n\n break;\n\n case MOUSE.PAN:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n scope.state = STATE.ROTATE;\n } else {\n if (scope.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n scope.state = STATE.PAN;\n }\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n if (scope.state !== STATE.NONE) {\n scope.dispatchEvent(_startEvent);\n }\n }\n\n function onMouseMove(event) {\n switch (scope.state) {\n case STATE.ROTATE:\n if (scope.enableRotate === false) return;\n\n handleMouseMoveRotate(event);\n\n break;\n\n case STATE.DOLLY:\n if (scope.enableZoom === false) return;\n\n handleMouseMoveDolly(event);\n\n break;\n\n case STATE.PAN:\n if (scope.enablePan === false) return;\n\n handleMouseMovePan(event);\n\n break;\n }\n }\n\n function onMouseWheel(event) {\n if (scope.enabled === false || scope.enableZoom === false || scope.state !== STATE.NONE) return;\n\n event.preventDefault();\n\n scope.dispatchEvent(_startEvent);\n\n handleMouseWheel(event);\n\n scope.dispatchEvent(_endEvent);\n }\n\n function onKeyDown(event) {\n if (scope.enabled === false || scope.enablePan === false) return;\n\n handleKeyDown(event);\n }\n\n function onTouchStart(event) {\n trackPointer(event);\n\n switch (scope.pointers.length) {\n case 1:\n switch (scope.touches.ONE) {\n case TOUCH.ROTATE:\n if (scope.enableRotate === false) return;\n\n handleTouchStartRotate();\n\n scope.state = STATE.TOUCH_ROTATE;\n\n break;\n\n case TOUCH.PAN:\n if (scope.enablePan === false) return;\n\n handleTouchStartPan();\n\n scope.state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n break;\n\n case 2:\n switch (scope.touches.TWO) {\n case TOUCH.DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return;\n\n handleTouchStartDollyPan();\n\n scope.state = STATE.TOUCH_DOLLY_PAN;\n\n break;\n\n case TOUCH.DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return;\n\n handleTouchStartDollyRotate();\n\n scope.state = STATE.TOUCH_DOLLY_ROTATE;\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n\n if (scope.state !== STATE.NONE) {\n scope.dispatchEvent(_startEvent);\n }\n }\n\n function onTouchMove(event) {\n trackPointer(event);\n\n switch (scope.state) {\n case STATE.TOUCH_ROTATE:\n if (scope.enableRotate === false) return;\n\n handleTouchMoveRotate(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_PAN:\n if (scope.enablePan === false) return;\n\n handleTouchMovePan(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return;\n\n handleTouchMoveDollyPan(event);\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return;\n\n handleTouchMoveDollyRotate(event);\n\n scope.update();\n\n break;\n\n default:\n scope.state = STATE.NONE;\n }\n }\n\n function onContextMenu(event) {\n if (scope.enabled === false) return;\n\n event.preventDefault();\n }\n\n function addPointer(event) {\n scope.pointers.push(event);\n }\n\n function removePointer(event) {\n delete scope.pointerPositions[event.pointerId];\n\n for (let i = 0; i < scope.pointers.length; i++) {\n if (scope.pointers[i].pointerId == event.pointerId) {\n scope.pointers.splice(i, 1);\n return;\n }\n }\n }\n\n function trackPointer(event) {\n let position = scope.pointerPositions[event.pointerId];\n\n if (position === undefined) {\n position = new Vector2();\n scope.pointerPositions[event.pointerId] = position;\n }\n\n position.set(event.pageX, event.pageY);\n }\n\n function getSecondPointerPosition(event) {\n const pointer = event.pointerId === scope.pointers[0].pointerId ? scope.pointers[1] : scope.pointers[0];\n\n return scope.pointerPositions[pointer.pointerId];\n }\n\n //\n\n scope.domElement.addEventListener(\"contextmenu\", onContextMenu);\n\n scope.domElement.addEventListener(\"pointerdown\", onPointerDown);\n scope.domElement.addEventListener(\"pointercancel\", onPointerUp);\n scope.domElement.addEventListener(\"wheel\", onMouseWheel, { passive: false });\n\n // force an update at start\n\n this.update();\n }\n}\n\nexport { OrbitControls, STATE };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE, TOUCH } from \"three\";\n\nimport type { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\nimport { OrbitControls, STATE } from \"../controls/OrbitControls.js\";\n\nexport class OrbitDragger implements IDisposable {\n protected viewer: Viewer;\n protected orbit: OrbitControls;\n protected changed: boolean;\n\n constructor(viewer: Viewer) {\n this.orbit = new OrbitControls(viewer.camera, viewer.canvas);\n this.orbit.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n this.orbit.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n this.orbit.screenSpacePanning = true;\n this.orbit.rotateSpeed = 0.33;\n this.orbit.addEventListener(\"start\", this.controlsStart);\n this.orbit.addEventListener(\"change\", this.controlsChange);\n this.changed = false;\n this.viewer = viewer;\n this.viewer.on(\"geometryend\", this.updateControls);\n this.viewer.on(\"viewposition\", this.updateControls);\n this.viewer.on(\"zoom\", this.updateControls);\n this.viewer.on(\"drawviewpoint\", this.updateControls);\n this.viewer.on(\"contextmenu\", this.stopContextMenu);\n this.updateControls();\n }\n\n dispose(): void {\n this.viewer.off(\"geometryend\", this.updateControls);\n this.viewer.off(\"viewposition\", this.updateControls);\n this.viewer.off(\"zoom\", this.updateControls);\n this.viewer.off(\"drawviewpoint\", this.updateControls);\n this.viewer.off(\"contextmenu\", this.stopContextMenu);\n\n this.orbit.removeEventListener(\"change\", this.controlsChange);\n this.orbit.dispose();\n }\n\n updateControls = () => {\n this.orbit.maxDistance = this.viewer.camera.far;\n this.orbit.minDistance = this.viewer.camera.near;\n this.orbit.target.copy(this.viewer.target);\n this.orbit.update();\n };\n\n controlsStart = () => {\n this.changed = false;\n };\n\n controlsChange = () => {\n this.viewer.target.copy(this.orbit.target);\n this.viewer.update();\n\n switch (this.orbit.state) {\n case STATE.PAN:\n case STATE.TOUCH_PAN:\n this.viewer.emitEvent({\n type: \"pan\",\n x: this.orbit.panEnd.x,\n y: this.orbit.panEnd.y,\n dX: this.orbit.panDelta.x,\n dY: this.orbit.panDelta.y,\n });\n break;\n\n case STATE.DOLLY:\n this.viewer.emitEvent({\n type: \"zoomat\",\n data: this.orbit.dollyScale,\n x: this.orbit.dollyEnd.x,\n y: this.orbit.dollyEnd.y,\n });\n break;\n }\n\n this.changed = true;\n };\n\n stopContextMenu = (event: PointerEvent) => {\n if (this.changed) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE } from \"three\";\n\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class PanDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.orbit.mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n // this.controls.touches = { ONE: TOUCH.PAN, TWO: TOUCH.DOLLY_ROTATE };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { MOUSE } from \"three\";\n\nimport { OrbitDragger } from \"./OrbitDragger\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ZoomDragger extends OrbitDragger {\n constructor(viewer: Viewer) {\n super(viewer);\n this.orbit.mouseButtons = { LEFT: MOUSE.DOLLY, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.PAN };\n // this.controls.touches = { ONE: TOUCH.DOLLY_PAN, TWO: TOUCH.DOLLY_PAN };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Clock, Camera, Controls, Quaternion, Vector2, Vector3 } from \"three\";\n\ninterface WalkControlsEventMap {\n change: { type: \"change\" };\n walkspeedchange: { type: \"walkspeedchange\"; data: number };\n}\n\nexport class WalkControls extends Controls<WalkControlsEventMap> {\n public movementSpeed = 0.2;\n public lookSpeed = 5;\n public multiplier = 5;\n\n private moveKeys: Set<string>;\n private moveWheel = 0;\n private moveClock: Clock;\n\n private quaternion: Quaternion;\n private downPosition: Vector2;\n private mouseDragOn = false;\n public rotateDelta: Vector2;\n\n constructor(camera: Camera, canvas: HTMLElement) {\n super(camera, canvas);\n\n this.moveKeys = new Set();\n this.moveClock = new Clock();\n\n this.quaternion = camera.quaternion.clone();\n this.downPosition = new Vector2(0, 0);\n this.rotateDelta = new Vector2(0, 0);\n\n this.domElement.addEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.addEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.addEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.addEventListener(\"wheel\", this.onWheel);\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n override dispose() {\n this.domElement.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.domElement.removeEventListener(\"pointermove\", this.onPointerMove);\n this.domElement.removeEventListener(\"pointerup\", this.onPointerUp);\n this.domElement.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.domElement.removeEventListener(\"wheel\", this.onWheel);\n\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.domElement.setPointerCapture(event.pointerId);\n this.downPosition.set(event.clientX, event.clientY);\n this.quaternion.copy(this.object.quaternion);\n this.mouseDragOn = true;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (!this.mouseDragOn) return;\n\n const movePosition = new Vector2(event.clientX, event.clientY);\n if (this.downPosition.distanceTo(movePosition) === 0) return;\n\n this.rotateDelta.copy(this.downPosition).sub(movePosition);\n this.rotateCamera(this.rotateDelta);\n this.dispatchEvent({ type: \"change\" });\n };\n\n onPointerUp = (event: PointerEvent) => {\n this.domElement.releasePointerCapture(event.pointerId);\n this.mouseDragOn = false;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.domElement.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onWheel = (event: WheelEvent) => {\n this.moveWheel = event.deltaY;\n this.update();\n };\n\n onKeyDown = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"NumpadSubtract\":\n case \"Minus\":\n if (this.multiplier > 1) {\n this.multiplier = this.multiplier - 1;\n this.dispatchEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"NumpadAdd\":\n case \"Equal\":\n if (this.multiplier < 10) {\n this.multiplier = this.multiplier + 1;\n this.dispatchEvent({ type: \"walkspeedchange\", data: this.multiplier });\n }\n break;\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"KeyW\":\n case \"KeyS\":\n case \"KeyA\":\n case \"KeyD\":\n case \"KeyQ\":\n case \"KeyE\":\n this.moveKeys.add(event.code);\n this.update();\n break;\n }\n };\n\n onKeyUp = (event: KeyboardEvent) => {\n if (this.moveKeys.delete(event.code)) this.update();\n };\n\n override update() {\n if (this.moveKeys.size > 0) {\n const timeDelta = this.moveClock.getDelta();\n const moveDelta = timeDelta * this.movementSpeed * this.multiplier;\n\n if (this.moveKeys.has(\"KeyW\")) this.object.translateZ(-moveDelta);\n if (this.moveKeys.has(\"KeyS\")) this.object.translateZ(moveDelta);\n\n if (this.moveKeys.has(\"KeyA\")) this.object.translateX(-moveDelta);\n if (this.moveKeys.has(\"KeyD\")) this.object.translateX(moveDelta);\n\n if (this.moveKeys.has(\"KeyQ\")) this.object.translateY(moveDelta);\n if (this.moveKeys.has(\"KeyE\")) this.object.translateY(-moveDelta);\n\n const lookDelta = this.lookSpeed + (this.multiplier - 1);\n\n if (this.moveKeys.has(\"ArrowUp\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, -lookDelta / 2)));\n if (this.moveKeys.has(\"ArrowDown\")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, lookDelta / 2)));\n\n if (this.moveKeys.has(\"ArrowLeft\")) this.rotateCamera(this.rotateDelta.add(new Vector2(lookDelta, 0)));\n if (this.moveKeys.has(\"ArrowRight\")) this.rotateCamera(this.rotateDelta.add(new Vector2(-lookDelta, 0)));\n\n this.moveWheel = 0;\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveWheel !== 0) {\n const moveDelta = this.moveWheel * 0.0001 * this.movementSpeed * this.multiplier;\n\n this.object.translateZ(-moveDelta);\n this.moveWheel += -1 * Math.sign(this.moveWheel);\n this.dispatchEvent({ type: \"change\" });\n }\n\n if (this.moveKeys.size === 0 && this.moveWheel === 0) {\n this.moveClock.stop();\n this.moveClock.autoStart = true;\n }\n }\n\n rotateCamera(delta: Vector2) {\n const rotateX = (Math.PI * delta.x) / this.domElement.clientWidth;\n const rotateY = (Math.PI * delta.y) / this.domElement.clientHeight;\n\n const xRotation = new Quaternion();\n xRotation.setFromAxisAngle(this.object.up, rotateX);\n\n const yRotation = new Quaternion();\n yRotation.setFromAxisAngle(new Vector3(1, 0, 0), rotateY);\n\n const quaternion = this.quaternion.clone();\n quaternion.premultiply(xRotation).multiply(yRotation).normalize();\n\n this.object.setRotationFromQuaternion(quaternion);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { WalkControls } from \"../controls/WalkControls\";\n\nexport class WalkDragger {\n protected viewer: Viewer;\n public controls: WalkControls;\n\n constructor(viewer: Viewer) {\n this.controls = new WalkControls(viewer.camera, viewer.canvas);\n this.controls.addEventListener(\"change\", this.controlsChange);\n this.controls.addEventListener(\"walkspeedchange\", this.walkspeedChange);\n this.viewer = viewer;\n this.viewer.on(\"render\", this.viewerRender);\n this.viewer.on(\"zoom\", this.viewerZoom);\n this.updateControls();\n }\n\n dispose() {\n this.viewer.off(\"render\", this.viewerRender);\n this.viewer.off(\"zoom\", this.viewerZoom);\n this.controls.removeEventListener(\"walkspeedchange\", this.walkspeedChange);\n this.controls.removeEventListener(\"change\", this.controlsChange);\n this.controls.dispose();\n }\n\n updateControls = () => {\n const size = this.viewer.extents.getSize(new Vector3());\n this.controls.movementSpeed = Math.min(size.x, size.y, size.z) / 2;\n };\n\n controlsChange = () => {\n this.viewer.update();\n };\n\n walkspeedChange = (event: any) => {\n this.viewer.emitEvent(event);\n };\n\n viewerRender = () => {\n this.controls.update();\n };\n\n viewerZoom = () => {\n this.controls.rotateDelta.set(0, 0);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport {\n BufferGeometry,\n DoubleSide,\n Float32BufferAttribute,\n Line,\n LineBasicMaterial,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Plane,\n Vector3,\n} from \"three\";\n\nclass PlaneHelper extends Line {\n public plane: Plane;\n public size: number;\n public offset: Vector3;\n public helper: Object3D;\n\n constructor(plane: Plane, size = 1, color = 0xffff00, offset: Vector3 = new Vector3()) {\n // const positions = [1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];\n const positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];\n\n const geometry = new BufferGeometry();\n geometry.setAttribute(\"position\", new Float32BufferAttribute(positions, 3));\n geometry.computeBoundingSphere();\n\n super(geometry, new LineBasicMaterial({ color, toneMapped: false }));\n\n (this as any).type = \"PlaneHelper\";\n\n this.plane = plane;\n this.size = size;\n this.offset = offset;\n\n const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];\n\n const geometry2 = new BufferGeometry();\n geometry2.setAttribute(\"position\", new Float32BufferAttribute(positions2, 3));\n geometry2.computeBoundingSphere();\n\n this.helper = new Mesh(\n geometry2,\n new MeshBasicMaterial({\n color,\n opacity: 0.2,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n side: DoubleSide,\n })\n );\n this.add(this.helper);\n }\n\n dispose() {\n this.geometry.dispose();\n (this.material as any).dispose();\n (this.children[0] as any).geometry.dispose();\n (this.children[0] as any).material.dispose();\n }\n\n override updateMatrixWorld(force: boolean) {\n this.position.set(0, 0, 0);\n this.lookAt(this.plane.normal);\n\n this.position.copy(this.offset);\n this.translateZ(-(this.offset.dot(this.plane.normal) + this.plane.constant));\n\n this.scale.set(0.5 * this.size, 0.5 * this.size, 1);\n\n super.updateMatrixWorld(force);\n }\n}\n\nexport { PlaneHelper };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Object3D, Plane, Vector3 } from \"three\";\nimport { TransformControls } from \"three/examples/jsm/controls/TransformControls.js\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { PlaneHelper } from \"../helpers/PlaneHelper\";\nimport { OrbitDragger } from \"./OrbitDragger\";\n\nexport class CuttingPlaneDragger extends OrbitDragger {\n protected plane: Plane;\n protected planeCenter: Object3D;\n protected planeHelper: PlaneHelper;\n protected transform: TransformControls;\n\n constructor(viewer: Viewer, normal: Vector3, color: number) {\n super(viewer);\n\n const size = viewer.extents.getSize(new Vector3()).length();\n const center = viewer.extents.getCenter(new Vector3());\n const constant = -center.dot(normal);\n\n this.plane = new Plane(normal, constant);\n\n if (!viewer.renderer.clippingPlanes) viewer.renderer.clippingPlanes = [];\n viewer.renderer.clippingPlanes.push(this.plane);\n\n this.planeHelper = new PlaneHelper(this.plane, size, color, center);\n this.viewer.helpers.add(this.planeHelper);\n\n this.planeCenter = new Object3D();\n this.planeCenter.position.copy(viewer.extents.getCenter(new Vector3()));\n this.viewer.helpers.add(this.planeCenter);\n\n this.transform = new TransformControls(viewer.camera, viewer.canvas);\n this.transform.showX = !!normal.x;\n this.transform.showY = !!normal.y;\n this.transform.showZ = !!normal.z;\n this.transform.attach(this.planeCenter);\n this.transform.addEventListener(\"change\", this.transformChange);\n this.transform.addEventListener(\"dragging-changed\", this.transformDrag);\n this.viewer.helpers.add(this.transform.getHelper());\n\n this.viewer.on(\"explode\", this.viewerExplode);\n this.viewer.canvas.addEventListener(\"dblclick\", this.onDoubleClick, true);\n this.viewer.update();\n }\n\n override dispose() {\n this.viewer.off(\"explode\", this.viewerExplode);\n this.viewer.canvas.removeEventListener(\"dblclick\", this.onDoubleClick, true);\n\n this.transform.removeEventListener(\"change\", this.transformChange);\n this.transform.removeEventListener(\"dragging-changed\", this.transformDrag);\n this.transform.getHelper().removeFromParent();\n this.transform.detach();\n this.transform.dispose();\n\n this.planeHelper.removeFromParent();\n this.planeHelper.dispose();\n\n this.planeCenter.removeFromParent();\n\n // this.viewer.renderer.clippingPlanes = this.viewer.renderer.clippingPlanes.filter((plane) => plane !== this.plane);\n // this.viewer.update();\n\n super.dispose();\n }\n\n transformChange = () => {\n this.plane.constant = -this.planeCenter.position.dot(this.plane.normal);\n this.viewer.update();\n };\n\n transformDrag = (event) => {\n this.orbit.enabled = !event.value;\n };\n\n viewerExplode = () => {\n this.planeHelper.size = this.viewer.extents.getSize(new Vector3()).length();\n this.viewer.update();\n };\n\n onDoubleClick = (event: PointerEvent) => {\n event.stopPropagation();\n\n this.plane.negate();\n this.viewer.update();\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneXAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(1, 0, 0), 0xff0000);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneYAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(0, 1, 0), 0x00ff00);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { CuttingPlaneDragger } from \"./CuttingPlaneDragger\";\n\nexport class CuttingPlaneZAxisDragger extends CuttingPlaneDragger {\n constructor(viewer: Viewer) {\n super(viewer, new Vector3(0, 0, 1), 0x0000ff);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Camera, Matrix4, Object3D, Scene, Raycaster, Vector2, Vector3, Vector4 } from \"three\";\n\nimport type { Viewer } from \"../Viewer\";\nimport { OrbitDragger } from \"./OrbitDragger\";\n\nconst PRECISION = 0.01;\n\nexport class MeasureLineDragger extends OrbitDragger {\n private overlay: MeasureOverlay;\n private line: MeasureLine;\n private snapper: MeasureSnapper;\n\n constructor(viewer: Viewer) {\n super(viewer);\n\n this.overlay = new MeasureOverlay(viewer.camera, viewer.canvas);\n this.overlay.attach();\n\n this.line = new MeasureLine(this.overlay);\n this.overlay.addLine(this.line);\n\n this.snapper = new MeasureSnapper(viewer.camera, viewer.canvas);\n this.snapper.update(viewer.scene);\n\n this.viewer.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.viewer.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.canvas.addEventListener(\"pointercancel\", this.onPointerCancel);\n this.viewer.canvas.addEventListener(\"pointerleave\", this.onPointerLeave);\n\n this.viewer.addEventListener(\"render\", this.renderOverlay);\n this.viewer.addEventListener(\"hide\", this.updateSnapper);\n this.viewer.addEventListener(\"isolate\", this.updateSnapper);\n this.viewer.addEventListener(\"showall\", this.updateSnapper);\n }\n\n override dispose() {\n this.viewer.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.viewer.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.viewer.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.viewer.canvas.removeEventListener(\"pointercancel\", this.onPointerCancel);\n this.viewer.canvas.removeEventListener(\"pointerleave\", this.onPointerLeave);\n\n this.viewer.removeEventListener(\"render\", this.renderOverlay);\n this.viewer.removeEventListener(\"hide\", this.updateSnapper);\n this.viewer.removeEventListener(\"isolate\", this.updateSnapper);\n this.viewer.removeEventListener(\"showall\", this.updateSnapper);\n\n this.overlay.detach();\n this.overlay.dispose();\n\n super.dispose();\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n\n this.line.startPoint = this.snapper.getSnapPoint(event);\n this.line.render();\n\n this.viewer.canvas.setPointerCapture(event.pointerId);\n this.orbit.enabled = !this.line.startPoint;\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (this.orbit.enabled && this.orbit.state !== -1) return;\n\n this.line.endPoint = this.snapper.getSnapPoint(event);\n this.line.render();\n\n if (this.line.startPoint) this.changed = true; // <- to prevent context menu\n };\n\n onPointerUp = (event: PointerEvent) => {\n if (this.line.startPoint && this.line.endPoint && this.line.getDistance() >= PRECISION) {\n this.line = new MeasureLine(this.overlay);\n this.overlay.addLine(this.line);\n } else {\n this.line.startPoint = undefined;\n this.line.endPoint = undefined;\n this.line.render();\n }\n\n this.viewer.canvas.releasePointerCapture(event.pointerId);\n this.orbit.enabled = true;\n };\n\n onPointerCancel = (event: PointerEvent) => {\n this.viewer.canvas.dispatchEvent(new PointerEvent(\"pointerup\", event));\n };\n\n onPointerLeave = () => {\n this.line.endPoint = undefined;\n this.line.render();\n };\n\n renderOverlay = () => {\n this.overlay.render();\n };\n\n updateSnapper = () => {\n this.snapper.update(this.viewer.scene);\n };\n}\n\nclass MeasureSnapper {\n private camera: Camera;\n private canvas: HTMLCanvasElement;\n private objects: Object3D[] = [];\n private raycaster: Raycaster;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n this.raycaster = new Raycaster();\n }\n\n getSnapPoint(event: PointerEvent): Vector3 | undefined {\n const mouse = new Vector2(event.clientX, event.clientY);\n\n const rect = this.canvas.getBoundingClientRect();\n const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;\n const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;\n\n const coords = new Vector2(x, y);\n this.raycaster.setFromCamera(coords, this.camera);\n\n this.raycaster.params = {\n Mesh: {},\n Line: { threshold: 0.25 },\n Line2: { threshold: 0.25 },\n LOD: {},\n Points: { threshold: 0.1 },\n Sprite: {},\n };\n\n const intersects = this.raycaster.intersectObjects(this.objects, false);\n if (intersects.length === 0) return undefined;\n\n return intersects[0].point;\n }\n\n update(scene: Scene) {\n this.objects = [];\n scene.traverseVisible((child) => this.objects.push(child));\n }\n}\n\nclass MeasureOverlay {\n public camera: Camera;\n public canvas: HTMLCanvasElement;\n public container: HTMLElement;\n public lines: MeasureLine[] = [];\n public projector: MeasureProjector;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n this.projector = new MeasureProjector(camera, canvas);\n }\n\n attach() {\n this.container = document.createElement(\"div\");\n this.container.id = \"measure-container\";\n this.container.style.background = \"rgba(0,0,0,0)\";\n this.container.style.position = \"absolute\";\n this.container.style.top = \"0px\";\n this.container.style.left = \"0px\";\n this.container.style.width = \"100%\";\n this.container.style.height = \"100%\";\n this.container.style.outline = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.overflow = \"hidden\";\n\n this.canvas.parentElement.appendChild(this.container);\n }\n\n dispose() {\n this.clear();\n }\n\n detach() {\n this.container.remove();\n this.container = undefined;\n }\n\n clear() {\n this.lines.forEach((line) => line.dispose());\n this.lines = [];\n }\n\n render() {\n this.projector.updateProjectionMatrix();\n this.lines.forEach((line) => line.render());\n }\n\n update() {\n this.lines.forEach((line) => line.update());\n }\n\n addLine(line: MeasureLine) {\n this.lines.push(line);\n }\n\n removeLine(line: MeasureLine) {\n this.lines = this.lines.filter((x) => x !== line);\n }\n}\n\nconst _middlePoint = new Vector3();\n\nclass MeasureLine {\n private overlay: MeasureOverlay;\n\n private elementStartPoint: HTMLElement;\n private elementEndPoint: HTMLElement;\n private elementLine: HTMLElement;\n private elementLabel: HTMLElement;\n\n public startPoint: Vector3;\n public endPoint: Vector3;\n\n public id = Date.now();\n public unit = \"\";\n public scale = 1.0;\n public size = 10.0;\n public lineWidth = 2;\n\n public style = {\n border: \"2px solid #FFFFFF\",\n background: \"#009bff\",\n boxShadow: \"0 0 10px rgba(0,0,0,0.5)\",\n color: \"white\",\n font: \"1rem system-ui\",\n };\n\n constructor(overlay: MeasureOverlay) {\n this.overlay = overlay;\n\n this.elementStartPoint = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementEndPoint = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementLine = overlay.container.appendChild(document.createElement(\"div\"));\n this.elementLabel = overlay.container.appendChild(document.createElement(\"div\"));\n\n this.update();\n }\n\n dispose() {\n this.elementStartPoint.remove();\n this.elementEndPoint.remove();\n this.elementLine.remove();\n this.elementLabel.remove();\n }\n\n render() {\n const projector = this.overlay.projector;\n\n if (this.startPoint) {\n const { point, visible } = projector.projectPoint(this.startPoint);\n\n this.elementStartPoint.style.display = visible ? \"block\" : \"none\";\n this.elementStartPoint.style.left = `${point.x}px`;\n this.elementStartPoint.style.top = `${point.y}px`;\n } else {\n this.elementStartPoint.style.display = \"none\";\n }\n\n if (this.endPoint) {\n const { point, visible } = projector.projectPoint(this.endPoint);\n\n this.elementEndPoint.style.display = visible ? \"block\" : \"none\";\n this.elementEndPoint.style.left = `${point.x}px`;\n this.elementEndPoint.style.top = `${point.y}px`;\n } else {\n this.elementEndPoint.style.display = \"none\";\n }\n\n if (this.startPoint && this.endPoint) {\n const { point1, point2, visible } = projector.projectLine(this.startPoint, this.endPoint);\n\n point2.sub(point1);\n const angle = point2.angle();\n const width = point2.length();\n\n this.elementLine.style.display = visible ? \"block\" : \"none\";\n this.elementLine.style.left = `${point1.x}px`;\n this.elementLine.style.top = `${point1.y}px`;\n this.elementLine.style.width = `${width}px`;\n this.elementLine.style.transform = `translate(0px, ${-this.lineWidth / 2}px) rotate(${angle}rad)`;\n } else {\n this.elementLine.style.display = \"none\";\n }\n\n if (this.startPoint && this.endPoint) {\n _middlePoint.lerpVectors(this.startPoint, this.endPoint, 0.5);\n const { point, visible } = projector.projectPoint(_middlePoint);\n\n const distance = this.getDistance();\n\n this.elementLabel.style.display = visible && distance >= PRECISION ? \"block\" : \"none\";\n this.elementLabel.style.left = `${point.x}px`;\n this.elementLabel.style.top = `${point.y}px`;\n this.elementLabel.innerHTML = `${distance.toFixed(2)} ${this.unit}`;\n } else {\n this.elementLabel.style.display = \"none\";\n }\n }\n\n update() {\n this.elementStartPoint.id = `markup-dot-start-${this.id}`;\n this.elementStartPoint.style.position = \"absolute\";\n this.elementStartPoint.style.zIndex = \"2\";\n this.elementStartPoint.style.width = `${this.size}px`;\n this.elementStartPoint.style.height = `${this.size}px`;\n this.elementStartPoint.style.border = this.style.border;\n this.elementStartPoint.style.borderRadius = `${this.size}px`;\n this.elementStartPoint.style.background = this.style.background;\n this.elementStartPoint.style.boxShadow = this.style.boxShadow;\n this.elementStartPoint.style.transform = \"translate(-50%, -50%)\";\n\n this.elementEndPoint.id = `markup-dot-end-${this.id}`;\n this.elementEndPoint.style.position = \"absolute\";\n this.elementEndPoint.style.zIndex = \"2\";\n this.elementEndPoint.style.width = `${this.size}px`;\n this.elementEndPoint.style.height = `${this.size}px`;\n this.elementEndPoint.style.border = this.style.border;\n this.elementEndPoint.style.borderRadius = `${this.size}px`;\n this.elementEndPoint.style.background = this.style.background;\n this.elementEndPoint.style.boxShadow = this.style.boxShadow;\n this.elementEndPoint.style.transform = \"translate(-50%, -50%)\";\n\n this.elementLine.id = `markup-line-${this.id}`;\n this.elementLine.style.position = \"absolute\";\n this.elementLine.style.zIndex = \"1\";\n this.elementLine.style.height = `${this.lineWidth}px`;\n this.elementLine.style.background = this.style.background;\n this.elementLine.style.boxShadow = this.style.boxShadow;\n this.elementLine.style.transformOrigin = `0px ${this.lineWidth / 2}px`;\n\n this.elementLabel.id = `markup-label-${this.id}`;\n this.elementLabel.style.position = \"absolute\";\n this.elementLabel.style.zIndex = \"3\";\n this.elementLabel.style.padding = \"2px\";\n this.elementLabel.style.paddingInline = \"5px\";\n this.elementLabel.style.borderRadius = \"5px\";\n this.elementLabel.style.background = this.style.background;\n this.elementLabel.style.boxShadow = this.style.boxShadow;\n this.elementLabel.style.color = this.style.color;\n this.elementLabel.style.font = this.style.font;\n this.elementLabel.style.transform = \"translate(-50%, -50%)\";\n }\n\n getDistance(): number {\n return this.startPoint.distanceTo(this.endPoint) / this.scale;\n }\n}\n\nlet _widthHalf: number;\nlet _heightHalf: number;\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _vector = new Vector3();\nconst _vector1 = new Vector4();\nconst _vector2 = new Vector4();\nconst point = new Vector2();\nconst point1 = new Vector2();\nconst point2 = new Vector2();\n\nclass MeasureProjector {\n private camera: Camera;\n private canvas: HTMLElement;\n\n constructor(camera: Camera, canvas: HTMLCanvasElement) {\n this.camera = camera;\n this.canvas = canvas;\n }\n\n updateProjectionMatrix() {\n const rect = this.canvas.getBoundingClientRect();\n _widthHalf = rect.width / 2;\n _heightHalf = rect.height / 2;\n\n _viewMatrix.copy(this.camera.matrixWorldInverse);\n _viewProjectionMatrix.multiplyMatrices(this.camera.projectionMatrix, _viewMatrix);\n }\n\n projectPoint(p: Vector3) {\n _vector.copy(p).applyMatrix4(_viewProjectionMatrix);\n const visible = _vector.z >= -1 && _vector.z <= 1;\n\n point.x = (_vector.x + 1) * _widthHalf;\n point.y = (-_vector.y + 1) * _heightHalf;\n\n return { point, visible };\n }\n\n projectLine(p1: Vector3, p2: Vector3) {\n let visible: boolean;\n\n _vector1.copy(p1 as any).applyMatrix4(_viewProjectionMatrix);\n _vector2.copy(p2 as any).applyMatrix4(_viewProjectionMatrix);\n\n // see three/examples/jsm/renderers/Projector.js/clipLine for more details\n\n const bc1near = _vector1.z + _vector1.w;\n const bc2near = _vector2.z + _vector2.w;\n const bc1far = -_vector1.z + _vector1.w;\n const bc2far = -_vector2.z + _vector2.w;\n\n if (bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0) visible = true;\n else if ((bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0)) visible = false;\n else {\n let alpha1 = 0;\n let alpha2 = 1;\n\n if (bc1near < 0) alpha1 = Math.max(alpha1, bc1near / (bc1near - bc2near));\n else if (bc2near < 0) alpha2 = Math.min(alpha2, bc1near / (bc1near - bc2near));\n\n if (bc1far < 0) alpha1 = Math.max(alpha1, bc1far / (bc1far - bc2far));\n else if (bc2far < 0) alpha2 = Math.min(alpha2, bc1far / (bc1far - bc2far));\n\n visible = alpha2 >= alpha1;\n\n if (visible) {\n _vector1.lerp(_vector2, alpha1);\n _vector2.lerp(_vector1, 1 - alpha2);\n }\n }\n\n _vector1.multiplyScalar(1 / _vector1.w);\n _vector2.multiplyScalar(1 / _vector2.w);\n\n point1.x = (_vector1.x + 1) * _widthHalf;\n point1.y = (-_vector1.y + 1) * _heightHalf;\n\n point2.x = (_vector2.x + 1) * _widthHalf;\n point2.y = (-_vector2.y + 1) * _heightHalf;\n\n return { point1, point2, visible };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, Vector3 } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ExtentsComponent implements IDisposable {\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"geometryend\", this.syncExtents);\n this.viewer.addEventListener(\"clear\", this.syncExtents);\n this.viewer.on(\"explode\", this.syncExtents);\n this.viewer.on(\"isolate\", this.syncExtents);\n this.viewer.on(\"hide\", this.syncExtents);\n this.viewer.on(\"showall\", this.syncExtents);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"geometryend\", this.syncExtents);\n this.viewer.removeEventListener(\"clear\", this.syncExtents);\n this.viewer.off(\"explode\", this.syncExtents);\n this.viewer.off(\"isolate\", this.syncExtents);\n this.viewer.off(\"hide\", this.syncExtents);\n this.viewer.off(\"showall\", this.syncExtents);\n }\n\n syncExtents = () => {\n const extents = new Box3();\n this.viewer.models.forEach((model) =>\n model.scene.traverseVisible((object) => !object.children.length && extents.expandByObject(object))\n );\n\n this.viewer.extents.copy(extents);\n this.viewer.target.copy(extents.getCenter(new Vector3()));\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { AmbientLight, DirectionalLight } from \"three\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class LightComponent implements IDisposable {\n protected viewer: Viewer;\n protected ambientLight: AmbientLight;\n protected directionalLight: DirectionalLight;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.ambientLight = new AmbientLight(0xffffff, 0);\n this.viewer.camera.add(this.ambientLight);\n\n this.directionalLight = new DirectionalLight(0xffffff, 1);\n this.directionalLight.position.set(0.5, 0, 0.866); // ~60º\n this.viewer.camera.add(this.directionalLight);\n }\n\n dispose(): void {\n this.ambientLight.removeFromParent();\n this.ambientLight = undefined;\n\n this.directionalLight.removeFromParent();\n this.directionalLight = undefined;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Color, PMREMGenerator } from \"three\";\nimport { RoomEnvironment } from \"three/examples/jsm/environments/RoomEnvironment.js\";\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class BackgroundComponent implements IDisposable {\n protected viewer: Viewer;\n protected backgroundColor: Color;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n\n this.backgroundColor = new Color(0xffffff);\n\n const environment = new RoomEnvironment();\n const pmremGenerator = new PMREMGenerator(this.viewer.renderer);\n\n this.viewer.renderer.setClearColor(this.backgroundColor);\n this.viewer.scene.background = this.backgroundColor;\n this.viewer.scene.environment = pmremGenerator.fromScene(environment).texture;\n this.viewer.addEventListener(\"optionschange\", this.syncOptions);\n\n environment.dispose();\n }\n\n dispose() {\n this.viewer.removeEventListener(\"optionschange\", this.syncOptions);\n this.viewer.scene.environment = undefined;\n this.viewer.scene.background = undefined;\n }\n\n syncOptions = () => {\n this.backgroundColor.setHex(0xffffff);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Vector3 } from \"three\";\n\nimport { GeometryEndEvent } from \"@inweb/viewer-core\";\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class DefaultPositionComponent implements IDisposable {\n protected viewer: Viewer;\n public defaultCameraPositions: any;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.viewer.addEventListener(\"geometryend\", this.geometryEnd);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"geometryend\", this.geometryEnd);\n }\n\n geometryEnd = (event: GeometryEndEvent) => {\n const box = this.viewer.extents;\n const size = box.getSize(new Vector3()).length();\n\n this.viewer.camera.near = size / 100;\n this.viewer.camera.far = size * 100;\n this.viewer.camera.updateMatrixWorld();\n this.viewer.camera.updateProjectionMatrix();\n\n this.viewer.executeCommand(\"setDefaultViewPosition\", \"front\");\n this.viewer.executeCommand(\"zoomToExtents\");\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class ResizeCanvasComponent implements IDisposable {\n protected viewer: Viewer;\n protected resizeObserver: ResizeObserver;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.resizeObserver = new ResizeObserver(this.resizeViewer);\n this.resizeObserver.observe(viewer.canvas.parentElement);\n }\n\n dispose() {\n this.resizeObserver.disconnect();\n }\n\n resizeViewer = (entries: ResizeObserverEntry[]) => {\n const { width, height } = entries[0].contentRect;\n\n if (!width || !height) return; // <- invisible viewer, or viewer with parent removed\n\n this.viewer.camera.aspect = width / height;\n this.viewer.camera.updateProjectionMatrix();\n this.viewer.renderer.setSize(width, height, true);\n\n this.viewer.update(true);\n this.viewer.emitEvent({ type: \"resize\", width, height });\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\n\nexport class RenderLoopComponent implements IDisposable {\n protected viewer: Viewer;\n protected requestId: number;\n\n constructor(viewer: Viewer) {\n this.viewer = viewer;\n this.animate();\n }\n\n dispose() {\n cancelAnimationFrame(this.requestId);\n }\n\n animate = (time = 0) => {\n this.requestId = requestAnimationFrame(this.animate);\n this.viewer.render(time);\n };\n}\n","import {\n Camera,\n CylinderGeometry,\n CanvasTexture,\n Color,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n OrthographicCamera,\n Sprite,\n SpriteMaterial,\n SRGBColorSpace,\n Vector4,\n WebGLRenderer,\n} from \"three\";\n\nexport class WCSHelper extends Object3D {\n private camera: Camera;\n private orthoCamera: OrthographicCamera;\n public size: number;\n\n constructor(camera: Camera) {\n super();\n\n this.camera = camera;\n this.size = 160;\n\n this.orthoCamera = new OrthographicCamera(-2, 2, 2, -2, 0, 4);\n this.orthoCamera.position.set(0, 0, 2);\n\n const matRed = new MeshBasicMaterial({ toneMapped: false, color: \"#aa0000\" });\n const matGreen = new MeshBasicMaterial({ toneMapped: false, color: \"#00aa00\" });\n const matBlue = new MeshBasicMaterial({ toneMapped: false, color: \"#0000aa\" });\n\n const spriteRed = this.getSpriteMaterial(matRed.color, \"X\");\n const spriteGreen = this.getSpriteMaterial(matGreen.color, \"Y\");\n const spriteBlue = this.getSpriteMaterial(matBlue.color, \"Z\");\n\n const lineGeometry = new CylinderGeometry(0.01, 0.01, 1, 3);\n lineGeometry.translate(0, 0.5, 0);\n\n const arrowGeometry = new CylinderGeometry(0, 0.1, 0.25, 12);\n arrowGeometry.translate(0, 0.625, 0);\n\n const axesMap = {\n X: [\n [new Mesh(arrowGeometry, matRed), [0.5, 0, 0], [0, 0, -Math.PI / 2]],\n [new Mesh(lineGeometry, matRed), [0, 0, 0], [0, 0, -Math.PI / 2]],\n [new Sprite(spriteRed), [1.55, 0, 0]],\n ],\n Y: [\n [new Mesh(arrowGeometry, matGreen), [0, 0.5, 0], null],\n [new Mesh(lineGeometry, matGreen), null, null],\n [new Sprite(spriteGreen), [0, 1.55, 0]],\n ],\n Z: [\n [new Mesh(arrowGeometry, matBlue), [0, 0, 0.5], [Math.PI / 2, 0, 0]],\n [new Mesh(lineGeometry, matBlue), null, [Math.PI / 2, 0, 0]],\n [new Sprite(spriteBlue), [0, 0, 1.55]],\n ],\n };\n\n Object.keys(axesMap).forEach((key) => {\n axesMap[key].forEach((objects: any) => {\n const object = objects[0];\n const position = objects[1];\n const rotation = objects[2];\n\n object.name = key;\n if (position) object.position.set(position[0], position[1], position[2]);\n if (rotation) object.rotation.set(rotation[0], rotation[1], rotation[2]);\n object.updateMatrixWorld();\n\n this.add(object);\n });\n });\n }\n\n dispose() {\n this.traverse((object: any) => {\n if (object.geometry) object.geometry.dispose();\n if (object.material) object.material.dispose();\n });\n }\n\n getSpriteMaterial(color: Color, text: string) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 64;\n canvas.height = 64;\n\n const context = canvas.getContext(\"2d\");\n context.clearRect(0, 0, 64, 64);\n context.font = \"24px Arial\";\n context.textAlign = \"center\";\n context.fillStyle = color.getStyle();\n context.fillText(text, 32, 41);\n\n const texture = new CanvasTexture(canvas);\n texture.colorSpace = SRGBColorSpace;\n\n return new SpriteMaterial({ map: texture, toneMapped: false });\n }\n\n render(renderer: WebGLRenderer) {\n this.quaternion.copy(this.camera.quaternion).invert();\n this.updateMatrixWorld();\n\n const clippingPlanes = renderer.clippingPlanes;\n const viewport = renderer.getViewport(new Vector4());\n\n renderer.setViewport(this.position.x, this.position.y, this.size, this.size);\n renderer.clippingPlanes = [];\n renderer.clearDepth();\n renderer.render(this, this.orthoCamera);\n\n renderer.setViewport(viewport);\n renderer.clippingPlanes = clippingPlanes;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IDisposable } from \"../IDisposable\";\nimport type { Viewer } from \"../Viewer\";\nimport { WCSHelper } from \"../helpers/WCSHelper\";\n\nexport class WCSHelperComponent implements IDisposable {\n private wcsHelper: WCSHelper;\n private viewer: Viewer;\n\n constructor(viewer: Viewer) {\n this.wcsHelper = new WCSHelper(viewer.camera);\n this.viewer = viewer;\n this.viewer.addEventListener(\"render\", this.viewerRender);\n }\n\n dispose() {\n this.viewer.removeEventListener(\"render\", this.viewerRender);\n this.wcsHelper.dispose();\n }\n\n viewerRender = () => {\n if (!this.viewer.options.showWCS) return;\n if (this.viewer.extents.isEmpty()) return;\n\n this.wcsHelper.render(this.viewer.renderer);\n };\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Box3, LinearToneMapping, Object3D, PerspectiveCamera, Plane, Scene, Vector3, WebGLRenderer } from \"three\";\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { GLTFLoadingManager } from \"./loaders/GLTFLoadingManager\";\nimport { USDZLoader2 } from \"./loaders/USDZLoader2\";\nimport { IFCXLoader } from \"./loaders/IFCXLoader\";\n\nimport { EventEmitter2 } from \"@inweb/eventemitter2\";\nimport { Assembly, Client, Model, File } from \"@inweb/client\";\nimport {\n CANVAS_EVENTS,\n CanvasEventMap,\n commands,\n IClippingPlane,\n IComponent,\n IDragger,\n IOptions,\n IPerspectiveCamera,\n IPoint,\n IViewer,\n IViewpoint,\n Options,\n OptionsEventMap,\n ViewerEventMap,\n} from \"@inweb/viewer-core\";\nimport { IMarkup, IWorldTransform, Markup } from \"@inweb/markup\";\n\nimport { PanDragger } from \"./draggers/PanDragger\";\nimport { OrbitDragger } from \"./draggers/OrbitDragger\";\nimport { ZoomDragger } from \"./draggers/ZoomDragger\";\nimport { WalkDragger } from \"./draggers/WalkDragger\";\nimport { CuttingPlaneXAxisDragger } from \"./draggers/CuttingPlaneXAxis\";\nimport { CuttingPlaneYAxisDragger } from \"./draggers/CuttingPlaneYAxis\";\nimport { CuttingPlaneZAxisDragger } from \"./draggers/CuttingPlaneZAxis\";\nimport { MeasureLineDragger } from \"./draggers/MeasureLineDragger\";\n\nimport { IDisposable } from \"./IDisposable\";\nimport { ExtentsComponent } from \"./components/ExtentsComponent\";\nimport { LightComponent } from \"./components/LightComponent\";\nimport { BackgroundComponent } from \"./components/BackgroundComponent\";\nimport { DefaultPositionComponent } from \"./components/DefaultPositionComponent\";\nimport { ResizeCanvasComponent } from \"./components/ResizeCanvasComponent\";\nimport { RenderLoopComponent } from \"./components/RenderLoopComponent\";\nimport { SelectionComponent } from \"./components/SelectionComponent\";\n// import { ViewPositionComponent } from \"./components/ViewPositionComponent\";\nimport { WCSHelperComponent } from \"./components/WCSHelperComponent\";\n// import { AxesHelperComponent } from \"./components/AxesHelperComponent\";\n// import { ExtentsHelperComponent } from \"./components/ExtentsHelperComponent\";\n\n/**\n * 3D viewer powered by {@link https://threejs.org/ | Three.js}.\n */\nexport class Viewer\n extends EventEmitter2<ViewerEventMap & CanvasEventMap & OptionsEventMap>\n implements IViewer, IWorldTransform\n{\n public client: Client | undefined;\n protected _options: Options;\n\n private canvaseventlistener: (event: any) => void;\n\n public canvas: HTMLCanvasElement | undefined;\n public canvasEvents: string[];\n\n public scene: Scene | undefined;\n public helpers: Scene | undefined;\n public camera: PerspectiveCamera | undefined;\n public renderer: WebGLRenderer | undefined;\n public models: Array<any>;\n public selected: Array<Object3D>;\n public extents: Box3;\n public target: Vector3;\n\n private draggerFactory: Record<string, any>;\n private _activeDragger: IDragger | null;\n\n private components: Array<IDisposable>;\n\n private renderNeeded: boolean;\n private renderTime: DOMHighResTimeStamp;\n\n private _markup: IMarkup;\n\n /**\n * @param client - The `Client` instance that is used to load model reference files from the\n * Open Cloud Server. Do not specify `Client` if you need a standalone viewer instance to\n * view `glTF` files from the web or from local computer.\n */\n constructor(client?: Client) {\n super();\n this._options = new Options(this);\n\n this.client = client;\n\n this.canvasEvents = CANVAS_EVENTS;\n this.canvaseventlistener = (event: Event) => this.emit(event);\n\n this.extents = new Box3();\n this.target = new Vector3();\n\n this.draggerFactory = {\n Pan: PanDragger,\n Zoom: ZoomDragger,\n Orbit: OrbitDragger,\n Walk: WalkDragger,\n CuttingPlaneXAxis: CuttingPlaneXAxisDragger,\n CuttingPlaneYAxis: CuttingPlaneYAxisDragger,\n CuttingPlaneZAxis: CuttingPlaneZAxisDragger,\n MeasureLine: MeasureLineDragger,\n };\n this._activeDragger = null;\n\n this.models = [];\n this.components = [];\n this.selected = [];\n\n this.renderTime = 0;\n\n this.render = this.render.bind(this);\n this.update = this.update.bind(this);\n\n this._markup = new Markup();\n }\n\n get options(): IOptions {\n return this._options;\n }\n\n get draggers(): string[] {\n return Object.keys(this.draggerFactory);\n }\n\n /**\n * 2D markup core instance used to create markups.\n *\n * @readonly\n */\n get markup(): IMarkup {\n return this._markup;\n }\n\n initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent<EventTarget>) => void): Promise<this> {\n this.addEventListener(\"optionschange\", (event) => this.syncOptions(event.data));\n\n this.scene = new Scene();\n this.helpers = new Scene();\n\n const rect = canvas.parentElement.getBoundingClientRect();\n const width = rect.width || 1;\n const height = rect.height || 1;\n this.camera = new PerspectiveCamera(45, width / height, 0.01, 1000);\n this.camera.up.set(0, 0, 1);\n\n this.renderer = new WebGLRenderer({ canvas, antialias: true, preserveDrawingBuffer: true });\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.setSize(width, height);\n this.renderer.toneMapping = LinearToneMapping;\n\n this.canvas = canvas;\n this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));\n\n this._markup.initialize(this.canvas, this.canvasEvents, this, this);\n\n this.components.push(new ExtentsComponent(this));\n this.components.push(new LightComponent(this));\n this.components.push(new BackgroundComponent(this));\n // this.components.push(new ViewPositionComponent(this));\n this.components.push(new DefaultPositionComponent(this));\n this.components.push(new ResizeCanvasComponent(this));\n this.components.push(new RenderLoopComponent(this));\n this.components.push(new SelectionComponent(this));\n this.components.push(new WCSHelperComponent(this));\n // this.components.push(new AxesHelperComponent(this));\n // this.components.push(new ExtentsHelperComponent(this));\n\n this.syncOptions();\n this.syncOverlay();\n\n this.renderTime = performance.now();\n this.render(this.renderTime);\n\n if (typeof onProgress === \"function\")\n onProgress(new ProgressEvent(\"progress\", { lengthComputable: true, loaded: 1, total: 1 }));\n\n this.emitEvent({ type: \"initializeprogress\", data: 1, loaded: 1, total: 1 });\n this.emitEvent({ type: \"initialize\" });\n\n return Promise.resolve(this);\n }\n\n dispose(): this {\n this.cancel();\n this.emitEvent({ type: \"dispose\" });\n\n this.components.forEach((component: IDisposable) => component.dispose());\n this.components = [];\n\n this.setActiveDragger();\n this.removeAllListeners();\n\n this.clear();\n\n this._markup.dispose();\n\n if (this.canvas) {\n this.canvasEvents.forEach((x) => this.canvas.removeEventListener(x, this.canvaseventlistener));\n this.canvas = undefined;\n }\n\n if (this.renderer) this.renderer.dispose();\n\n this.renderer = undefined;\n this.camera = undefined;\n this.scene = undefined;\n this.helpers = undefined;\n\n return this;\n }\n\n isInitialized(): boolean {\n return !!this.renderer;\n }\n\n public render(time: DOMHighResTimeStamp): void {\n if (!this.renderNeeded) return;\n if (!this.renderer) return;\n\n this.renderNeeded = false;\n\n this.renderer.setViewport(0, 0, this.canvas.offsetWidth, this.canvas.offsetHeight);\n this.renderer.autoClear = true;\n this.renderer.render(this.scene, this.camera);\n\n const clippingPlanes = this.renderer.clippingPlanes;\n this.renderer.clippingPlanes = [];\n this.renderer.autoClear = false;\n this.renderer.render(this.helpers, this.camera);\n this.renderer.clippingPlanes = clippingPlanes;\n\n const deltaTime = (time - this.renderTime) / 1000;\n this.renderTime = time;\n this.emitEvent({ type: \"render\", time, deltaTime });\n }\n\n public update(force = false): void {\n this.renderNeeded = true;\n if (force) this.render(performance.now());\n this.emitEvent({ type: \"update\", data: force });\n }\n\n public syncOptions(options: IOptions = this.options): void {\n // this.update();\n }\n\n loadReferences(model: Model | File | Assembly): Promise<this> {\n // todo: load reference as text fonts\n return Promise.resolve(this);\n }\n\n /**\n * Loads a file from Open Cloud Server into the viewer.\n *\n * The file geometry data on the server must be converted to `glTF` format.\n *\n * This method requires a `Client` instance to be specified when creating the viewer to load\n * model reference files from the Open Cloud Server. For a standalone viewer instance use\n * {@link openGltfFile | openGltfFile()}.\n *\n * If there was an active dragger before opening the file, it will be deactivated. After\n * opening the file, you must manually activate the required dragger.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryChunkEvent | geometrychunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File, assembly or specific model to load. If a `File` instance with multiple\n * models is specified, the default model will be loaded. If there is no default model,\n * first availiable model will be loaded.\n */\n async open(file: Model | File | Assembly): Promise<this> {\n if (!this.renderer) return this;\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\", file, model: file });\n\n if (!file) throw new Error(\"No default model found\");\n\n let database = \"\";\n let path = \"\";\n\n const models = (await file.getModels()) || [];\n const model = models.find((model: Model) => model.default) || models[0];\n if (model) {\n database = model.database;\n path = model.path;\n } else {\n database = file.id + file.type;\n path = `${file.path}/downloads`;\n }\n\n const url = `${file.httpClient.serverUrl}${path}/${database}`;\n const params = { requestHeader: file.httpClient.headers };\n\n await this.loadReferences(file);\n await this.loadGltfFile(url, undefined, params);\n\n return this;\n }\n\n cancel(): this {\n this.emitEvent({ type: \"cancel\" });\n return this;\n }\n\n /**\n * Loads a `glTF` file into the viewer.\n *\n * If there was an active dragger before opening the file, it will be deactivated. After\n * opening the file, you must manually activate the required dragger.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File URL or binary data buffer to load.\n * @param externalData - External resource map such as binary data buffers or images. Each\n * resource should be represented by a `uri` and a corresponding resource URL, or\n * {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object, or\n * {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}\n * or {@link https://developer.mozilla.org/docs/Web/API/Blob/Blob | Blob}, or\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string,\n * @param params - Loader parameters.\n * @param params.fileFormat - File format. If no format is specified, the file extension from\n * the file URL will be used, or `gltf` for binary data. If no appropriate loader is found\n * for the specified format, an exception will be thrown.\n * @param params.path - The base path from which additional resources like textures will be\n * loaded. If not defined, the base path of the file URL will be used.\n * @param params.requestHeader - The\n * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used\n * in HTTP request.\n * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the url\n * from a different domain that allows CORS. Default is `anonymous`.\n * @param params.withCredentials - Whether the XMLHttpRequest uses credentials such as\n * cookies, authorization headers or TLS client certificates. See\n * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.\n */\n openGltfFile(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | globalThis.File | ArrayBuffer | Blob> = new Map(),\n params: {\n fileFormat?: string;\n path?: string;\n requestHeader?: HeadersInit;\n crossOrigin?: string;\n withCredentials?: boolean;\n } = {}\n ): Promise<this> {\n if (!this.renderer) return Promise.resolve(this);\n\n this.cancel();\n this.clear();\n\n this.emitEvent({ type: \"open\" });\n\n return this.loadGltfFile(file, externalData, params);\n }\n\n /**\n * Appends a `glTF` file to the existing opened file.\n *\n * Fires:\n *\n * - {@link OpenEvent | open}\n * - {@link GeometryStartEvent | geometrystart}\n * - {@link GeometryProgressEvent | geometryprogress}\n * - {@link DatabaseChunkEvent | databasechunk}\n * - {@link GeometryEndEvent | geometryend}\n * - {@link GeometryErrorEvent | geometryerror}\n *\n * @param file - File URL or binary data buffer to load.\n * @param externalData - External resource map such as binary data buffers or images. Each\n * resource should be represented by a `uri` and a corresponding resource URL, or\n * {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object, or\n * {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}\n * or {@link https://developer.mozilla.org/docs/Web/API/Blob/Blob | Blob}, or\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string,\n * @param params - Loader parameters.\n * @param params.fileFormat - File format. If no format is specified, the file extension from\n * the file URL will be used, or `gltf` for binary data. If no appropriate loader is found\n * for the specified format, an exception will be thrown.\n * @param params.path - The base path from which additional resources like textures will be\n * loaded. If not defined, the base path of the file URL will be used.\n * @param params.requestHeader - The\n * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used\n * in HTTP request.\n * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the url\n * from a different domain that allows CORS. Default is `anonymous`.\n * @param params.withCredentials - Whether the XMLHttpRequest uses credentials such as\n * cookies, authorization headers or TLS client certificates. See\n * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.\n */\n async loadGltfFile(\n file: string | globalThis.File | ArrayBuffer | Blob,\n externalData: Map<string, string | globalThis.File | ArrayBuffer | Blob> = new Map(),\n params: {\n fileFormat?: string;\n path?: string;\n requestHeader?: HeadersInit;\n crossOrigin?: string;\n withCredentials?: boolean;\n } = {}\n ): Promise<this> {\n const manager = new GLTFLoadingManager(file, externalData, params);\n try {\n this.emitEvent({ type: \"geometrystart\" });\n\n const loaders = {\n gltf: GLTFLoader,\n usdz: USDZLoader2,\n ifcx: IFCXLoader,\n };\n\n let format = params.fileFormat;\n if (!format && typeof file === \"string\") format = file.split(\".\").pop().toLocaleLowerCase();\n if (!format && file instanceof globalThis.File) format = file.name.split(\".\").pop().toLocaleLowerCase();\n if (!format) format = \"gltf\";\n if (!loaders[format]) throw new Error(`Unknown geometry type: ${format}`);\n\n const loader = new loaders[format](manager);\n loader.setPath(manager.path);\n loader.setRequestHeader(params.requestHeader as any);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const model = await loader.loadAsync(manager.fileURL, (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.emitEvent({ type: \"geometryprogress\", data: progress });\n });\n\n if (!this.scene) return this;\n if (!model.scene) throw new Error(\"No scene found\");\n\n this.models.push(model);\n this.scene.add(model.scene);\n\n this.syncOptions();\n this.syncOverlay();\n this.update();\n\n setTimeout(this.update, 0); // <- USDZ specific\n\n this.emitEvent({ type: \"databasechunk\" });\n this.emitEvent({ type: \"geometryend\", data: model.scene });\n } catch (error) {\n this.emitEvent({ type: \"geometryerror\", data: error });\n throw error;\n } finally {\n manager.dispose();\n }\n\n return this;\n }\n\n clear(): this {\n if (!this.renderer) return this;\n\n function disposeMaterial(material: any) {\n const materials = Array.isArray(material) ? material : [material];\n materials.forEach((material: any) => {\n // Object.keys(material).forEach((key) => material[key]?.dispose?.());\n material.dispose();\n });\n }\n\n function disposeObject(object: any) {\n if (object.geometry) object.geometry.dispose();\n if (object.material) disposeMaterial(object.material);\n }\n\n this.setActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n this.clearSelected();\n\n this.helpers.traverse(disposeObject);\n this.helpers.clear();\n\n this.models.forEach((model) => model.scene.traverse(disposeObject));\n this.models.forEach((model) => model.scene.removeFromParent());\n this.models = [];\n\n this.scene.clear();\n\n this.syncOptions();\n this.syncOverlay();\n this.update(true);\n\n this.emitEvent({ type: \"clear\" });\n\n return this;\n }\n\n syncOverlay(): void {\n if (!this.renderer) return;\n\n this._markup.syncOverlay();\n this.update();\n }\n\n clearOverlay(): void {\n if (!this.renderer) return;\n\n this._markup.clearOverlay();\n this.update();\n }\n\n clearSlices(): void {\n if (!this.renderer) return;\n\n this.renderer.clippingPlanes = [];\n this.update();\n }\n\n getSelected(): string[] {\n return this.executeCommand(\"getSelected\");\n }\n\n setSelected(handles?: string[]): void {\n this.executeCommand(\"setSelected\", handles);\n }\n\n clearSelected(): void {\n this.executeCommand(\"clearSelected\");\n }\n\n hideSelected(): void {\n this.executeCommand(\"hideSelected\");\n }\n\n isolateSelected(): void {\n this.executeCommand(\"isolateSelected\");\n }\n\n showAll(): void {\n this.executeCommand(\"showAll\");\n }\n\n explode(index = 0): void {\n this.executeCommand(\"explode\", index);\n }\n\n collect(): void {\n this.executeCommand(\"collect\");\n }\n\n activeDragger(): IDragger | null {\n return this._activeDragger;\n }\n\n setActiveDragger(name = \"\"): IDragger | null {\n if (!this._activeDragger || this._activeDragger.name !== name) {\n if (this._activeDragger) {\n this._activeDragger.dispose();\n this._activeDragger = null;\n }\n if (this.isInitialized()) {\n const Constructor = this.draggerFactory[name];\n if (Constructor) {\n this._activeDragger = new Constructor(this);\n this._activeDragger.name = name;\n }\n }\n const canvas = this.canvas;\n if (canvas) {\n canvas.className = canvas.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${name.toLowerCase()}`)\n .join(\" \");\n }\n this.emitEvent({ type: \"changeactivedragger\", data: name });\n this.update();\n }\n return this._activeDragger;\n }\n\n resetActiveDragger(): void {\n const dragger = this._activeDragger;\n if (dragger) {\n this.setActiveDragger();\n this.setActiveDragger(dragger.name);\n }\n }\n\n is3D(): boolean {\n return true;\n }\n\n screenToWorld(position: { x: number; y: number }): { x: number; y: number; z: number } {\n if (!this.renderer) return { x: position.x, y: position.y, z: 0 };\n\n const rect = this.canvas.getBoundingClientRect();\n const x = position.x / (rect.width / 2) - 1;\n const y = -position.y / (rect.height / 2) + 1;\n\n const point = new Vector3(x, y, -1);\n point.unproject(this.camera);\n\n return { x: point.x, y: point.y, z: point.z };\n }\n\n worldToScreen(position: { x: number; y: number; z: number }): { x: number; y: number } {\n if (!this.renderer) return { x: position.x, y: position.y };\n\n const point = new Vector3(position.x, position.y, position.z);\n point.project(this.camera);\n\n const rect = this.canvas.getBoundingClientRect();\n const x = (point.x + 1) * (rect.width / 2);\n const y = (-point.y + 1) * (rect.height / 2);\n\n return { x, y };\n }\n\n getScale(): { x: number; y: number; z: number } {\n return { x: 1, y: 1, z: 1 };\n }\n\n executeCommand(id: string, ...args: any[]): any {\n return commands(\"ThreeJS\").executeCommand(id, this, ...args);\n }\n\n getComponent(type): any {\n return this.components.find((component) => component instanceof type);\n }\n\n drawViewpoint(viewpoint: IViewpoint): void {\n if (!this.renderer) return;\n\n const getVector3FromPoint3d = ({ x, y, z }): Vector3 => new Vector3(x, y, z);\n\n const setPerspectiveCamera = (camera: IPerspectiveCamera) => {\n if (camera) {\n this.camera.up.copy(getVector3FromPoint3d(camera.up_vector));\n this.camera.fov = camera.field_of_view;\n this.camera.position.copy(getVector3FromPoint3d(camera.view_point));\n this.camera.lookAt(getVector3FromPoint3d(camera.direction).add(this.camera.position));\n this.camera.updateMatrixWorld();\n this.camera.updateProjectionMatrix();\n }\n };\n\n const setClippingPlanes = (clipping_planes: IClippingPlane[]) => {\n clipping_planes?.forEach((clipping_plane) => {\n const plane = new Plane();\n plane.setFromNormalAndCoplanarPoint(\n getVector3FromPoint3d(clipping_plane.direction),\n getVector3FromPoint3d(clipping_plane.location)\n );\n\n this.renderer.clippingPlanes.push(plane);\n });\n };\n\n const setSelection = (selection: IComponent[]) => {\n this.setSelected(selection?.map((component) => component.handle));\n };\n\n const draggerName = this._activeDragger?.name;\n\n this.setActiveDragger();\n this.clearSlices();\n this.clearOverlay();\n\n this.clearSelected();\n this.showAll();\n this.explode();\n\n setPerspectiveCamera(viewpoint.perspective_camera);\n setClippingPlanes(viewpoint.clipping_planes);\n setSelection(viewpoint.selection);\n this._markup.setViewpoint(viewpoint);\n\n this.target = getVector3FromPoint3d(viewpoint.custom_fields?.camera_target ?? this.target);\n\n this.setActiveDragger(draggerName);\n this.emitEvent({ type: \"drawviewpoint\", data: viewpoint });\n this.update();\n }\n\n createViewpoint(): IViewpoint {\n if (!this.renderer) return {};\n\n const getPoint3dFromVector3 = ({ x, y, z }): IPoint => ({ x, y, z });\n\n const getPerspectiveCamera = (): IPerspectiveCamera => {\n return {\n view_point: getPoint3dFromVector3(this.camera.position),\n direction: getPoint3dFromVector3(this.camera.getWorldDirection(new Vector3())),\n up_vector: getPoint3dFromVector3(this.camera.up),\n field_of_view: this.camera.fov,\n };\n };\n\n const getClippingPlanes = (): IClippingPlane[] => {\n const clipping_planes = [];\n this.renderer.clippingPlanes.forEach((plane: Plane) => {\n const clipping_plane = {\n location: getPoint3dFromVector3(plane.coplanarPoint(new Vector3())),\n direction: getPoint3dFromVector3(plane.normal),\n };\n clipping_planes.push(clipping_plane);\n });\n return clipping_planes;\n };\n\n const getSelection = (): IComponent[] => {\n return this.getSelected().map((handle) => ({ handle }));\n };\n\n const viewpoint: IViewpoint = { custom_fields: {} };\n\n viewpoint.perspective_camera = getPerspectiveCamera();\n viewpoint.clipping_planes = getClippingPlanes();\n viewpoint.selection = getSelection();\n viewpoint.description = new Date().toDateString();\n this._markup.getViewpoint(viewpoint);\n\n viewpoint.custom_fields.camera_target = getPoint3dFromVector3(this.target);\n\n this.emitEvent({ type: \"createviewpoint\", data: viewpoint });\n\n return viewpoint;\n }\n}\n"],"names":["Commands","constructor","this","_commands","Map","registerCommand","id","handler","description","thisArg","set","registerCommandAlias","alias","viewer","args","executeCommand","getCommand","get","getCommands","map","forEach","value","key","command","isDraggerCommand","draggers","includes","setActiveDragger","console","warn","undefined","result","apply","emit","type","data","commands","viewerType","defaultOptions","showWCS","cameraAnimation","antialiasing","groundShadow","shadows","cameraAxisXSpeed","cameraAxisYSpeed","ambientOcclusion","enableStreamingMode","enablePartialMode","memoryLimit","cuttingPlaneFillColor","red","green","blue","edgesColor","r","g","b","facesColor","edgesVisibility","edgesOverlap","facesOverlap","facesTransparancy","enableCustomHighlight","sceneGraph","edgeModel","reverseZoomWheel","enableZoomWheel","enableGestures","geometryType","rulerUnit","Options","emitter","_emitter","_data","loadFromStorage","defaults","notifierChangeEvent","change","saveToStorage","window","localStorage","setItem","JSON","stringify","error","item","getItem","parse","resetToDefaults","fields","resetData","reduce","acc","field","Boolean","CanvasEvents","CANVAS_EVENTS","Dragger","name","initialize","dispose","updatePreview","applyModelTransform","model","clearOverlay","SelectionComponent","onPointerDown","event","isPrimary","button","getMousePosition","downPosition","onPointerUp","upPosition","Vector2","distanceTo","intersects","getPointerIntersects","clearSelection","length","select","object","update","emitEvent","handles","getSelected","onDoubleClick","optionsChange","options","facesMaterial","color","setRGB","opacity","raycaster","Raycaster","MeshBasicMaterial","transparent","addEventListener","removeEventListener","target","clientX","clientY","mouse","rect","canvas","getBoundingClientRect","x","left","width","y","top","height","coords","setFromCamera","camera","objects","scene","traverseVisible","child","push","params","Mesh","Line","threshold","Line2","LOD","Points","Sprite","intersectObjects","isSelected","originalMaterial","material","selected","clearSelected","selection","clearSlices","createPreview","encoderOptions","toDataURL","calcObjectDepth","depth","res","children","objectDepth","originalPosition","position","clone","explodeScene","scale","maxDepth","explodeDepth","explodeObject","parentCenter","parentOffset","objectBox","Box3","setFromObject","objectCenter","getCenter","Vector3","objectOffset","offset","sub","multiplyScalar","add","copy","direction","normalize","sceneExtents","sceneCenter","explode","index","models","gltf","defaultViewPositions","bottom","right","front","back","sw","se","ne","nw","setDefaultViewPosition","center","extents","sphere","getBoundingSphere","Sphere","offet","radius","lookAt","updateProjectionMatrix","updateMatrixWorld","getDefaultViewPositions","Object","keys","getModels","userData","handle","filter","_a","hideSelected","visible","isolateSelected","selectedSet","Set","isolateObject","canBeIsolated","has","regenerateAll","resetView","selectModel","dragger","setSelected","handleSet","showAll","traverse","zoomToExtents","isEmpty","distance","delta","applyQuaternion","quaternion","zoomToObjects","expandByObject","zoomToSelected","GLTFLoadingManager","LoadingManager","file","externalData","super","path","resourcePath","fileURL","dataURLs","LoaderUtils","extractUrlBase","dataURL","URL","createObjectURL","Blob","setURLModifier","url","decodeURI","replace","revokeObjectURL","USDZLoader2","USDZLoader","buffer","load","onLoad","onProgress","onError","THREE","BufferAttribute","BufferGeometry","Color","Group","LineBasicMaterial","Matrix4","PerspectiveCamera","Scene","datas","autoCamera","init","innerWidth","innerHeight","up","getChildByName","root","childName","skip","fragments","split","i","shift","f","find","reverse","createMaterialFromParent","parent","reference","attributes","materialNode","ref","shader","createCurveFromJson","node","points","Float32Array","flat","geometry","setAttribute","lineMaterial","createMeshFromJson","indices","Uint16Array","setIndex","computeVertexNormals","meshMaterial","traverseTree","parentNode","elem","matrixAutoUpdate","matrixNode","matrix","transpose","collectNames","compose","compositionEdges","flattenAttributes","prim","k","vs","entries","attrs","fromEntries","kk","vv","addEdge","a","collectPaths","nodes","paths","parentPathStr","isFullyQualified","reverseWhenFullyQualified","pathStr","nodeId","nodeIdComplete","N","def","ih","inherits","substring","endsWith","n","removeDuplicates","map_of_arrays","array","indexOf","maps","compositionEdgesOrig","composePrim","concat","dep","e","extraItemsInDeps","values","st","Array","from","hasOwnProperty","m","some","composed","built","p","opinions","updateName","oldPrefix","newPrefix","RegExp","c","maxIterations","bottomRankNodes","_","size","v","log","definedPrims","startsWith","search","assign","orderedSet","d","composeAndRender","tree","arr","boundingBox","avg","min","max","ext","far","addModel","clear","IFCXLoader","Loader","loader","FileLoader","manager","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","itemError","EventEmitter2","_listeners","listener","listeners","removeAllListeners","invoke","slice","call","on","off","WorldTransform","screenToWorld","z","worldToScreen","getScale","MarkupColor","setColor","asHex","HEX","asRGB","R","G","B","rgbToHex","valueToHex","hex","toString","LineTypeSpecs","KonvaLine","_b","_ref","konvaPoints","point","Konva","stroke","strokeWidth","globalCompositeOperation","lineCap","lineJoin","draggable","strokeScaleEnabled","dash","rotation","_id","enableMouseEditing","getColor","getRotation","setRotation","degrees","getZIndex","zIndex","setZIndex","destroy","getPoints","setLineWidth","getLineWidth","getLineType","typeSpecs","setLineType","specs","addPoints","newPoints","KonvaText","_c","TEXT_FONT_FAMILY","text","Text","fontSize","fontFamily","fill","align","getTextWidth","scaleByX","Math","abs","scaleX","scaleByY","scaleY","newWidth","newHeight","minWidth","round","getFontSize","getText","setText","getPosition","setPosition","setFontSize","KonvaRectangle","_d","Rect","lineWidth","minHeight","getWidth","getHeigth","setWidth","w","setHeight","h","KonvaEllipse","Ellipse","radiusX","radiusY","newRadiusX","newRadiusY","minRadiusX","minRadiusY","evt","ctrlKey","shiftKey","getRadiusX","setRadiusX","getRadiusY","setRadiusY","KonvaArrow","start","end","Arrow","setPoints","getStartPoint","setStartPoint","getEndPoint","setEndPoint","KonvaImage","_ratio","EPSILON","BASE64_HEADER_START","BASE64_NOT_FOUND","src","_canvasImage","image","Image","onload","maxWidth","heightOutOfCanvas","maxHeight","widthOutOfCanvas","onerror","getSrc","setSrc","getHeight","KonvaCloud","arcRadius","Shape","sceneFunc","context","shape","calculateMidpoint","midX","midY","midPoint","baseArcLength","beginPath","iPoint","approxArcLength","dx","dy","sqrt","arcCount","floor","lengthMod","pX","pY","pEndX","pEndY","endAngle","atan","startAngle","PI","counterClockwise","iArc","arc","closePath","fillStrokeShape","className","getSelfRect","MarkupMode2Konva","SelectMarkup","initializer","Rectangle","Cloud","KonvaMarkup","_containerEvents","_markupIsActive","_markupColor","lineType","changeActiveDragger","draggerName","_markupContainer","_container","toLowerCase","join","removeTextInput","removeImageInput","enableEditMode","resizeContainer","contentRect","_konvaStage","pan","newPos","dX","dY","zoomAt","newScale","redirectToViewer","_viewer","getRelativePointPosition","transform","getAbsoluteTransform","invert","getRelativePointerPosition","getStage","getPointerPosition","container","containerEvents","worldTransformer","Error","_worldTransformer","document","createElement","style","outline","pointerEvents","parentDiv","parentElement","appendChild","_resizeObserver","ResizeObserver","observe","initializeKonva","destroyKonva","disconnect","remove","syncOverlay","getObjects","obj","delete","getMarkupColor","setMarkupColor","colorizeAllMarkup","hexColor","colorizeSelectedMarkups","getSelectedObjects","setViewpoint","viewpoint","_e","_f","_g","_h","markupColor","custom_fields","markup_color","lines","line","linePoints","screenPoint","addLine","texts","addText","angle","text_size","font_size","rectangles","addRectangle","line_width","ellipses","ellipse","addEllipse","arrows","arrow","startPoint","endPoint","addArrow","clouds","cloud","addCloud","images","addImage","getViewpoint","getMarkupLines","getMarkupTexts","getMarkupArrows","getMarkupClouds","getMarkupEllipses","getMarkupImages","getMarkupRectangles","snapshot","combineMarkupWithDrawing","mode","_markupMode","createObject","konvaShape","addObject","konvaLayerFind","_konvaTransformer","selectObjects","selectedObjs","_groupImages","_groupTexts","_groupGeometry","_konvaLayer","stage","Stage","clientWidth","clientHeight","layer","Layer","pixelRation","devicePixelRatio","transformer","Transformer","shouldOverdrawWholeArea","keepRatio","flipEnabled","isPaint","lastLine","mouseDownPos","lastObj","pos","defParams","startX","startY","_textInputRef","_textInputPos","_textInputAngle","createTextInput","pageX","pageY","_imageInputRef","_imageInputPos","createImageInput","rotateEnabled","metaPressed","metaKey","splice","tabIndex","focus","code","preventDefault","worldPoints","absoluteTransform","atPoint","worldPoint","konvaLine","textSize","textScale","stageAbsoluteTransform","getMatrix","rectangle","atStartPoint","worldStartPoint","atEndPoint","worldEndPoint","tempCanvas","ctx","getContext","HTMLCanvasElement","drawImage","toCanvas","pixelRatio","inputX","inputY","display","onkeydown","body","setTimeout","convertBase64","Promise","resolve","reject","fileReader","FileReader","readAsDataURL","accept","onchange","async","files","base64","oncancel","click","at","tolerance","konvaText","konvaRectangle","konvaEllipse","konvaArrow","konvaCloud","konvaImage","_changeEvent","_startEvent","_endEvent","STATE","NONE","ROTATE","DOLLY","PAN","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","TOUCH_DOLLY_ROTATE","OrbitControls","EventDispatcher","domElement","touchAction","enabled","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","panSpeed","screenSpacePanning","keyPanSpeed","autoRotate","autoRotateSpeed","LEFT","UP","RIGHT","BOTTOM","mouseButtons","MOUSE","MIDDLE","touches","ONE","TOUCH","TWO","DOLLY_PAN","target0","position0","zoom0","zoom","_domElementKeyEvents","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","getDistance","listenToKeyEvents","onKeyDown","stopListenToKeyEvents","saveState","scope","reset","dispatchEvent","state","quat","Quaternion","setFromUnitVectors","quatInverse","lastPosition","lastQuaternion","lastTargetPosition","twoPI","setFromVector3","rotateLeft","getAutoRotationAngle","sphericalDelta","isFinite","makeSafe","addScaledVector","panOffset","setFromSpherical","zoomChanged","distanceToSquared","EPS","dot","onContextMenu","onMouseWheel","onPointerMove","Spherical","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","dollyScale","pointers","pointerPositions","getZoomScale","pow","rotateUp","panLeft","objectMatrix","setFromMatrixColumn","panUp","crossVectors","deltaX","deltaY","element","isPerspectiveCamera","targetDistance","tan","fov","isOrthographicCamera","dollyOut","dollyIn","handleMouseDownRotate","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","needsUpdate","handleTouchStartRotate","handleTouchStartPan","handleTouchStartDolly","handleTouchStartDollyPan","handleTouchStartDollyRotate","handleTouchMoveRotate","getSecondPointerPosition","handleTouchMovePan","handleTouchMoveDolly","handleTouchMoveDollyPan","handleTouchMoveDollyRotate","setPointerCapture","pointerId","addPointer","pointerType","onTouchStart","onMouseDown","onTouchMove","onMouseMove","removePointer","releasePointerCapture","mouseAction","trackPointer","DOLLY_ROTATE","pointer","passive","OrbitDragger","updateControls","orbit","near","controlsStart","changed","controlsChange","stopContextMenu","stopPropagation","PanDragger","ZoomDragger","WalkControls","Controls","movementSpeed","lookSpeed","multiplier","moveWheel","mouseDragOn","movePosition","rotateCamera","onPointerCancel","PointerEvent","onWheel","moveKeys","onKeyUp","moveClock","Clock","timeDelta","getDelta","moveDelta","translateZ","translateX","translateY","lookDelta","sign","stop","autoStart","rotateX","rotateY","xRotation","setFromAxisAngle","yRotation","premultiply","multiply","setRotationFromQuaternion","WalkDragger","getSize","controls","walkspeedChange","viewerRender","viewerZoom","PlaneHelper","plane","positions","Float32BufferAttribute","computeBoundingSphere","toneMapped","positions2","geometry2","helper","depthWrite","side","DoubleSide","force","normal","constant","CuttingPlaneDragger","transformChange","planeCenter","transformDrag","viewerExplode","planeHelper","negate","Plane","renderer","clippingPlanes","helpers","Object3D","TransformControls","showX","showY","showZ","attach","getHelper","removeFromParent","detach","CuttingPlaneXAxisDragger","CuttingPlaneYAxisDragger","CuttingPlaneZAxisDragger","PRECISION","MeasureLineDragger","snapper","getSnapPoint","render","MeasureLine","overlay","onPointerLeave","renderOverlay","updateSnapper","MeasureOverlay","MeasureSnapper","projector","MeasureProjector","background","overflow","removeLine","_middlePoint","Date","now","unit","border","boxShadow","font","elementStartPoint","elementEndPoint","elementLine","elementLabel","projectPoint","point1","point2","projectLine","lerpVectors","innerHTML","toFixed","borderRadius","transformOrigin","padding","paddingInline","_widthHalf","_heightHalf","_viewMatrix","_viewProjectionMatrix","_vector","_vector1","Vector4","_vector2","matrixWorldInverse","multiplyMatrices","projectionMatrix","applyMatrix4","p1","p2","bc1near","bc2near","bc1far","bc2far","alpha1","alpha2","lerp","ExtentsComponent","syncExtents","LightComponent","ambientLight","AmbientLight","directionalLight","DirectionalLight","BackgroundComponent","syncOptions","backgroundColor","setHex","environment","RoomEnvironment","pmremGenerator","PMREMGenerator","setClearColor","fromScene","texture","DefaultPositionComponent","geometryEnd","box","ResizeCanvasComponent","resizeViewer","aspect","setSize","resizeObserver","RenderLoopComponent","animate","time","requestId","requestAnimationFrame","cancelAnimationFrame","WCSHelper","orthoCamera","OrthographicCamera","matRed","matGreen","matBlue","spriteRed","getSpriteMaterial","spriteGreen","spriteBlue","lineGeometry","CylinderGeometry","translate","arrowGeometry","axesMap","X","Y","Z","clearRect","textAlign","fillStyle","getStyle","fillText","CanvasTexture","colorSpace","SRGBColorSpace","SpriteMaterial","viewport","getViewport","setViewport","clearDepth","WCSHelperComponent","wcsHelper","Viewer","client","_options","canvasEvents","canvaseventlistener","draggerFactory","Pan","Zoom","Orbit","Walk","CuttingPlaneXAxis","CuttingPlaneYAxis","CuttingPlaneZAxis","_activeDragger","components","renderTime","bind","_markup","Markup","markup","WebGLRenderer","antialias","preserveDrawingBuffer","setPixelRatio","toneMapping","LinearToneMapping","performance","ProgressEvent","lengthComputable","loaded","total","cancel","component","isInitialized","renderNeeded","offsetWidth","offsetHeight","autoClear","deltaTime","loadReferences","open","database","default","httpClient","serverUrl","headers","loadGltfFile","openGltfFile","loaders","GLTFLoader","usdz","ifcx","format","fileFormat","pop","toLocaleLowerCase","globalThis","File","setCrossOrigin","crossOrigin","loadAsync","progress","disposeMaterial","materials","isArray","disposeObject","collect","activeDragger","Constructor","resetActiveDragger","is3D","unproject","project","getComponent","drawViewpoint","getVector3FromPoint3d","setPerspectiveCamera","up_vector","field_of_view","view_point","setClippingPlanes","clipping_planes","clipping_plane","setFromNormalAndCoplanarPoint","location","setSelection","perspective_camera","camera_target","createViewpoint","getPoint3dFromVector3","getPerspectiveCamera","getWorldDirection","getClippingPlanes","coplanarPoint","getSelection","toDateString"],"mappings":"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"}
|