{"version":3,"file":"app-26a324bb.13da5084c6dcb4a7.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/project/ifc-fun/EgMessagePackLoader/EgFragmentLoader.ts","webpack://client-app/./src/app/project/ifc-fun/OpenBimHandles.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/DimensionMeasureTool.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/RayCastDebugTool.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/VisibilityTool.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/CropTool.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/IfcSpaceVisibility.ts","webpack://client-app/./src/app/project/ifc-fun/OpenBimViewerThreeDService.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/ModeToolHandler.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/ObjectSelectionTool.ts"],"sourcesContent":["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, MsgPackWrapper } from \"./IfcDataWrapper\";\r\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\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\nexport class EgFragmentLoader extends OBC.Component\r\n\timplements OBC.Disposable /*, OBC.Updateable */ {\r\n\tstatic readonly uuid = \"7BB331A7-FF47-49EC-966D-00C689CEDE71\";\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\tconstructor(components: OBC.Components) {\r\n\t\tsuper(components);\r\n\t\tcomponents.tools.add(EgFragmentLoader.uuid, this);\r\n\t}\r\n\r\n\tpublic get() {\r\n\t\treturn this._group;\r\n\t}\r\n\r\n\tpublic loadFromJson(jsonData: string, id: string): BF.FragmentsGroup {\r\n\t\tlet data : IfcDataWrapper[] = JSON.parse(jsonData);\r\n\t\tthis._group = this.loadAllGeometry(data, id);\r\n\t\treturn this._group;\r\n\t}\r\n\r\n\tpublic loadFromMessagePackZip(data: Uint8Array, id: string): BF.FragmentsGroup {\r\n\t\tconsole.log(`Unzipping...`);\r\n\t\tlet start = this.ms();\r\n\t\tconst unzipped: fflate.Unzipped = fflate.unzipSync(data);\r\n\t\tdata = 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 tmp: any = mp.decode(rawMsgPack);\r\n\t\tlet geometryData: IfcDataWrapper[] = [];\r\n\r\n\t\tlet items : IfcDataWrapper[] = tmp.items; //Root object of structure is called items...\r\n\r\n\t\tfor (let item of items) {\r\n\t\t\tconst ifcWrap : IfcDataWrapper = item;\r\n\t\t\tgeometryData.push(ifcWrap)\r\n\t\t}\r\n\r\n\t\ttmp = null;\r\n\t\ttime = this.ms() - start;\r\n\t\tconsole.log(`Deserialize took ${time} ms`);\r\n\r\n\t\tthis._group = this.loadAllGeometry(items, id);\r\n\t\treturn this._group;\r\n\t}\r\n\r\n\tpublic loadAllGeometry(data: IfcDataWrapper[], id: string) {\r\n\r\n\t\tlet geometries = new Map[]>();\r\n\t\tlet transparentGeometries = new Map[]>();\r\n\r\n\t\tlet meshes: THREE.Mesh[] = [];\r\n\r\n\t\tlet start = this.ms();\r\n\t\tconsole.log(`Loading geometry...`);\r\n\t\tfor (let item of data) {\r\n\t\t\tconst placedGeometries = item.geometries;\r\n\r\n\t\t\tif (!placedGeometries)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tif (!item.globalID)\r\n\t\t\t\titem.globalID = crypto.randomUUID();\r\n\r\n\t\t\tif (item.globalID == '3l7AhtGo19VACck763uUX9') {\r\n\t\t\t\tlet qqq = 0;\r\n\t\t\t\t++qqq;\r\n\t\t\t}\r\n\r\n\t\t\tfor (let i = 0; i < placedGeometries.length; i++) {\r\n\t\t\t\tconst placedGeometry = placedGeometries[i];\r\n\t\t\t\tlet mesh = this.getPlacedGeometryFromWrapper(placedGeometry);\r\n\r\n\t\t\t\tmesh.userData = {\r\n\t\t\t\t\tglobalId: item.globalID,\r\n\t\t\t\t\tifcType: item.ifctype,\r\n\t\t\t\t\texpressId : item.expressID\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (placedGeometry.color.w !== 1) {\r\n\t\t\t\t\tif (!transparentGeometries.has(item.globalID))\r\n\t\t\t\t\t\ttransparentGeometries.set(item.globalID, []);\r\n\r\n\t\t\t\t\tlet arr = transparentGeometries.get(item.globalID);\r\n\t\t\t\t\tarr?.push(mesh);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (!geometries.has(item.globalID))\r\n\t\t\t\t\t\tgeometries.set(item.globalID, []);\r\n\r\n\t\t\t\t\tlet arr = geometries.get(item.globalID);\r\n\t\t\t\t\tarr?.push(mesh);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\titem.geometries = [];\r\n\t\t}\r\n\r\n\t\tdata = [];\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\tstart = this.ms();\r\n\t\tconsole.log(`Merging geometry...`);\r\n\t\tlet group = new BF.FragmentsGroup();\r\n\t\tgroup.uuid = id;\r\n\t\tlet fragmentKey = 1;\r\n\t\tif (geometries.size > 0) {\r\n\t\t\tfor (let g of geometries) {\r\n\t\t\t\tlet bufferedGeometries = g[1];\r\n\t\t\t\tlet userData = bufferedGeometries[0].userData;\r\n\t\t\t\tconst combinedGeometry = BufferGeometryUtils.mergeGeometries(bufferedGeometries.map(i => i.geometry));\r\n\t\t\t\tlet mat = new THREE.MeshLambertMaterial({ emissiveIntensity: 1.1, flatShading: true, reflectivity: 1.1 });\r\n\t\t\t\tmat.vertexColors = true;\r\n\t\t\t\tthis.addFragmentToGroup(combinedGeometry, mat, userData, group, fragmentKey);\r\n\t\t\t\t++fragmentKey;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (transparentGeometries.size > 0) {\r\n\t\t\tfor (let g of transparentGeometries) {\r\n\t\t\t\tlet bufferedGeometries = g[1];\r\n\t\t\t\tlet userData = bufferedGeometries[0].userData;\r\n\t\t\t\tconst combinedGeometryTransp = BufferGeometryUtils.mergeGeometries(bufferedGeometries.map(i => i.geometry));\r\n\t\t\t\tlet matTransp = new THREE.MeshBasicMaterial();\r\n\t\t\t\tmatTransp.vertexColors = true;\r\n\t\t\t\tmatTransp.transparent = true;\r\n\t\t\t\tmatTransp.opacity = 0.5;\r\n\t\t\t\tthis.addFragmentToGroup(combinedGeometryTransp, matTransp, userData, group, fragmentKey);\r\n\t\t\t\t++fragmentKey;\r\n\t\t\t}\r\n\t\t}\r\n\t\ttime = this.ms() - start;\r\n\t\tconsole.log(`Merging geometry took ${time} ms`);\r\n\r\n\t\treturn group;\r\n\t}\r\n\r\n\tprivate addFragmentToGroup(geom: THREE.BufferGeometry, mat: THREE.Material, userData: any, group: BF.FragmentsGroup, fragmentKey: number) {\r\n\t\tlet f = new BF.Fragment(geom, mat, 1);\r\n\t\tf.mesh.userData = userData;\r\n\t\tlet expressId = userData[\"expressId\"];\r\n\t\tlet id = expressId.toString();\r\n\t\tf.id = id;//userData[\"globalId\"] ?? crypto.randomUUID(); \r\n\t\tf.items.push(expressId);\r\n\t\tf.ids.add(expressId);\r\n\t\tf.mesh.updateMatrix();\r\n\r\n\t\tf.setInstance(0, {\r\n\t\t\tids: [id],\r\n\t\t\ttransform: f.mesh.matrix,\r\n\t\t});\r\n\r\n\t\tthis.saveItemsInMap(f, [id], id);\r\n\r\n\t\tgroup.items.push(f);\r\n\t\tgroup.add(f.mesh);\r\n\t\tf.group = group;\r\n\r\n\t\tgroup.keyFragments[fragmentKey] = id;\r\n\t\tgroup.data[expressId] = [[fragmentKey], [0]];\r\n\r\n\t\tgeom.dispose();\r\n\t}\r\n\r\n\tprivate checkBlockNumberValid(f: BF.Fragment, ids: string[]) {\r\n\t\tif (ids.length > f.blocks.count) {\r\n\t\t\tthrow new Error(\r\n\t\t\t\t`You passed more items (${ids.length}) than blocks in this instance (${f.blocks.count})`\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate saveItemsInMap(f:BF.Fragment, ids: string[], instanceId: number) {\r\n\t\tthis.checkBlockNumberValid(f, ids);\r\n\t\tlet counter = 0;\r\n\t\tfor (const id of ids) {\r\n\t\t\tconst index = this.getItemIndex(f, instanceId, counter);\r\n\t\t\tf.items[index] = id;\r\n\t\t\tcounter++;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getItemIndex(f:BF.Fragment, instanceId: number, blockId: number) {\r\n\t\treturn instanceId * f.blocks.count + blockId;\r\n\t}\r\n\r\n\tprivate getItemID(f:BF.Fragment, instanceID: number, blockID: number) {\r\n\t\tconst index = this.getItemIndex(f, instanceID, blockID);\r\n\t\treturn f.items[index];\r\n\t}\r\n\r\n\tprivate getPlacedGeometryFromWrapper(wrapper: IfcMeshWrapper) {\r\n\t\tconst material = this.getMeshMaterial(wrapper.color);\r\n\t\tlet matrix = this.getMeshMatrix(wrapper.flatTransformation);\r\n\t\tlet bufGeom = this.ifcGeometryWrapperToBuffer(wrapper.color, wrapper.geometry);\r\n\t\tbufGeom = bufGeom.applyMatrix4(matrix);\r\n\t\tconst mesh = new THREE.Mesh(bufGeom, material);\r\n\t\tmesh.matrix = matrix;\r\n\t\tmesh.matrixAutoUpdate = false;\r\n\t\treturn mesh;\r\n\t}\r\n\r\n\tprivate getMeshMaterial(color: Color) {\r\n\t\t//let colID = `${color.x}${color.y}${color.z}${color.w}`;\r\n\t\t// if (this.materials[colID])\r\n\t\t// {\r\n\t\t// return this.materials[colID];\r\n\t\t// }\r\n\r\n\t\tconst col = new THREE.Color(color.x, color.y, color.z);\r\n\t\tconst material = new THREE.MeshPhongMaterial({ color: col, side: THREE.DoubleSide });\r\n\t\tmaterial.transparent = color.w !== 1;\r\n\t\tmaterial.vertexColors = true;\r\n\t\tif (material.transparent) material.opacity = 0.5;//color.w;\r\n\r\n\t\t//this.materials[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\tlet 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\tcolorFloats[i / 2 + 0] = color.x;\r\n\t\t\tcolorFloats[i / 2 + 1] = color.y;\r\n\t\t\tcolorFloats[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\tgeometry.setAttribute(\r\n\t\t\t'color',\r\n\t\t\tnew THREE.BufferAttribute(colorFloats, 3));\r\n\r\n\t\tgeometry.setIndex(new THREE.BufferAttribute(this.numToUint32Array(wrapper.indexData), 1));\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:OBC.Disposer = this.components.tools.get(OBC.Disposer); // await \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\n","import * as OBC from \"openbim-components\";\r\nimport { FragmentsGroup } from 'bim-fragment';\r\nimport {EgFragmentLoader} from \"./EgMessagePackLoader/EgFragmentLoader\";\r\nimport {OpenBim_ViewerObjectInfoService} from \"../../services/viewer-object-info-service/OB-viewer-object-info-service\";\r\nimport {OpenBimViewerThreeDService} from \"./OpenBimViewerThreeDService\";\r\n\r\nexport class OpenBimHandles {\r\n\t/* JG: Denne klasse kan ogsaa opfattes \r\n\tsom et 'openBim SCOPE' eller en 'openBim CONTEXT'.\r\n\t Brugs-intentionen er følgende:\r\n\tEt parent/hosting objekt laver en instans af den,\r\n\tog styrer derved lifetime/lifecycle for det openBim-scope.\r\n\r\n\tDerudover videregiver den dette scope-objekt\r\n\ttil diverse nestede conceptuelle children.\r\n\tDels aurelia element/component children,\r\n\thvor den kan 'passe' ved at binde egenskaben som en input-parameter på det child.\r\n\tAlternativt ved direkte at assigne/kalde metoder,\r\n\tpå children den selv har referencer til.\r\n\t Det fungerer, idet det er en objekt-reference.\r\n\tDerved er det ikke så skrøbeligt som aurealias value-passing mekanisme for simple value bindings\r\n\t(e.g. af strings eller numbers), hvor vi oplever at ændringer i den bundne værdi ikke altid reflekteres.\r\n\t Det hjælper også, \r\n\tat vi ikke er afhængige af OpenBimHandles i rendered views/DOM elementer\r\n\t(ie vi har ikke behov for, at disse re-renderes.)\r\n\t*/\r\n\tcomp: OBC.Components | undefined;\r\n\tmgr: OBC.FragmentManager | undefined;\r\n\tloader: OBC.FragmentIfcLoader | undefined;\r\n\tmpkLoader: EgFragmentLoader | undefined;\t// Loader for the message pack format\r\n\thighlighter: OBC.FragmentHighlighter | undefined; // in-for openbim-container. MAY NOT BE NECESSARY, instead we could request it from COMPONENTS? \r\n\r\n\t// fixme, should be robust for >1 model/revision loaded!\r\n\ttheModel: FragmentsGroup | undefined;\r\n\r\n\topenbimViewerThreeDService: OpenBimViewerThreeDService|undefined;\r\n}\r\n","import * as OBC from \"openbim-components\";\r\nimport {ModeTool} from \"./ModeTool\";\r\n\r\nexport class DimensionMeasureTool implements ModeTool {\r\n\r\n\tprivate dimensions: OBC.LengthMeasurement;\r\n\r\n\tconstructor(private components: OBC.Components) {\r\n\t\tthis.dimensions = this.components.tools.get(OBC.LengthMeasurement);\r\n\t\tthis.dimensions.snapDistance = 1;\r\n\t}\r\n\r\n\tasync activate(): Promise {\r\n\t\tthis.dimensions.enabled = true;\r\n\t}\r\n\r\n\tasync deactivate(): Promise {\r\n\t\tthis.dimensions.enabled = false;\r\n\t\tawait this.dimensions.deleteAll();\r\n\t}\r\n\r\n\tasync onDoubleClick(event: MouseEvent): Promise {\r\n\t\tawait this.dimensions.create();\r\n\t}\r\n\t\r\n\tasync onMouseDown(event: MouseEvent): Promise {\r\n\t}\r\n\r\n\tasync onMouseUp(event: MouseEvent): Promise {\r\n\t}\r\n}\r\n","import {Components, FragmentManager} from \"openbim-components\";\r\nimport {Intersection} from \"three\";\r\nimport {ModeTool} from \"./ModeTool\";\r\n\r\nexport class RayCastDebugTool implements ModeTool {\r\n\tconstructor(private components: Components) {\r\n\t}\r\n\r\n\tasync onMouseDown(event: Event): Promise {\r\n\t\tconst fragmentManager = this.components.tools.get(FragmentManager);\r\n\t\tconst result: Intersection | null = this.components.raycaster.castRay(fragmentManager.meshes);\r\n\r\n\t\tif (!result) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconsole.log('Peeew! 🌠', result);\r\n\t}\r\n\r\n\tasync onMouseUp(event: Event): Promise {\r\n\t}\r\n\r\n\tasync onDoubleClick(event: Event): Promise {\r\n\t}\r\n\r\n\tasync activate(): Promise {\r\n\t}\r\n\r\n\tasync deactivate(): Promise {\r\n\t}\r\n\r\n}\r\n","import {Components, FragmentManager, MaterialManager} from \"openbim-components\";\r\nimport {Material, Mesh, MeshBasicMaterial, MeshBasicMaterialParameters, MeshLambertMaterial} from \"three\";\r\nimport {ModelLoadCallbackIF} from \"../EgMessagePackLoader/ModelLoadCallbackIF\";\r\nexport class VisibilityTool implements ModelLoadCallbackIF {\r\n\tprivate fragmentManager: FragmentManager;\r\n\t\r\n\tprivate materialManager: MaterialManager;\r\n\tprivate translucentMaterial: MeshBasicMaterial;\r\n\t\r\n\t//private meshUuids: string[] = [];\r\n\tconstructor(private components: Components) {\r\n\t\tthis.materialManager = components.tools.get(MaterialManager);\t\r\n\t\tthis.fragmentManager = components.tools.get(FragmentManager);\r\n\t\t\r\n\t\tthis.translucentMaterial = new MeshBasicMaterial({\r\n\t\t\tcolor: 'darkblue',\r\n\t\t\ttransparent: true,\r\n\t\t\topacity: 0.1\r\n\t\t});\r\n\t\t\r\n\t\tthis.materialManager.addMaterial('translucent', this.translucentMaterial);\r\n\t}\r\n\r\n\tafterModelLoad(): void {\r\n\t\t// We need to add the meshes to the translucent material every time a new model is loaded.\r\n\t\tthis.materialManager.addMeshes('translucent', this.components.meshes);\r\n\t\t\r\n\t\t// Make a material per mesh\r\n\t\t/*\r\n\t\tfor (let mesh of this.components.meshes) {\r\n\t\t\tthis.meshUuids.push(mesh.uuid);\r\n\r\n\t\t\tconst newMaterial = new MeshBasicMaterial({transparent: true, opacity: 0.1});\r\n\r\n\t\t\tif (mesh.material instanceof MeshLambertMaterial) {\r\n\t\t\t\tnewMaterial.color = mesh.material.color ?? \"FFFFFF\";\r\n\t\t\t}\r\n\t\t\telse if (mesh.material instanceof Array) {\r\n\t\t\t\tnewMaterial.color = ( mesh.material[0])?.color ?? \"FFFFFF\";\r\n\t\t\t}\r\n\r\n\t\t\tconsole.log(newMaterial);\r\n\t\t\tthis.materialManager.addMaterial(mesh.uuid, newMaterial);\r\n\t\t}\r\n\t\t */\r\n }\r\n\t\r\n\tasync hideAll() {\r\n\t\tconsole.log('Before hideAll');\r\n\t\tthis.fragmentManager.groups.forEach(group => group.visible = false);\r\n\t\tconsole.log('After hideAll');\r\n\t}\r\n\t\r\n\tasync showAll() {\r\n\t\tthis.materialManager.set(false, ['translucent']);\r\n\t\t//this.materialManager.set(false, this.meshUuids);\r\n\t\tconsole.log('Before showAll');\r\n\t\tthis.fragmentManager.groups.forEach(group => group.visible = true);\r\n\t\tconsole.log('After showAll');\r\n\t}\r\n\t\r\n\tasync transluteAll() {\r\n\t\tconsole.log('Before transluteAll');\r\n\t\t//this.materialManager.set(true, this.meshUuids);\r\n\t\tthis.materialManager.set(true, ['translucent']);\r\n\t\tconsole.log('After transluteAll');\r\n\t}\r\n}\r\n","import {ModeTool} from \"./ModeTool\";\r\nimport * as OBC from \"openbim-components\";\r\nimport {SimpleClipper, SimplePlane} from \"openbim-components\";\r\n\r\nexport class CropTool implements ModeTool {\r\n\tprivate clipper: SimpleClipper;\r\n\t\r\n\tconstructor(private components: OBC.Components) {\r\n\t\tthis.clipper = new OBC.SimpleClipper(components);\r\n\t}\r\n\t\r\n async onMouseDown(event: MouseEvent): Promise {\r\n\t\tif (event.ctrlKey) {\r\n\t\t\tthis.clipper.delete()\r\n\t\t}\r\n\t}\r\n\tasync onMouseUp(event: Event): Promise {\r\n }\r\n\tasync onDoubleClick(event: Event): Promise {\r\n\t\tthis.clipper.create();\r\n }\r\n\tasync activate(): Promise {\r\n this.clipper.enabled = true;\r\n }\r\n\tasync deactivate(): Promise {\r\n this.clipper.enabled = false;\r\n }\r\n\t\r\n}\r\n","import * as OBC from 'openbim-components';\r\nimport {ModelLoadCallbackIF} from \"../EgMessagePackLoader/ModelLoadCallbackIF\";\r\nexport class IfcSpaceVisibility implements ModelLoadCallbackIF {\r\n\tprivate classifier: OBC.FragmentClassifier;\r\n\tconstructor(private components: OBC.Components) {\r\n\t\tthis.classifier = new OBC.FragmentClassifier(components);\r\n\t}\r\n\r\n\tafterModelLoad(): void {\r\n\t\tconst fragmentManager = this.components.tools.get(OBC.FragmentManager);\r\n\t\t\r\n\t\tfragmentManager.groups.forEach((group) => {\r\n\t\t\tthis.classifier.byEntity(group);\r\n\t\t\tconst classification: OBC.Classification = this.classifier.get();\r\n\t\t\tconsole.log('classification:', classification);\r\n\t\t});\r\n }\r\n}\r\n","import { RevisionInformation3d } from \"../work-area/split-viewer-interfaces\";\r\nimport {BimViewerThreeDServiceIF, ToolEnum} from \"app/services/BimViewerThreeDServiceIF\";\r\nimport * as OBC from \"openbim-components\";\r\nimport {ModeToolHandler} from \"./Tools/ModeToolHandler\";\r\nimport {DimensionMeasureTool} from \"./Tools/DimensionMeasureTool\";\r\nimport {RayCastDebugTool} from \"./Tools/RayCastDebugTool\";\r\nimport {ObjectSelectionTool} from \"./Tools/ObjectSelectionTool\";\r\nimport {VisibilityTool} from \"./Tools/VisibilityTool\";\r\nimport {CropTool} from \"./Tools/CropTool\";\r\nimport {ModelLoadCallbackIF} from \"./EgMessagePackLoader/ModelLoadCallbackIF\";\r\nimport {IfcSpaceVisibility} from \"./Tools/IfcSpaceVisibility\";\r\n\r\nexport class OpenBimViewerThreeDService implements BimViewerThreeDServiceIF {\r\n\tprivate readonly objectSelectionTool: ObjectSelectionTool;\r\n\tprivate readonly lengthMeasureTool: DimensionMeasureTool;\r\n\tprivate readonly debugTool: RayCastDebugTool;\r\n\tprivate readonly cropTool: CropTool;\r\n\t\r\n\tprivate readonly visibilityTool: VisibilityTool;\r\n\tprivate ifcSpaceVisibility: IfcSpaceVisibility;\r\n\t\r\n\tpublic readonly loadEventsSubscribers: ModelLoadCallbackIF[] = [];\r\n\r\n\tconstructor(private toolHandler: ModeToolHandler, components: OBC.Components, objectSelectionTool: ObjectSelectionTool) {\r\n\t\tthis.objectSelectionTool = objectSelectionTool;\r\n\t\tthis.lengthMeasureTool = new DimensionMeasureTool(components);\r\n\t\tthis.debugTool = new RayCastDebugTool(components);\r\n\t\tthis.cropTool = new CropTool(components);\r\n\r\n\t\tthis.visibilityTool = new VisibilityTool(components);\r\n\t\tthis.ifcSpaceVisibility = new IfcSpaceVisibility(components);\r\n\t\t\r\n\t\tthis.loadEventsSubscribers.push(this.visibilityTool);\r\n\t\tthis.loadEventsSubscribers.push(this.ifcSpaceVisibility);\r\n\t}\r\n\t\r\n\tshowObjects(objectIds: number[]) {\r\n\t\t\r\n\t}\r\n\thideObjects(objectIds: number[]) { }\r\n\ttransluteObjects(objectIds: number[]) { }\r\n\tchangeSelectedTool(tool: ToolEnum) {\r\n\t\tswitch (tool) {\r\n\t\t\tcase ToolEnum.ObjectSelection:\r\n\t\t\t\tthis.toolHandler.setTool(this.objectSelectionTool);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ToolEnum.DimensionMeasure:\r\n\t\t\t\tthis.toolHandler.setTool(this.lengthMeasureTool);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ToolEnum.LaserMeasure:\r\n\t\t\t\tthis.toolHandler.setTool(this.debugTool);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ToolEnum.CropTool:\r\n\t\t\t\tthis.toolHandler.setTool(this.cropTool);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\thideAllObjects(loadedRevisions: Map) { \r\n\t\tthis.visibilityTool.hideAll();\r\n\t}\r\n\ttransluteAllObjects(loadedRevisions: Map) {\r\n\t\tthis.visibilityTool.transluteAll();\r\n\t}\r\n\tshowAllObjects(loadedRevisions: Map) {\r\n\t\tthis.visibilityTool.showAll();\r\n\t}\r\n\thandleSpaces(loadedRevisions: Map, shouldShowSpaces: boolean) { }\r\n}\r\n","import {ModeTool} from \"./ModeTool\";\r\n\r\n/**\r\n * This class is responsible for handling the mode tools.\r\n * There are two kinds of tools. ModeTools and OneOffTools.\r\n * ModeTools are tools that are active until another tool is activated.\r\n * OneOffTools are tools that are active only for one event. These are implemented as functions elsewhere.\r\n */\r\nexport class ModeToolHandler {\r\n\tprivate activeTool: ModeTool;\r\n\t\r\n\tconstructor(defaultTool: ModeTool) {\r\n\t\tthis.activeTool = defaultTool;\r\n\t}\r\n\tpublic async setTool(tool: ModeTool) {\r\n\t\tconsole.log('ModeToolHandler.setTool', tool)\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.deactivate();\r\n\t\t}\r\n\t\tthis.activeTool = tool;\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.activate();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic async onMouseDown(event: MouseEvent) {\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.onMouseDown(event);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic async onMouseUp(event: MouseEvent) {\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.onMouseUp(event);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic async onDoubleClick(event: MouseEvent) {\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.onDoubleClick(event);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static setupToolEventsWithoutAurelia(container: HTMLElement, modeToolHandler: ModeToolHandler) {\r\n\t\tcontainer.addEventListener('mousedown', async (event:MouseEvent) => modeToolHandler.onMouseDown(event));\r\n\t\tcontainer.addEventListener( 'mouseup', async (event:MouseEvent) => modeToolHandler.onMouseUp(event));\r\n\t\tcontainer.addEventListener('dblclick', async (event:MouseEvent) => modeToolHandler.onDoubleClick(event));\r\n\t}\r\n}\r\n","\r\nimport * as OBC from \"openbim-components\";\r\nimport {EventAggregator} from \"aurelia-event-aggregator\";\r\nimport {Fragment, FragmentsGroup, IfcProperties} from \"bim-fragment\";\r\nimport {ModeTool} from \"./ModeTool\";\r\nimport {OpenBimHandles} from \"../OpenBimHandles\";\r\nimport {\r\n\tcollectIDsFromMap,\r\n\tdisableHighlighterOutline,\r\n\tHighlightResult,\r\n\tObjPropertySet,\r\n\tselectionHighlightName\r\n} from \"../openbim-highlighter\";\r\nimport { openbimFlag_EG_OutlineEnabled } from \"../openbim-initcontainer\";\r\n\r\nexport class ObjectSelectionTool implements ModeTool {\r\n\r\n\tconstructor(private OB: OpenBimHandles, private highlighter: OBC.FragmentHighlighter, private eventAggregator: EventAggregator) {\r\n\t}\r\n\r\n\tprivate mouseDownTime: number = 0;\r\n\r\n\tasync activate(): Promise {\r\n\t\tif (this.highlighter)\r\n\t\t\tthis.highlighter.enabled = true;\r\n\t}\r\n\r\n\tasync deactivate(): Promise {\r\n\t\tif (this.highlighter)\r\n\t\t\tthis.highlighter.enabled = false;\r\n\r\n\t\t// experiment:\r\n\t\tif (!openbimFlag_EG_OutlineEnabled()) {\r\n\t\t\tdisableHighlighterOutline(this.highlighter);\r\n\t\t}\r\n\t\tthis.highlighter?.clear(selectionHighlightName);\r\n\t}\r\n\r\n\tasync onDoubleClick(event: MouseEvent): Promise {\r\n\t}\r\n\r\n\tasync onMouseDown(event: MouseEvent): Promise {\r\n\t\tthis.mouseDownTime = event.timeStamp;\r\n\t}\r\n\r\n\tasync onMouseUp(event: MouseEvent): Promise {\r\n\t\tawait ObjectSelectionTool.highlightOnClick(event, event.timeStamp - this.mouseDownTime, this.highlighter!, this.OB, this.eventAggregator)\r\n\t}\r\n\r\n\tprivate static async highlightOnClick(event: MouseEvent, dur: number, highlighter: OBC.FragmentHighlighter, OB: OpenBimHandles, aggr: EventAggregator): Promise {\r\n\t\tlet singleSelection = {value: false}; //true };\r\n\r\n\t\tconst LeftMouseButton = 0;\r\n\r\n\t\tif (event.button != LeftMouseButton) {\r\n\t\t\treturn;\r\n\t\t} // ignore everything but left mouse-button.\r\n\t\tif (dur > 160) {\r\n\t\t\tconsole.log('highlightOnClick, ignoring mouse click longer than dur:', dur);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconsole.log('hiliter has mats:', highlighter.highlightMats);\r\n\r\n\t\t// experiment:\r\n\t\tif (!openbimFlag_EG_OutlineEnabled()) {\r\n\t\t\tdisableHighlighterOutline(highlighter);\r\n\t\t}\r\n\r\n\t\tconst sel: HighlightResult | null = await highlighter.highlight(selectionHighlightName, singleSelection.value);\r\n\t\tconsole.log('sel result:', sel);\r\n\t\tconst realSel: OBC.FragmentIdMap = highlighter.selection[selectionHighlightName];\r\n\t\tconsole.log('realsel result:', realSel);\r\n\r\n\r\n\t\tif (!sel) {\r\n\t\t\tconsole.log('(null sel)');\r\n\t\t}\r\n\r\n\t\tconst sel_expressId: number = Number(sel?.id);\r\n\t\tconst someFrag: Fragment | undefined = sel?.fragments[0];\r\n\t\tconst group: FragmentsGroup | undefined = someFrag?.group;\r\n\t\tconst props: IfcProperties | undefined = group?.properties;\r\n\t\tconst objPropertySet: ObjPropertySet | undefined = props ? props[sel_expressId] : undefined; // https://standards.buildingsmart.org/IFC/RELEASE/IFC4_1/FINAL/HTML/schema/templates/property-sets-for-objects.htm\r\n\r\n\t\ttry {\r\n\t\t\tconst revitTag: string = objPropertySet?.Tag?.value ?? '(no Tag field)';\r\n\t\t\tconst ifcTypeNum: number = objPropertySet?.type;\r\n\t\t\tconst ifcGlobalId: string = objPropertySet?.GlobalId?.value;\r\n\t\t\tconst ifcName: string = objPropertySet?.Name?.value;\r\n\t\t\tconst inf = {sel_expressId, revitTag, ifcTypeNum, ifcGlobalId, ifcName};\r\n\t\t\t//console.table(inf);\r\n\t\t\tconsole.log(inf);\r\n\t\t\tthis.send_ElmsSelect_Event(aggr, realSel, OB, inf);\r\n\t\t} catch (s) {\r\n\t\t\tconsole.warn(s, objPropertySet);\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate static send_ElmsSelect_Event(\r\n\t\taggr: EventAggregator, // we need this one, so we can send messages.\r\n\t\trealSel: OBC.FragmentIdMap, // we need this one, to actually HAVE the current selection.\r\n\t\tOB: OpenBimHandles, // optional, not used, if-we-might-need-it.\r\n\t\tinf: { // other earlier hints for selection. Think of cases where we are not only using expressIDs, e.g. IfcGlobalId.\r\n\t\t\tsel_expressId: number,\r\n\t\t\trevitTag: string, //= objPropertySet?.Tag?.value ?? '(no Tag field)';\r\n\t\t\tifcTypeNum: number, //= objPropertySet.type;\r\n\t\t\tifcGlobalId: string, //= objPropertySet.GlobalId.value;\r\n\t\t\tifcName: string //= objPropertySet.Name.value;\r\n\t\t},\r\n\t) {\r\n\t\tconst asArray = collectIDsFromMap(realSel);\r\n\t\tconsole.log('expressIDs collected:', asArray);\r\n\t\taggr.publish('base-viewer-combined:select', { // for the benefit of pivot-grid-component, and PivotGridComponent.highlightMatchingRows().\r\n\t\t\tevent: 'no-event-for-you',\r\n\t\t\tobjectIds: asArray\r\n\t\t});\r\n\t}\r\n}\r\n\r\n\r\n"],"names":["EgFragmentLoader","constructor","components","super","onDisposed","enabled","tools","add","uuid","this","get","_group","loadFromJson","jsonData","id","data","JSON","parse","loadAllGeometry","loadFromMessagePackZip","console","log","start","ms","unzipped","Uint8Array","rawMsgPack","Object","entries","time","tmp","geometryData","items","item","ifcWrap","push","geometries","Map","transparentGeometries","placedGeometries","globalID","crypto","randomUUID","qqq","i","length","placedGeometry","mesh","getPlacedGeometryFromWrapper","userData","globalId","ifcType","ifctype","expressId","expressID","color","w","has","set","arr","group","fragmentKey","size","g","bufferedGeometries","combinedGeometry","map","geometry","mat","emissiveIntensity","flatShading","reflectivity","vertexColors","addFragmentToGroup","combinedGeometryTransp","matTransp","transparent","opacity","geom","f","toString","ids","updateMatrix","setInstance","transform","matrix","saveItemsInMap","keyFragments","dispose","checkBlockNumberValid","blocks","count","Error","instanceId","counter","index","getItemIndex","blockId","getItemID","instanceID","blockID","wrapper","material","getMeshMaterial","getMeshMatrix","flatTransformation","bufGeom","ifcGeometryWrapperToBuffer","applyMatrix4","matrixAutoUpdate","col","x","y","z","side","fromArray","vertexData","posFloats","Float32Array","normFloats","colorFloats","setAttribute","setIndex","numToUint32Array","indexData","num","Uint32Array","numberOfDigits","Math","max","floor","log10","abs","toCompositeID","factor","idString","async","reset","disposer","destroy","Date","getTime","OpenBimHandles","DimensionMeasureTool","dimensions","snapDistance","deleteAll","event","create","RayCastDebugTool","fragmentManager","result","raycaster","castRay","meshes","VisibilityTool","materialManager","translucentMaterial","MeshBasicMaterial","addMaterial","afterModelLoad","addMeshes","groups","forEach","visible","CropTool","clipper","ctrlKey","delete","IfcSpaceVisibility","classifier","byEntity","classification","OpenBimViewerThreeDService","toolHandler","objectSelectionTool","loadEventsSubscribers","lengthMeasureTool","debugTool","cropTool","visibilityTool","ifcSpaceVisibility","showObjects","objectIds","hideObjects","transluteObjects","changeSelectedTool","tool","setTool","hideAllObjects","loadedRevisions","hideAll","transluteAllObjects","transluteAll","showAllObjects","showAll","handleSpaces","shouldShowSpaces","ModeToolHandler","defaultTool","activeTool","deactivate","activate","onMouseDown","onMouseUp","onDoubleClick","static","container","modeToolHandler","addEventListener","ObjectSelectionTool","OB","highlighter","eventAggregator","mouseDownTime","clear","timeStamp","highlightOnClick","dur","aggr","button","highlightMats","sel","highlight","realSel","selection","sel_expressId","Number","someFrag","fragments","props","properties","objPropertySet","undefined","revitTag","Tag","value","ifcTypeNum","type","inf","ifcGlobalId","GlobalId","ifcName","Name","send_ElmsSelect_Event","s","warn","asArray","publish"],"sourceRoot":""}