{"version":3,"file":"vendor.openbim-components-e54f7391.6ed80e971e0d14c3.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/measurement/AreaMeasurement/src/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/AreaMeasurement/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/EdgeMeasurement/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/FaceMeasurement/index.js"],"sourcesContent":["import * as THREE from \"three\";\r\nimport { Simple2DMarker } from \"../../../core\";\r\nimport { Event, Component } from \"../../../base-types\";\r\nimport { DimensionLabelClassName, SimpleDimensionLine, } from \"../../SimpleDimensionLine\";\r\nexport class AreaMeasureElement extends Component {\r\n constructor(components, points) {\r\n super(components);\r\n this.name = \"AreaShape\";\r\n this.enabled = true;\r\n this.visible = true;\r\n this.points = [];\r\n this.workingPlane = null;\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this._rotationMatrix = null;\r\n this._dimensionLines = [];\r\n this._defaultLineMaterial = new THREE.LineBasicMaterial({ color: \"red\" });\r\n this.onAreaComputed = new Event();\r\n this.onWorkingPlaneComputed = new Event();\r\n this.onPointAdded = new Event();\r\n this.onPointRemoved = new Event();\r\n const htmlText = document.createElement(\"div\");\r\n htmlText.className = DimensionLabelClassName;\r\n this.labelMarker = new Simple2DMarker(components, htmlText);\r\n this.labelMarker.visible = false;\r\n this.onPointAdded.add((point) => {\r\n if (this.points.length === 3 && !this._dimensionLines[2]) {\r\n this.addDimensionLine(point, this.points[0]);\r\n this.labelMarker.visible = true;\r\n }\r\n });\r\n points?.forEach((point) => this.setPoint(point));\r\n }\r\n setPoint(point, index) {\r\n let _index;\r\n if (!index) {\r\n _index = this.points.length === 0 ? 0 : this.points.length;\r\n }\r\n else {\r\n _index = index;\r\n }\r\n if (_index === 0) {\r\n this.points[0] = point;\r\n return;\r\n }\r\n if (_index < 0 || _index > this.points.length)\r\n return;\r\n const existingIndex = this.points.length > _index;\r\n this.points[_index] = point;\r\n this.onPointAdded.trigger(point);\r\n if (!existingIndex) {\r\n this.addDimensionLine(this.points[_index - 1], point);\r\n }\r\n const { previousLine, nextLine } = this.getLinesBetweenIndex(_index);\r\n if (previousLine)\r\n previousLine.endPoint = point;\r\n if (nextLine)\r\n nextLine.startPoint = point;\r\n }\r\n removePoint(index) {\r\n if (this.points.length === 3)\r\n return;\r\n this.points.splice(index, 1);\r\n const { previousLine, nextLine } = this.getLinesBetweenIndex(index);\r\n if (nextLine)\r\n previousLine.endPoint = nextLine.endPoint;\r\n nextLine?.dispose();\r\n this._dimensionLines.splice(index, 1);\r\n this.onPointRemoved.trigger();\r\n }\r\n toggleLabel() {\r\n this.labelMarker.toggleVisibility();\r\n }\r\n addDimensionLine(start, end) {\r\n const element = document.createElement(\"div\");\r\n element.className = \"w-2 h-2 bg-red-600 rounded-full\";\r\n const dimensionLine = new SimpleDimensionLine(this.components, {\r\n start,\r\n end,\r\n lineMaterial: this._defaultLineMaterial,\r\n endpointElement: element,\r\n });\r\n dimensionLine.toggleLabel();\r\n if (this._dimensionLines.length > 1) {\r\n this._dimensionLines.splice(this._dimensionLines.length - 1, 0, dimensionLine);\r\n }\r\n else {\r\n this._dimensionLines.push(dimensionLine);\r\n }\r\n return dimensionLine;\r\n }\r\n getLinesBetweenIndex(index) {\r\n const previousLineIndex = index === 0 ? this._dimensionLines.length - 1 : index - 1;\r\n const previousLine = this._dimensionLines[previousLineIndex];\r\n const nextLine = this._dimensionLines[index];\r\n return { previousLine, nextLine };\r\n }\r\n computeWorkingPlane() {\r\n this.workingPlane = new THREE.Plane().setFromCoplanarPoints(this.points[0], this.points[1], this.points[2]);\r\n const referenceVector = new THREE.Vector3(0, 1, 0);\r\n const theta = this.workingPlane.normal.angleTo(referenceVector);\r\n const rotationAxis = new THREE.Vector3()\r\n .crossVectors(this.workingPlane.normal, referenceVector)\r\n .normalize();\r\n this._rotationMatrix = new THREE.Matrix4().makeRotationAxis(rotationAxis, theta);\r\n this.onWorkingPlaneComputed.trigger(this.workingPlane);\r\n }\r\n computeArea() {\r\n if (!(this._rotationMatrix && this.workingPlane)) {\r\n this.onAreaComputed.trigger(0);\r\n return 0;\r\n }\r\n let xSum = 0;\r\n let ySum = 0;\r\n const rotMatrix = this._rotationMatrix;\r\n const vectors2D = this.points.map((point) => {\r\n const transformedPoint = point.clone().applyMatrix4(rotMatrix);\r\n const vector2D = new THREE.Vector2(transformedPoint.x, transformedPoint.z);\r\n xSum += vector2D.x;\r\n ySum += vector2D.y;\r\n return vector2D;\r\n });\r\n const area = Math.abs(THREE.ShapeUtils.area(vectors2D));\r\n this.labelMarker.get().element.textContent = `${area.toFixed(2)} m²`;\r\n this.labelMarker\r\n .get()\r\n .position.set(xSum / vectors2D.length, -this.workingPlane.constant, ySum / vectors2D.length)\r\n .applyMatrix4(rotMatrix.clone().invert());\r\n this.onAreaComputed.trigger(area);\r\n return area;\r\n }\r\n async dispose() {\r\n this.onAreaComputed.reset();\r\n this.onWorkingPlaneComputed.reset();\r\n this.onPointAdded.reset();\r\n this.onPointRemoved.reset();\r\n for (const line of this._dimensionLines) {\r\n line.dispose();\r\n }\r\n await this.labelMarker.dispose();\r\n this._dimensionLines = [];\r\n this.points = [];\r\n this._rotationMatrix = null;\r\n this.workingPlane = null;\r\n this._defaultLineMaterial.dispose();\r\n this.components = null;\r\n await this.onDisposed.trigger();\r\n this.onDisposed.reset();\r\n }\r\n get() {\r\n return {\r\n points: this.points,\r\n workingPlane: this.workingPlane,\r\n area: this.computeArea(),\r\n };\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map","import { Event, Component, UIElement, } from \"../../base-types\";\r\nimport { ToolComponent } from \"../../core\";\r\nimport { Button } from \"../../ui\";\r\nimport { VertexPicker } from \"../../utils\";\r\nimport { AreaMeasureElement } from \"./src\";\r\nexport class AreaMeasurement extends Component {\r\n set enabled(value) {\r\n this._enabled = value;\r\n this._vertexPicker.enabled = value;\r\n if (this.components.uiEnabled) {\r\n const main = this.uiElement.get(\"main\");\r\n main.active = value;\r\n }\r\n this.setupEvents(value);\r\n if (!value)\r\n this.cancelCreation();\r\n }\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set workingPlane(plane) {\r\n this._vertexPicker.workingPlane = plane;\r\n }\r\n get workingPlane() {\r\n return this._vertexPicker.workingPlane;\r\n }\r\n constructor(components) {\r\n super(components);\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this.uiElement = new UIElement();\r\n this._enabled = false;\r\n this._currentAreaElement = null;\r\n this._clickCount = 0;\r\n this._measurements = [];\r\n this.onBeforeCreate = new Event();\r\n this.onAfterCreate = new Event();\r\n this.onBeforeCancel = new Event();\r\n this.onAfterCancel = new Event();\r\n this.onBeforeDelete = new Event();\r\n this.onAfterDelete = new Event();\r\n this.create = () => {\r\n if (!this.enabled)\r\n return;\r\n const point = this._vertexPicker.get();\r\n if (!point)\r\n return;\r\n if (!this._currentAreaElement) {\r\n const areaShape = new AreaMeasureElement(this.components);\r\n areaShape.onPointAdded.add(() => {\r\n if (this._clickCount === 3 && !areaShape.workingPlane) {\r\n areaShape.computeWorkingPlane();\r\n this._vertexPicker.workingPlane = areaShape.workingPlane;\r\n }\r\n });\r\n areaShape.onPointRemoved.add(() => this._clickCount--);\r\n this._currentAreaElement = areaShape;\r\n }\r\n this._currentAreaElement.setPoint(point, this._clickCount);\r\n this._currentAreaElement.computeArea();\r\n this._clickCount++;\r\n };\r\n this.onMouseMove = () => {\r\n const point = this._vertexPicker.get();\r\n if (!(point && this._currentAreaElement))\r\n return;\r\n this._currentAreaElement.setPoint(point, this._clickCount);\r\n this._currentAreaElement.computeArea();\r\n };\r\n this.onKeydown = (e) => {\r\n if (!this.enabled)\r\n return;\r\n if (e.key === \"z\" && e.ctrlKey && this._currentAreaElement)\r\n this._currentAreaElement.removePoint(this._clickCount - 1);\r\n if (e.key === \"Enter\" && this._currentAreaElement)\r\n this.endCreation();\r\n if (e.key === \"Escape\") {\r\n if (this._clickCount === 0 && !this._currentAreaElement) {\r\n this.enabled = false;\r\n }\r\n else {\r\n this.cancelCreation();\r\n }\r\n }\r\n };\r\n this.components.tools.add(AreaMeasurement.uuid, this);\r\n // TODO: Make vertexpicker a tool?\r\n this._vertexPicker = new VertexPicker(components);\r\n if (components.uiEnabled) {\r\n this.setUI();\r\n }\r\n }\r\n async dispose() {\r\n this.setupEvents(false);\r\n this.onBeforeCreate.reset();\r\n this.onAfterCreate.reset();\r\n this.onBeforeCancel.reset();\r\n this.onAfterCancel.reset();\r\n this.onBeforeDelete.reset();\r\n this.onAfterDelete.reset();\r\n this.uiElement.dispose();\r\n await this._vertexPicker.dispose();\r\n if (this._currentAreaElement) {\r\n await this._currentAreaElement.dispose();\r\n }\r\n for (const measure of this._measurements) {\r\n await measure.dispose();\r\n }\r\n this.components = null;\r\n await this.onDisposed.trigger(AreaMeasurement.uuid);\r\n this.onDisposed.reset();\r\n }\r\n setUI() {\r\n const main = new Button(this.components);\r\n main.materialIcon = \"check_box_outline_blank\";\r\n main.onClick.add(() => {\r\n if (!this.enabled) {\r\n main.active = true;\r\n this.enabled = true;\r\n }\r\n else {\r\n this.enabled = false;\r\n main.active = false;\r\n }\r\n });\r\n this.uiElement.set({ main });\r\n }\r\n delete() { }\r\n /** Deletes all the dimensions that have been previously created. */\r\n async deleteAll() {\r\n for (const dim of this._measurements) {\r\n await dim.dispose();\r\n await this.onAfterDelete.trigger(this);\r\n }\r\n this._measurements = [];\r\n }\r\n endCreation() {\r\n if (this._currentAreaElement) {\r\n this._measurements.push(this._currentAreaElement);\r\n this._currentAreaElement.removePoint(this._clickCount);\r\n this._currentAreaElement.computeWorkingPlane();\r\n this._currentAreaElement.computeArea();\r\n this._currentAreaElement = null;\r\n }\r\n this._vertexPicker.workingPlane = null;\r\n this._clickCount = 0;\r\n }\r\n cancelCreation() {\r\n if (this._currentAreaElement) {\r\n this._currentAreaElement.dispose();\r\n this._currentAreaElement = null;\r\n }\r\n this._vertexPicker.workingPlane = null;\r\n this._clickCount = 0;\r\n }\r\n get() {\r\n return this._measurements;\r\n }\r\n setupEvents(active) {\r\n const viewerContainer = this.components.ui.viewerContainer;\r\n if (active) {\r\n viewerContainer.addEventListener(\"click\", this.create);\r\n viewerContainer.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"keydown\", this.onKeydown);\r\n }\r\n else {\r\n viewerContainer.removeEventListener(\"click\", this.create);\r\n viewerContainer.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"keydown\", this.onKeydown);\r\n }\r\n }\r\n}\r\nAreaMeasurement.uuid = \"c453a99e-f054-4781-9060-33df617db4a5\";\r\nToolComponent.libraryUUIDs.add(AreaMeasurement.uuid);\r\n//# sourceMappingURL=index.js.map","import * as THREE from \"three\";\r\nimport { Event, Component, UIElement, } from \"../../base-types\";\r\nimport { ToolComponent } from \"../../core\";\r\nimport { Button } from \"../../ui\";\r\nimport { SimpleDimensionLine } from \"../SimpleDimensionLine\";\r\nimport { LengthMeasurement } from \"../LengthMeasurement\";\r\nimport { MeasurementUtils } from \"../MeasurementUtils\";\r\nexport class EdgeMeasurement extends Component {\r\n set enabled(value) {\r\n this._enabled = value;\r\n if (this.components.uiEnabled) {\r\n const main = this.uiElement.get(\"main\");\r\n main.active = value;\r\n }\r\n this.setupEvents(value);\r\n if (value) {\r\n // const scene = this.components.scene.get();\r\n }\r\n else {\r\n this.cancelCreation();\r\n }\r\n // this.setVisibility(value);\r\n }\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n constructor(components) {\r\n super(components);\r\n this.uiElement = new UIElement();\r\n this.tolerance = 0.3;\r\n this.onBeforeCreate = new Event();\r\n this.onAfterCreate = new Event();\r\n this.onBeforeCancel = new Event();\r\n this.onAfterCancel = new Event();\r\n this.onBeforeDelete = new Event();\r\n this.onAfterDelete = new Event();\r\n this.onDisposed = new Event();\r\n this._enabled = false;\r\n this._lineMaterial = new THREE.LineBasicMaterial({\r\n color: \"#DC2626\",\r\n linewidth: 2,\r\n depthTest: false,\r\n transparent: true,\r\n });\r\n this.create = async () => {\r\n if (!this.enabled || !this.preview.visible)\r\n return;\r\n const dims = this.components.tools.get(LengthMeasurement);\r\n const start = this.preview.startPoint.clone();\r\n const end = this.preview.endPoint.clone();\r\n dims.createOnPoints(start, end);\r\n };\r\n this.onMouseMove = () => {\r\n if (!this.enabled) {\r\n this.preview.visible = false;\r\n return;\r\n }\r\n const result = this.components.raycaster.castRay();\r\n if (!result || !result.object) {\r\n this.preview.visible = false;\r\n return;\r\n }\r\n const { object, faceIndex, point } = result;\r\n if (faceIndex === undefined) {\r\n this.preview.visible = false;\r\n return;\r\n }\r\n if (object instanceof THREE.Mesh || object instanceof THREE.InstancedMesh) {\r\n this.updateSelection(object, point, faceIndex, result.instanceId);\r\n }\r\n else {\r\n this.preview.visible = false;\r\n }\r\n };\r\n this.onKeydown = (_e) => { };\r\n this.components.tools.add(EdgeMeasurement.uuid, this);\r\n const endpointElement = document.createElement(\"div\");\r\n endpointElement.className = \"w-2 h-2 bg-red-600 rounded-full\";\r\n this.preview = new SimpleDimensionLine(this.components, {\r\n start: new THREE.Vector3(),\r\n end: new THREE.Vector3(),\r\n lineMaterial: this._lineMaterial,\r\n endpointElement,\r\n });\r\n this.preview.visible = false;\r\n if (components.uiEnabled) {\r\n this.setUI();\r\n }\r\n }\r\n async dispose() {\r\n await this.preview.dispose();\r\n this._lineMaterial.dispose();\r\n this.setupEvents(false);\r\n this.onBeforeCreate.reset();\r\n this.onAfterCreate.reset();\r\n this.onBeforeCancel.reset();\r\n this.onAfterCancel.reset();\r\n this.onBeforeDelete.reset();\r\n this.onAfterDelete.reset();\r\n await this.uiElement.dispose();\r\n await this.onDisposed.trigger();\r\n this.onDisposed.reset();\r\n this.components = null;\r\n }\r\n setUI() {\r\n const main = new Button(this.components);\r\n main.materialIcon = \"check_box_outline_blank\";\r\n main.onClick.add(() => {\r\n if (!this.enabled) {\r\n main.active = true;\r\n this.enabled = true;\r\n }\r\n else {\r\n this.enabled = false;\r\n main.active = false;\r\n }\r\n });\r\n this.uiElement.set({ main });\r\n }\r\n // TODO: this could be better. Fusion this class with lengthmeasurement?\r\n async delete() {\r\n if (!this.enabled)\r\n return;\r\n const dims = this.components.tools.get(LengthMeasurement);\r\n const previous = dims.enabled;\r\n dims.enabled = true;\r\n await dims.delete();\r\n dims.enabled = previous;\r\n }\r\n async deleteAll() {\r\n const dims = this.components.tools.get(LengthMeasurement);\r\n await dims.deleteAll();\r\n }\r\n endCreation() { }\r\n cancelCreation() { }\r\n get() {\r\n const dims = this.components.tools.get(LengthMeasurement);\r\n const lines = dims.get();\r\n const serialized = [];\r\n for (const line of lines) {\r\n const start = line.startPoint;\r\n const end = line.endPoint;\r\n const data = [start.x, start.y, start.z, end.x, end.y, end.z];\r\n serialized.push(data);\r\n }\r\n return serialized;\r\n }\r\n set(dimensions) {\r\n const dims = this.components.tools.get(LengthMeasurement);\r\n for (const dim of dimensions) {\r\n const [x1, y1, z1, x2, y2, z2] = dim;\r\n const v1 = new THREE.Vector3(x1, y1, z1);\r\n const v2 = new THREE.Vector3(x2, y2, z2);\r\n dims.createOnPoints(v1, v2);\r\n }\r\n }\r\n setupEvents(active) {\r\n const viewerContainer = this.components.ui.viewerContainer;\r\n if (active) {\r\n viewerContainer.addEventListener(\"click\", this.create);\r\n viewerContainer.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"keydown\", this.onKeydown);\r\n }\r\n else {\r\n viewerContainer.removeEventListener(\"click\", this.create);\r\n viewerContainer.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"keydown\", this.onKeydown);\r\n }\r\n }\r\n updateSelection(mesh, point, faceIndex, instance) {\r\n if (!mesh.geometry.index) {\r\n return;\r\n }\r\n const result = MeasurementUtils.getFace(mesh, faceIndex, instance);\r\n if (!result)\r\n return;\r\n const { edges } = result;\r\n let minDistance = Number.MAX_VALUE;\r\n let currentEdge = [];\r\n for (const edge of edges) {\r\n const [v1, v2] = edge.points;\r\n const distance = MeasurementUtils.distanceFromPointToLine(point, v1, v2, true);\r\n if (distance < this.tolerance && distance < minDistance) {\r\n minDistance = distance;\r\n currentEdge = edge.points;\r\n }\r\n }\r\n if (!currentEdge.length) {\r\n this.preview.visible = false;\r\n return;\r\n }\r\n const [start, end] = currentEdge;\r\n this.preview.startPoint = start;\r\n this.preview.endPoint = end;\r\n // const scene = this.components.scene.get();\r\n this.preview.visible = true;\r\n }\r\n}\r\nEdgeMeasurement.uuid = \"e7be5749-89df-4514-8d25-83aa38ce12d8\";\r\nToolComponent.libraryUUIDs.add(EdgeMeasurement.uuid);\r\n//# sourceMappingURL=index.js.map","import * as THREE from \"three\";\r\nimport { Event, Component, UIElement, } from \"../../base-types\";\r\nimport { Simple2DMarker, ToolComponent } from \"../../core\";\r\nimport { Button } from \"../../ui\";\r\nimport { DimensionLabelClassName } from \"../SimpleDimensionLine\";\r\nimport { MeasurementUtils } from \"../MeasurementUtils\";\r\nexport class FaceMeasurement extends Component {\r\n set enabled(value) {\r\n this._enabled = value;\r\n if (this.components.uiEnabled) {\r\n const main = this.uiElement.get(\"main\");\r\n main.active = value;\r\n }\r\n this.setupEvents(value);\r\n if (value) {\r\n const scene = this.components.scene.get();\r\n scene.add(this.preview);\r\n }\r\n else {\r\n this.preview.removeFromParent();\r\n this.cancelCreation();\r\n }\r\n this.setVisibility(value);\r\n }\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n constructor(components) {\r\n super(components);\r\n this.uiElement = new UIElement();\r\n this.selection = [];\r\n this.preview = new THREE.Mesh(new THREE.BufferGeometry(), new THREE.MeshBasicMaterial({\r\n side: 2,\r\n depthTest: false,\r\n transparent: true,\r\n opacity: 0.25,\r\n color: \"#BCF124\",\r\n }));\r\n this.selectionMaterial = new THREE.MeshBasicMaterial({\r\n side: 2,\r\n depthTest: false,\r\n transparent: true,\r\n color: \"#BCF124\",\r\n opacity: 0.75,\r\n });\r\n this.onBeforeCreate = new Event();\r\n this.onAfterCreate = new Event();\r\n this.onBeforeCancel = new Event();\r\n this.onAfterCancel = new Event();\r\n this.onBeforeDelete = new Event();\r\n this.onAfterDelete = new Event();\r\n this.onDisposed = new Event();\r\n this._enabled = false;\r\n this._currentSelelection = null;\r\n this.create = () => {\r\n if (!this.enabled || !this._currentSelelection)\r\n return;\r\n const scene = this.components.scene.get();\r\n const geometry = new THREE.BufferGeometry();\r\n const mesh = new THREE.Mesh(geometry, this.selectionMaterial);\r\n geometry.setAttribute(\"position\", this.preview.geometry.attributes.position);\r\n scene.add(mesh);\r\n geometry.computeBoundingSphere();\r\n const { area, perimeter } = this._currentSelelection;\r\n const label = this.newLabel(geometry, area);\r\n mesh.add(label.get());\r\n this.selection.push({ area, perimeter, mesh, label });\r\n };\r\n this.onMouseMove = () => {\r\n if (!this.enabled) {\r\n this.unselect();\r\n return;\r\n }\r\n const result = this.components.raycaster.castRay();\r\n if (!result || !result.object || result.faceIndex === undefined) {\r\n this.unselect();\r\n return;\r\n }\r\n const { object, faceIndex } = result;\r\n if (object instanceof THREE.Mesh || object instanceof THREE.InstancedMesh) {\r\n this.updateSelection(object, faceIndex, result.instanceId);\r\n }\r\n else {\r\n this.unselect();\r\n }\r\n };\r\n this.onKeydown = (_e) => { };\r\n this.components.tools.add(FaceMeasurement.uuid, this);\r\n this.preview.frustumCulled = false;\r\n if (components.uiEnabled) {\r\n this.setUI();\r\n }\r\n }\r\n async dispose() {\r\n this.setupEvents(false);\r\n await this.deleteAll();\r\n this.preview.removeFromParent();\r\n this.preview.material.dispose();\r\n this.preview.geometry.dispose();\r\n this.selectionMaterial.dispose();\r\n this.onBeforeCreate.reset();\r\n this.onAfterCreate.reset();\r\n this.onBeforeCancel.reset();\r\n this.onAfterCancel.reset();\r\n this.onBeforeDelete.reset();\r\n this.onAfterDelete.reset();\r\n await this.uiElement.dispose();\r\n await this.onDisposed.trigger();\r\n this.onDisposed.reset();\r\n this.components = null;\r\n }\r\n setUI() {\r\n const main = new Button(this.components);\r\n main.materialIcon = \"check_box_outline_blank\";\r\n main.onClick.add(() => {\r\n if (!this.enabled) {\r\n main.active = true;\r\n this.enabled = true;\r\n }\r\n else {\r\n this.enabled = false;\r\n main.active = false;\r\n }\r\n });\r\n this.uiElement.set({ main });\r\n }\r\n async delete() {\r\n const meshes = this.selection.map((item) => item.mesh);\r\n const result = this.components.raycaster.castRay(meshes);\r\n if (!result || !result.object) {\r\n return;\r\n }\r\n const found = this.selection.find((item) => item.mesh === result.object);\r\n if (!found)\r\n return;\r\n found.mesh.removeFromParent();\r\n found.mesh.geometry.dispose();\r\n await found.label.dispose();\r\n const index = this.selection.indexOf(found);\r\n this.selection.splice(index, 1);\r\n }\r\n async deleteAll() {\r\n for (const item of this.selection) {\r\n item.mesh.removeFromParent();\r\n item.mesh.geometry.dispose();\r\n await item.label.dispose();\r\n }\r\n this.selection = [];\r\n }\r\n endCreation() { }\r\n cancelCreation() { }\r\n get() {\r\n const serialized = [];\r\n for (const item of this.selection) {\r\n const geometry = item.mesh.geometry;\r\n const { area, perimeter } = item;\r\n const position = geometry.attributes.position.array;\r\n serialized.push({ position, area, perimeter });\r\n }\r\n return serialized;\r\n }\r\n set(serialized) {\r\n const scene = this.components.scene.get();\r\n for (const item of serialized) {\r\n const geometry = new THREE.BufferGeometry();\r\n const mesh = new THREE.Mesh(geometry, this.selectionMaterial);\r\n scene.add(mesh);\r\n const attr = new THREE.BufferAttribute(item.position, 3);\r\n geometry.setAttribute(\"position\", attr);\r\n geometry.computeBoundingSphere();\r\n const { area, perimeter } = item;\r\n const label = this.newLabel(geometry, area);\r\n mesh.add(label.get());\r\n this.selection.push({ area, perimeter, mesh, label });\r\n }\r\n }\r\n setupEvents(active) {\r\n const viewerContainer = this.components.ui.viewerContainer;\r\n if (active) {\r\n viewerContainer.addEventListener(\"click\", this.create);\r\n viewerContainer.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"keydown\", this.onKeydown);\r\n }\r\n else {\r\n viewerContainer.removeEventListener(\"click\", this.create);\r\n viewerContainer.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"keydown\", this.onKeydown);\r\n }\r\n }\r\n setVisibility(active) {\r\n const scene = this.components.scene.get();\r\n for (const item of this.selection) {\r\n const label = item.label.get();\r\n if (active) {\r\n scene.add(item.mesh);\r\n item.mesh.add(label);\r\n }\r\n else {\r\n item.mesh.removeFromParent();\r\n label.removeFromParent();\r\n }\r\n }\r\n }\r\n unselect() {\r\n this.preview.removeFromParent();\r\n this._currentSelelection = null;\r\n }\r\n updateSelection(mesh, faceIndex, instance) {\r\n const scene = this.components.scene.get();\r\n scene.add(this.preview);\r\n const result = MeasurementUtils.getFace(mesh, faceIndex, instance);\r\n if (result === null) {\r\n return;\r\n }\r\n const area = this.regenerateHighlight(mesh, result.indices, instance);\r\n let perimeter = 0;\r\n for (const { distance } of result.edges) {\r\n perimeter += distance;\r\n }\r\n this._currentSelelection = { perimeter, area };\r\n }\r\n newLabel(geometry, area) {\r\n if (!geometry.boundingSphere) {\r\n throw new Error(\"Error computing area geometry\");\r\n }\r\n const { center } = geometry.boundingSphere;\r\n const htmlText = document.createElement(\"div\");\r\n htmlText.className = DimensionLabelClassName;\r\n const formattedArea = Math.trunc(area * 100) / 100;\r\n htmlText.textContent = formattedArea.toString();\r\n const label = new Simple2DMarker(this.components, htmlText);\r\n const labelObject = label.get();\r\n labelObject.position.copy(center);\r\n return label;\r\n }\r\n regenerateHighlight(mesh, indices, instance) {\r\n const position = [];\r\n const index = [];\r\n let counter = 0;\r\n let area = 0;\r\n const areaTriangle = new THREE.Triangle();\r\n for (const i of indices) {\r\n const { p1, p2, p3 } = MeasurementUtils.getVerticesAndNormal(mesh, i, instance);\r\n position.push(p1.x, p1.y, p1.z);\r\n position.push(p2.x, p2.y, p2.z);\r\n position.push(p3.x, p3.y, p3.z);\r\n areaTriangle.set(p1, p2, p3);\r\n area += areaTriangle.getArea();\r\n index.push(counter, counter + 1, counter + 2);\r\n counter += 3;\r\n }\r\n const buffer = new Float32Array(position);\r\n const attr = new THREE.BufferAttribute(buffer, 3);\r\n this.preview.geometry.setAttribute(\"position\", attr);\r\n this.preview.geometry.setIndex(index);\r\n return area;\r\n }\r\n}\r\nFaceMeasurement.uuid = \"30279548-1309-44f6-aa97-ce26eed73522\";\r\nToolComponent.libraryUUIDs.add(FaceMeasurement.uuid);\r\n//# sourceMappingURL=index.js.map"],"names":["AreaMeasureElement","constructor","components","points","super","this","name","enabled","visible","workingPlane","onDisposed","_rotationMatrix","_dimensionLines","_defaultLineMaterial","color","onAreaComputed","onWorkingPlaneComputed","onPointAdded","onPointRemoved","htmlText","document","createElement","className","labelMarker","add","point","length","addDimensionLine","forEach","setPoint","index","_index","existingIndex","trigger","previousLine","nextLine","getLinesBetweenIndex","endPoint","startPoint","removePoint","splice","dispose","toggleLabel","toggleVisibility","start","end","element","dimensionLine","SimpleDimensionLine","lineMaterial","endpointElement","push","previousLineIndex","computeWorkingPlane","setFromCoplanarPoints","referenceVector","theta","normal","angleTo","rotationAxis","crossVectors","normalize","makeRotationAxis","computeArea","xSum","ySum","rotMatrix","vectors2D","map","transformedPoint","clone","applyMatrix4","vector2D","x","z","y","area","Math","abs","get","textContent","toFixed","position","set","constant","invert","reset","line","AreaMeasurement","value","_enabled","_vertexPicker","uiEnabled","uiElement","active","setupEvents","cancelCreation","plane","_currentAreaElement","_clickCount","_measurements","onBeforeCreate","onAfterCreate","onBeforeCancel","onAfterCancel","onBeforeDelete","onAfterDelete","create","areaShape","onMouseMove","onKeydown","e","key","ctrlKey","endCreation","tools","uuid","setUI","measure","main","materialIcon","onClick","deleteAll","dim","viewerContainer","ui","addEventListener","window","removeEventListener","libraryUUIDs","EdgeMeasurement","tolerance","_lineMaterial","linewidth","depthTest","transparent","async","preview","dims","createOnPoints","result","raycaster","castRay","object","faceIndex","undefined","updateSelection","instanceId","_e","previous","delete","lines","serialized","data","dimensions","x1","y1","z1","x2","y2","z2","v1","v2","mesh","instance","geometry","getFace","edges","minDistance","Number","MAX_VALUE","currentEdge","edge","distance","distanceFromPointToLine","FaceMeasurement","scene","removeFromParent","setVisibility","selection","side","opacity","selectionMaterial","_currentSelelection","setAttribute","attributes","computeBoundingSphere","perimeter","label","newLabel","unselect","frustumCulled","material","meshes","item","found","find","indexOf","array","attr","regenerateHighlight","indices","boundingSphere","Error","center","formattedArea","trunc","toString","copy","counter","areaTriangle","i","p1","p2","p3","getVerticesAndNormal","getArea","buffer","Float32Array","setIndex"],"sourceRoot":""}