{"version":3,"file":"app-b4b5981a.64a21e10bf111406.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/project/ifc-fun/BoundingBoxUtility.ts","webpack://client-app/./src/app/project/ifc-fun/EgMessagePackLoader/IfcDataWrapper.ts","webpack://client-app/./src/app/project/ifc-fun/EgMessagePackLoader/EgFragmentLoader.ts","webpack://client-app/./src/app/project/ifc-fun/IdMappingComponent.ts"],"sourcesContent":["import {OpenBimHandles} from \"./OpenBimHandles\";\r\nimport {FragmentIdMap} from \"openbim-components\";\r\nimport {Box3, BufferGeometry, InstancedMesh, Matrix4, Mesh, Quaternion, Vector3} from \"three\";\r\nimport {Fragment, FragmentMesh} from \"bim-fragment\";\r\n\r\nexport class BoundingBoxUtility {\r\n\r\n\tconstructor(private openBimHandles: OpenBimHandles) {\r\n\t}\r\n\r\n\tpublic getBoundingBoxForItems(fragmentIdToItemIdMap: FragmentIdMap): Box3 {\r\n\t\tconst allMeshes: Mesh[] = [];\r\n\t\tthis.openBimHandles.comp!.meshes.forEach(mesh => allMeshes.push(mesh));\r\n\r\n\t\tconst selectedMeshes = allMeshes.filter(mesh => {\r\n\t\t\tconst fragmentMesh: FragmentMesh = mesh;\r\n\t\t\treturn fragmentIdToItemIdMap[fragmentMesh.fragment.id] !== undefined;\r\n\t\t});\r\n\r\n\t\t// Calculate the bounding box of the selected objects\r\n\t\tconst totalBoundingBox: Box3 = new Box3();\r\n\t\tfor (const object of selectedMeshes) {\r\n\t\t\tconst fragmentMesh: FragmentMesh = object;\r\n\t\t\t// All of this below can be elevated up so it only happens once per fragment\r\n\t\t\tconst fragment: Fragment = fragmentMesh.fragment;\r\n\r\n\t\t\tconst instanceIds = BoundingBoxUtility.getInstanceIdsOfFragment(fragmentIdToItemIdMap, fragment);\r\n\r\n\t\t\tconst boundingBoxForInstances: Box3 = this.getBoundingBoxForInstances(fragmentMesh, instanceIds);\r\n\t\t\ttotalBoundingBox!.union(boundingBoxForInstances);\r\n\t\t}\r\n\t\treturn totalBoundingBox;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the instance IDs of the fragment.\r\n\t * It only returns the instance IDs of the items that are present in the fragmentIdMap meaning only the items that\r\n\t * were given using their object ids.\r\n\t * @param fragmentIdToItemIdMap\r\n\t * @param fragment\r\n\t * @private\r\n\t */\r\n\tprivate static getInstanceIdsOfFragment(fragmentIdToItemIdMap: FragmentIdMap, fragment: Fragment) {\r\n\t\tconst itemIDs: number[] = Array.from(fragmentIdToItemIdMap[fragment.id]);\r\n\r\n\t\tconst instanceIds: number[] = itemIDs.flatMap(itemID => {\r\n\t\t\tconst instanceIdsSet: Set | null = fragment.getInstancesIDs(itemID);\r\n\t\t\tconst numbers: number[] = [...instanceIdsSet!];\r\n\t\t\treturn numbers;\r\n\t\t});\r\n\t\treturn instanceIds;\r\n\t}\r\n\r\n\tprivate getBoundingBoxForInstances(instancedMesh: InstancedMesh, indices: number[]): Box3 {\r\n\r\n\t\tconst boundingBox = new Box3();\r\n\t\tconst tempBox = new Box3();\r\n\t\tconst tempMatrix = new Matrix4();\r\n\t\tconst tempPosition = new Vector3();\r\n\t\tconst tempQuaternion = new Quaternion();\r\n\t\tconst tempScale = new Vector3();\r\n\r\n\t\tindices.forEach(index => {\r\n\t\t\tinstancedMesh.getMatrixAt(index, tempMatrix);\r\n\r\n\t\t\t// Decompose the matrix into position, rotation, and scale\r\n\t\t\ttempMatrix.decompose(tempPosition, tempQuaternion, tempScale);\r\n\r\n\t\t\t// Apply the transformation to a temporary geometry bounding box\r\n\t\t\tconst geometry: BufferGeometry = instancedMesh.geometry;\r\n\t\t\tif (!geometry.boundingBox) {\r\n\t\t\t\tgeometry.computeBoundingBox();\r\n\t\t\t}\r\n\t\t\ttempBox.copy(geometry.boundingBox!).applyMatrix4(tempMatrix);\r\n\r\n\t\t\t// Extend the main bounding box with the transformed bounding box\r\n\t\t\tboundingBox.union(tempBox);\r\n\t\t});\r\n\r\n\t\treturn boundingBox;\r\n\t}\r\n}\r\n","import * as BF from \"bim-fragment\";\r\nexport class GeometryRootData {\r\n\tpublic version?: number;\r\n\tpublic items: IfcDataWrapper[] = [];\r\n\tpublic geometries: IfcGeometryWrapper[] = [];\r\n}\r\n\r\nexport class IfcDataWrapper {\r\n\texpressID: number = 0;\r\n\tglobalID: string = \"\";\r\n\tifcType: string = \"\";\r\n\tmeshes: IfcMeshWrapper[] = []\r\n}\r\n\r\nexport class IfcMeshWrapper {\r\n\tcolor!: Color;\r\n\tflatTransformation: number[] = [];\r\n\tgeometryID!: number;\r\n\tgeometryExpressID!: number;\r\n}\r\n\r\nexport class IfcGeometryWrapper {\r\n\tid!: number;\r\n\tgeometryExpressID!: number;\r\n\tindexData: number[] = [];\r\n\tvertexData: number[] = [];\r\n}\r\n\r\nexport class GroupAndIdMappings {\r\n\tgroup: BF.FragmentsGroup;\r\n\tglobalIdMapping: Map;\r\n\texpressIdMapping: Map;\r\n\r\n\tconstructor(group: BF.FragmentsGroup,\r\n\t\t\t\tglobalIdMapping: Map,\r\n\t\t\t\texpressIdMapping: Map) {\r\n\t\tthis.group = group;\r\n\t\tthis.globalIdMapping = globalIdMapping;\r\n\t\tthis.expressIdMapping = expressIdMapping;\r\n\t}\r\n}\r\n\r\nexport interface Color {\r\n\tx: number;\r\n\ty: number;\r\n\tz: number;\r\n\tw: number;\r\n}\r\n","import * as THREE from \"three\";\r\nimport * as OBC from \"openbim-components\";\r\nimport * as BF from \"bim-fragment\";\r\nimport { IfcDataWrapper, IfcGeometryWrapper, IfcMeshWrapper, Color, GeometryRootData, GroupAndIdMappings } from \"./IfcDataWrapper\";\r\nimport * as fflate from \"fflate\";\r\nimport * as mp from \"@msgpack/msgpack\"\r\n\r\n/**\r\n * A tool to load Fragments from various formats\r\n */\r\n\r\nexport class EgFragmentLoader extends OBC.Component\r\n\timplements OBC.Disposable /*, OBC.Updateable */ {\r\n\tstatic readonly uuid = \"EFDECA14-5498-4BE1-9F70-1ED1B93512F2\";\r\n\r\n\t//readonly onAfterUpdate = new OBC.Event();\r\n\r\n\t//readonly onBeforeUpdate = new OBC.Event();\r\n\treadonly onDisposed = new OBC.Event();\r\n\r\n\tenabled = true;\r\n\r\n\tprivate _group!: BF.FragmentsGroup;\r\n\r\n\tprivate _transparentMaterial: THREE.Material;\r\n\r\n\tconstructor(components: OBC.Components) {\r\n\t\tsuper(components);\r\n\t\tcomponents.tools.add(EgFragmentLoader.uuid, this);\r\n\r\n\t\tthis._transparentMaterial = new THREE.MeshStandardMaterial({ transparent: true, opacity: 0.4 });\r\n\t\tthis._transparentMaterial.depthWrite = false;\r\n\t\tthis._transparentMaterial.polygonOffset = true;\r\n\t\tthis._transparentMaterial.polygonOffsetFactor = 5;\r\n\t\tthis._transparentMaterial.polygonOffsetUnits = 1;\r\n\t}\r\n\r\n\tpublic get() {\r\n\t\treturn this._group;\r\n\t}\r\n\r\n\tpublic async loadFromJson(jsonData: string, id: string): Promise {\r\n\t\tlet data = JSON.parse(jsonData);\r\n\t\tconst result = await this.loadAllGeometry(data, id);\r\n\t\tthis._group = result.group;\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic async loadFromMessagePackZip(zipData: Uint8Array, id: string) : Promise {\r\n\t\tconsole.log(`Unzipping...`);\r\n\t\tlet start = this.ms();\r\n\t\tconst unzipped: fflate.Unzipped = fflate.unzipSync(zipData);\r\n\t\tzipData = new Uint8Array();\r\n\t\tlet rawMsgPack = Object.entries(unzipped)[0][1]; //unzipped is an array of entries where 0 = filename and 1 = contents;\r\n\t\tlet time = this.ms() - start;\r\n\t\tconsole.log(`Unzip took ${time} ms`);\r\n\r\n\t\tconsole.log(`Deserializing message pack...`);\r\n\t\tstart = this.ms();\r\n\t\tlet data = mp.decode(rawMsgPack);\r\n\r\n\t\ttime = this.ms() - start;\r\n\t\tconsole.log(`Deserialize took ${time} ms`);\r\n\r\n\t\tconst result = await this.loadAllGeometry(data, id);\r\n\t\tthis._group = result.group;\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic async loadAllGeometry(data: GeometryRootData, id: string) : Promise {\r\n\r\n\t\tlet uniqueMaterials = new Map();\r\n\r\n\t\tlet start = this.ms();\r\n\t\tconsole.log(`Loading geometry...`);\r\n\r\n\t\tlet group = new BF.FragmentsGroup();\r\n\t\tgroup.uuid = id;\r\n\r\n\t\tlet geomMap = new Map();\r\n\r\n\t\tlet props : any = {};\r\n\r\n\t\t//Flatten geometry structure for easier access to meshes\r\n\t\tfor (const item of data.items) {\r\n\t\t\tfor (const mesh of item.meshes) {\r\n\t\t\t\tconst color = new THREE.Color().setRGB(mesh.color.x, mesh.color.y, mesh.color.z, \"srgb\");\r\n\t\t\t\tlet colID = color.getHexString();\r\n\r\n\t\t\t\t//let combinedId = `${item.expressID}-${mesh.geometryExpressID}`;\r\n\t\t\t\tlet transparentId = mesh.color.w != 1 ? 1 : 0;\r\n\t\t\t\tlet combinedId = `${mesh.geometryExpressID}-${colID}-${transparentId}`;\r\n\r\n\t\t\t\tif (!geomMap.has(combinedId))\r\n\t\t\t\t\tgeomMap.set(combinedId, []);\r\n\r\n\t\t\t\tlet meshes = geomMap.get(combinedId);\r\n\t\t\t\tif (meshes)\r\n\t\t\t\t\tmeshes.push(new FlatMesh(combinedId, mesh, item, color, mesh.color.w));\r\n\t\t\t}\r\n\r\n\t\t\tprops[item.expressID] = {\r\n\t\t\t\tglobalId: item.globalID,\r\n\t\t\t\tifcType: item.ifcType\r\n\t\t\t};\r\n\r\n\t\t\tgroup.data.set(item.expressID, [[], [0, 0]]);\r\n\t\t}\r\n\r\n\t\tgroup.setLocalProperties(props);\r\n\r\n\t\tlet result = new GroupAndIdMappings(group, new Map(), new Map());\r\n\r\n\t\tlet ix = 0;\r\n\t\tfor (const ent of geomMap.entries()) {\r\n\t\t\tlet fragment : BF.Fragment|null = null; //Make one fragment per unique geometry/color\r\n\t\t\tgroup.keyFragments.set(ix, ent[0].toString());\r\n\r\n\t\t\tlet meshCount = ent[1].length;\r\n\r\n\t\t\tfor (const flatmesh of ent[1]) {\r\n\t\t\t\tlet item = flatmesh.item;\r\n\t\t\t\tlet mesh = flatmesh.mesh;\r\n\r\n\t\t\t\tlet expressId = item.expressID.toString();\r\n\t\t\t\tlet geomExpressId = flatmesh.combinedId.toString();\r\n\r\n\t\t\t\tlet groupData = group.data.get(item.expressID);\r\n\t\t\t\tif (groupData)\r\n\t\t\t\t\tgroupData[0].push(ix);\r\n\r\n\t\t\t\tif (fragment == null) {\r\n\t\t\t\t\tlet geometry = data.geometries.find(i => i.id == mesh.geometryID);\r\n\t\t\t\t\tif (!geometry) {\r\n\t\t\t\t\t\tconsole.error(\"Cannot find geometry with id: \" + mesh.geometryID);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet mat = this.getMeshMaterial(flatmesh, uniqueMaterials);\r\n\t\t\t\t\tlet bufGeom = this.ifcGeometryWrapperToBuffer(mesh.color, geometry);\r\n\r\n\t\t\t\t\tfragment = new BF.Fragment(bufGeom, mat, meshCount);\r\n\t\t\t\t\tfragment.id = geomExpressId;\r\n\t\t\t\t\tfragment.mesh.userData[\"ifcType\"] = item.ifcType;\r\n\t\t\t\t\tfragment.mesh.userData[\"expressID\"] = [];\r\n\t\t\t\t\t\r\n\t\t\t\t\tgroup.add(fragment.mesh);\r\n\t\t\t\t\tgroup.items.push(fragment);\r\n\t\t\t\t\tfragment.group = group;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfragment.mesh.userData[\"expressID\"].push(item.expressID);\r\n\r\n\t\t\t\t//const color = new THREE.Color().setRGB(mesh.color.x, mesh.color.y, mesh.color.z, \"srgb\");\r\n\t\t\t\tlet matrix = this.getMeshMatrix(mesh.flatTransformation);\r\n\r\n\t\t\t\tlet white = new THREE.Color(1, 1, 1);\r\n\t\t\t\tfragment.add(\r\n\t\t\t\t\t[\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\ttransforms: [matrix],\r\n\t\t\t\t\t\t\tcolors: [flatmesh.color],\r\n\t\t\t\t\t\t\t//colors: [white],\r\n\t\t\t\t\t\t\tid: item.expressID\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t]\r\n\t\t\t\t);\r\n\r\n\t\t\t\tresult.expressIdMapping.set(item.expressID, item.globalID);\r\n\t\t\t\tresult.globalIdMapping.set(item.globalID, item.expressID);\r\n\t\t\t}\r\n\r\n\t\t\tif (fragment && fragment.mesh.userData[\"ifcType\"].toUpperCase() == \"IFCSPACE\")\r\n\t\t\t\tfragment.setVisibility(false, fragment.ids);\r\n\r\n\t\t\t++ix;\r\n\t\t}\r\n\r\n\t\tlet time = this.ms() - start;\r\n\t\tconsole.log(`Loading geometry took ${time} ms`);\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprivate getMeshMaterial(flatmesh: FlatMesh, uniqueMaterials: Map) : THREE.Material {\r\n\t\tlet idParts = flatmesh.combinedId.split(\"-\");\r\n\t\tlet colID = idParts[1] + idParts[2];\r\n\r\n\t\tif (uniqueMaterials.has(colID))\r\n\t\t{\r\n\t\t\tlet mat = uniqueMaterials.get(colID);\r\n\t\t\tif (mat)\r\n\t\t\t\treturn mat;\r\n\t\t}\r\n\r\n\t\tlet white = new THREE.Color(1, 1, 1);\r\n\t\tlet col = flatmesh.color;\r\n\t\tcol = white;\r\n\r\n\t\tlet material: THREE.Material;\r\n\t\tconst transparent = flatmesh.opacity !== 1;\r\n\t\tif (transparent) {\r\n\t\t\t//material = new THREE.MeshBasicMaterial({ color: white, transparent: true, opacity: flatmesh.opacity });\r\n\t\t\tmaterial = new THREE.MeshStandardMaterial({ color: col, transparent: true, opacity: flatmesh.opacity });\r\n\r\n\t\t\t//material = new THREE.MeshStandardMaterial({ color: col, transparent: false, opacity: color.w });\r\n\t\t\tmaterial.vertexColors = false;\r\n\t\t\t//material.depthWrite = false;\r\n\t\t\t//material.polygonOffset = true;\r\n\t\t\t//material.polygonOffsetFactor = 5;\r\n\t\t\t//material.polygonOffsetUnits = 1;\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//material = new THREE.MeshBasicMaterial({ color: white, side: THREE.DoubleSide });\r\n\r\n\t\t\tmaterial = new THREE.MeshLambertMaterial({ color: col, side: THREE.DoubleSide, emissiveIntensity: 1.2, flatShading: true, reflectivity: 1.2 });\r\n\t\t\t//material = new THREE.MeshBasicMaterial({ color: col });\r\n\t\t\tmaterial.vertexColors = false;\r\n\t\t}\r\n\r\n\r\n\t\tuniqueMaterials.set(colID, material);\r\n\r\n\t\treturn material;\r\n\t}\r\n\r\n\tprivate getMeshMatrix(matrix: Array) {\r\n\t\tconst mat = new THREE.Matrix4();\r\n\t\tmat.fromArray(matrix);\r\n\t\treturn mat;\r\n\t}\r\n\r\n\tprivate ifcGeometryWrapperToBuffer(color: Color, wrapper: IfcGeometryWrapper) {\r\n\t\tconst geometry = new THREE.BufferGeometry();\r\n\r\n\t\tlet vertexData = wrapper.vertexData;\r\n\r\n\t\tlet posFloats = new Float32Array(vertexData.length / 2);\r\n\t\tlet normFloats = new Float32Array(vertexData.length / 2);\r\n\t\t//let colorFloats = new Float32Array(vertexData.length / 2);\r\n\r\n\t\tfor (let i = 0; i < vertexData.length; i += 6) {\r\n\t\t\tposFloats[i / 2 + 0] = vertexData[i + 0];\r\n\t\t\tposFloats[i / 2 + 1] = vertexData[i + 1];\r\n\t\t\tposFloats[i / 2 + 2] = vertexData[i + 2];\r\n\r\n\t\t\tnormFloats[i / 2 + 0] = vertexData[i + 3];\r\n\t\t\tnormFloats[i / 2 + 1] = vertexData[i + 4];\r\n\t\t\tnormFloats[i / 2 + 2] = vertexData[i + 5];\r\n\r\n\t\t\t//colorFloats[i / 2 + 0] = color.x;\r\n\t\t\t//colorFloats[i / 2 + 1] = color.y;\r\n\t\t\t//colorFloats[i / 2 + 2] = color.z;\r\n\t\t}\r\n\r\n\t\tgeometry.setAttribute(\r\n\t\t\t'position',\r\n\t\t\tnew THREE.BufferAttribute(posFloats, 3));\r\n\t\tgeometry.setAttribute(\r\n\t\t\t'normal',\r\n\t\t\tnew THREE.BufferAttribute(normFloats, 3));\r\n\t\t//geometry.setAttribute(\r\n\t\t// 'color',\r\n\t\t// new THREE.BufferAttribute(colorFloats, 3));\r\n\r\n\t\tgeometry.setIndex(Array.from(this.numToUint32Array(wrapper.indexData)));\r\n\t\treturn geometry;\r\n\t}\r\n\r\n\tnumToUint32Array(num: number[]) {\r\n\t\tlet arr = new Uint32Array(num.length);\r\n\t\tfor (let i = 0; i < num.length; i++)\r\n\t\t\tarr[i] = num[i];\r\n\t\treturn arr;\r\n\t}\r\n\r\n\tnumberOfDigits(x: number) {\r\n\t\treturn Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;\r\n\t}\r\n\r\n\ttoCompositeID(id: number, count: number) {\r\n\t\tconst factor = 0.1 ** this.numberOfDigits(count);\r\n\t\tid += count * factor;\r\n\t\tlet idString = id.toString();\r\n\t\t// add missing zeros\r\n\t\tif (count % 10 === 0) {\r\n\t\t\tfor (let i = 0; i < factor; i++) {\r\n\t\t\t\tidString += \"0\";\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn idString;\r\n\t}\r\n\r\n\tasync dispose() {\r\n\t\tthis.enabled = false;\r\n\t\t// Make sure to clean up the events\r\n\t\t//this.onBeforeUpdate.reset();\r\n\t\t//this.onAfterUpdate.reset();\r\n\r\n\t\tthis.onDisposed?.reset();\r\n\r\n\t\t// Use the disposer tool to easily dispose THREE.js objects\r\n\t\tconst disposer = this.components.tools.get(OBC.Disposer);\r\n\t\tif (this._group)\r\n\t\t\tdisposer.destroy(this._group);\r\n\t}\r\n\r\n\tms(): number {\r\n\t\tconst d = new Date();\r\n\t\treturn d.getTime();\r\n\t}\r\n\r\n\t//async update() {\r\n\t// this.onBeforeUpdate.trigger();\r\n\t// console.log(\"Updated!\");\r\n\t// this.onAfterUpdate.trigger();\r\n\t//}\r\n}\r\n\r\nclass FlatMesh {\r\n\tmesh: IfcMeshWrapper;\r\n\titem: IfcDataWrapper;\r\n\tcombinedId: string;\r\n\tcolor: THREE.Color;\r\n\topacity: number;\r\n\tconstructor(combinedId: string, mesh: IfcMeshWrapper, item: IfcDataWrapper, color: THREE.Color, opacity: number) {\r\n\t\tthis.combinedId = combinedId;\r\n\t\tthis.mesh = mesh;\r\n\t\tthis.item = item;\r\n\t\tthis.color = color;\r\n\t\tthis.opacity = opacity;\r\n\t}\r\n}\r\n","import * as OBC from \"openbim-components\";\r\nimport * as BF from \"bim-fragment\";\r\nimport {ModelLoadCallbackIF} from \"./EgMessagePackLoader/ModelLoadCallbackIF\";\r\nimport { FragmentSource } from \"./openbim-container\";\r\nimport {ObjPropertySet} from \"./openbim-highlighter\";\r\n\r\nexport class IdMappingComponent extends OBC.Component implements ModelLoadCallbackIF {\r\n\r\n\tprivate fragmentGroupToMappings: Map = new Map();\r\n\r\n\tconstructor(components: OBC.Components) {\r\n\t\tsuper(components);\r\n\t}\r\n\t\r\n async afterModelLoad(fragmentsGroup: BF.FragmentsGroup, source: FragmentSource): Promise {\r\n\t\tconst properties = fragmentsGroup.getLocalProperties();\r\n\t\tif (!properties)\r\n\t\t\treturn;\r\n\r\n\t\tconst idToGlobalId = new Map;\r\n\t\tconst globalIdToId = new Map;\r\n\r\n\t\tfragmentsGroup.getAllPropertiesIDs().forEach(id => {\r\n\t\t\tconst property: ObjPropertySet = properties[id];\r\n\t\t\tconst ifcGlobalId: string = property?.globalId;\r\n\r\n\t\t\tif (ifcGlobalId) {\r\n\t\t\t\tidToGlobalId.set(id, ifcGlobalId);\r\n\t\t\t\tglobalIdToId.set(ifcGlobalId, id);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\r\n\t\tthis.fragmentGroupToMappings.set(fragmentsGroup.id, {globalIdMapping: globalIdToId, idMapping: idToGlobalId});\r\n }\r\n\t\t\r\n\tstatic readonly uuid = \"198F91B0-98FD-4F96-BFD2-32C88D23AB94\";\r\n\tenabled: boolean = true;\r\n\r\n\tget(args: any): FragmentGroupMappings {\r\n\t\tconst fragmentGroupMappings = this.fragmentGroupToMappings.get(args.groupId)!;\r\n\t\treturn fragmentGroupMappings;\r\n\t}\r\n\r\n\tgetFromFragmentGroupId(fragmentGroupId: number) : FragmentGroupMappings | undefined {\r\n\t\tconst fragmentGroupMappings = this.fragmentGroupToMappings.get(fragmentGroupId);\r\n\t\treturn fragmentGroupMappings;\r\n\t}\r\n}\r\n\r\nexport interface FragmentGroupMappings {\r\n\tglobalIdMapping: Map;\r\n\tidMapping: Map;\r\n}\r\n"],"names":["BoundingBoxUtility","constructor","openBimHandles","getBoundingBoxForItems","fragmentIdToItemIdMap","allMeshes","this","comp","meshes","forEach","mesh","push","selectedMeshes","filter","undefined","fragment","id","totalBoundingBox","Box3","object","fragmentMesh","instanceIds","getInstanceIdsOfFragment","boundingBoxForInstances","getBoundingBoxForInstances","union","Array","from","flatMap","itemID","getInstancesIDs","instancedMesh","indices","boundingBox","tempBox","tempMatrix","Matrix4","tempPosition","Vector3","tempQuaternion","Quaternion","tempScale","index","getMatrixAt","decompose","geometry","computeBoundingBox","copy","applyMatrix4","GroupAndIdMappings","group","globalIdMapping","expressIdMapping","EgFragmentLoader","components","super","onDisposed","enabled","tools","add","uuid","_transparentMaterial","transparent","opacity","depthWrite","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","get","_group","loadFromJson","jsonData","data","JSON","parse","result","loadAllGeometry","loadFromMessagePackZip","zipData","console","log","start","ms","unzipped","Uint8Array","rawMsgPack","Object","entries","time","uniqueMaterials","Map","geomMap","props","item","items","color","setRGB","x","y","z","colID","getHexString","transparentId","w","combinedId","geometryExpressID","has","set","FlatMesh","expressID","globalId","globalID","ifcType","setLocalProperties","ix","ent","keyFragments","toString","meshCount","length","flatmesh","geomExpressId","groupData","geometries","find","i","geometryID","error","mat","getMeshMaterial","bufGeom","ifcGeometryWrapperToBuffer","userData","matrix","getMeshMatrix","flatTransformation","transforms","colors","toUpperCase","setVisibility","ids","idParts","split","material","white","col","vertexColors","side","emissiveIntensity","flatShading","reflectivity","fromArray","wrapper","vertexData","posFloats","Float32Array","normFloats","setAttribute","setIndex","numToUint32Array","indexData","num","arr","Uint32Array","numberOfDigits","Math","max","floor","log10","abs","toCompositeID","count","factor","idString","dispose","reset","disposer","destroy","Date","getTime","IdMappingComponent","fragmentGroupToMappings","afterModelLoad","fragmentsGroup","source","properties","getLocalProperties","idToGlobalId","globalIdToId","getAllPropertiesIDs","property","ifcGlobalId","idMapping","args","groupId","getFromFragmentGroupId","fragmentGroupId"],"sourceRoot":""}