{"version":3,"file":"vendor.openbim-components-53aeae12.5f929b5703372032.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/measurement/LengthMeasurement/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/MeasurementUtils/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/SimpleDimensionLine/types.js","webpack://client-app/./node_modules/openbim-components/src/measurement/SimpleDimensionLine/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/VolumeMeasurement/index.js"],"sourcesContent":["import * as THREE from \"three\";\r\nimport { SimpleDimensionLine } from \"../SimpleDimensionLine\";\r\nimport { Component, Event, UIElement, } from \"../../base-types\";\r\nimport { SimpleRaycaster, ToolComponent } from \"../../core\";\r\nimport { Button } from \"../../ui\";\r\nimport { VertexPicker } from \"../../utils\";\r\n/**\r\n * A basic dimension tool to measure distances between 2 points in 3D and\r\n * display a 3D symbol displaying the numeric value.\r\n */\r\nexport class LengthMeasurement extends Component {\r\n /** {@link Component.enabled} */\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n /** {@link Component.enabled} */\r\n set enabled(value) {\r\n if (!value)\r\n this.cancelCreation();\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 }\r\n /** {@link Hideable.visible} */\r\n get visible() {\r\n return this._visible;\r\n }\r\n /** {@link Hideable.visible} */\r\n set visible(value) {\r\n this._visible = value;\r\n for (const dimension of this._measurements) {\r\n dimension.visible = value;\r\n }\r\n }\r\n /**\r\n * The [Color](https://threejs.org/docs/#api/en/math/Color)\r\n * of the geometry of the dimensions.\r\n */\r\n set color(color) {\r\n this._lineMaterial.color = color;\r\n }\r\n constructor(components) {\r\n super(components);\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n /** {@link Updateable.onBeforeUpdate} */\r\n this.onBeforeUpdate = new Event();\r\n /** {@link Updateable.onAfterUpdate} */\r\n this.onAfterUpdate = new Event();\r\n /** {@link Createable.onAfterCreate} */\r\n this.onAfterCreate = new Event();\r\n /** {@link Createable.onBeforeCreate} */\r\n this.onBeforeCreate = new Event();\r\n /** {@link Createable.onAfterDelete} */\r\n this.onAfterDelete = new Event();\r\n /** {@link Createable.onBeforeDelete} */\r\n this.onBeforeDelete = new Event();\r\n /** {@link Createable.onBeforeCancel} */\r\n this.onBeforeCancel = new Event();\r\n /** {@link Createable.onAfterCancel} */\r\n this.onAfterCancel = new Event();\r\n this.uiElement = new UIElement();\r\n /** The minimum distance to force the dimension cursor to a vertex. */\r\n this.snapDistance = 0.25;\r\n this._lineMaterial = new THREE.LineBasicMaterial({\r\n color: \"#DC2626\",\r\n linewidth: 2,\r\n depthTest: false,\r\n });\r\n this._measurements = [];\r\n this._visible = true;\r\n this._enabled = false;\r\n /** Temporary variables for internal operations */\r\n this._temp = {\r\n isDragging: false,\r\n start: new THREE.Vector3(),\r\n end: new THREE.Vector3(),\r\n dimension: undefined,\r\n };\r\n // TODO: The data arg needs to be better defined\r\n /**\r\n * Starts or finishes drawing a new dimension line.\r\n *\r\n * @param data - forces the dimension to be drawn on a plane. Use this if you are drawing\r\n * dimensions in floor plan navigation.\r\n */\r\n this.create = async (data) => {\r\n const plane = data instanceof THREE.Object3D ? data : undefined;\r\n if (!this._enabled)\r\n return;\r\n await this.onBeforeCreate.trigger(this);\r\n if (!this._temp.isDragging) {\r\n this.drawStart(plane);\r\n return;\r\n }\r\n await this.endCreation();\r\n };\r\n this.onKeyDown = (e) => {\r\n if (!this.enabled)\r\n return;\r\n if (e.key === \"Escape\") {\r\n if (this._temp.isDragging) {\r\n this.cancelCreation();\r\n }\r\n else {\r\n this.enabled = false;\r\n }\r\n }\r\n };\r\n this.components.tools.add(LengthMeasurement.uuid, this);\r\n this._raycaster = new SimpleRaycaster(this.components);\r\n this._vertexPicker = new VertexPicker(components, {\r\n previewElement: this.newEndpoint(),\r\n snapDistance: this.snapDistance,\r\n });\r\n if (components.uiEnabled) {\r\n this.setUI();\r\n }\r\n }\r\n setUI() {\r\n const main = new Button(this.components);\r\n this.uiElement.set({ main });\r\n main.materialIcon = \"straighten\";\r\n main.onClick.add(() => {\r\n if (!this.enabled) {\r\n this.setupEvents(true);\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 this.setupEvents(false);\r\n }\r\n });\r\n }\r\n /** {@link Component.get} */\r\n get() {\r\n return this._measurements;\r\n }\r\n /** {@link Disposable.dispose} */\r\n async dispose() {\r\n this.setupEvents(false);\r\n this.enabled = false;\r\n this.onBeforeUpdate.reset();\r\n this.onAfterUpdate.reset();\r\n this.onBeforeCreate.reset();\r\n this.onAfterCreate.reset();\r\n this.onBeforeDelete.reset();\r\n this.onAfterDelete.reset();\r\n this.onBeforeCancel.reset();\r\n this.onAfterCancel.reset();\r\n this.uiElement.dispose();\r\n if (this.previewElement) {\r\n this.previewElement.remove();\r\n }\r\n for (const measure of this._measurements) {\r\n await measure.dispose();\r\n }\r\n this._lineMaterial.dispose();\r\n this._measurements = [];\r\n await this._vertexPicker.dispose();\r\n await this.onDisposed.trigger(LengthMeasurement.uuid);\r\n this.onDisposed.reset();\r\n }\r\n /** {@link Updateable.update} */\r\n async update(_delta) {\r\n if (this._enabled) {\r\n await this.onBeforeUpdate.trigger(this);\r\n if (this._temp.isDragging) {\r\n this.drawInProcess();\r\n }\r\n await this.onAfterUpdate.trigger(this);\r\n }\r\n }\r\n createOnPoints(p1, p2) {\r\n const dimension = this.drawDimension();\r\n dimension.startPoint = p1;\r\n dimension.endPoint = p2;\r\n dimension.createBoundingBox();\r\n this._measurements.push(dimension);\r\n }\r\n /** Deletes the dimension that the user is hovering over with the mouse or touch event. */\r\n async delete() {\r\n if (!this._enabled || this._measurements.length === 0)\r\n return;\r\n const boundingBoxes = this.getBoundingBoxes();\r\n const intersect = this._raycaster.castRay(boundingBoxes);\r\n if (!intersect)\r\n return;\r\n const dimension = this._measurements.find((dim) => dim.boundingBox === intersect.object);\r\n if (dimension) {\r\n const index = this._measurements.indexOf(dimension);\r\n this._measurements.splice(index, 1);\r\n await dimension.dispose();\r\n await this.onAfterDelete.trigger(this);\r\n }\r\n }\r\n async deleteMeasurement(measurement) {\r\n if (measurement) {\r\n const index = this._measurements.indexOf(measurement);\r\n this._measurements.splice(index, 1);\r\n await measurement.dispose();\r\n await this.onAfterDelete.trigger(this);\r\n }\r\n }\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 /** Cancels the drawing of the current dimension. */\r\n cancelCreation() {\r\n if (!this._temp.dimension)\r\n return;\r\n this._temp.isDragging = false;\r\n this._temp.dimension?.dispose();\r\n this._temp.dimension = undefined;\r\n }\r\n drawStart(plane) {\r\n const items = plane ? [plane] : undefined;\r\n const intersects = this._raycaster.castRay(items);\r\n const point = this._vertexPicker.get();\r\n if (!(intersects && point))\r\n return;\r\n this._temp.isDragging = true;\r\n this._temp.start = plane ? intersects.point : point;\r\n }\r\n drawInProcess() {\r\n const intersects = this._raycaster.castRay();\r\n if (!intersects)\r\n return;\r\n const found = this._vertexPicker.get();\r\n if (!found)\r\n return;\r\n this._temp.end = found;\r\n if (!this._temp.dimension) {\r\n this._temp.dimension = this.drawDimension();\r\n }\r\n this._temp.dimension.endPoint = this._temp.end;\r\n }\r\n async endCreation() {\r\n if (!this._temp.dimension)\r\n return;\r\n this._temp.dimension.createBoundingBox();\r\n this._measurements.push(this._temp.dimension);\r\n await this.onAfterCreate.trigger(this._temp.dimension);\r\n this._temp.dimension = undefined;\r\n this._temp.isDragging = false;\r\n }\r\n drawDimension() {\r\n return new SimpleDimensionLine(this.components, {\r\n start: this._temp.start,\r\n end: this._temp.end,\r\n lineMaterial: this._lineMaterial,\r\n endpointElement: this.newEndpoint(),\r\n });\r\n }\r\n newEndpoint() {\r\n const element = document.createElement(\"div\");\r\n element.className = \"w-2 h-2 bg-red-600 rounded-full\";\r\n return element;\r\n }\r\n getBoundingBoxes() {\r\n return this._measurements\r\n .map((dim) => dim.boundingBox)\r\n .filter((box) => box !== undefined);\r\n }\r\n setupEvents(active) {\r\n const viewerContainer = this.components.renderer.get().domElement.parentElement;\r\n if (!viewerContainer)\r\n return;\r\n if (active) {\r\n viewerContainer.addEventListener(\"click\", this.create);\r\n window.addEventListener(\"keydown\", this.onKeyDown);\r\n }\r\n else {\r\n viewerContainer.removeEventListener(\"click\", this.create);\r\n window.removeEventListener(\"keydown\", this.onKeyDown);\r\n }\r\n }\r\n}\r\nLengthMeasurement.uuid = \"2f9bcacf-18a9-4be6-a293-e898eae64ea1\";\r\nToolComponent.libraryUUIDs.add(LengthMeasurement.uuid);\r\n//# sourceMappingURL=index.js.map","import * as THREE from \"three\";\r\nexport class MeasurementUtils {\r\n static getFace(mesh, triangleIndex, instance) {\r\n if (!mesh.geometry.index) {\r\n throw new Error(\"Geometry must be indexed!\");\r\n }\r\n const allEdges = new Map();\r\n const indices = mesh.geometry.index.array;\r\n // Find out the raycasted face plane\r\n const { plane: targetPlane } = this.getFaceData(triangleIndex, instance, mesh);\r\n // Get the face where the given triangle belongs\r\n const coplanarFacesIndices = [];\r\n for (let faceIndex = 0; faceIndex < indices.length / 3; faceIndex++) {\r\n const { plane, edges } = this.getFaceData(faceIndex, instance, mesh);\r\n if (plane.equals(targetPlane)) {\r\n coplanarFacesIndices.push({ index: faceIndex, edges });\r\n for (const { id, points, distance } of edges) {\r\n allEdges.set(id, { points, distance });\r\n }\r\n }\r\n }\r\n // Now, let's get all faces (groups of adjacent triangles)\r\n // To visualize this, draw all possible cases on paper, it's easy\r\n let nextFaceID = 0;\r\n const edgeFaceMap = new Map();\r\n const faceEdgesMap = new Map();\r\n for (const { index, edges } of coplanarFacesIndices) {\r\n const commonEdgesFaces = new Map();\r\n for (const { id: edge } of edges) {\r\n if (edgeFaceMap.has(edge)) {\r\n const commonFace = edgeFaceMap.get(edge);\r\n commonEdgesFaces.set(edge, commonFace);\r\n }\r\n }\r\n const edgesIDs = edges.map((edge) => edge.id);\r\n // Triangle is isolated, just create a new face\r\n if (!commonEdgesFaces.size) {\r\n const faceID = nextFaceID++;\r\n for (const { id: edge } of edges) {\r\n edgeFaceMap.set(edge, faceID);\r\n }\r\n faceEdgesMap.set(faceID, {\r\n edges: new Set(edgesIDs),\r\n indices: new Set([index]),\r\n });\r\n continue;\r\n }\r\n // Triangle has common edges with existing faces\r\n let firstFaceID = null;\r\n const otherFaces = new Set();\r\n const edgesToAdd = new Set(edgesIDs);\r\n // First, remove all common edges\r\n for (const [edge, faceID] of commonEdgesFaces) {\r\n if (firstFaceID === null) {\r\n firstFaceID = faceID;\r\n }\r\n else if (faceID !== firstFaceID) {\r\n otherFaces.add(faceID);\r\n }\r\n edgeFaceMap.delete(edge);\r\n const { edges: foundFaceEdges } = faceEdgesMap.get(faceID);\r\n foundFaceEdges.delete(edge);\r\n edgesToAdd.delete(edge);\r\n }\r\n // If we hadn't found a face, we wouldn't be here\r\n if (firstFaceID === null) {\r\n throw new Error(\"Error computing face!\");\r\n }\r\n // Now, let's merge this triangle with the first face\r\n const firstFace = faceEdgesMap.get(firstFaceID);\r\n const { indices: firstFaceIndices } = firstFace;\r\n firstFaceIndices.add(index);\r\n for (const edge of edgesToAdd) {\r\n edgeFaceMap.set(edge, firstFaceID);\r\n const { edges: firstFaceEdges } = firstFace;\r\n firstFaceEdges.add(edge);\r\n }\r\n // Finally, if there were other faces in common\r\n // merge them with the first one\r\n for (const faceID of otherFaces) {\r\n const otherFace = faceEdgesMap.get(faceID);\r\n const { edges: otherEdges, indices: otherIndices } = otherFace;\r\n const firstFace = faceEdgesMap.get(firstFaceID);\r\n const { edges: firstEdges, indices: firstIndices } = firstFace;\r\n for (const edge of otherEdges) {\r\n firstEdges.add(edge);\r\n edgeFaceMap.set(edge, firstFaceID);\r\n }\r\n for (const index of otherIndices) {\r\n firstIndices.add(index);\r\n }\r\n faceEdgesMap.delete(faceID);\r\n }\r\n }\r\n for (const [_faceID, { indices, edges }] of faceEdgesMap) {\r\n if (indices.has(triangleIndex)) {\r\n const foundEdges = [];\r\n for (const edgeID of edges) {\r\n const foundEdge = allEdges.get(edgeID);\r\n foundEdges.push(foundEdge);\r\n }\r\n return { edges: foundEdges, indices };\r\n }\r\n }\r\n return null;\r\n }\r\n static distanceFromPointToLine(point, lineStart, lineEnd, clamp = false) {\r\n const tempLine = new THREE.Line3();\r\n const tempPoint = new THREE.Vector3();\r\n tempLine.set(lineStart, lineEnd);\r\n tempLine.closestPointToPoint(point, clamp, tempPoint);\r\n return tempPoint.distanceTo(point);\r\n }\r\n static getFaceData(faceIndex, instance, mesh) {\r\n const found = this.getVerticesAndNormal(mesh, faceIndex, instance);\r\n const { p1, p2, p3, faceNormal } = found;\r\n // Round numbers to make sure numerical precision\r\n // doesn't affect edge detection\r\n this.round(p1);\r\n this.round(p2);\r\n this.round(p3);\r\n this.round(faceNormal);\r\n // To make sure the edge AB === the edge BA\r\n const vertices = [\r\n { id: `${p1.x}|${p1.y}|${p1.z}`, value: p1 },\r\n { id: `${p2.x}|${p2.y}|${p2.z}`, value: p2 },\r\n { id: `${p3.x}|${p3.y}|${p3.z}`, value: p3 },\r\n ];\r\n vertices.sort((a, b) => {\r\n if (a.id < b.id) {\r\n return -1;\r\n }\r\n if (a.id > b.id) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n const [{ id: id1, value: v1 }, { id: id2, value: v2 }, { id: id3, value: v3 },] = vertices;\r\n // Create IDs to identify the edges\r\n const edges = [\r\n {\r\n id: `${id1}|${id2}`,\r\n distance: v1.distanceTo(v2),\r\n points: [v1, v2],\r\n },\r\n {\r\n id: `${id2}|${id3}`,\r\n distance: v2.distanceTo(v3),\r\n points: [v2, v3],\r\n },\r\n {\r\n id: `${id1}|${id3}`,\r\n distance: v1.distanceTo(v3),\r\n points: [v1, v3],\r\n },\r\n ];\r\n const plane = new THREE.Plane();\r\n plane.setFromNormalAndCoplanarPoint(faceNormal, p1);\r\n plane.constant = Math.round(plane.constant * 10) / 10;\r\n return { plane, edges };\r\n }\r\n static getVerticesAndNormal(mesh, faceIndex, instance) {\r\n if (!mesh.geometry.index) {\r\n throw new Error(\"Geometry must be indexed!\");\r\n }\r\n const indices = mesh.geometry.index.array;\r\n const pos = mesh.geometry.attributes.position.array;\r\n const nor = mesh.geometry.attributes.normal.array;\r\n const i1 = indices[faceIndex * 3] * 3;\r\n const i2 = indices[faceIndex * 3 + 1] * 3;\r\n const i3 = indices[faceIndex * 3 + 2] * 3;\r\n const p1 = new THREE.Vector3(pos[i1], pos[i1 + 1], pos[i1 + 2]);\r\n const p2 = new THREE.Vector3(pos[i2], pos[i2 + 1], pos[i2 + 2]);\r\n const p3 = new THREE.Vector3(pos[i3], pos[i3 + 1], pos[i3 + 2]);\r\n const n1 = new THREE.Vector3(nor[i1], nor[i1 + 1], nor[i1 + 2]);\r\n const n2 = new THREE.Vector3(nor[i2], nor[i2 + 1], nor[i2 + 2]);\r\n const n3 = new THREE.Vector3(nor[i3], nor[i3 + 1], nor[i3 + 2]);\r\n const averageNx = (n1.x + n2.x + n3.x) / 3;\r\n const averageNy = (n1.y + n2.y + n3.y) / 3;\r\n const averageNz = (n1.z + n2.z + n3.z) / 3;\r\n const faceNormal = new THREE.Vector3(averageNx, averageNy, averageNz);\r\n // Apply instance transformation to vertex and normal\r\n if (instance !== undefined && mesh instanceof THREE.InstancedMesh) {\r\n const transform = new THREE.Matrix4();\r\n mesh.getMatrixAt(instance, transform);\r\n const rotation = new THREE.Matrix4();\r\n rotation.extractRotation(transform);\r\n faceNormal.applyMatrix4(rotation);\r\n p1.applyMatrix4(transform);\r\n p2.applyMatrix4(transform);\r\n p3.applyMatrix4(transform);\r\n }\r\n return { p1, p2, p3, faceNormal };\r\n }\r\n static round(vector) {\r\n const factor = 1000;\r\n vector.x = Math.trunc(vector.x * factor) / factor;\r\n vector.y = Math.trunc(vector.y * factor) / factor;\r\n vector.z = Math.trunc(vector.z * factor) / factor;\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map","/** The name of the CSS class that styles the dimension label. */\r\nexport const DimensionLabelClassName = \"text-white text-sm bg-ifcjs-100 rounded-md px-3 py-1\";\r\n/** The name of the CSS class that styles the dimension label. */\r\nexport const DimensionPreviewClassName = \"bg-ifcjs-100 rounded-full w-[8px] h-[8px]\";\r\n//# sourceMappingURL=types.js.map","import * as THREE from \"three\";\r\nimport { DimensionLabelClassName } from \"./types\";\r\nimport { Disposer, Simple2DMarker } from \"../../core\";\r\nexport * from \"./types\";\r\n// TODO: Document + clean up this: way less parameters, clearer logic\r\nexport class SimpleDimensionLine {\r\n get visible() {\r\n return this._visible;\r\n }\r\n set visible(value) {\r\n this._visible = value;\r\n this.label.visible = value;\r\n this._endpoints[0].visible = value;\r\n this._endpoints[1].visible = value;\r\n const [endpoint1, endpoint2] = this._endpoints;\r\n const ep1Object = endpoint1.get();\r\n const ep2Object = endpoint2.get();\r\n const label = this.label.get();\r\n if (value) {\r\n this._components.scene.get().add(this._root);\r\n this._root.add(label, ep1Object, ep2Object);\r\n }\r\n else {\r\n label.removeFromParent();\r\n ep1Object.removeFromParent();\r\n ep2Object.removeFromParent();\r\n this._root.removeFromParent();\r\n }\r\n }\r\n get endPoint() {\r\n return this._end;\r\n }\r\n set endPoint(point) {\r\n this._end = point;\r\n const position = this._line.geometry.attributes\r\n .position;\r\n position.setXYZ(1, point.x, point.y, point.z);\r\n position.needsUpdate = true;\r\n this._endpoints[1].get().position.copy(point);\r\n this.updateLabel();\r\n }\r\n get startPoint() {\r\n return this._start;\r\n }\r\n set startPoint(point) {\r\n this._start = point;\r\n const position = this._line.geometry.attributes\r\n .position;\r\n position.setXYZ(0, point.x, point.y, point.z);\r\n position.needsUpdate = true;\r\n this._endpoints[0].get().position.copy(point);\r\n this.updateLabel();\r\n }\r\n get _center() {\r\n let dir = this._end.clone().sub(this._start);\r\n const len = dir.length() * 0.5;\r\n dir = dir.normalize().multiplyScalar(len);\r\n return this._start.clone().add(dir);\r\n }\r\n constructor(components, data) {\r\n this.boundingBox = new THREE.Mesh();\r\n this._visible = true;\r\n this._root = new THREE.Group();\r\n this._endpoints = [];\r\n this._components = components;\r\n this._start = data.start;\r\n this._end = data.end;\r\n this._length = this.getLength();\r\n this._line = this.createLine(data);\r\n this.newEndpointElement(data.endpointElement);\r\n // @ts-ignore\r\n this.newEndpointElement(data.endpointElement.cloneNode(true));\r\n this.label = this.newText();\r\n this._root.renderOrder = 2;\r\n this._components.scene.get().add(this._root);\r\n }\r\n async dispose() {\r\n const disposer = await this._components.tools.get(Disposer);\r\n this.visible = false;\r\n disposer.destroy(this._root);\r\n disposer.destroy(this._line);\r\n for (const marker of this._endpoints) {\r\n await marker.dispose();\r\n }\r\n this._endpoints.length = 0;\r\n await this.label.dispose();\r\n if (this.boundingBox) {\r\n disposer.destroy(this.boundingBox);\r\n }\r\n this._components = null;\r\n }\r\n createBoundingBox() {\r\n this.boundingBox.geometry = new THREE.BoxGeometry(1, 1, this._length);\r\n this.boundingBox.position.copy(this._center);\r\n this.boundingBox.lookAt(this._end);\r\n this.boundingBox.visible = false;\r\n this._root.add(this.boundingBox);\r\n }\r\n toggleLabel() {\r\n this.label.toggleVisibility();\r\n }\r\n newEndpointElement(element) {\r\n const isFirst = this._endpoints.length === 0;\r\n const position = isFirst ? this._start : this._end;\r\n const marker = new Simple2DMarker(this._components, element);\r\n marker.get().position.copy(position);\r\n this._endpoints.push(marker);\r\n this._root.add(marker.get());\r\n }\r\n updateLabel() {\r\n this._length = this.getLength();\r\n this.label.get().element.textContent = this.getTextContent();\r\n this.label.get().position.copy(this._center);\r\n this._line.computeLineDistances();\r\n }\r\n createLine(data) {\r\n const axisGeom = new THREE.BufferGeometry();\r\n axisGeom.setFromPoints([data.start, data.end]);\r\n const line = new THREE.Line(axisGeom, data.lineMaterial);\r\n this._root.add(line);\r\n return line;\r\n }\r\n newText() {\r\n const htmlText = document.createElement(\"div\");\r\n htmlText.className = DimensionLabelClassName;\r\n htmlText.textContent = this.getTextContent();\r\n const label = new Simple2DMarker(this._components, htmlText);\r\n label.get().position.copy(this._center);\r\n this._root.add(label.get());\r\n return label;\r\n }\r\n getTextContent() {\r\n return `${this._length / SimpleDimensionLine.scale} ${SimpleDimensionLine.units}`;\r\n }\r\n getLength() {\r\n return parseFloat(this._start.distanceTo(this._end).toFixed(2));\r\n }\r\n}\r\nSimpleDimensionLine.scale = 1;\r\nSimpleDimensionLine.units = \"m\";\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 { FragmentBoundingBox } from \"../../fragments\";\r\n// TODO: Make it work more similar to face measure?\r\nexport class VolumeMeasurement 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 this.cancelCreation();\r\n }\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._enabled = false;\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.create = () => {\r\n if (!this.enabled)\r\n return;\r\n const result = this.components.raycaster.castRay();\r\n if (!result || !result.object)\r\n return;\r\n const { object } = result;\r\n if (object instanceof THREE.Mesh) {\r\n const volume = this.getVolumeOfMesh(object);\r\n console.log(volume);\r\n }\r\n };\r\n this.onMouseMove = () => { };\r\n this.onKeydown = (_e) => { };\r\n this.components.tools.add(VolumeMeasurement.uuid, this);\r\n this.label = this.newLabel();\r\n this.label.get().removeFromParent();\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.label.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 delete() { }\r\n /** Deletes all the dimensions that have been previously created. */\r\n async deleteAll() { }\r\n endCreation() { }\r\n cancelCreation() { }\r\n get() { }\r\n getVolumeFromMeshes(meshes) {\r\n let volume = 0;\r\n for (const mesh of meshes) {\r\n volume += this.getVolumeOfMesh(mesh);\r\n }\r\n const scene = this.components.scene.get();\r\n const labelObject = this.label.get();\r\n scene.add(labelObject);\r\n const bbox = this.components.tools.get(FragmentBoundingBox);\r\n for (const mesh of meshes) {\r\n mesh.geometry.computeBoundingSphere();\r\n bbox.addMesh(mesh);\r\n }\r\n const sphere = bbox.getSphere();\r\n bbox.reset();\r\n labelObject.position.copy(sphere.center);\r\n const formattedVolume = Math.trunc(volume * 100) / 100;\r\n labelObject.element.textContent = formattedVolume.toString();\r\n return volume;\r\n }\r\n newLabel() {\r\n const htmlText = document.createElement(\"div\");\r\n htmlText.className = DimensionLabelClassName;\r\n return new Simple2DMarker(this.components, htmlText);\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 // https://stackoverflow.com/a/1568551\r\n getVolumeOfMesh(mesh) {\r\n let volume = 0;\r\n const p1 = new THREE.Vector3();\r\n const p2 = new THREE.Vector3();\r\n const p3 = new THREE.Vector3();\r\n const { index } = mesh.geometry;\r\n const pos = mesh.geometry.attributes.position.array;\r\n if (!index) {\r\n console.warn(\"Geometry must be indexed to compute its volume!\");\r\n return 0;\r\n }\r\n // prettier-ignore\r\n const instances = [];\r\n if (mesh instanceof THREE.InstancedMesh) {\r\n for (let i = 0; i < mesh.count; i++) {\r\n const matrix = new THREE.Matrix4();\r\n mesh.getMatrixAt(i, matrix);\r\n instances.push(matrix);\r\n }\r\n }\r\n else {\r\n instances.push(new THREE.Matrix4().identity());\r\n }\r\n const { matrixWorld } = mesh;\r\n for (let i = 0; i < index.array.length - 2; i += 3) {\r\n for (const instance of instances) {\r\n const transform = instance.multiply(matrixWorld);\r\n const i1 = index.array[i] * 3;\r\n const i2 = index.array[i + 1] * 3;\r\n const i3 = index.array[i + 2] * 3;\r\n p1.set(pos[i1], pos[i1 + 1], pos[i1 + 2]).applyMatrix4(transform);\r\n p2.set(pos[i2], pos[i2 + 1], pos[i2 + 2]).applyMatrix4(transform);\r\n p3.set(pos[i3], pos[i3 + 1], pos[i3 + 2]).applyMatrix4(transform);\r\n volume += this.getSignedVolumeOfTriangle(p1, p2, p3);\r\n }\r\n }\r\n return Math.abs(volume);\r\n }\r\n getSignedVolumeOfTriangle(p1, p2, p3) {\r\n const v321 = p3.x * p2.y * p1.z;\r\n const v231 = p2.x * p3.y * p1.z;\r\n const v312 = p3.x * p1.y * p2.z;\r\n const v132 = p1.x * p3.y * p2.z;\r\n const v213 = p2.x * p1.y * p3.z;\r\n const v123 = p1.x * p2.y * p3.z;\r\n return (1.0 / 6.0) * (-v321 + v231 + v312 - v132 - v213 + v123);\r\n }\r\n}\r\nVolumeMeasurement.uuid = \"811da532-7af3-4635-b592-1c06ae494af5\";\r\nToolComponent.libraryUUIDs.add(VolumeMeasurement.uuid);\r\n//# sourceMappingURL=index.js.map"],"names":["LengthMeasurement","enabled","this","_enabled","value","cancelCreation","_vertexPicker","components","uiEnabled","uiElement","get","active","visible","_visible","dimension","_measurements","color","_lineMaterial","constructor","super","onDisposed","onBeforeUpdate","onAfterUpdate","onAfterCreate","onBeforeCreate","onAfterDelete","onBeforeDelete","onBeforeCancel","onAfterCancel","snapDistance","linewidth","depthTest","_temp","isDragging","start","end","undefined","create","async","data","plane","trigger","endCreation","drawStart","onKeyDown","e","key","tools","add","uuid","_raycaster","previewElement","newEndpoint","setUI","main","set","materialIcon","onClick","setupEvents","dispose","reset","remove","measure","update","_delta","drawInProcess","createOnPoints","p1","p2","drawDimension","startPoint","endPoint","createBoundingBox","push","length","boundingBoxes","getBoundingBoxes","intersect","castRay","find","dim","boundingBox","object","index","indexOf","splice","deleteMeasurement","measurement","deleteAll","items","intersects","point","found","lineMaterial","endpointElement","element","document","createElement","className","map","filter","box","viewerContainer","renderer","domElement","parentElement","addEventListener","window","removeEventListener","libraryUUIDs","MeasurementUtils","getFace","mesh","triangleIndex","instance","geometry","Error","allEdges","Map","indices","array","targetPlane","getFaceData","coplanarFacesIndices","faceIndex","edges","equals","id","points","distance","nextFaceID","edgeFaceMap","faceEdgesMap","commonEdgesFaces","edge","has","commonFace","edgesIDs","size","faceID","Set","firstFaceID","otherFaces","edgesToAdd","delete","foundFaceEdges","firstFace","firstFaceIndices","firstFaceEdges","otherFace","otherEdges","otherIndices","firstEdges","firstIndices","_faceID","foundEdges","edgeID","foundEdge","distanceFromPointToLine","lineStart","lineEnd","clamp","tempLine","tempPoint","closestPointToPoint","distanceTo","getVerticesAndNormal","p3","faceNormal","round","vertices","x","y","z","sort","a","b","id1","v1","id2","v2","id3","v3","setFromNormalAndCoplanarPoint","constant","Math","pos","attributes","position","nor","normal","i1","i2","i3","n1","n2","n3","averageNx","averageNy","averageNz","transform","getMatrixAt","rotation","extractRotation","applyMatrix4","vector","factor","trunc","DimensionLabelClassName","SimpleDimensionLine","label","_endpoints","endpoint1","endpoint2","ep1Object","ep2Object","_components","scene","_root","removeFromParent","_end","_line","setXYZ","needsUpdate","copy","updateLabel","_start","_center","dir","clone","sub","len","normalize","multiplyScalar","_length","getLength","createLine","newEndpointElement","cloneNode","newText","renderOrder","disposer","destroy","marker","lookAt","toggleLabel","toggleVisibility","textContent","getTextContent","computeLineDistances","axisGeom","setFromPoints","line","htmlText","scale","units","parseFloat","toFixed","VolumeMeasurement","result","raycaster","volume","getVolumeOfMesh","console","log","onMouseMove","onKeydown","_e","newLabel","getVolumeFromMeshes","meshes","labelObject","bbox","computeBoundingSphere","addMesh","sphere","getSphere","center","formattedVolume","toString","ui","warn","instances","i","count","matrix","identity","matrixWorld","multiply","getSignedVolumeOfTriangle","abs"],"sourceRoot":""}