{"version":3,"file":"ngx-ifc-viewer.mjs","sources":["../../../projects/ifc-viewer/src/lib/ifc-viewer.service.ts","../../../projects/ifc-viewer/src/lib/models.ts","../../../projects/ifc-viewer/src/lib/import-export/ifc-import.service.ts","../../../projects/ifc-viewer/src/lib/import-export/gltf-import.service.ts","../../../projects/ifc-viewer/src/lib/model-loader.service.ts","../../../projects/ifc-viewer/src/lib/ifc-tools.service.ts","../../../projects/ifc-viewer/src/lib/picking.service.ts","../../../projects/ifc-viewer/src/lib/helpers/color-helpers.ts","../../../projects/ifc-viewer/src/lib/selection.service.ts","../../../projects/ifc-viewer/src/lib/color.service.ts","../../../projects/ifc-viewer/src/lib/visibility.service.ts","../../../projects/ifc-viewer/src/lib/overlay.service.ts","../../../projects/ifc-viewer/src/lib/property-panel/IfcDatatypesMap.ts","../../../projects/ifc-viewer/src/lib/property-panel/IfcElementsMap.ts","../../../projects/ifc-viewer/src/lib/pipes/character-decode.ts","../../../projects/ifc-viewer/src/lib/pipes/decode-step.pipe.ts","../../../projects/ifc-viewer/src/lib/property-panel/property-panel.component.ts","../../../projects/ifc-viewer/src/lib/property-panel/property-panel.component.html","../../../projects/ifc-viewer/src/lib/spinner/spinner.service.ts","../../../projects/ifc-viewer/src/lib/menu-panel/search-bar/search-bar.component.ts","../../../projects/ifc-viewer/src/lib/menu-panel/search-bar/search-bar.component.html","../../../projects/ifc-viewer/src/lib/menu-panel/menu-panel.component.ts","../../../projects/ifc-viewer/src/lib/menu-panel/menu-panel.component.html","../../../projects/ifc-viewer/src/lib/context-menu/context-menu.component.ts","../../../projects/ifc-viewer/src/lib/context-menu/context-menu.component.html","../../../projects/ifc-viewer/src/lib/spinner/spinner.component.ts","../../../projects/ifc-viewer/src/lib/directives/longpress.directive.ts","../../../projects/ifc-viewer/src/lib/directives/shortpress.directive.ts","../../../projects/ifc-viewer/src/lib/directives/shortpress-right.directive.ts","../../../projects/ifc-viewer/src/lib/directives/resize.directive.ts","../../../projects/ifc-viewer/src/lib/ifc-viewer.component.ts","../../../projects/ifc-viewer/src/lib/ifc-viewer.component.html","../../../projects/ifc-viewer/src/lib/import-export/gltf-export.service.ts","../../../projects/ifc-viewer/src/lib/menu-panel/menu-panel.module.ts","../../../projects/ifc-viewer/src/lib/ifc-viewer.module.ts","../../../projects/ifc-viewer/src/public-api.ts","../../../projects/ifc-viewer/src/ngx-ifc-viewer.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { AmbientLight, AxesHelper, Box3, Color, DirectionalLight, DoubleSide, GridHelper, LineSegments, Material, MathUtils, Matrix4, Mesh, MeshBasicMaterial, MeshLambertMaterial, MOUSE, PerspectiveCamera, Quaternion, Raycaster, Scene, Sphere, Spherical, Vector2, Vector3, Vector4, WebGLRenderer, WireframeGeometry, Clock, BoxBufferGeometry } from 'three';\r\nimport { IFCModel } from 'web-ifc-three/IFC/components/IFCModel';\r\nimport {  OrbitControls } from \"three/examples/jsm/controls/OrbitControls\"; // Original\r\nimport { ModelViewerSettings } from './models';\r\nimport { IFCManager } from 'web-ifc-three/IFC/components/IFCManager';\r\nimport CameraControls from 'camera-controls';\r\n\r\nconst subsetOfTHREE = {\r\n    MOUSE,\r\n    Vector2,\r\n    Vector3,\r\n    Vector4,\r\n    Quaternion,\r\n    Matrix4,\r\n    Spherical,\r\n    Box3,\r\n    Sphere,\r\n    Raycaster,\r\n    MathUtils: {\r\n      DEG2RAD: MathUtils.DEG2RAD,\r\n      clamp: MathUtils.clamp\r\n    }\r\n  };\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class IFCViewerService {\r\n    \r\n\r\n    public scene: Scene = new Scene();\r\n    public camera: PerspectiveCamera = new PerspectiveCamera();    \r\n    public cameraControls?: CameraControls;\r\n    private clock: Clock = new Clock();\r\n    public renderer: WebGLRenderer = new WebGLRenderer();\r\n    public controls?: OrbitControls;\r\n    public sceneStatus$ = new BehaviorSubject<boolean>(false);\r\n    public loadedModels: IFCModel[] = [];\r\n    public globalColorScheme: string[] = [];\r\n\r\n    public grid: GridHelper = new GridHelper(50, 30);\r\n    public axes: any = new AxesHelper();\r\n\r\n    public ifcManager: IFCManager | null = null;\r\n\r\n    public globalSettings?: ModelViewerSettings;\r\n\r\n    constructor(){\r\n        console.log(\"Viewer service init\");\r\n\r\n        this.axes.material.depthTest = false;\r\n        this.axes.renderOrder = 1;\r\n\r\n        CameraControls.install({ THREE: subsetOfTHREE });\r\n    }\r\n\r\n    public initViewer(canvas: any, settings: ModelViewerSettings){\r\n\r\n        console.log(\"Scene init...\");\r\n\r\n        // Creates the Three.js scene\r\n        this.scene = new Scene();\r\n\r\n        // Fit to div\r\n        const size = {\r\n            width: canvas.clientWidth,\r\n            height: canvas.clientHeight,\r\n        };\r\n\r\n        //Creates the camera (point of view of the user)\r\n        const aspect = size.width / size.height;\r\n        const camera = new PerspectiveCamera(75, aspect);\r\n        camera.position.z = 15;\r\n        camera.position.y = 13;\r\n        camera.position.x = 8;\r\n        this.camera = camera;\r\n\r\n        //Creates the lights of the scene\r\n        const lightColor = 0xffffff;\r\n\r\n        const ambientLight = new AmbientLight(lightColor, 0.5);\r\n        this.scene.add(ambientLight);\r\n\r\n        const directionalLight = new DirectionalLight(lightColor, 1);\r\n        directionalLight.position.set(0, 10, 0);\r\n        directionalLight.target.position.set(-5, 0, 0);\r\n        this.scene.add(directionalLight);\r\n        this.scene.add(directionalLight.target);\r\n\r\n        //Sets up the renderer, fetching the canvas of the HTML\r\n        this.renderer = new WebGLRenderer({\r\n            canvas,\r\n            alpha: true\r\n        });\r\n\r\n        this.renderer.setSize(size.width, size.height);\r\n        this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\r\n\r\n        // Append all viewer settings\r\n        this.appendViewerSettings(settings);\r\n\r\n        // Create the camera-controls to navigate to a specific element\r\n        this.cameraControls = new CameraControls(this.camera, canvas);\r\n\r\n        this.setupControls(this.cameraControls);\r\n\r\n        //Animation loop\r\n        const animate = () => {\r\n            const delta = this.clock.getDelta();\r\n            this.cameraControls?.update(delta);\r\n            this.renderer.render(this.scene as Scene, camera);\r\n            requestAnimationFrame(animate);\r\n        };\r\n\r\n        animate();\r\n\r\n        //Adjust the viewport to the size of the browser\r\n        window.addEventListener(\"resize\", () => {\r\n            size.width = window.innerWidth;\r\n            size.height = window.innerHeight;\r\n            camera.aspect = size.width / size.height;\r\n            camera.updateProjectionMatrix();\r\n            this.renderer.setSize(size.width, size.height);\r\n        });\r\n\r\n        console.log(\"Scene finished...\");\r\n        this.sceneStatus$.next(true);\r\n\r\n    }\r\n\r\n    private setupControls(cameraControls: CameraControls) {\r\n        cameraControls.dampingFactor = 0.1;\r\n        cameraControls.dollyToCursor = true;\r\n        cameraControls.infinityDolly = true;\r\n        cameraControls.setTarget(0, 0, 0);\r\n      }\r\n\r\n    update(_delta: number) {\r\n        // super.update(_delta);\r\n        if (this.cameraControls?.enabled) {\r\n          this.cameraControls.update(_delta);\r\n        }\r\n      }\r\n\r\n    toggleCameraControls(active: boolean) {\r\n        if(this.cameraControls)\r\n        this.cameraControls.enabled = active;\r\n    }\r\n    \r\n\r\n    // Append all settings at once\r\n    public appendViewerSettings(settings: ModelViewerSettings){\r\n        this.globalSettings = settings;\r\n        //Creates grids and axes in the scene\r\n        this.setGridVisibility(settings.displayGrid);\r\n        this.setAxesVisibility(settings.displayAxes);\r\n        this.globalColorScheme = settings.colorScheme;\r\n    }\r\n\r\n    public setGridVisibility(visible: boolean){\r\n        visible ? this.scene.add(this.grid) : this.scene.remove(this.grid);\r\n    }\r\n\r\n    public setAxesVisibility(visible: boolean){\r\n        visible ? this.scene.add(this.axes) : this.scene.remove(this.axes);\r\n    }\r\n\r\n    public getSceneStatus(){\r\n        return this.sceneStatus$.asObservable();\r\n    }\r\n\r\n    public getScene(){\r\n        return this.scene;\r\n    }\r\n\r\n    public reRender(){\r\n        this.renderer.render(this.scene, this.camera);\r\n    }\r\n\r\n    flyToMeshCenter(mesh: Mesh, zoom: boolean = false, offset: number = 1.5, showBbox: boolean = false) {\r\n        let promises = [];\r\n        const center = this.getCenter(mesh);\r\n        mesh.geometry.computeBoundingBox();\r\n        // const boundingBox = new Box3();\r\n        // boundingBox.setFromObject( mesh );\r\n        const bbox = mesh.geometry.boundingBox as Box3;\r\n        if(bbox && zoom == true) {\r\n            bbox.min.x = bbox.min.x * offset;\r\n            bbox.max.y = bbox.max.y * offset;\r\n            bbox.min.x = bbox.min.x * offset;\r\n            bbox.max.y = bbox.max.y * offset;\r\n            const bbSize = bbox.getSize(new Vector3());\r\n            const distance = this.getDistanceToFitBox( bbSize.x, bbSize.y, bbSize.z );\r\n            promises.push( this.cameraControls?.dollyTo( distance, true ) );\r\n\r\n            if(showBbox == true) {\r\n                const geometry = new BoxBufferGeometry(bbSize.x, bbSize.y, bbSize.z);\r\n                const material = new MeshBasicMaterial({\r\n                    color: 0xff00ff,\r\n                    wireframe: true\r\n                  });\r\n                  const mesh = new Mesh(geometry, material);\r\n                this.loadMeshColor(mesh, \"red\", true)\r\n            }\r\n        }\r\n        \r\n        promises.push( this.cameraControls?.moveTo(center.x, center.y, center.z, true));\r\n        return Promise.all( promises );\r\n    }\r\n\r\n    async fitCameraToMeshBox(mesh: Mesh) {\r\n        await this.cameraControls?.fitToBox(mesh, true);\r\n    }\r\n\r\n    getCenter(mesh: Mesh) {\r\n        mesh.geometry.computeBoundingBox();\r\n        if (!mesh.geometry.index) return new Vector3();\r\n        const indices = mesh.geometry.index.array;\r\n        const position = mesh.geometry.attributes['position'];\r\n    \r\n        const threshold = 20;\r\n        let xCoords = 0;\r\n        let yCoords = 0;\r\n        let zCoords = 0;\r\n        let counter = 0;\r\n    \r\n        for (let i = 0; i < indices.length || i < threshold; i++) {\r\n          xCoords += position.getX(indices[i]);\r\n          yCoords += position.getY(indices[i]);\r\n          zCoords += position.getZ(indices[i]);\r\n          counter++;\r\n        }\r\n    \r\n        return new Vector3(xCoords / counter, yCoords / counter, zCoords / counter);\r\n    }\r\n\r\n    getDistanceToFitBox( width: number, height: number, depth: number ): number {\r\n\r\n\t\tconst boundingRectAspect = width / height;\r\n\t\tconst fov = this.camera.getEffectiveFOV() * MathUtils.DEG2RAD;\r\n\t\tconst aspect = this.camera.aspect;\r\n\r\n\t\tconst heightToFit = boundingRectAspect < aspect ? height : width / aspect;\r\n\t\treturn heightToFit * 0.5 / Math.tan( fov * 0.5 ) + depth * 0.5;\r\n\r\n\t}\r\n\r\n    public appendModel(model: IFCModel){\r\n\r\n        // Append to array of loaded models\r\n        this.loadedModels.push(model);\r\n\r\n        // Set IFC manager if not already set\r\n        if(this.ifcManager == undefined){\r\n            this.ifcManager = model.ifcManager;\r\n        }\r\n\r\n        this.getSceneStatus().subscribe(status => {\r\n            if(status == false) return;\r\n            \r\n            this.scene.add(model as any);\r\n            this.reRender();\r\n        })\r\n\r\n    }\r\n\r\n    public loadMesh(mesh: Mesh){\r\n\r\n        this.getSceneStatus().subscribe(status => {\r\n            if(status == false) return;\r\n            \r\n            // console.log(this.scene);\r\n            // console.log(mesh);\r\n            this.scene.add(mesh as any);\r\n            this.reRender();\r\n            // console.log(this.scene);\r\n        })\r\n\r\n    }\r\n\r\n    public getLoadedModels(){\r\n        return this.loadedModels;\r\n    }\r\n\r\n    public loadMeshColor(mesh: Mesh, color: string, asWireframe: boolean = false, randomColor: boolean = false){\r\n\r\n        this.getSceneStatus().subscribe(status => {\r\n            if(status == false) return;\r\n            const o = Math.round, r = Math.random, s = 255;\r\n            // console.log(this.scene);\r\n            // console.log(mesh);\r\n            if (asWireframe == true) {\r\n                const wireframe = new WireframeGeometry( mesh.geometry );\r\n                let line: any = new LineSegments( wireframe );\r\n                const material = new MeshBasicMaterial( { color: 0x00ff00 } );\r\n               \r\n                material.color.setRGB(o(r() * s), o(r() * s), o(r() * s));\r\n                line.material[0] = material;\r\n                console.log(line)\r\n\r\n                this.scene.add(line);\r\n            } else {\r\n                // Create random color\r\n                if(randomColor == true) {\r\n                    mesh.material = this.getRandomColorMaterial()\r\n                } else {\r\n                    mesh.material = this.materialFromColor(color);\r\n                }      \r\n                this.scene.add(mesh as any);\r\n            }\r\n            this.reRender();\r\n            // console.log(this.scene);\r\n        })        \r\n    }\r\n\r\n    public removeMeshFromScene(expressIDs: string[]) {\r\n        console.log(expressIDs)\r\n\r\n        for (let i = 0; i < expressIDs.length; i++) {\r\n            let id = expressIDs[i];\r\n\r\n            // loop through scene and get the meshes by name\r\n            for (let i = 0; i < this.scene.children.length; i++) {\r\n                let object = this.scene.children[i];\r\n                console.log(object.name)\r\n\r\n                // remove object if it is in expressIDs-Array\r\n                if(object.name == id) this.scene.remove(object)    \r\n            }\r\n        }\r\n    }\r\n\r\n    public getRandomColorMaterial() {\r\n        // Create random color\r\n        const color = new Color( 0xffffff );\r\n        color.setHex( Math.random() * 0xffffff );\r\n        return new MeshLambertMaterial({color});\r\n      }\r\n\r\n      public materialFromColor(color: string, opacity: number = 1): Material{\r\n\r\n        if(color.startsWith(\"rgba\")){\r\n            const res = this.processRGBA(color);\r\n            color = res.color;\r\n            opacity = res.opacity;\r\n        }\r\n  \r\n        let material = new MeshLambertMaterial({\r\n          color: new Color(color),\r\n          depthTest: true,\r\n          side: DoubleSide\r\n        });\r\n  \r\n        if(opacity != 1){\r\n            material.transparent = true;\r\n            material.opacity = opacity;\r\n        }\r\n  \r\n        return material;\r\n  \r\n      }\r\n\r\n      private processRGBA(str: string){\r\n        const arr = str.split(\"rgba(\")[1].split(\")\")[0].split(\",\").map(item => item.trim())\r\n        const color: string = `rgb(${arr[0]}, ${arr[1]}, ${arr[2]})`;\r\n        const opacity: number = parseFloat(arr[3]);\r\n        return { color, opacity };\r\n      }\r\n\r\n}","import { Color, PointsMaterial, Vector2, Vector3 } from \"three\";\r\nimport { LineMaterial } from \"three-fatline\";\r\n\r\nexport class ModelViewerSettings{\r\n    \r\n    public panelColor: string = \"DodgerBlue\";\r\n    public panelColorHover: string = \"RoyalBlue\";\r\n    public displayMenuPanel: boolean = true;\r\n    public displayGrid: boolean = false;\r\n    public clickableWhenDimmed: boolean = false;    // Should dimmed elements be clickable?\r\n    public highlightSelectedObjects: boolean = true;\r\n    public multiSelectEnabled: boolean = false;\r\n    public selectionColor: string = \"rgba(251,254,157,0.5)\";\r\n    public hoverColor: string = \"rgba(255,204,255,0.5)\";\r\n    public displayAxes: boolean = true;\r\n    public backgroundColor: string = \"\";\r\n    public showContextMenu: boolean = true;\r\n    public showSpinnerOnModelLoad: boolean = true;\r\n    public menuPanelSettings: MenuPanelSettings = new MenuPanelSettings();\r\n    public contextMenuButtons: ContextMenuButtons = new ContextMenuButtons();\r\n    // https://coolors.co/palette/001219-005f73-0a9396-94d2bd-e9d8a6-ee9b00-ca6702-bb3e03-ae2012-9b2226\r\n    public colorScheme: string[] = [\"#001219\", \"#005F73\", \"#0A9396\", \"#94D2BD\", \"#E9D8A6\", \"#EE9B00\", \"#CA6702\", \"#BB3E03\", \"#AE2012\", \"#9B2226\"];\r\n\r\n    setColorScheme(panelColor: string, panelColorHover: string){\r\n        this.panelColor = panelColor;\r\n        this.panelColorHover = panelColorHover;\r\n        this.menuPanelSettings.setColorScheme(panelColor, panelColorHover);\r\n    }\r\n\r\n}\r\n\r\nexport enum ModelFileType{\r\n    IFC=\"IFC\",\r\n    glTF=\"glTF\",\r\n    LDBIM=\"LDBIM\"\r\n}\r\n\r\nexport class MenuPanelSettings{\r\n\r\n    public panelColor: string = \"DodgerBlue\";\r\n    public panelColorHover: string = \"RoyalBlue\";\r\n    public displayMenuPanel: boolean = true;\r\n    public displayContextMenu: boolean = true;\r\n    public panelButtons: PanelButtons = new PanelButtons();\r\n\r\n    setColorScheme(panelColor: string, panelColorHover: string){\r\n        this.panelColor = panelColor;\r\n        this.panelColorHover = panelColorHover;\r\n    }\r\n\r\n}\r\n\r\nexport class ContextMenuButtons{\r\n    showProperties: boolean = true;\r\n}\r\n\r\n\r\nexport class PanelButtons{\r\n    uploadFile: boolean = true;\r\n    searchBar: boolean = true;\r\n    cleanScene: boolean = true;\r\n    modelOverview: boolean = true;\r\n}\r\n\r\nexport interface ColorGroup{\r\n    color: \"string\",\r\n    expressIDs: number[]\r\n}\r\n\r\nexport interface IDMap{\r\n    expressToGlobalId: any;\r\n    globalToExpressId: any;\r\n}\r\n\r\nexport interface XYScreenCoordinate{\r\n    x: string;\r\n    y: string;\r\n}\r\n\r\nexport interface ElementClickEvent{\r\n    globalId: string;\r\n    expressID: number;\r\n    modelID: number;\r\n    object: PickedObject;\r\n    mouseEvent: MouseEvent;\r\n    selection: string[];\r\n}\r\n\r\nexport interface GlobalIdMatch{\r\n    modelID: number;\r\n    expressIDs: number[];\r\n}\r\n\r\nexport interface PickedObject{\r\n    distance: number;\r\n    expressID: number;\r\n    modelID: number;\r\n    intersectionPoint: Vector3;\r\n}\r\n\r\n// WKT Objects\r\nexport class WKTObject{\r\n    public wktString: string = \"\";\r\n    public options: WKTObjectOptions = new WKTObjectOptions();\r\n    public type: WKTObjectType = WKTObjectType.Unknown;\r\n    public transformYZ: boolean = true;\r\n\r\n    constructor(wktString: string, options = new WKTObjectOptions()){\r\n        this.wktString = wktString.toLowerCase().trim();\r\n        this.options = options;\r\n        this.setType();\r\n    }\r\n\r\n    setType(){\r\n        if(this.wktString.startsWith(\"bbox\")){\r\n            this.type = WKTObjectType.AABB;\r\n        }\r\n        if(this.wktString.startsWith(\"point\")){\r\n            this.type = WKTObjectType.Point;\r\n        }\r\n        if(this.wktString.startsWith(\"linestring\")){\r\n            this.type = WKTObjectType.LineString;\r\n        }\r\n        if(this.wktString.startsWith(\"polygon\")){\r\n            this.type = WKTObjectType.Polygon;\r\n        }\r\n    }\r\n}\r\n\r\nexport class WKTObjectOptions{\r\n    public color: string = \"black\";\r\n    public size?: number = 0.3;\r\n    public lineWidth?: number = 2;\r\n\r\n    constructor(color?: string){\r\n        if(color != undefined) this.color = color;\r\n    }\r\n}\r\n\r\nexport enum WKTObjectType{\r\n    Unknown=\"unknown\",\r\n    Polygon=\"polygon\",\r\n    LineString=\"lineString\",\r\n    Point=\"point\",\r\n    AABB=\"aabb\"\r\n}","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, from, Observable } from 'rxjs';\r\nimport { IFCLoader } from 'web-ifc-three';\r\nimport { IFCManager } from 'web-ifc-three/IFC/components/IFCManager';\r\nimport { LoadingStatus } from '../model-loader.service';\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class IFCImportService {\r\n    \r\n    constructor() { }\r\n\r\n    loadModel(file: File, ifcLoader: IFCLoader, fileLoading$: BehaviorSubject<LoadingStatus>, modelsArray: any[]): void{\r\n\r\n        const fileURL = URL.createObjectURL(file);\r\n\r\n        let fileLoad = 0;\r\n        let fileProcessing = 0;\r\n\r\n        ifcLoader.ifcManager.setOnProgress(event => {\r\n            const fileProcessing = Math.floor((event.loaded * 100) / event.total);\r\n            console.log(\"Processed \" + fileProcessing + \" %\");\r\n            fileLoading$.next({ fileLoad, fileProcessing });\r\n        });\r\n\r\n        // Apply origin to first model\r\n        from(ifcLoader.ifcManager.applyWebIfcConfig({\r\n            COORDINATE_TO_ORIGIN: modelsArray.length == 0,\r\n            USE_FAST_BOOLS: true\r\n          })).subscribe(() => {\r\n\r\n            // Start loading the model\r\n            from(ifcLoader.loadAsync(fileURL, (xhr) => {\r\n                let percentage = (xhr.loaded / xhr.total) * 100;\r\n                fileLoad = Math.floor(percentage * 100) / 100;\r\n                console.log(\"Loaded \" + fileLoad + \" %\");\r\n                fileLoading$.next({ fileLoad, fileProcessing });\r\n            })).subscribe(async (model: any) => {\r\n\r\n                // set model name\r\n                model.name = file.name;\r\n\r\n                // Update progress to finsihed\r\n                fileLoading$.next({ fileLoad: 100, fileProcessing: 100, result: model });\r\n                console.log(\"Processed 100 %\");\r\n\r\n                fileLoading$.complete();\r\n\r\n            }, err => fileLoading$.error(err));;\r\n\r\n        })\r\n\r\n\r\n    }\r\n    \r\n}","// Inspired by https://github.com/IFCjs/web-ifc-viewer/blob/master/viewer/src/components/import-export/glTF.ts\r\n\r\nimport { BehaviorSubject, from } from \"rxjs\";\r\nimport { BufferAttribute, BufferGeometry, Mesh, MeshLambertMaterial, MeshStandardMaterial } from \"three\";\r\nimport { GLTF, GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';\r\nimport { IFCManager } from \"web-ifc-three/IFC/components/IFCManager\";\r\nimport { IFCModel } from \"web-ifc-three/IFC/components/IFCModel\";\r\nimport { LoadingStatus } from \"../model-loader.service\";\r\n\r\nexport class GlTFImportService {\r\n\r\n    private loader = new GLTFLoader();\r\n\r\n    /**\r\n     * Load glTF and enable IFC.js tools over it. T\r\n     * his just works if the glTF was previously exported from an IFC model using `exportIfcAsGltf()`.\r\n     * @url The URL of the GLTF file to load\r\n     */\r\n     public loadModel(ifcManager: IFCManager, file: File, fileLoading$: BehaviorSubject<LoadingStatus>, modelID: number): void {\r\n\r\n      const fileURL = URL.createObjectURL(file);\r\n\r\n      from(this.getGltfMesh(fileURL)).subscribe(gltfMesh => {\r\n\r\n        // Update progress\r\n        fileLoading$.next({ fileLoad: 100, fileProcessing: 50 });\r\n\r\n        gltfMesh.geometry.computeBoundsTree();\r\n        gltfMesh.modelID = modelID;\r\n        gltfMesh.ifcManager = ifcManager;\r\n        // this.context.getScene().add(gltfMesh); // SKIP THIS (LOADED FROM OUTSIDE)\r\n        this.setupMeshAsModel(ifcManager, gltfMesh);\r\n\r\n        // Update progress to finsihed\r\n        fileLoading$.next({ fileLoad: 100, fileProcessing: 100, result: gltfMesh });\r\n        console.log(\"Processed 100 %\");\r\n\r\n        fileLoading$.complete();\r\n\r\n      });\r\n\r\n    }\r\n\r\n    /**\r\n     * Loads any glTF file into the scene using [Three.js loader](https://threejs.org/docs/#examples/en/loaders/GLTFLoader).\r\n     * @url The URL of the GLTF file to load\r\n     */\r\n    private async load(url: string) {\r\n        const loaded = (await this.loader.loadAsync(url)) as GLTF;\r\n        const mesh = loaded.scene;\r\n        // const modelID = this.getModelID();   // ADD LATER!\r\n        // this.GLTFModels[modelID] = mesh;     // ADD LATER!\r\n        // this.context.getScene().add(mesh);   // ADD LATER!\r\n        return mesh;\r\n    }\r\n\r\n    private async getGltfMesh(url: string) {\r\n        const allMeshes = await this.getMeshes(url);\r\n        const geometry = this.getGeometry(allMeshes);\r\n        const materials = this.getMaterials(allMeshes);\r\n        this.cleanUpLoadedInformation(allMeshes);\r\n        return new Mesh(geometry, materials) as any as IFCModel;\r\n    }\r\n\r\n    private getGeometry(meshes: Mesh[]) {\r\n        // eslint-disable-next-line no-underscore-dangle\r\n        const parseDraco =\r\n          meshes.length <= 1\r\n            ? false\r\n            : meshes[0].geometry.attributes[\"position\"].array !==\r\n              meshes[1].geometry.attributes[\"position\"].array;\r\n        const geometry = new BufferGeometry();\r\n        if (parseDraco) {\r\n          this.setupGeometryAttributesDraco(geometry, meshes);\r\n          this.setupGeometryIndexDraco(meshes, geometry);\r\n        } else {\r\n          this.setupGeometryAttributes(geometry, meshes);\r\n          this.setupGeometryIndex(meshes, geometry);\r\n        }\r\n        this.setupGroups(meshes, geometry);\r\n        return geometry;\r\n    }\r\n\r\n    private getMaterials(allMeshes: Mesh[]) {\r\n        // const clippingPlanes = this.context.getClippingPlanes();   // ADD LATER!\r\n        return allMeshes.map((mesh) => {\r\n          const material = mesh.material as MeshStandardMaterial;\r\n          return new MeshLambertMaterial({\r\n            color: material.color,\r\n            transparent: material.opacity !== 1,\r\n            opacity: material.opacity,\r\n            side: 2,\r\n            // clippingPlanes   // ADD LATER!\r\n          });\r\n        });\r\n    }\r\n\r\n    private async getMeshes(url: string) {\r\n        const result = await this.load(url);\r\n        result.removeFromParent();\r\n    \r\n        const isNested = result.children[0].children.length !== 0;\r\n        const meshes = isNested ? result.children[0].children : [result.children[0]];\r\n        return meshes as Mesh[];\r\n    }\r\n\r\n    private setupGroups(meshes: Mesh[], geometry: BufferGeometry) {\r\n        const groupLengths = meshes.map((mesh) => {\r\n          const index = mesh.geometry.index;\r\n          return index ? index.count : 0;\r\n        });\r\n        let start = 0;\r\n        let materialIndex = 0;\r\n        geometry.groups = groupLengths.map((count) => {\r\n          const result = { start, count, materialIndex };\r\n          materialIndex++;\r\n          start += count;\r\n          return result;\r\n        });\r\n    }\r\n\r\n    private setupGeometryAttributesDraco(geometry: BufferGeometry, meshes: Mesh[]) {\r\n        let intArraryLength = 0;\r\n        let floatArrayLength = 0;\r\n        for (let i = 0; i < meshes.length; i++) {\r\n          const mesh = meshes[i];\r\n          const attributes = mesh.geometry.attributes;\r\n          // eslint-disable-next-line no-underscore-dangle\r\n          intArraryLength += attributes[\"_expressid\"].array.length;\r\n          floatArrayLength += attributes[\"position\"].array.length;\r\n        }\r\n    \r\n        const expressidArray = new Uint32Array(intArraryLength);\r\n        const positionArray = new Float32Array(floatArrayLength);\r\n        const normalArray = new Float32Array(floatArrayLength);\r\n    \r\n        this.fillArray(meshes, '_expressid', expressidArray);\r\n        this.fillArray(meshes, 'position', positionArray);\r\n        this.fillArray(meshes, 'normal', normalArray);\r\n    \r\n        geometry.setAttribute('expressID', new BufferAttribute(expressidArray, 1));\r\n        geometry.setAttribute('position', new BufferAttribute(positionArray, 3));\r\n        geometry.setAttribute('normal', new BufferAttribute(normalArray, 3));\r\n    }\r\n\r\n    private fillArray(meshes: Mesh[], key: string, arr: Uint32Array | Float32Array) {\r\n        let offset = 0;\r\n        for (let i = 0; i < meshes.length; i++) {\r\n          const mesh = meshes[i];\r\n          arr.set(mesh.geometry.attributes[key].array, offset);\r\n          offset += mesh.geometry.attributes[key].array.length;\r\n        }\r\n    }\r\n\r\n    private setupGeometryIndexDraco = (meshes: Mesh[], geometry: BufferGeometry) => {\r\n        let off = 0;\r\n        const offsets: number[] = [];\r\n        for (let i = 0; i < meshes.length; i++) {\r\n          offsets.push(off);\r\n          // eslint-disable-next-line no-underscore-dangle\r\n          off += meshes[i].geometry.attributes[\"_expressid\"].count;\r\n        }\r\n    \r\n        const indices = meshes.map((mesh, i) => {\r\n          const index = mesh.geometry.index;\r\n          return !index ? [] : new Uint32Array(index.array).map((value: number) => value + offsets[i]);\r\n        });\r\n    \r\n        geometry.setIndex(this.flattenIndices(indices));\r\n    };\r\n\r\n    private flattenIndices = (indices: ArrayLike<number>[]) => {\r\n      const indexArray = [];\r\n      for (let i = 0; i < indices.length; i++) {\r\n        for (let j = 0; j < indices[i].length; j++) {\r\n          indexArray.push(indices[i][j]);\r\n        }\r\n      }\r\n      return indexArray;\r\n    };\r\n\r\n    private setupGeometryAttributes(geometry: BufferGeometry, meshes: Mesh[]) {\r\n      // eslint-disable-next-line no-underscore-dangle\r\n      geometry.setAttribute('expressID', meshes[0].geometry.attributes[\"_expressid\"]);\r\n      geometry.setAttribute('position', meshes[0].geometry.attributes[\"position\"]);\r\n      geometry.setAttribute('normal', meshes[0].geometry.attributes[\"normal\"]);\r\n    }\r\n\r\n    private setupGeometryIndex(meshes: Mesh[], geometry: BufferGeometry) {\r\n      const indices = meshes.map((mesh) => {\r\n        const index = mesh.geometry.index;\r\n        return index ? index.array : [];\r\n      });\r\n  \r\n      const indexArray = [];\r\n      for (let i = 0; i < indices.length; i++) {\r\n        for (let j = 0; j < indices[i].length; j++) {\r\n          indexArray.push(indices[i][j]);\r\n        }\r\n      }\r\n      geometry.setIndex(indexArray);\r\n    }\r\n\r\n    private cleanUpLoadedInformation(allMeshes: Mesh[]) {\r\n      allMeshes.forEach((mesh) => {\r\n        mesh.geometry.attributes = {};\r\n        mesh.geometry.dispose();\r\n        (mesh.material as MeshStandardMaterial).dispose();\r\n      });\r\n    }\r\n\r\n    // Necessary to make the glTF work as a model\r\n    private setupMeshAsModel(ifcManager: IFCManager, newMesh: IFCModel) {\r\n      // TODO: In the future we might want to rethink this or at least fix the typings\r\n      ifcManager.state.models[newMesh.modelID] = { mesh: newMesh } as any;\r\n      // const items = this.context.items; // NEEDED??\r\n      // items.ifcModels.push(newMesh); // NEEDED??\r\n      // items.pickableIfcModels.push(newMesh); // NEEDED??\r\n    }\r\n\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { IFCModel } from \"web-ifc-three/IFC/components/IFCModel\";\r\nimport { IFCLoader } from \"web-ifc-three/IFCLoader\";\r\nimport {\r\n    acceleratedRaycast,\r\n    computeBoundsTree,\r\n    disposeBoundsTree\r\n} from 'three-mesh-bvh';\r\nimport { BehaviorSubject, filter, from, map, Observable } from \"rxjs\";\r\nimport { LoaderSettings } from 'web-ifc';\r\nimport { GlobalIdMatch, IDMap, ModelFileType } from \"./models\";\r\nimport { Matrix4 } from \"three\";\r\nimport { IFCImportService } from \"./import-export/ifc-import.service\";\r\nimport { GlTFImportService } from \"./import-export/gltf-import.service\";\r\n\r\nexport interface LoadingStatus {\r\n    fileLoad: number,\r\n    fileProcessing: number,\r\n    result?: IFCModel\r\n}\r\n\r\nconst IFCSPACE = 3856911033;\r\nconst IFCOPENINGELEMENT = 3588315303;\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class ModelLoaderService {\r\n\r\n    public models: IFCModel[] = [];\r\n    public ifcLoader = new IFCLoader();\r\n    public ifc = this.ifcLoader.ifcManager;\r\n\r\n    public globalCoordinationMatrix?: number[]; //Matrix4;\r\n\r\n    public modelsLoaded$ = new BehaviorSubject<number>(0);\r\n\r\n    private expressToGlobalId: any[] = []; // Object that maintains idMap between expressID and GlobalId for all loaded models (modelID = index in array)\r\n    private globalToExpressId: any[] = []; // Object that maintains idMap between expressID and GlobalId for all loaded models (modelID = index in array)\r\n\r\n    constructor(\r\n        private _ifcLoader: IFCImportService,\r\n        private _gltfLoader: GlTFImportService\r\n    ) {\r\n\r\n        this.ifc.setWasmPath('assets/ifcjs/');\r\n        \r\n\r\n        // Sets up optimized picking\r\n        this.ifc.setupThreeMeshBVH(\r\n            computeBoundsTree,\r\n            disposeBoundsTree,\r\n            acceleratedRaycast\r\n        );\r\n\r\n        const settings: LoaderSettings = {\r\n            COORDINATE_TO_ORIGIN: true,\r\n            USE_FAST_BOOLS: true\r\n        }\r\n\r\n        this.ifc.parser.setupOptionalCategories({\r\n            [IFCSPACE]: true,\r\n            [IFCOPENINGELEMENT]: false\r\n        })\r\n\r\n        this.ifc.applyWebIfcConfig(settings);\r\n    }\r\n\r\n    public useWebWorkers(use: boolean, ifcJSDir: string = \"assets/ifcjs/\"){\r\n        if(use){\r\n            this.ifc.useWebWorkers(true, ifcJSDir + \"IFCWorker.js\");\r\n            this.ifc.setWasmPath('./');\r\n        }else{\r\n            this.ifc.useWebWorkers(false, ifcJSDir);\r\n            this.ifc.setWasmPath(ifcJSDir);\r\n        }\r\n    }\r\n\r\n    public getIFCManager(){\r\n        return this.ifc;\r\n    }\r\n\r\n    public getGlobalIdFromMap(modelID: number, expressID: number){\r\n        let globalID;\r\n        if(this.expressToGlobalId[modelID]) {\r\n            globalID = this.expressToGlobalId[modelID][expressID]\r\n        }\r\n\r\n        return globalID;\r\n    }\r\n\r\n    loadModel(file: File, fileType: ModelFileType = ModelFileType.IFC, expressIdToGlobalIdMap?: any): Observable<LoadingStatus> {\r\n\r\n        const modelID: number = this.models.length;\r\n\r\n        // Start behavior subjects to track progress\r\n        const fileLoading$ = new BehaviorSubject<LoadingStatus>({ fileLoad: 0, fileProcessing: 0 });\r\n        \r\n        if(fileType == ModelFileType.IFC){\r\n            this._ifcLoader.loadModel(file, this.ifcLoader, fileLoading$, this.models);\r\n        }\r\n        \r\n        else if(fileType == ModelFileType.glTF){\r\n            this._gltfLoader.loadModel(this.ifcLoader.ifcManager, file, fileLoading$, modelID);\r\n            if(expressIdToGlobalIdMap != undefined){\r\n                // Set id maps\r\n                this.expressToGlobalId[modelID] = expressIdToGlobalIdMap;\r\n                this.globalToExpressId[modelID] = this.swapExpressIdToGlobalIdMap(expressIdToGlobalIdMap);\r\n            }\r\n        }\r\n\r\n        let model: any;\r\n        fileLoading$.subscribe({\r\n            next: (status) => {\r\n                if(status.result) model = status.result;\r\n            },\r\n            complete: async () => {\r\n\r\n                // Apply first model matrix as global matrix, to later on move the elements again to the original coordinates (IFC only)\r\n                if(this.models.length == 0 && fileType == ModelFileType.IFC) {\r\n                    this.globalCoordinationMatrix = await this.ifc.ifcAPI.GetCoordinationMatrix(model.modelID);\r\n                    await this.setCoordinationMatrixFromFirst(0);\r\n                }\r\n\r\n                // Add to array of models\r\n                this.models.push(model);\r\n\r\n                // Build id map if the model is an IFC\r\n                if(fileType == ModelFileType.IFC){\r\n                    await this.getIDMaps(this.models.length-1);\r\n                }\r\n\r\n                this.modelsLoaded$.next(this.models.length);\r\n\r\n            }\r\n        })\r\n        \r\n        // Return observable that tracks the upload progress\r\n        return fileLoading$.asObservable();\r\n\r\n    }\r\n\r\n    public getModelsLoaded(): Observable<number>{\r\n        return this.modelsLoaded$.asObservable().pipe(\r\n            filter((no: number) => no > 0)\r\n        );\r\n    }\r\n\r\n    public getModels() {\r\n        return this.models;\r\n    }\r\n\r\n    async setCoordinationMatrixFromFirst(modelID: number) {\r\n        const matrixArr = await this.ifc.ifcAPI.GetCoordinationMatrix(modelID);\r\n        const matrix = new Matrix4().fromArray(matrixArr) as any;\r\n        this.ifc.setupCoordinationMatrix(matrix);\r\n    }\r\n\r\n    public getAllIdsInModel(modelID: number = 0): number[]{\r\n        const model = this.models[modelID];\r\n        const arr: number[] = Array.from(model.geometry.attributes[\"expressID\"].array);\r\n        return [...new Set(arr)];\r\n    }\r\n\r\n    // Builds map between expressID and globalID and returns existing one if it already exists\r\n    public async getIDMaps(modelID: number = 0): Promise<IDMap>{\r\n\r\n        if(this.expressToGlobalId[modelID] == undefined){\r\n            console.time(\"Built expressID to GlobalId map\");\r\n\r\n            let expressGlobal: any = {};\r\n            let globalExpress: any = {};\r\n\r\n            // Get all ids in model\r\n            const expressIDs = this.getAllIdsInModel(modelID);\r\n\r\n            // Get all properties in parallel (tested and twice as fast as waiting individually)\r\n            let promises = [];\r\n            for (let i = 0; i < expressIDs.length; i++) {\r\n                promises.push(this.ifc.getItemProperties(modelID, expressIDs[i], false));\r\n            }\r\n\r\n            // Once all properties arrived, get GlobalId and append to map\r\n            const properties = await Promise.all(promises);\r\n            for (let i = 0; i < expressIDs.length; i++) {\r\n                const globalId = properties[i].GlobalId.value;\r\n                expressGlobal[expressIDs[i]] = globalId;\r\n                globalExpress[globalId] = expressIDs[i];\r\n            }\r\n\r\n            this.expressToGlobalId[modelID] = expressGlobal;\r\n            this.globalToExpressId[modelID] = globalExpress;\r\n\r\n            console.timeEnd(\"Built expressID to GlobalId map\");\r\n        }\r\n        \r\n        return {\r\n            expressToGlobalId: this.expressToGlobalId[modelID],\r\n            globalToExpressId: this.globalToExpressId[modelID]\r\n        };\r\n    }\r\n\r\n    public async globalIdsToExpressIDs(globalIds: string[]): Promise<GlobalIdMatch[]>{\r\n\r\n        // Make copy of globalIds array\r\n        const ids = JSON.parse(JSON.stringify(globalIds));\r\n\r\n        let arr = [];\r\n        // Loop over models\r\n        for (let modelID = 0; modelID < this.models.length; modelID++) {\r\n\r\n            // Get idMaps for model\r\n            const idMaps = await this.getIDMaps(modelID);\r\n\r\n            // Find expressIDs that match the provided globalIDs\r\n            let expressIDs = [];\r\n\r\n            // Loop over globalIds in model\r\n            const modelGlobalIds = Object.keys(idMaps.globalToExpressId);\r\n            for (let i = 0; i < modelGlobalIds.length; i++) {\r\n                const investigatedGlobalId = modelGlobalIds[i];\r\n\r\n                // If there is a match in the globalIds array, add the corresponding expressID to the list and remove globalId from list og globalIds\r\n                const idx = ids.indexOf(investigatedGlobalId);\r\n                if(idx != -1){\r\n                    if(expressIDs.indexOf(investigatedGlobalId) == -1){\r\n                        expressIDs.push(idMaps.globalToExpressId[investigatedGlobalId]);\r\n                        ids.splice(idx, 1);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Add matches to result array\r\n            if(expressIDs.length){\r\n                arr.push({modelID, expressIDs});\r\n            }\r\n\r\n        }\r\n\r\n        if(ids.length){\r\n            console.log(\"Unmatched globalIDs: \" + ids.join(\", \"));\r\n        }\r\n\r\n        return arr;\r\n\r\n    }\r\n\r\n    async getGlobalId(elementID: number, modelID: number = 0): Promise<string>{\r\n\r\n        // First check if it exists in id maps\r\n        const idMaps = await this.getIDMaps(modelID);\r\n\r\n        if(idMaps && idMaps.expressToGlobalId){\r\n            const globalId = idMaps.expressToGlobalId[elementID];\r\n            if(globalId && globalId != undefined) return globalId;\r\n        }\r\n\r\n        const properties = await this.ifc.getItemProperties(modelID, elementID);\r\n        return properties.GlobalId.value;\r\n    }\r\n\r\n    private swapExpressIdToGlobalIdMap(json: any){\r\n        var ret: any = {};\r\n        for(var key in json){\r\n          ret[json[key]] = parseInt(key);\r\n        }\r\n        return ret;\r\n    }\r\n\r\n}","import { Injectable } from '@angular/core';\r\nimport { IFCManager } from 'web-ifc-three/IFC/components/IFCManager';\r\nimport { ModelLoaderService } from './model-loader.service';\r\n\r\n@Injectable({providedIn: 'root'})\r\n\r\nexport class IFCToolsService {\r\n\r\n    public ifc: IFCManager = this.modelLoaderService.getIFCManager();\r\n\r\n    constructor(\r\n        public modelLoaderService: ModelLoaderService\r\n    ){ }\r\n\r\n    async listTypes(modelID: number = 0){\r\n\r\n      console.log(\"Get spacial structure\")\r\n      try {\r\n        const ss = await this.ifc.getSpatialStructure(modelID);\r\n        console.log(ss)\r\n        let occurences = {};\r\n        let types: any[] = [];\r\n    \r\n        function traverseSS(occurences:any, currentNode:any){\r\n          \r\n          if(currentNode.type){\r\n            const t = currentNode.type;\r\n            // If new type\r\n            if(types.indexOf(t) == -1){\r\n              types.push(t);\r\n              occurences[t] = 1;\r\n            }else{\r\n              occurences[t]++;\r\n            }\r\n          }\r\n    \r\n          if(currentNode.children){\r\n            currentNode.children.forEach((childNode:any) => {\r\n              traverseSS(occurences, childNode)\r\n            })\r\n            \r\n          }\r\n    \r\n        }\r\n\r\n        traverseSS(occurences, ss);\r\n        return {occurences, types};\r\n      \r\n      } catch (err) {\r\n        console.log(err)\r\n        return undefined\r\n      }\r\n  \r\n    }\r\n\r\n    async getGlobalId(elementID: number, modelID: number = 0): Promise<string>{\r\n      const properties = await this.modelLoaderService.ifc.getItemProperties(modelID, elementID);\r\n      return properties.GlobalId.value;\r\n    }\r\n\r\n    async getElementsOfType(type: number, modelID: number = 0, getProperties: boolean = false) {\r\n      // getAllItemsOfTypes is much faster if you only get the expressIDs and later specifically get the needed properties\r\n      // --> getProperties == false!\r\n      this.ifc = this.modelLoaderService.getIFCManager();\r\n      return await this.ifc.getAllItemsOfType(modelID, type, getProperties);\r\n    }\r\n  \r\n}","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, concatMap, distinctUntilChanged, filter, fromEvent, map, Observable, sample, timer } from 'rxjs';\r\nimport { Camera, Intersection, Raycaster, Scene, Vector2, WebGLRenderer } from 'three';\r\nimport { IfcMesh } from 'web-ifc-three/IFC/BaseDefinitions';\r\nimport { IFCModel } from 'web-ifc-three/IFC/components/IFCModel';\r\nimport { ModelLoaderService } from './model-loader.service';\r\nimport { IFCViewerService } from './ifc-viewer.service';\r\nimport { PickedObject } from './models';\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class PickingService {\r\n\r\n    public hoveredMesh$ = new BehaviorSubject<any>(null);\r\n\r\n    public emitRate$ = timer(0, 100);  // Emits every 100 ms\r\n    public mouseMove$ = fromEvent<MouseEvent>(document, 'mousemove');\r\n\r\n    public raycaster = new Raycaster();\r\n    public mouse = new Vector2();\r\n\r\n    // This object holds array of ids that for some reason are unpickable (dimmed, hidden etc.)\r\n    // Each model is a key in the object\r\n    private unpickableIDs: any = {};    \r\n\r\n    constructor(\r\n        private _viewerService: IFCViewerService,\r\n        private _modelLoaderService: ModelLoaderService\r\n    ){\r\n        this.raycaster.firstHitOnly = false;\r\n    }\r\n\r\n    getUnpickable(){\r\n        return this.unpickableIDs;\r\n    }\r\n\r\n    appendUnpickable(expressIDs: number[], modelID: number = 0): void{\r\n        // Append model to unpickable object if it's not already there\r\n        if(this.unpickableIDs[modelID] == undefined) this.unpickableIDs[modelID] = [];\r\n\r\n        for (let i = 0; i < expressIDs.length; i++) {\r\n          const expressID = expressIDs[i];\r\n          const idx = this.unpickableIDs[modelID].indexOf(expressID);\r\n          if(idx == -1) this.unpickableIDs[modelID].push(expressID);\r\n        }\r\n      }\r\n  \r\n    removeUnpickable(expressIDs: number[], modelID: number = 0): void{\r\n\r\n        // ModelID must exist in unpickable object\r\n        if(this.unpickableIDs[modelID] == undefined) return;\r\n\r\n        for (let i = 0; i < expressIDs.length; i++) {\r\n            const expressID = expressIDs[i];\r\n            const idx = this.unpickableIDs[modelID].indexOf(expressID);\r\n            if(idx != -1) this.unpickableIDs[modelID].splice(idx, 1);\r\n        }\r\n    }\r\n\r\n    resetUnpickable(): void{\r\n        this.unpickableIDs = {};\r\n    }\r\n\r\n    makeModelUnpickable(modelID: number): void{\r\n        const expressIDs = this._modelLoaderService.getAllIdsInModel(modelID);\r\n        this.unpickableIDs[modelID] = expressIDs;\r\n    }\r\n\r\n    makeModelPickable(modelID: number): void{\r\n        delete this.unpickableIDs[modelID];\r\n    }\r\n\r\n    makeAllUnpickable(): void{\r\n        for (let modelID = 0; modelID < this._modelLoaderService.models.length; modelID++) {\r\n            const expressIDs = this._modelLoaderService.getAllIdsInModel(modelID);\r\n            this.unpickableIDs[modelID] = expressIDs;\r\n        }\r\n    }\r\n\r\n    // Observable that emits the last hovered mesh\r\n    // Emits at the specified emitRate$\r\n    hoveredElementObservable(canvas: any): Observable<PickedObject|null> {\r\n        return this.getHoveredElement(canvas);\r\n    }\r\n\r\n    // General method that emits the last hovered item of a given type\r\n    private getHoveredElement(canvas: any): Observable<PickedObject|null> {\r\n\r\n        return this.mouseMove$.pipe(\r\n            sample(this.emitRate$),\r\n            concatMap(async (ev: MouseEvent) => {\r\n\r\n                ev.preventDefault();\r\n\r\n                return await this.nearestIntersection(ev, canvas);\r\n\r\n            }),\r\n            distinctUntilChanged()\r\n        )\r\n\r\n    }\r\n\r\n    // Returns an array of objects being hit by the raycaster\r\n    private async nearestIntersection(event: MouseEvent, canvas: any): Promise<PickedObject|null> {\r\n\r\n        const models = this._viewerService.getLoadedModels();\r\n        if(!models.length) return null;\r\n\r\n        // Computes the position of the mouse on the screen\r\n        const bounds = canvas.getBoundingClientRect();\r\n      \r\n        const x1 = event.clientX - bounds.left;\r\n        const x2 = bounds.right - bounds.left;\r\n        this.mouse.x = (x1 / x2) * 2 - 1;\r\n      \r\n        const y1 = event.clientY - bounds.top;\r\n        const y2 = bounds.bottom - bounds.top;\r\n        this.mouse.y = -(y1 / y2) * 2 + 1;\r\n      \r\n        // Places it on the camera pointing to the mouse\r\n        this.raycaster.setFromCamera(this.mouse, this._viewerService.camera);\r\n      \r\n        // Casts a ray\r\n        const objects = this.raycaster.intersectObjects(models);\r\n\r\n        // The objects are ordered by distance (nearest first) we need to filter out those that are unpickable and then take the nearest\r\n        let pickedObject = null;\r\n        for (let i = 0; i < objects.length; i++) {\r\n            const item: Intersection = objects[i];\r\n            const mesh = item.object as IfcMesh;\r\n\r\n            if(item.faceIndex == undefined) break;\r\n\r\n            const modelID: number = mesh.modelID;\r\n            const expressID = await this._modelLoaderService.ifc.getExpressId(mesh.geometry, item.faceIndex);\r\n\r\n            // If modelID is not in the unpickable set, we are done\r\n            if(this.unpickableIDs[modelID] == undefined){\r\n                pickedObject = {distance: item.distance, expressID, modelID, intersectionPoint: item.point};\r\n                break;\r\n            }\r\n\r\n            // If modelID is in the unpickable set, but the expressID is not, we are done\r\n            if(this.unpickableIDs[modelID].indexOf(expressID) == -1){\r\n                pickedObject = {distance: item.distance, expressID, modelID, intersectionPoint: item.point};\r\n                break;\r\n            }\r\n\r\n        }\r\n\r\n        return pickedObject;\r\n\r\n    }\r\n    \r\n}","import { Color, DoubleSide, MeshLambertMaterial } from \"three\";\r\n\r\nexport function materialFromColor(color: string, opacity: number = 1): MeshLambertMaterial{\r\n\r\n    if(color.startsWith(\"rgba\")){\r\n        const res = processRGBA(color);\r\n        color = res.color;\r\n        opacity = res.opacity;\r\n    }\r\n\r\n    let material = new MeshLambertMaterial({\r\n      color: new Color(color),\r\n      depthTest: true,\r\n      side: DoubleSide\r\n    });\r\n\r\n    if(opacity != 1){\r\n        material.transparent = true;\r\n        material.opacity = opacity;\r\n    }\r\n\r\n    return material;\r\n\r\n}\r\n\r\nexport function randomColor(): string{\r\n    const randomBetween = (min: number, max: number) => min + Math.floor(Math.random() * (max - min + 1));\r\n    const r = randomBetween(0, 255);\r\n    const g = randomBetween(0, 255);\r\n    const b = randomBetween(0, 255);\r\n    return `rgb(${r},${g},${b})`;\r\n}\r\n\r\nfunction processRGBA(str: string){\r\n    const arr = str.split(\"rgba(\")[1].split(\")\")[0].split(\",\").map(item => item.trim())\r\n    const color: string = `rgb(${arr[0]}, ${arr[1]}, ${arr[2]})`;\r\n    const opacity: number = parseFloat(arr[3]);\r\n    return { color, opacity };\r\n}","import { Injectable } from '@angular/core';\r\nimport { DoubleSide, Mesh, MeshLambertMaterial } from 'three';\r\nimport { IFCModel } from 'web-ifc-three/IFC/components/IFCModel';\r\nimport { ColorService } from './color.service';\r\nimport { materialFromColor } from './helpers/color-helpers';\r\nimport { ModelLoaderService } from './model-loader.service';\r\nimport { IFCViewerService } from './ifc-viewer.service';\r\nimport { PickingService } from './picking.service';\r\n\r\n@Injectable({providedIn: 'root'})\r\n\r\nexport class SelectionService {\r\n\r\n    public fullModelSubsets: any = {};\r\n\r\n    public hoverMaterial?: MeshLambertMaterial;\r\n    public selectionMaterial?: MeshLambertMaterial;\r\n\r\n    private selectedElements: any[] = [];\r\n\r\n    constructor(\r\n        public modelLoaderService: ModelLoaderService,\r\n        public viewerService: IFCViewerService,\r\n        public pickingService: PickingService\r\n    ){}\r\n\r\n    public markHovered(ids: number[], modelID: number = 0){\r\n\r\n      if(this.hoverMaterial == undefined) this.setHoverMaterial();\r\n\r\n      const mesh = this.modelLoaderService.ifc.createSubset({\r\n        scene: this.viewerService.scene,\r\n        modelID,\r\n        ids,\r\n        removePrevious: true,\r\n        material: this.hoverMaterial\r\n      });\r\n      if(mesh) mesh.visible = true;\r\n    };\r\n\r\n    public appendToSelection(globalIds: string[]): string[]{\r\n      const settings = this.viewerService.globalSettings;\r\n      if(settings?.multiSelectEnabled){\r\n        for (let i = 0; i < globalIds.length; i++) {\r\n          if(this.selectedElements.indexOf(globalIds[i]) == -1){\r\n            this.selectedElements.push(globalIds[i]);\r\n          }\r\n        }\r\n      }else{\r\n        this.selectedElements = globalIds;\r\n      }\r\n\r\n      if(settings?.highlightSelectedObjects){\r\n\r\n      }\r\n\r\n      return this.selectedElements;\r\n    }\r\n\r\n    public setSelection(globalIds: string[]): void{\r\n      this.selectedElements = globalIds;\r\n    }\r\n\r\n    public clearSelection(){\r\n      this.selectedElements = [];\r\n    }\r\n\r\n    public getSelection(): string[]{\r\n      return this.selectedElements;\r\n    }\r\n\r\n    // Basically a missing feature from https://github.com/IFCjs/web-ifc-three/blob/main/web-ifc-three/src/IFC/components/subsets/SubsetManager.ts\r\n    public removeAllSubsets(){\r\n      \r\n      const subsets = this.viewerService.ifcManager?.subsets[\"subsets\"];\r\n\r\n      if(subsets == undefined) return;\r\n\r\n      Object.keys(subsets).forEach(key => {\r\n\r\n          // Skip default\r\n          if(key.indexOf(\"DEFAULT\") != -1) return;\r\n\r\n          // Get subset\r\n          const subset = subsets[key];\r\n\r\n          // Remove it\r\n          if (subset.mesh.parent) subset.mesh.removeFromParent();\r\n          subset.mesh.geometry.attributes = {};\r\n          subset.mesh.geometry.index = null;\r\n          subset.mesh.geometry.dispose();\r\n          // @ts-ignore\r\n          subset.mesh.geometry = null;\r\n          delete this.viewerService.ifcManager?.subsets[\"subsets\"][key];\r\n      })\r\n    }\r\n\r\n    public getAllIdsInModel(modelID: number = 0){\r\n      return this.modelLoaderService.getAllIdsInModel();\r\n    }\r\n\r\n    public hideAll(){\r\n      for (let i = 0; i < this.viewerService.scene.children.length; i++) {\r\n        const child = this.viewerService.scene.children[i];\r\n        // console.log(child);\r\n        if(child instanceof Mesh) child.visible = false;\r\n      }\r\n    }\r\n\r\n    public hideModel(modelID: number){\r\n      for (let i = 0; i < this.viewerService.scene.children.length; i++) {\r\n        const child: any = this.viewerService.scene.children[i];\r\n        if(Object.keys(child).includes(\"modelID\")) {\r\n          if(child[\"modelID\"] == modelID) {\r\n            child.visible = false;\r\n            this.pickingService.makeModelUnpickable(modelID)\r\n          }\r\n          // this.viewerService.scene.remove(child);\r\n          // if (subset.mesh.parent) subset.mesh.removeFromParent();\r\n        }\r\n      }\r\n    }\r\n\r\n    public unhideModel(modelID: number){\r\n      for (let i = 0; i < this.viewerService.scene.children.length; i++) {\r\n        const child: any = this.viewerService.scene.children[i];\r\n        if(Object.keys(child).includes(\"modelID\")) {\r\n          if(child[\"modelID\"] == modelID) {\r\n            child.visible = true;\r\n            this.pickingService.makeModelPickable(modelID)\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    public unhideAll(){\r\n      for (let i = 0; i < this.viewerService.scene.children.length; i++) {\r\n        const child = this.viewerService.scene.children[i];\r\n        if(child instanceof Mesh) child.visible = true;\r\n      }\r\n    }\r\n\r\n    public getDefaultSubset(){\r\n      const subsets = this.viewerService.ifcManager?.subsets[\"subsets\"];\r\n      const key = Object.keys(subsets).find(key => key.indexOf(\"DEFAULT\") != -1);\r\n      if(key != undefined) return subsets[key];\r\n    }\r\n\r\n    private setHoverMaterial(): void{\r\n      const settings = this.viewerService.globalSettings;\r\n      if(settings != undefined){\r\n        this.hoverMaterial = materialFromColor(settings.hoverColor);\r\n      }else{\r\n        this.hoverMaterial = new MeshLambertMaterial({\r\n            color: 0xffccff,\r\n            opacity: 0.5,\r\n            transparent: true,\r\n            depthTest: false,\r\n            side: DoubleSide,\r\n            // clippingPlanes: planes\r\n        });\r\n      }\r\n    }\r\n\r\n}","import { Injectable } from '@angular/core';\r\nimport { BufferAttribute, Color, DoubleSide, Material, Mesh, MeshLambertMaterial } from 'three';\r\nimport { materialFromColor } from './helpers/color-helpers';\r\nimport { GlobalIdMatch } from './models';\r\nimport { SelectionService } from './selection.service';\r\n\r\n@Injectable({providedIn: 'root'})\r\n\r\nexport class ColorService extends SelectionService {\r\n\r\n    public loadedSubsets: string[] = [];            // List of customIDs of subsets that are loaded in the scene\r\n    public loadedSubsetMaterials: Material[] = [];  // List of materials of subsets that are loaded in the scene\r\n    public loadedSubsetExpressIDs: any[] = [];      // List of expressIDs of subsets that are loaded in the scene\r\n\r\n    private subsetModelId: any = {}; // Main with subset name as key and modelID as Value\r\n\r\n    // This object holds array undimmed (original material)\r\n    // Each model is a key in the object\r\n    private undimmedMaterials: any = {};\r\n\r\n    // Takes a nested array with globalIds and automatically appends a color from the predefined scheme\r\n    // Currently only works if ids are in the same model\r\n    public async colorByGroupGlobalIds(idGroups: string[][]): Promise<string[]>{\r\n\r\n      let groups = [];\r\n      let modelID = 0;\r\n\r\n      // Loop over groups\r\n      for (let i = 0; i < idGroups.length; i++) {\r\n        const matches: GlobalIdMatch[] = await this.modelLoaderService.globalIdsToExpressIDs(idGroups[i]);\r\n        groups.push(matches[0].expressIDs); // Expect only matches in one model\r\n        modelID = matches[0].modelID;       // Expect only matches in one model\r\n      }\r\n\r\n      return this.colorByGroup(groups, modelID);\r\n\r\n    }\r\n\r\n    // Takes a nested array with expressIDs and automatically appends a color from the predefined scheme\r\n    public colorByGroup(idGroups: number[][], modelID: number = 0): string[]{\r\n\r\n      const colors = this.viewerService.globalColorScheme;\r\n\r\n      // Better result if we jump some spaces in pallette\r\n      const groupCount = idGroups.length;\r\n      const palletteSize = colors.length;\r\n      const skipEvery = Math.floor(palletteSize/groupCount);\r\n\r\n      // Loop over groups\r\n      let groupColors: string[] = [];\r\n      let colorIndex: number = 0;\r\n      idGroups.forEach((groupIDs, i) => {\r\n\r\n        // Get color and append it to used colors + increment index for next color\r\n        const color = colors[colorIndex];\r\n        groupColors.push(color);\r\n        colorIndex+=skipEvery;\r\n\r\n        // Give group a unique id (used to later delete the colors easily)\r\n        const id = `color-group-${i}`;\r\n\r\n        // Color the subset\r\n        this.colorSubset(groupIDs, color, id, modelID);\r\n        \r\n      })\r\n      \r\n      return groupColors;\r\n\r\n    }\r\n\r\n    public async colorSubsetGlobalIds(globalIds: string[], strColor: string, customID: string){\r\n      const matches: GlobalIdMatch[] = await this.modelLoaderService.globalIdsToExpressIDs(globalIds);\r\n      matches.forEach(match => {\r\n        this.colorSubset(match.expressIDs, strColor, customID, match.modelID);\r\n      });\r\n    }\r\n\r\n    public colorSubset(expressIDs: number[], strColor: string, customID: string, modelID: number = 0, opacity: number = 1, clean: boolean = false){\r\n\r\n      \r\n      if(!this.viewerService.ifcManager) return;\r\n      console.log(expressIDs)\r\n\r\n      // Update model ID map\r\n      this.subsetModelId[customID] = modelID;\r\n\r\n      // If a subset with this id is loaded already, start by removing it\r\n      const subsetIndex = this.loadedSubsets.indexOf(customID);\r\n      if(subsetIndex != -1){\r\n          // console.log(\"remove subset in color service: \", customID)\r\n          this.removeSubset(customID);\r\n      }\r\n      \r\n      // If subset doesn't exist, create it\r\n      let material = materialFromColor(strColor, opacity);\r\n\r\n      const subset = this.viewerService.ifcManager.createSubset({\r\n          scene: this.viewerService.scene,\r\n          modelID,\r\n          ids: expressIDs,\r\n          removePrevious: true,\r\n          material,\r\n          customID\r\n      });\r\n\r\n      this.loadedSubsets.push(customID);\r\n      this.loadedSubsetMaterials.push(material);\r\n      this.loadedSubsetExpressIDs.push(expressIDs);\r\n\r\n      if(clean) {\r\n        this.cleanMesh(subset);\r\n        // this.removeUnusedMaterials(mesh);\r\n      }\r\n\r\n      // Remove from unpickable if something is dimmed and this behavior is expected on dimmed objects\r\n      if(!this.viewerService.globalSettings?.clickableWhenDimmed){\r\n        if(this.undimmedMaterials[modelID] != undefined){\r\n          this.pickingService.removeUnpickable(expressIDs, modelID);\r\n        }\r\n      }\r\n\r\n      return subset\r\n      \r\n    }\r\n\r\n    public removeSubset(customID: string){\r\n\r\n      if(!this.viewerService.ifcManager) return;\r\n\r\n      // Get modelID\r\n      const modelID = this.subsetModelId[customID];\r\n\r\n      const subsetIndex = this.loadedSubsets.indexOf(customID);\r\n      if(subsetIndex != -1){\r\n\r\n        // Get the material that was appended to the subset\r\n        const subsetMaterial = this.loadedSubsetMaterials[subsetIndex];\r\n        const expressIDs = this.loadedSubsetExpressIDs[subsetIndex];\r\n\r\n        this.viewerService.ifcManager.removeSubset(modelID, subsetMaterial, customID);\r\n        this.loadedSubsets.splice(subsetIndex, 1);\r\n        this.loadedSubsetMaterials.splice(subsetIndex, 1);\r\n\r\n        // Re-append to unpickable if something is dimmed and this behavior is expected on dimmed objects\r\n        if(!this.viewerService.globalSettings?.clickableWhenDimmed){\r\n          if(this.undimmedMaterials[modelID] != undefined){\r\n            this.pickingService.appendUnpickable(expressIDs, modelID);\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    public dimAll(){\r\n\r\n      // First remove all subsets\r\n      this.removeAllSubsets();\r\n\r\n      if(!this.viewerService.ifcManager) return;\r\n\r\n      // Append to unpickable if this behavior is expected\r\n      if(!this.viewerService.globalSettings?.clickableWhenDimmed){\r\n        this.pickingService.makeAllUnpickable();\r\n      }\r\n\r\n      for (let modelID = 0; modelID < this.modelLoaderService.models.length; modelID++) {\r\n        this.dimModel(modelID);\r\n      }\r\n\r\n    }\r\n\r\n    undimAll(){\r\n      if(!this.viewerService.ifcManager) return;\r\n\r\n      for (let modelID = 0; modelID < this.modelLoaderService.models.length; modelID++) {\r\n        this.undimModel(modelID);\r\n      }\r\n    }\r\n\r\n    public dimModel(modelID: number){\r\n\r\n      // Get model\r\n      const model = this.viewerService.loadedModels[modelID];\r\n\r\n      if(model == undefined) return;\r\n\r\n      // If not already dimmed\r\n      if(this.undimmedMaterials[modelID] == undefined){\r\n\r\n        // Save material\r\n        this.undimmedMaterials[modelID] = Array.isArray(model.material) ? model.material.map(item => item.clone()) : model.material.clone();\r\n\r\n        // Set new transparency settings\r\n        if(Array.isArray(model.material)){\r\n          model.material.forEach(mat => {\r\n            mat.transparent = true;\r\n            mat.opacity = 0.1;\r\n          });\r\n        }else{\r\n          model.material.transparent = true;\r\n          model.material.opacity = 0.1;\r\n        }\r\n        this.pickingService.makeModelUnpickable(modelID)\r\n\r\n      }\r\n\r\n    }\r\n\r\n    public undimModel(modelID: number){\r\n      if(this.undimmedMaterials[modelID] == undefined) return;\r\n\r\n      // Get model\r\n      const model = this.viewerService.loadedModels[modelID];\r\n\r\n      // Undim all materials\r\n      model.material = this.undimmedMaterials[modelID];\r\n      this.undimmedMaterials[modelID] = undefined;\r\n\r\n      // Remove from unpickable if this behavior is expected\r\n      if(!this.viewerService.globalSettings?.clickableWhenDimmed){\r\n        this.pickingService.makeModelPickable(modelID)\r\n      }\r\n    }\r\n\r\n    public resetAllColors(){\r\n      this.undimAll();\r\n      return this.removeAllSubsets();\r\n    }\r\n\r\n    private cleanMesh(mesh: Mesh): void{\r\n\r\n      const index = mesh.geometry.getIndex();\r\n\r\n      if(index == undefined) return;\r\n\r\n      const initialExpressID = mesh.geometry.getAttribute(\"expressID\");\r\n      const initialPosition = mesh.geometry.getAttribute(\"position\");\r\n      const initialNormal = mesh.geometry.getAttribute(\"normal\");\r\n\r\n      const expressIDArray = new Uint32Array(index.array.length);\r\n      const positionArray = new Float32Array(index.array.length * 3);\r\n      const normalArray = new Float32Array(index.array.length * 3);\r\n      let currentGroup = 0;\r\n      for (let i = 0; i < index.array.length; i++) {\r\n\r\n          const idx = index.array[i];\r\n\r\n          // Get expressID\r\n          expressIDArray[i] = initialExpressID.array[idx];\r\n\r\n          // Get position\r\n          const pX = initialPosition.getX(idx);\r\n          const pY = initialPosition.getY(idx);\r\n          const pZ = initialPosition.getZ(idx);\r\n          positionArray[i+currentGroup] = pX;\r\n          positionArray[i+currentGroup+1] = pY;\r\n          positionArray[i+currentGroup+2] = pZ;\r\n\r\n          // Get normal\r\n          const nX = initialNormal.getX(idx);\r\n          const nY = initialNormal.getY(idx);\r\n          const nZ = initialNormal.getZ(idx);\r\n          normalArray[i+currentGroup] = nX;\r\n          normalArray[i+currentGroup+1] = nY;\r\n          normalArray[i+currentGroup+2] = nZ;\r\n\r\n          currentGroup+=2;\r\n\r\n      }\r\n\r\n      mesh.geometry.setAttribute('expressID', new BufferAttribute(expressIDArray, 1));\r\n      mesh.geometry.setAttribute('position', new BufferAttribute(positionArray, 3));\r\n      mesh.geometry.setAttribute('normal', new BufferAttribute(normalArray, 3));\r\n\r\n      // Set index to \r\n      mesh.geometry.setIndex(Array.from(Array(index.array.length).keys()));\r\n\r\n      mesh.updateMatrix();\r\n      \r\n  }\r\n    \r\n}","import { Injectable } from '@angular/core';\r\nimport { SelectionService } from './selection.service';\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class VisibilityService extends SelectionService {\r\n\r\n    \r\n    \r\n}","import { Injectable } from '@angular/core';\r\nimport { Box3, Box3Helper, BufferGeometry, Color, DoubleSide, Float32BufferAttribute, Group, Line, LineBasicMaterial, Material, Matrix4, Mesh, MeshBasicMaterial, Object3D, Points, PointsMaterial, Quaternion, Shape, ShapeGeometry, Triangle, Vector2, Vector3 } from 'three';\r\nimport { IFCViewerService } from './ifc-viewer.service';\r\nimport { ModelLoaderService } from './model-loader.service';\r\nimport { Line2, LineGeometry, LineMaterial } from 'three-fatline';\r\nimport { WKTObject, WKTObjectType } from './models';\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class OverlayService {\r\n    vectors: any;\r\n    pMin: any;\r\n    pMax: any;\r\n\r\n    constructor(\r\n        private _viewer: IFCViewerService,\r\n        private _modelLoader: ModelLoaderService\r\n    ) {}\r\n\r\n    async addWKTs(defs: WKTObject[]){\r\n\r\n        const promises: any[] = [];\r\n        defs.forEach(def => {\r\n\r\n            if(def.type == WKTObjectType.AABB){\r\n                promises.push(this.loadBBox(def))\r\n            }\r\n            if(def.type == WKTObjectType.Point){\r\n                promises.push(this.loadPoint(def))\r\n            }\r\n            if(def.type == WKTObjectType.LineString){\r\n                promises.push(this.loadLineString(def))\r\n            }\r\n            if(def.type == WKTObjectType.Polygon){\r\n                promises.push(this.loadPolygon(def))\r\n            }\r\n            \r\n        })\r\n\r\n        const objects = await Promise.all(promises);\r\n        console.log(\"Loaded objects\");\r\n\r\n        await this.addToScene(objects);\r\n        console.log(\"Added objects to scene\");\r\n\r\n    }\r\n\r\n    public clearOverlay(id: string = \"overlay\"){\r\n        let toBeRemoved = this._viewer.scene.children.filter(item => item.name == \"ol_\" + id);\r\n        toBeRemoved.forEach(obj => {\r\n            this._viewer.scene.remove(obj);\r\n        })\r\n        this._viewer.reRender();\r\n    }\r\n\r\n    public async clearAllOverlays(){\r\n        let toBeRemoved = this._viewer.scene.children.filter(item => item.name.startsWith(\"ol_\"));\r\n        toBeRemoved.forEach(obj => {\r\n            this._viewer.scene.remove(obj);\r\n        })\r\n        this._viewer.reRender();\r\n    }\r\n\r\n    private async addToScene(objects: Object3D[], id: string = \"overlay\"): Promise<void>{\r\n\r\n        return new Promise((resolve, reject) => {\r\n\r\n            const group = new Group();\r\n            group.name = \"ol_\" + id;\r\n            objects.forEach(object => group.add(object));\r\n\r\n            // Append global transformation\r\n            const globalMatrix: any = this._modelLoader.globalCoordinationMatrix;\r\n            if(globalMatrix != undefined){\r\n                group.matrixAutoUpdate = false;\r\n                group.applyMatrix4(new Matrix4().fromArray(globalMatrix));\r\n            }\r\n\r\n            this._viewer.scene.add(group);\r\n            this._viewer.reRender();\r\n\r\n            resolve();\r\n        })\r\n    }\r\n\r\n    private loadLineString(def: WKTObject): Promise<Line2>{\r\n\r\n        return new Promise((resolve, reject) => {\r\n\r\n            const pointsStr = def.wktString.split(\"(\")[1].split(\")\")[0].trim().split(\",\");  // Ex [\"0 0 0\", \"1 1 1\"]\r\n            const floatPoints = pointsStr.map(p => p.trim().split(\" \").map(p => parseFloat(p)));  // Ex [[0,0,0], [1,1,1]]\r\n\r\n            const points: any[] = [];\r\n            if (def.transformYZ){\r\n                floatPoints.forEach(p => {\r\n                    points.push(p[0]);\r\n                    points.push(p[2]);\r\n                    points.push(p[1]);\r\n            })}\r\n            else{\r\n                floatPoints.forEach(p => {\r\n                    points.push(p[0]);\r\n                    points.push(p[1]);\r\n                    points.push(p[2]);\r\n            });};\r\n\r\n            const geometry = new LineGeometry();\r\n            geometry.setPositions(points);\r\n\r\n            const material = new LineMaterial({ color: new Color(def.options.color).getHex(), linewidth: def.options.lineWidth, resolution: new Vector2(640, 480) });\r\n            const line = new Line2(geometry, material);\r\n            line.computeLineDistances();\r\n\r\n            resolve(line);\r\n\r\n        })\r\n\r\n    }\r\n\r\n    private async loadPoint(def: WKTObject): Promise<Points>{\r\n\r\n        return new Promise((resolve, reject) => {\r\n\r\n            const point = def.wktString.split(\"(\")[1].split(\")\")[0].trim();  // Ex [\"0 0 0\"]\r\n            const floatPoint = point.split(\" \").map(p => parseFloat(p));\r\n    \r\n            const geometry = new BufferGeometry();\r\n                       \r\n            if(def.transformYZ){\r\n                geometry.setAttribute('position', new Float32BufferAttribute([floatPoint[0], floatPoint[2], floatPoint[1]], 3))\r\n            }\r\n            else\r\n                geometry.setAttribute('position', new Float32BufferAttribute([floatPoint[0], floatPoint[1], floatPoint[2]], 3))\r\n    \r\n            const material = new PointsMaterial( { color: new Color(def.options.color), size: def.options.size } );\r\n            const points = new Points( geometry, material );\r\n\r\n            resolve(points);\r\n\r\n        });\r\n\r\n    }\r\n\r\n    private async loadPolygon(def: WKTObject): Promise<Mesh>{\r\n\r\n        return new Promise((resolve, reject) => {\r\n\r\n            // FROM POLYGON Z(-1 0 0, 1 0 0, 1 1 0, -1.5 1 0, -1 0 0)\r\n            // TO [[-1,0,0],[1,0,0],[1,1,0],[-1.5,1,0],[-1,0,0]]\r\n            const re = new RegExp(\"\\\\((.*?)\\\\)\");\r\n            const match: any = def.wktString.match(re);\r\n\r\n            if(!match || !match?.length) reject(\"Unable to parse WKT string\");\r\n\r\n            const planePoints = match[1]\r\n                .split(\", \")\r\n                .map((x: string) => x.split(\" \").map((y: string) => parseFloat(y)));\r\n            \r\n            let vectors = planePoints.map((p: any) => new Vector3(p[0],p[2],p[1]));\r\n\r\n            if (def.transformYZ == false){\r\n                this.vectors = planePoints.map((p: any) => new Vector3(p[0],p[1],p[2]))\r\n            }; \r\n\r\n            const tri = new Triangle(vectors[2], vectors[1], vectors[0]);\r\n            const normal = new Vector3();\r\n            tri.getNormal(normal);\r\n\r\n            var baseNormal = new Vector3(0, 0, 1);\r\n            var quaternion = new Quaternion().setFromUnitVectors(normal, baseNormal);\r\n\r\n            const tempPoints = vectors.map((v: Vector3) => v.clone().applyQuaternion(quaternion))\r\n\r\n            const shape = new Shape(tempPoints);\r\n            const geometry = new ShapeGeometry(shape);\r\n\r\n            const material = new MeshBasicMaterial({\r\n                color: new Color(def.options.color),\r\n                side: DoubleSide\r\n            })\r\n            const mesh = new Mesh(geometry, material);\r\n\r\n            mesh.geometry.setFromPoints(vectors);\r\n\r\n            // Add outlines\r\n            const lineGeometry = new BufferGeometry().setFromPoints(vectors);\r\n            const line = new Line(lineGeometry, new LineBasicMaterial({ color: 0xffffff }));\r\n            mesh.add(line);\r\n\r\n            resolve(mesh);\r\n\r\n        });\r\n\r\n    }\r\n\r\n    public loadBBox(def: WKTObject): Promise<Box3Helper>{\r\n\r\n        return new Promise((resolve, reject) => {\r\n\r\n            const points = def.wktString.split(\"(\")[1].split(\")\")[0].trim().split(\",\");  // Ex [\"0 0 0\", \"1 1 1\"]\r\n            const pMinFloats = points[0].trim().split(\" \").map(p => parseFloat(p));   // Ex [0,0,0]\r\n            const pMaxFloats = points[1].trim().split(\" \").map(p => parseFloat(p));;   // Ex [1,1,1]\r\n\r\n            if (def.transformYZ){\r\n                this.pMin = new Vector3(pMinFloats[0], pMinFloats[2], pMinFloats[1]);\r\n                this.pMax = new Vector3(pMaxFloats[0], pMaxFloats[2], pMaxFloats[1]);\r\n            }\r\n            else{\r\n                this.pMin = new Vector3(pMinFloats[0], pMinFloats[1], pMinFloats[2]);\r\n                this.pMax = new Vector3(pMaxFloats[0], pMaxFloats[1], pMaxFloats[2]);\r\n            };\r\n            \r\n\r\n            const box = new Box3(this.pMin, this.pMax);\r\n            const helper = new Box3Helper( box, new Color(def.options.color) );\r\n            \r\n            resolve(helper);\r\n\r\n        })\r\n\r\n    }\r\n    \r\n}","export const IfcDatatypes: {[key: number]: string} = {\r\n    1: 'xsd:string',\r\n    2: 'xsd:boolean'\r\n};\r\n\r\nexport const IfcLabels: {[key: string]: string} = {\r\n    \"IFCLABEL\": 'xsd:string',\r\n    \"IFCBOOLEAN\": 'xsd:boolean'\r\n};","export const IfcElements: {[key: number]: string} = {\r\n    103090709: 'IfcProject',\r\n    4097777520: 'IfcSite',\r\n    4031249490: 'IfcBuilding',\r\n    3124254112: 'IfcBuildingStorey',\r\n    3856911033: 'IfcSpace',\r\n    1674181508: 'IfcAnnotation',\r\n    25142252: 'IfcController',\r\n    32344328: 'IfcBoiler',\r\n    76236018: 'IfcLamp',\r\n    90941305: 'IfcPump',\r\n    177149247: 'IfcAirTerminalBox',\r\n    182646315: 'IfcFlowInstrument',\r\n    263784265: 'IfcFurnishingElement',\r\n    264262732: 'IfcElectricGenerator',\r\n    277319702: 'IfcAudioVisualAppliance',\r\n    310824031: 'IfcPipeFitting',\r\n    331165859: 'IfcStair',\r\n    342316401: 'IfcDuctFitting',\r\n    377706215: 'IfcMechanicalFastener',\r\n    395920057: 'IfcDoor',\r\n    402227799: 'IfcElectricMotor',\r\n    413509423: 'IfcSystemFurnitureElement',\r\n    484807127: 'IfcEvaporator',\r\n    486154966: 'IfcWindowStandardCase',\r\n    629592764: 'IfcLightFixture',\r\n    630975310: 'IfcUnitaryControlElement',\r\n    635142910: 'IfcCableCarrierFitting',\r\n    639361253: 'IfcCoil',\r\n    647756555: 'IfcFastener',\r\n    707683696: 'IfcFlowStorageDevice',\r\n    738039164: 'IfcProtectiveDevice',\r\n    753842376: 'IfcBeam',\r\n    812556717: 'IfcTank',\r\n    819412036: 'IfcFilter',\r\n    843113511: 'IfcColumn',\r\n    862014818: 'IfcElectricDistributionBoard',\r\n    900683007: 'IfcFooting',\r\n    905975707: 'IfcColumnStandardCase',\r\n    926996030: 'IfcVoidingFeature',\r\n    979691226: 'IfcReinforcingBar',\r\n    987401354: 'IfcFlowSegment',\r\n    1003880860: 'IfcElectricTimeControl',\r\n    1051757585: 'IfcCableFitting',\r\n    1052013943: 'IfcDistributionChamberElement',\r\n    1062813311: 'IfcDistributionControlElement',\r\n    1073191201: 'IfcMember',\r\n    1095909175: 'IfcBuildingElementProxy',\r\n    1156407060: 'IfcPlateStandardCase',\r\n    1162798199: 'IfcSwitchingDevice',\r\n    1329646415: 'IfcShadingDevice',\r\n    1335981549: 'IfcDiscreteAccessory',\r\n    1360408905: 'IfcDuctSilencer',\r\n    1404847402: 'IfcStackTerminal',\r\n    1426591983: 'IfcFireSuppressionTerminal',\r\n    1437502449: 'IfcMedicalDevice',\r\n    1509553395: 'IfcFurniture',\r\n    1529196076: 'IfcSlab',\r\n    1620046519: 'IfcTransportElement',\r\n    1634111441: 'IfcAirTerminal',\r\n    1658829314: 'IfcEnergyConversionDevice',\r\n    1677625105: 'IfcCivilElement',\r\n    1687234759: 'IfcPile',\r\n    1904799276: 'IfcElectricAppliance',\r\n    1911478936: 'IfcMemberStandardCase',\r\n    1945004755: 'IfcDistributionElement',\r\n    1973544240: 'IfcCovering',\r\n    1999602285: 'IfcSpaceHeater',\r\n    2016517767: 'IfcRoof',\r\n    2056796094: 'IfcAirToAirHeatRecovery',\r\n    2058353004: 'IfcFlowController',\r\n    2068733104: 'IfcHumidifier',\r\n    2176052936: 'IfcJunctionBox',\r\n    2188021234: 'IfcFlowMeter',\r\n    2223149337: 'IfcFlowTerminal',\r\n    2262370178: 'IfcRailing',\r\n    2272882330: 'IfcCondenser',\r\n    2295281155: 'IfcProtectiveDeviceTrippingUnit',\r\n    2320036040: 'IfcReinforcingMesh',\r\n    2347447852: 'IfcTendonAnchor',\r\n    2391383451: 'IfcVibrationIsolator',\r\n    2391406946: 'IfcWall',\r\n    2474470126: 'IfcMotorConnection',\r\n    2769231204: 'IfcVirtualElement',\r\n    2814081492: 'IfcEngine',\r\n    2906023776: 'IfcBeamStandardCase',\r\n    2938176219: 'IfcBurner',\r\n    2979338954: 'IfcBuildingElementPart',\r\n    3024970846: 'IfcRamp',\r\n    3026737570: 'IfcTubeBundle',\r\n    3027962421: 'IfcSlabStandardCase',\r\n    3040386961: 'IfcDistributionFlowElement',\r\n    3053780830: 'IfcSanitaryTerminal',\r\n    3079942009: 'IfcOpeningStandardCase',\r\n    3087945054: 'IfcAlarm',\r\n    3101698114: 'IfcSurfaceFeature',\r\n    3127900445: 'IfcSlabElementedCase',\r\n    3132237377: 'IfcFlowMovingDevice',\r\n    3171933400: 'IfcPlate',\r\n    3221913625: 'IfcCommunicationsAppliance',\r\n    3242481149: 'IfcDoorStandardCase',\r\n    3283111854: 'IfcRampFlight',\r\n    3296154744: 'IfcChimney',\r\n    3304561284: 'IfcWindow',\r\n    3310460725: 'IfcElectricFlowStorageDevice',\r\n    3319311131: 'IfcHeatExchanger',\r\n    3415622556: 'IfcFan',\r\n    3420628829: 'IfcSolarDevice',\r\n    3493046030: 'IfcGeographicElement',\r\n    3495092785: 'IfcCurtainWall',\r\n    3508470533: 'IfcFlowTreatmentDevice',\r\n    3512223829: 'IfcWallStandardCase',\r\n    3518393246: 'IfcDuctSegment',\r\n    3571504051: 'IfcCompressor',\r\n    3588315303: 'IfcOpeningElement',\r\n    3612865200: 'IfcPipeSegment',\r\n    3640358203: 'IfcCoolingTower',\r\n    3651124850: 'IfcProjectionElement',\r\n    3694346114: 'IfcOutlet',\r\n    3747195512: 'IfcEvaporativeCooler',\r\n    3758799889: 'IfcCableCarrierSegment',\r\n    3824725483: 'IfcTendon',\r\n    3825984169: 'IfcTransformer',\r\n    3902619387: 'IfcChiller',\r\n    4074379575: 'IfcDamper',\r\n    4086658281: 'IfcSensor',\r\n    4123344466: 'IfcElementAssembly',\r\n    4136498852: 'IfcCooledBeam',\r\n    4156078855: 'IfcWallElementedCase',\r\n    4175244083: 'IfcInterceptor',\r\n    4207607924: 'IfcValve',\r\n    4217484030: 'IfcCableSegment',\r\n    4237592921: 'IfcWasteTerminal',\r\n    4252922144: 'IfcStairFlight',\r\n    4278956645: 'IfcFlowFitting',\r\n    4288193352: 'IfcActuator',\r\n    4292641817: 'IfcUnitaryEquipment',\r\n    3009204131: 'IfcGrid'\r\n};","const map: any = {\r\n    \"\\\\\\\\X2\\\\\\\\00FC\\\\\\\\X0\\\\\\\\\": \"ü\",\r\n    \"\\\\\\\\X2\\\\\\\\00F6\\\\\\\\X0\\\\\\\\\": \"ä\",\r\n    \"\\\\\\\\X2\\\\\\\\00E6\\\\\\\\X0\\\\\\\\\": \"æ\",\r\n    \"\\\\\\\\X2\\\\\\\\00C6\\\\\\\\X0\\\\\\\\\": \"Æ\",\r\n    \"\\\\\\\\X2\\\\\\\\00F8\\\\\\\\X0\\\\\\\\\": \"ø\",\r\n    \"\\\\\\\\X2\\\\\\\\00D8\\\\\\\\X0\\\\\\\\\": \"Ø\",\r\n    \"\\\\\\\\X2\\\\\\\\00E5\\\\\\\\X0\\\\\\\\\": \"å\",\r\n    \"\\\\\\\\X2\\\\\\\\00C5\\\\\\\\X0\\\\\\\\\": \"Å\"\r\n}\r\n\r\nexport function decodeString(str: string){\r\n\r\n    // Skip if no special characters found\r\n    if(str.indexOf(\"\\\\\") == -1) return str;\r\n\r\n    // Replace all known special characters\r\n    const keys = Object.keys(map);\r\n    for (let i = 0; i < keys.length; i++) {\r\n        const regex = new RegExp(keys[i], \"g\");\r\n        str = str.replace(regex, map[keys[i]]);\r\n    }\r\n    return str;\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { decodeString } from './character-decode';\r\n\r\n@Pipe({name: 'decodeSTEP', pure: true})\r\nexport class DecodeSTEPPipe implements PipeTransform {\r\n\r\n  public language: string = \"en\";\r\n\r\n  transform(value: string): string {\r\n    return decodeString(value);\r\n  }\r\n\r\n}","import { Component, Input, OnChanges } from '@angular/core';\r\nimport { IfcDatatypes, IfcLabels } from './IfcDatatypesMap';\r\nimport {IfcElements} from './IfcElementsMap';\r\n\r\n@Component({\r\n    selector: 'property-panel',\r\n    templateUrl: 'property-panel.component.html',\r\n    styleUrls: ['property-panel.component.scss']\r\n})\r\n\r\nexport class PropertyPanelComponent implements OnChanges {\r\n\r\n    @Input() properties: any;\r\n    @Input() psetProperties: any;\r\n\r\n    public propertyKeys: string[] = [];\r\n    public psetNames: string[] = [];\r\n\r\n    public propertiesSimple: any = {};\r\n    public propertySetsSimple: any = {};\r\n\r\n    constructor() { }\r\n\r\n    ngOnChanges() {\r\n        if(this.properties != undefined){\r\n            this.simplifyPropertiesObject();\r\n        }\r\n        if(this.psetProperties != undefined){\r\n            this.buildPsetObject();\r\n        }\r\n    }\r\n\r\n    simplifyPropertiesObject(){\r\n\r\n        const { expressID, type, Name, GlobalId, Description } = this.properties;\r\n\r\n        this.propertiesSimple.expressID = this.toJSONLDValue(expressID);\r\n        this.propertiesSimple.type = this.toJSONLDValue(IfcElements[type]);\r\n        this.propertiesSimple.name = this.toJSONLDValue(Name);\r\n        this.propertiesSimple.globalID = this.toJSONLDValue(GlobalId);\r\n        this.propertiesSimple.description = this.toJSONLDValue(Description);\r\n\r\n        this.propertyKeys = Object.keys(this.propertiesSimple);\r\n    }\r\n\r\n    buildPsetObject(){\r\n        this.psetProperties.forEach((pset: any) => {\r\n\r\n            // Deconstruct object\r\n            const { expressID, type, Name, GlobalId, Description, HasProperties } = pset;\r\n\r\n            // Build pset object\r\n            let psetObj: any = {};\r\n\r\n            psetObj.name = this.toJSONLDValue(Name);\r\n            psetObj.expressID = this.toJSONLDValue(expressID);\r\n            psetObj.GlobalId = this.toJSONLDValue(GlobalId);\r\n\r\n            psetObj.properties = HasProperties.map((prop: any) => {\r\n                const propObj: any = {};\r\n\r\n                propObj.name = prop.Name.value;\r\n                propObj.value = this.nominalValueToJSONLD(prop.NominalValue)\r\n\r\n                return propObj;\r\n            })\r\n            \r\n            // Add pset name to array containing the pset names\r\n            this.psetNames.push(psetObj.name[\"@value\"]);\r\n\r\n            this.propertySetsSimple[psetObj.name[\"@value\"]] = psetObj;\r\n\r\n        })\r\n    }\r\n\r\n    private toJSONLDValue(val: any){\r\n\r\n        if(!val) return {'@value': '', '@type': 'string'};\r\n\r\n        if(typeof val == \"string\"){\r\n            return {'@value': val, '@type': 'xsd:string'}\r\n        }\r\n        if(typeof val == \"number\"){\r\n            return {'@value': val.toString(), '@type': 'xsd:decimal'}\r\n        }\r\n        if('value' in val){\r\n            return {'@value': val.value, '@type': IfcDatatypes[val.type]}\r\n        }\r\n        return val;\r\n    }\r\n\r\n    private nominalValueToJSONLD(val: any){\r\n\r\n        if(IfcLabels[val.label] == \"xsd:boolean\"){\r\n            if(val.value == \"F\") val.value = false;\r\n            if(val.value == \"T\") val.value = true;\r\n        }\r\n\r\n        return {'@value': val.value, '@type': IfcLabels[val.label]}\r\n    }\r\n\r\n}","<div class=\"panel-container\" *ngIf=\"propertiesSimple\">\r\n\r\n    <!-- GENERAL -->\r\n    <div *ngFor=\"let key of propertyKeys\" class=\"row\">\r\n        <span class=\"title\">{{key}}</span> \r\n        <span class=\"value\">{{propertiesSimple[key][\"@value\"] | decodeSTEP}}</span>\r\n    </div>\r\n\r\n    <hr>\r\n\r\n    <!-- PSETS -->\r\n    <ng-container *ngFor=\"let name of psetNames\">\r\n\r\n        <!-- PSET -->\r\n        <span class=\"value\">{{name}}</span>\r\n        <div *ngFor=\"let property of propertySetsSimple[name].properties\" class=\"row\">\r\n            <span class=\"title\">{{property.name}}</span>\r\n            <span class=\"value\">{{property.value[\"@value\"] | decodeSTEP}}</span>\r\n        </div>\r\n        \r\n        <hr>\r\n\r\n    </ng-container>\r\n\r\n</div>","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SpinnerService {\r\n\r\n  public visibility$ = new BehaviorSubject<boolean>(false);\r\n  public label$ = new BehaviorSubject<string>(\"\");\r\n\r\n  constructor() { }\r\n\r\n  public getVisibility(){\r\n    return this.visibility$.asObservable();\r\n  }\r\n\r\n  public setVisibility(status: boolean){\r\n    this.visibility$.next(status);\r\n  }\r\n\r\n  public getLabel(){\r\n    return this.label$.asObservable();\r\n  }\r\n\r\n  public setLabel(label: string){\r\n    this.label$.next(label);\r\n  }\r\n\r\n  public removeLabel(){\r\n    this.label$.next(\"\");\r\n  }\r\n\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\n\r\n@Component({\r\n    selector: 'search-bar',\r\n    templateUrl: 'search-bar.component.html',\r\n    styleUrls: ['search-bar.component.scss']\r\n})\r\n\r\nexport class SearchBarComponent implements OnInit {\r\n\r\n    @Input() label: string = \"Search term\";\r\n    @Output() close = new EventEmitter<void>();\r\n    @Output() search = new EventEmitter<string>();\r\n\r\n    public searchTerm: string = \"\";\r\n\r\n    constructor() { }\r\n\r\n    ngOnInit() {\r\n        console.log(\"aaa\")\r\n    }\r\n\r\n    onClose(){\r\n        this.close.emit();\r\n    }\r\n\r\n    doSearch(){\r\n        console.log(`Search: ${this.searchTerm}`)\r\n        this.search.emit(this.searchTerm);\r\n    }\r\n\r\n}","<div class=\"search-container\">\r\n\r\n    <mat-form-field>\r\n        <mat-label>{{label}}</mat-label>\r\n        <input matInput [(ngModel)]=\"searchTerm\" (keyup.enter)=\"doSearch()\">\r\n    </mat-form-field>\r\n\r\n    <button mat-mini-fab *ngIf=\"searchTerm\" aria-label=\"Search\" (click)=\"doSearch()\">\r\n        <mat-icon>search</mat-icon>\r\n    </button>\r\n\r\n    <button mat-mini-fab *ngIf=\"!searchTerm\" aria-label=\"Dismiss\" (click)=\"onClose()\">\r\n        <mat-icon>close</mat-icon>\r\n    </button>\r\n\r\n</div>","import { Component, Input, OnInit } from '@angular/core';\r\nimport { IFCModel } from 'web-ifc-three/IFC/components/IFCModel';\r\nimport { ModelLoaderService, LoadingStatus } from '../model-loader.service';\r\nimport { IFCViewerService } from '../ifc-viewer.service';\r\nimport { SpinnerService } from '../spinner/spinner.service';\r\nimport { MenuPanelSettings } from '../models';\r\n\r\nimport { SelectionService } from '../selection.service';\r\nimport { ColorService } from '../color.service';\r\nimport { OverlayService } from '../overlay.service';\r\n\r\n@Component({\r\n    selector: 'ifc-viewer-menu',\r\n    templateUrl: 'menu-panel.component.html',\r\n    styleUrls: ['menu-panel.component.scss']\r\n})\r\n\r\nexport class MenuPanelComponent implements OnInit {\r\n\r\n    @Input() modelLoaded: boolean = false;\r\n    @Input() models: IFCModel[] = [];\r\n    @Input() settings: MenuPanelSettings = new MenuPanelSettings();\r\n\r\n    // Dim status\r\n    public dimmed: any = {}\r\n\r\n    public clippingActive: boolean = false;\r\n\r\n    public showSearchByGlobalId: boolean = false;\r\n    public showSearchByExpressId: boolean = false;\r\n\r\n    constructor(\r\n        private _mls: ModelLoaderService,\r\n        private _vs: IFCViewerService,\r\n        private _spinnerService: SpinnerService,\r\n        private _selectionService: SelectionService,\r\n        private _colorService: ColorService,\r\n        private _overlayService: OverlayService\r\n    ) { }\r\n\r\n    ngOnInit() { }\r\n\r\n    showSearchBar(type: string){\r\n        this.cloasSearchBars();\r\n        if(type == \"globalId\") this.showSearchByGlobalId = true;\r\n        if(type == \"expressId\") this.showSearchByExpressId = true;\r\n    }\r\n\r\n    cloasSearchBars(){\r\n        this.showSearchByGlobalId = false;\r\n        this.showSearchByExpressId = false;\r\n    }\r\n\r\n    onFileLoad(event: any) {\r\n\r\n        this._spinnerService.setVisibility(true);\r\n        this._spinnerService.setLabel(\"Loading model\");\r\n\r\n        if (event.target.files.length == 0) {\r\n            console.log(\"No file selected!\");\r\n            return;\r\n        }\r\n        let file: File = event.target.files[0];\r\n\r\n        if (file) {\r\n\r\n            let loadedModel: IFCModel;\r\n            this._mls.loadModel(file).subscribe(\r\n                (status: LoadingStatus) => {\r\n\r\n                    let msg = \"Loading model\";\r\n\r\n                    if(status.fileLoad && !status.fileProcessing){\r\n                        msg = status.fileLoad != 100 ? `Loaded ${status.fileLoad.toFixed(0)} %` : \"Processed 0 %\";\r\n                    }\r\n                    if(status.fileLoad && status.fileProcessing){\r\n                        msg = status.fileProcessing != 100 ? `Processed ${status.fileProcessing} %` : \"Finalizing the scene\";\r\n                    }\r\n\r\n                    this._spinnerService.setLabel(msg);\r\n\r\n                    if (status.result != undefined) {\r\n                        loadedModel = status.result;\r\n                        \r\n                        // Append model to scene\r\n                        this._vs.appendModel(loadedModel);\r\n\r\n                        this._spinnerService.setVisibility(false);\r\n\r\n                        const modelID = loadedModel.modelID\r\n                        this.dimmed[modelID] =  false;\r\n\r\n                    }\r\n                },\r\n                err => console.log(err))\r\n\r\n        }\r\n\r\n    }\r\n\r\n    async setClippingPlane(){\r\n        // const bot = await this._bs.generateBuildingTopologyTriples();\r\n        console.log(\"Set clipping plane\");\r\n        this.clippingActive = !this.clippingActive;\r\n        // this.ifc.ifcViewer?.toggleClippingPlanes();\r\n    }\r\n\r\n    async cleanScene(){\r\n        // Get modelIds\r\n        this._colorService.resetAllColors();\r\n        this._selectionService.removeAllSubsets();\r\n        this._overlayService.clearAllOverlays();\r\n    }\r\n\r\n    hideModel(index: number){\r\n        console.log(this.models[index])\r\n\r\n        this._selectionService.hideModel(index)\r\n        console.log(this.models[index])\r\n    }\r\n\r\n    showModel(index: number){\r\n        console.log(this.models[index])\r\n\r\n        this._selectionService.unhideModel(index);\r\n        this._vs.flyToMeshCenter(this.models[index], true);\r\n    }\r\n\r\n    flyCameraToModel(index: number) {\r\n        this._vs.flyToMeshCenter(this.models[index], true);\r\n    }\r\n\r\n    dimModel(index: number) {\r\n        this._colorService.dimModel(index);\r\n        this.dimmed[index] = true;\r\n    }\r\n\r\n    undimModel(index:number) {\r\n        this._colorService.undimModel(index);  \r\n        this.dimmed[index] = false;      \r\n    }\r\n\r\n    findItem(searchTerm: string){\r\n        this._colorService.dimAll();\r\n\r\n        if(this.showSearchByGlobalId){\r\n          this._colorService.colorSubsetGlobalIds([searchTerm], \"red\", searchTerm);\r\n        }\r\n        if(this.showSearchByExpressId){\r\n            // console.log(searchTerm)\r\n          this._colorService.colorSubset([parseInt(searchTerm)], \"red\", searchTerm);\r\n        }\r\n        this.closeSearchBars();\r\n    }\r\n\r\n    closeSearchBars(){\r\n        this.showSearchByGlobalId = false;\r\n        this.showSearchByExpressId = false;\r\n    }\r\n\r\n\r\n}","<div class=\"btn-container\" [style.background-color]=\"settings.panelColor\">\r\n\r\n    <!--hidden button for file upload-->\r\n    <input #fileUpload type=\"file\" \r\n        (change)=\"onFileLoad($event)\" style=\"display:none\">\r\n\r\n    <!--our custom file upload button-->\r\n    <button \r\n        *ngIf=\"settings.panelButtons.uploadFile\"\r\n        class=\"btn\" \r\n        (click)=\"fileUpload.click()\" \r\n        matTooltip=\"Load IFC\">\r\n        <mat-icon>upload</mat-icon>\r\n    </button>\r\n\r\n    <!-- Additional content pre load -->\r\n    <ng-content select=\"[menuPreLoadContent]\"></ng-content>\r\n\r\n    <!-- after model loaded -->\r\n    <ng-container *ngIf=\"modelLoaded\">\r\n\r\n        <!-- set clipping plane -->\r\n        <!-- <button class=\"btn\" (click)=\"setClippingPlane()\" matTooltip=\"Slice model\">\r\n            <mat-icon>cut</mat-icon>\r\n        </button> -->\r\n\r\n        <!-- Find by id -->\r\n        <button class=\"btn\" *ngIf=\"settings.panelButtons.searchBar\" [matMenuTriggerFor]=\"searchMenu\" matTooltip=\"Find specific item\">\r\n            <mat-icon>search</mat-icon>\r\n        </button>\r\n        <mat-menu #searchMenu=\"matMenu\">\r\n            <ng-content select=\"[searchMenuBefore]\"></ng-content>\r\n            <button mat-menu-item (click)=\"showSearchBar('globalId')\">Find by GlobalId</button>\r\n            <button mat-menu-item (click)=\"showSearchBar('expressId')\">Find by ExpressID</button>\r\n            <ng-content select=\"[searchMenuAfter]\"></ng-content>\r\n        </mat-menu>   \r\n\r\n        <!-- Model overview -->\r\n        <button class=\"btn\" \r\n            *ngIf=\"settings.panelButtons.modelOverview\"\r\n            [matMenuTriggerFor]=\"modelMenu\" \r\n            matTooltip=\"model overview\">\r\n            <mat-icon>home</mat-icon>\r\n        </button>\r\n\r\n        <mat-menu #modelMenu=\"matMenu\" class=\"menu-panel\">\r\n            <div *ngFor=\"let model of models; index as i\">\r\n                <div class=\"model-menu-row\">\r\n                    <div>{{model.name}}</div>\r\n                    \r\n                    <!-- Hide Model -->\r\n                    <mat-icon *ngIf=\"model.visible\" class=\"clickable\" (click)=\"hideModel(i) ;$event.stopPropagation()\"\r\n                    matTooltip=\"Hide model\">visibility</mat-icon>\r\n                    <!-- Show Model -->\r\n                    <mat-icon *ngIf=\"!model.visible\" class=\"clickable\" (click)=\"showModel(i) ;$event.stopPropagation()\"\r\n                    matTooltip=\"Hide model\">visibility_off</mat-icon>\r\n\r\n                    <!-- Center Model -->\r\n                    <mat-icon *ngIf=\"model.visible\" class=\"clickable\" (click)=\"flyCameraToModel(i) ;$event.stopPropagation()\"\r\n                    matTooltip=\"Center model\">center_focus_weak</mat-icon>\r\n\r\n                    <!-- Dim model -->\r\n                    <mat-icon *ngIf=\"dimmed[i] == false\" class=\"clickable\" (click)=\"dimModel(i) ;$event.stopPropagation()\"\r\n                    matTooltip=\"Dim model\">lens_blur</mat-icon>\r\n\r\n                    <!-- Dim model -->\r\n                    <mat-icon *ngIf=\"dimmed[i] == true\" class=\"clickable\" (click)=\"undimModel(i) ;$event.stopPropagation()\"\r\n                    matTooltip=\"Undim model\">lens_blur</mat-icon>\r\n                  \r\n                </div>\r\n               \r\n            </div>\r\n        </mat-menu>\r\n\r\n        <!-- Unhide all -->\r\n        <button \r\n            *ngIf=\"settings.panelButtons.cleanScene\"\r\n            class=\"btn\" \r\n            (click)=\"cleanScene()\" \r\n            matTooltip=\"Clean scene (reset colors)\">\r\n            <mat-icon>cleaning_services</mat-icon>\r\n        </button>\r\n\r\n        <!-- Additional content post load -->\r\n        <ng-content select=\"[menuPostLoadContent]\"></ng-content>\r\n\r\n    </ng-container>\r\n\r\n</div>\r\n\r\n<!-- SEARCH BARS -->\r\n<search-bar *ngIf=\"showSearchByExpressId\" class=\"search-bar\" label=\"ExpressID\" (search)=\"findItem($event)\" (close)=\"closeSearchBars()\"></search-bar>\r\n<search-bar *ngIf=\"showSearchByGlobalId\" class=\"search-bar\" label=\"GlobalId\" (search)=\"findItem($event)\" (close)=\"closeSearchBars()\"></search-bar>","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { ContextMenuButtons, ElementClickEvent, XYScreenCoordinate } from '../models';\r\n\r\n@Component({\r\n    selector: 'ifc-viewer-context-menu',\r\n    templateUrl: 'context-menu.component.html',\r\n    styleUrls: ['context-menu.component.scss']\r\n})\r\n\r\nexport class ContextMenuComponent implements OnInit, OnChanges {\r\n\r\n    @Input() menuTopLeftPosition: XYScreenCoordinate | undefined;\r\n    @Input() clickContext?: ElementClickEvent;\r\n    @Input() public buttonVisibility: ContextMenuButtons = new ContextMenuButtons();\r\n\r\n    @Output() onShowProperties = new EventEmitter<void>();\r\n\r\n    // reference to the MatMenuTrigger in the DOM\r\n    @ViewChild(MatMenuTrigger) private menuTrigger?: MatMenuTrigger;\r\n    public menu: any;\r\n    public hoveringMenu: boolean = false;\r\n    public displayMenuTrigger: boolean = false;\r\n\r\n    constructor() { }\r\n\r\n    ngOnInit(){\r\n        this.menu = document.getElementById('menuBtn');\r\n        this.displayMenuTrigger = false;\r\n        this.menu.style.position = 'fixed';\r\n    }\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n\r\n        if(this.menuTopLeftPosition == undefined || this.clickContext == undefined) return;\r\n\r\n        // Show menu\r\n        this.menu.style.left = this.menuTopLeftPosition.x;\r\n        this.menu.style.top = this.menuTopLeftPosition.y;\r\n        this.menuTrigger?.openMenu();\r\n\r\n    }\r\n\r\n    public setItemMenuHover(ev: boolean) {\r\n        this.hoveringMenu = ev;\r\n    }\r\n\r\n    clickedItem(ev: string){\r\n        if(ev == \"properties\") this.onShowProperties.emit();\r\n    }\r\n\r\n    public onItemMenuClosed() {\r\n        if (this.menu && this.menu != undefined) {\r\n          this.displayMenuTrigger = false;\r\n        }\r\n    }\r\n\r\n}","<!-- an hidden div is created to set the position of appearance of the menu--> \r\n<!-- <div style=\"display: hidden; position: fixed;\" \r\n[style.left]=\"menuTopLeftPosition.x\" \r\n[style.top]=\"menuTopLeftPosition.y\" \r\n[matMenuTriggerFor]=\"menu\"></div>  -->\r\n \r\n<!-- standard material menu --> \r\n<!-- <mat-menu #menu=\"matMenu\">\r\n    <button mat-menu-item (click)=\"clickedItem('properties')\">Show properties</button>\r\n</mat-menu> -->\r\n\r\n<button mat-button [matMenuTriggerFor]=\"menu\" id=\"menuBtn\" [hidden]=\"!displayMenuTrigger\"></button>\r\n<mat-menu #menu=\"matMenu\" (close)=\"onItemMenuClosed()\">\r\n    <div (mouseover)=\"setItemMenuHover(true)\" (mouseout)=\"setItemMenuHover(false)\">\r\n        <button mat-menu-item (click)=\"clickedItem('properties')\" *ngIf=\"buttonVisibility.showProperties\">Show properties</button>\r\n        <ng-content select=\"[contextMenu]\"></ng-content>\r\n    </div>\r\n</mat-menu>","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { SpinnerService } from './spinner.service';\r\n\r\n@Component({\r\n  selector: 'fullpage-spinner',\r\n  template: `\r\n  <div id=\"container\" [class.visible]=\"showSpinner\">\r\n    <div class=\"lds-spinner\"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>\r\n    <div class=\"label\" *ngIf=\"label\">\r\n      {{label}}\r\n    </div>\r\n  </div>\r\n  `,\r\n  styleUrls: ['./spinner.component.css']\r\n})\r\nexport class SpinnerComponent implements OnInit {\r\n\r\n  public showSpinner: boolean = true;\r\n  public label: string = \"\";\r\n\r\n  constructor(\r\n    private _s: SpinnerService\r\n  ) { }\r\n\r\n  ngOnInit(): void {\r\n    this._s.getVisibility().subscribe(visibility => this.showSpinner = visibility);\r\n    this._s.getLabel().subscribe(label => {\r\n      this.label = label\r\n      console.log(label)\r\n    });\r\n  }\r\n\r\n}\r\n","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\n\r\n@Directive({ selector: '[longPress]' })\r\n\r\nexport class LongPressDirective {\r\n\r\n    @Output() longPress = new EventEmitter<MouseEvent>();\r\n\r\n    private _timeout: any;\r\n\r\n    @HostListener('mousedown', ['$event']) onMouseDown( e: MouseEvent ) {\r\n        this._timeout = setTimeout(() => {\r\n            this.longPress.emit( e );\r\n        }, 500);\r\n    }\r\n\r\n    @HostListener('mouseup') onMouseUp() {\r\n        clearTimeout(this._timeout);\r\n    }\r\n\r\n    @HostListener('mouseleave') onMouseLeave() {\r\n        clearTimeout(this._timeout);\r\n    }\r\n}","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\n\r\n@Directive({ selector: '[shortPress]' })\r\n\r\nexport class ShortPressDirective {\r\n\r\n    @Output() shortPress = new EventEmitter<MouseEvent>();\r\n\r\n    private _timeout: any;\r\n    private _isShort?: boolean;\r\n\r\n    @HostListener('mousedown') onMouseDown( e: MouseEvent ) {\r\n        this._isShort = true;\r\n        this._timeout = setTimeout(() => {\r\n            this._isShort = false;\r\n        }, 500);\r\n    }\r\n\r\n    @HostListener('mouseup', ['$event']) onMouseUp( e: MouseEvent ) {\r\n        if (this._isShort && e.button == 0) {\r\n            this.shortPress.emit( e );\r\n        }\r\n        clearTimeout(this._timeout);\r\n    }\r\n\r\n    @HostListener('mouseleave') onMouseLeave() {\r\n        clearTimeout(this._timeout);\r\n    }\r\n}","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\n\r\n@Directive({ selector: '[shortPress]' })\r\n\r\nexport class ShortPressRightDirective {\r\n\r\n    @Output() shortPressRight = new EventEmitter<MouseEvent>();\r\n\r\n    private _timeout: any;\r\n    private _isShort?: boolean;\r\n\r\n    @HostListener('mousedown') onMouseDown( e: MouseEvent ) {\r\n        this._isShort = true;\r\n        this._timeout = setTimeout(() => {\r\n            this._isShort = false;\r\n        }, 500);\r\n    }\r\n\r\n    @HostListener('mouseup', ['$event']) onMouseUp( e: MouseEvent ) {\r\n        if (this._isShort && e.button == 2) {\r\n            e.preventDefault();\r\n            this.shortPressRight.emit( e );\r\n        }\r\n        clearTimeout(this._timeout);\r\n    }\r\n\r\n    @HostListener('mouseleave') onMouseLeave() {\r\n        clearTimeout(this._timeout);\r\n    }\r\n}","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\n\r\n@Directive({ selector: '[resize]' })\r\n\r\nexport class ResizeDirective {\r\n\r\n    @Output() resize = new EventEmitter<void>();\r\n\r\n    @HostListener('window:resize', ['$event'])\r\n    public onResize(event: Event): void {\r\n        this.resize.emit();\r\n  }\r\n}","import { Component, ElementRef, OnInit, Input, Output, ViewChild, EventEmitter, OnChanges } from '@angular/core';\r\nimport { DoubleSide, MeshLambertMaterial } from 'three';\r\nimport { IFCModel } from 'web-ifc-three/IFC/components/IFCModel';\r\nimport { ColorService } from './color.service';\r\nimport { ModelLoaderService } from './model-loader.service';\r\nimport { IFCViewerService } from './ifc-viewer.service';\r\nimport { ElementClickEvent, ModelViewerSettings, PickedObject, XYScreenCoordinate } from './models';\r\nimport { PickingService } from './picking.service';\r\nimport { SelectionService } from './selection.service';\r\n\r\n@Component({\r\n  selector: 'ifc-viewer',\r\n  templateUrl: './ifc-viewer.component.html',\r\n  styleUrls: ['./ifc-viewer.component.scss']\r\n})\r\nexport class IFCViewerComponent implements OnInit, OnChanges {\r\n\r\n  @ViewChild('canvas') set content(content: ElementRef) {\r\n    if (content) {\r\n      // initially setter gets called with undefined\r\n      this.initScene(content.nativeElement);\r\n    }\r\n  }\r\n\r\n  @Input() settings: ModelViewerSettings = new ModelViewerSettings();\r\n\r\n  @Output() elementClick = new EventEmitter<ElementClickEvent>();\r\n  @Output() canvasClick = new EventEmitter<MouseEvent>();\r\n\r\n  public modelLoaded: boolean = false;\r\n  public models: IFCModel[] = [];\r\n\r\n  public hoveredDetails?: PickedObject;\r\n  public hoveredFace?: number;\r\n  public hoveredObject?: number;\r\n  public hoveredModel?: number;\r\n\r\n  public elementClickContext?: ElementClickEvent;\r\n\r\n  public properties: any;\r\n  public psetProperties: any;\r\n\r\n  public showPropertyPanel: boolean = false;\r\n\r\n  public contextMenuPosition?: XYScreenCoordinate;\r\n\r\n  // private defPreselectMat: Material;\r\n  // private defSelectMat: Material;\r\n  // private defHighlightMat: Material;\r\n\r\n  constructor(\r\n      private _viewerService: IFCViewerService,\r\n      private _pickingService: PickingService,\r\n      private _selectionService: SelectionService,\r\n      private _modelLoader: ModelLoaderService,\r\n      private _colorService: ColorService\r\n  ) { }\r\n\r\n  ngOnInit(): void {\r\n    // this.defSelectMat = this.initializeDefMaterial(0xff33ff, 0.3);\r\n    // this.defPreselectMat = this.initializeDefMaterial(0xffccff, 0.5);\r\n    // this.defHighlightMat = this.initializeDefMaterial(0xffccff, 0.5);\r\n\r\n    // Get models for model overview\r\n    this.models = this._viewerService.loadedModels;\r\n\r\n    this._modelLoader.getModelsLoaded().subscribe(count => {\r\n      if(count){\r\n        this.modelLoaded = true;\r\n        \r\n        // Move camera to recently added model\r\n        this._viewerService.flyToMeshCenter(this.models[count-1], true)\r\n      }\r\n    });\r\n  }\r\n\r\n  ngOnChanges(){\r\n    this._viewerService.appendViewerSettings(this.settings);\r\n  }\r\n\r\n  initScene(canvas: any){\r\n\r\n    this._viewerService.initViewer(canvas, this.settings);\r\n\r\n    // NB! Should ignore dimmed when finding nearest\r\n    this._pickingService.hoveredElementObservable(canvas).subscribe(item => {\r\n\r\n      // Hovering canvas\r\n      if(!item){\r\n        this.onCanvasHover();\r\n      }\r\n\r\n      // Hovering an object\r\n      else{\r\n\r\n        // Skip if context menu is open\r\n        if(this.contextMenuPosition != undefined) return this.onCanvasHover();\r\n\r\n        // Skip if property panel is open\r\n        if(this.showPropertyPanel) return this.onCanvasHover();\r\n\r\n        this.onObjectHover(item);\r\n\r\n      }\r\n  \r\n    })\r\n  }\r\n\r\n  onLongPress(ev: any){\r\n      this.closeContextMenu();\r\n  }\r\n\r\n  onCanvasHover(){\r\n    // Set cursor to default\r\n    document.body.style.cursor = 'default';\r\n\r\n    // Remove previous selection\r\n    if(this.hoveredModel != undefined) this._selectionService.markHovered([], this.hoveredModel);\r\n\r\n    this.hoveredModel = undefined;\r\n    this.hoveredFace = undefined;\r\n    this.hoveredObject = undefined;\r\n  }\r\n\r\n  onObjectHover(object: PickedObject){\r\n\r\n    document.body.style.cursor = 'pointer';\r\n\r\n    // Set hovered object and model\r\n    this.hoveredDetails = object;\r\n    this.hoveredObject = object.expressID;\r\n    this.hoveredModel = object.modelID;\r\n\r\n    // Add to selection in order to change color\r\n    this._selectionService.markHovered([object.expressID], object.modelID);\r\n\r\n  }\r\n\r\n  async onShortPress(ev: any){\r\n\r\n      if(this.hoveredModel != undefined && this.hoveredObject != undefined){\r\n        await this.onModelClick(ev);\r\n      }else{\r\n        this.onCanvasClick(ev);\r\n      }\r\n\r\n  }\r\n\r\n  async onShortPressRight(ev: any){\r\n    \r\n  }\r\n\r\n  public openContextMenu(ev: any){\r\n    const x = ev.clientX + 'px';\r\n    const y = ev.clientY + 'px';\r\n    this.contextMenuPosition = {x, y};\r\n  }\r\n\r\n  public closeContextMenu(){\r\n    this.contextMenuPosition = undefined;\r\n  }\r\n\r\n  async onModelClick(ev: any){\r\n\r\n    if(this.hoveredModel == undefined || this.hoveredObject == undefined) return;\r\n\r\n    if(this.settings.showContextMenu){\r\n      this.openContextMenu(ev);\r\n    }\r\n\r\n    // Get global id\r\n    const globalId = await this._modelLoader.getGlobalId(this.hoveredObject, this.hoveredModel);\r\n\r\n    // Add to selection\r\n    const selection = this._selectionService.appendToSelection([globalId]);\r\n\r\n    // Color selection??\r\n    if(this.settings.highlightSelectedObjects){\r\n      await this._colorService.colorSubsetGlobalIds(selection, this.settings.selectionColor, \"selection\");\r\n    }\r\n\r\n    this.elementClickContext = {globalId, selection, expressID: this.hoveredObject, modelID: this.hoveredModel, mouseEvent: ev, object: this.hoveredDetails as PickedObject};\r\n\r\n    this.elementClick.emit(this.elementClickContext);\r\n\r\n  }\r\n\r\n  async showPropertiesPanel(){\r\n    \r\n    if(this.elementClickContext == undefined || this.elementClickContext == undefined) return;\r\n\r\n    await this.getProperties(this.elementClickContext.expressID, this.elementClickContext.modelID);\r\n    this.showPropertyPanel = true;\r\n    \r\n  }\r\n\r\n  async onCanvasClick(ev: any){\r\n    this.showPropertyPanel = false;\r\n    this.elementClickContext = undefined;\r\n    this._selectionService.clearSelection();\r\n    await this._colorService.removeSubset(\"selection\");\r\n    this.closeContextMenu();\r\n    this.canvasClick.emit(ev);\r\n  }\r\n\r\n  onResize(){\r\n      // console.log(\"Resize\");\r\n  }\r\n\r\n  async getProperties(elementID: number, modelID: number = 0, recursive: boolean = true): Promise<void>{\r\n\r\n    // Get properties\r\n    const [properties, psetProperties, materialProperties] = await Promise.all([\r\n      this._modelLoader.ifc.getItemProperties(modelID, elementID, recursive),\r\n      this._modelLoader.ifc.getPropertySets(modelID, elementID, recursive),\r\n      this._modelLoader.ifc.getMaterialsProperties(modelID, elementID, recursive)\r\n    ]);\r\n\r\n    this.properties = properties;\r\n    this.psetProperties = psetProperties;\r\n\r\n  }\r\n\r\n  async getGlobalId(elementID: number, modelID: number = 0): Promise<string>{\r\n    const properties = await this._modelLoader.ifc.getItemProperties(modelID, elementID);\r\n    return properties.GlobalId.value;\r\n  }\r\n\r\n  private initializeDefMaterial(color: number, opacity: number) {\r\n    // const planes = this.context.getClippingPlanes();\r\n    return new MeshLambertMaterial({\r\n      color,\r\n      opacity,\r\n      transparent: true,\r\n      depthTest: false,\r\n      side: DoubleSide,\r\n      // clippingPlanes: planes\r\n    });\r\n  }\r\n\r\n}\r\n","<canvas\r\n    #canvas\r\n    canvasEvents\r\n    id=\"three-canvas\"\r\n    (longPress)=\"onLongPress($event)\"\r\n    (shortPress)=\"onShortPress($event)\"\r\n    (shortPressRight)=\"onShortPressRight($event)\"\r\n    (resize)=\"onResize()\">\r\n</canvas>\r\n\r\n<!-- PROPERTY PANEL -->\r\n<property-panel id=\"property-panel\" \r\n    *ngIf=\"showPropertyPanel\"\r\n    [properties]=\"properties\"\r\n    [psetProperties]=\"psetProperties\">\r\n</property-panel>\r\n\r\n<!-- TOP MENU -->\r\n<ifc-viewer-menu \r\n    id=\"menu-panel\"\r\n    *ngIf=\"settings.displayMenuPanel\"\r\n    [settings]=\"settings.menuPanelSettings\"\r\n    [modelLoaded]=\"modelLoaded\"\r\n    [models]=\"models\">\r\n\r\n    <ng-container menuPreLoadContent>\r\n        <ng-content select=\"[menuPreLoadContent]\"></ng-content>\r\n    </ng-container>\r\n\r\n    <ng-container menuPostLoadContent>\r\n        <ng-content select=\"[menuPostLoadContent]\"></ng-content>\r\n    </ng-container>\r\n\r\n    <!-- Search menu content -->\r\n    <ng-container searchMenuBefore>\r\n        <ng-content select=\"[searchMenuBefore]\"></ng-content>\r\n    </ng-container>\r\n    <ng-container searchMenuAfter>\r\n        <ng-content select=\"[searchMenuAfter]\"></ng-content>\r\n    </ng-container>\r\n\r\n</ifc-viewer-menu>\r\n\r\n\r\n<!-- CONTEXT MENU -->\r\n<ifc-viewer-context-menu\r\n    [menuTopLeftPosition]=\"contextMenuPosition\"\r\n    [clickContext]=\"elementClickContext\"\r\n    [buttonVisibility]=\"settings.contextMenuButtons\"\r\n    (onShowProperties)=\"showPropertiesPanel()\">\r\n\r\n    <ng-container contextMenu>\r\n        <ng-content select=\"[contextMenu]\"></ng-content>\r\n    </ng-container>\r\n\r\n</ifc-viewer-context-menu>\r\n\r\n<!-- SPINNER -->\r\n<fullpage-spinner *ngIf=\"settings.showSpinnerOnModelLoad\"></fullpage-spinner>","// Inspired by https://github.com/IFCjs/web-ifc-viewer/blob/master/viewer/src/components/import-export/glTF.ts\r\n\r\n// SplitByFloors and categories currently not supported (copy from above link)\r\n\r\nimport { Mesh } from \"three\";\r\nimport { GLTFExporter } from \"three/examples/jsm/exporters/GLTFExporter\";\r\n\r\nexport class GlTFExportService {\r\n\r\n    private exporter = new GLTFExporter();\r\n    private options = {\r\n        trs: false,\r\n        onlyVisible: false,\r\n        truncateDrawRange: true,\r\n        binary: true,\r\n        maxTextureSize: 0\r\n    };\r\n\r\n    public async getModelAsGltf(model: any) {\r\n        return this.exportMeshToGltf(model);\r\n    }\r\n\r\n    public async downloadModelAsGltf(model: any) {\r\n        const binary = await this.getModelAsGltf(model);\r\n        saveFile(binary, \"model.gltf\", \"model/gltf-binary\");\r\n    }\r\n\r\n    /**\r\n     * Exports the given mesh as glTF.\r\n     * @mesh The mesh to export.\r\n     */\r\n    private exportMeshToGltf(mesh: Mesh) {\r\n        return new Promise<any>((resolve) => {\r\n            this.exporter.parse(mesh, (result: any) => resolve(result), this.options);\r\n        });\r\n    }\r\n\r\n}\r\n\r\n// Trick used by FileSaver.js:\r\n// 1. Create a hidden <a> tag.\r\n// 2. Set its href attribute to the blob's URL.\r\n// 3. Set its download attribute to the filename.\r\n// 4. Click on the <a> tag.\r\nconst saveFile = (function () {\r\n    let a = document.createElement(\"a\");\r\n    document.body.appendChild(a);\r\n    // a.style = \"display: none\";\r\n    return function (data: string, fileName: string, mimetype: string) {\r\n        var blob = new Blob([data], {type: mimetype}),\r\n            url = window.URL.createObjectURL(blob);\r\n        a.href = url;\r\n        a.download = fileName;\r\n        a.click();\r\n        window.URL.revokeObjectURL(url);\r\n        return url;\r\n    };\r\n}());","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\n\r\nimport { MenuPanelComponent } from './menu-panel.component';\r\nimport { SearchBarComponent } from './search-bar/search-bar.component';\r\n\r\n@NgModule({\r\n    imports: [\r\n        CommonModule,\r\n        FormsModule,\r\n        MatIconModule,\r\n        MatMenuModule,\r\n        MatButtonModule,\r\n        MatInputModule\r\n    ],\r\n    exports: [MenuPanelComponent],\r\n    declarations: [\r\n        MenuPanelComponent,\r\n        SearchBarComponent\r\n    ],\r\n    providers: [],\r\n})\r\nexport class MenuPanelModule { }\r\n","// Angular\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { createCustomElement } from '@angular/elements';\r\nimport { Injector, NgModule } from '@angular/core';\r\n\r\n// 3rd party\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\n// Components\r\nimport { PropertyPanelComponent } from './property-panel/property-panel.component';\r\nimport { IFCViewerComponent } from './ifc-viewer.component';\r\nimport { SpinnerComponent } from './spinner/spinner.component';\r\nimport { ContextMenuComponent } from './context-menu/context-menu.component';\r\n\r\n// Directives\r\nimport { ShortPressRightDirective } from './directives/shortpress-right.directive';\r\nimport { LongPressDirective } from './directives/longpress.directive';\r\nimport { ResizeDirective } from './directives/resize.directive';\r\nimport { ShortPressDirective } from './directives/shortpress.directive';\r\n\r\n// Pipes\r\nimport { DecodeSTEPPipe } from './pipes/decode-step.pipe';\r\n\r\n// Services\r\nimport { ModelLoaderService } from './model-loader.service';\r\nimport { IFCViewerService } from './ifc-viewer.service';\r\nimport { PickingService } from './picking.service';\r\nimport { SpinnerService } from './spinner/spinner.service';\r\nimport { SelectionService } from './selection.service';\r\nimport { ColorService } from './color.service';\r\nimport { VisibilityService } from './visibility.service';\r\nimport { IFCToolsService } from './ifc-tools.service';\r\nimport { GlTFExportService } from './import-export/gltf-export.service';\r\nimport { GlTFImportService } from './import-export/gltf-import.service';\r\nimport { OverlayService } from './overlay.service';\r\nimport { MenuPanelModule } from './menu-panel/menu-panel.module';\r\n\r\n@NgModule({\r\n  declarations: [\r\n    IFCViewerComponent,\r\n    ContextMenuComponent,\r\n    PropertyPanelComponent,\r\n    LongPressDirective,\r\n    ShortPressDirective,\r\n    ShortPressRightDirective,\r\n    ResizeDirective,\r\n    SpinnerComponent,\r\n    DecodeSTEPPipe\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    MatTooltipModule,\r\n    MatMenuModule,\r\n    MatButtonModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    MatIconModule,\r\n    MenuPanelModule\r\n  ],\r\n  exports: [\r\n    IFCViewerComponent\r\n  ],\r\n  providers: [\r\n    ModelLoaderService,\r\n    IFCViewerService,\r\n    PickingService,\r\n    ColorService,\r\n    OverlayService,\r\n    GlTFImportService,\r\n    GlTFExportService,\r\n    VisibilityService,\r\n    IFCToolsService,\r\n    SelectionService,\r\n    SpinnerService\r\n  ]\r\n})\r\nexport class IfcViewerModule {\r\n\r\n  constructor(private injector: Injector) {}\r\n\r\n  ngDoBootstrap(): void {\r\n      const el = createCustomElement(IFCViewerComponent, {injector: this.injector});\r\n      customElements.define('ifc-viewer', el);\r\n  }\r\n\r\n}\r\n","/*\r\n * Public API Surface of ifc-viewer\r\n */\r\n\r\nexport * from './lib/ifc-viewer.service';\r\nexport * from './lib/ifc-tools.service';\r\nexport * from './lib/model-loader.service';\r\nexport * from './lib/picking.service';\r\nexport * from './lib/color.service';\r\nexport * from './lib/visibility.service';\r\nexport * from './lib/selection.service';\r\nexport * from './lib/overlay.service';\r\nexport * from './lib/ifc-viewer.component';\r\nexport * from './lib/ifc-viewer.module';\r\nexport * from './lib/menu-panel/menu-panel.component';\r\nexport * from './lib/directives/longpress.directive';\r\nexport * from './lib/directives/shortpress.directive';\r\nexport * from './lib/directives/shortpress-right.directive';\r\nexport * from './lib/directives/resize.directive';\r\nexport * from './lib/models';\r\nexport * from './lib/pipes/decode-step.pipe';\r\nexport * from './lib/menu-panel/search-bar/search-bar.component'\r\nexport * from './lib/helpers/color-helpers';\r\n\r\nexport * from './lib/import-export/gltf-import.service';\r\nexport * from './lib/import-export/gltf-export.service';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}