{"version":3,"file":"vendor.openbim-components-edf05b2e.fba16ddecf17f11c.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/ifc/IfcJsonExporter/src/ifc-geometry-types.js","webpack://client-app/./node_modules/openbim-components/src/ifc/IfcJsonExporter/index.js","webpack://client-app/./node_modules/openbim-components/src/ifc/IfcPropertiesFinder/src/attribute-query.js","webpack://client-app/./node_modules/openbim-components/src/ifc/IfcPropertiesFinder/src/query-group.js","webpack://client-app/./node_modules/openbim-components/src/ifc/IfcPropertiesFinder/src/query-builder.js","webpack://client-app/./node_modules/openbim-components/src/ifc/IfcPropertiesFinder/index.js"],"sourcesContent":["export const GeometryTypes = new Set([\r\n 1123145078, 574549367, 1675464909, 2059837836, 3798115385, 32440307,\r\n 3125803723, 3207858831, 2740243338, 2624227202, 4240577450, 3615266464,\r\n 3724593414, 220341763, 477187591, 1878645084, 1300840506, 3303107099,\r\n 1607154358, 1878645084, 846575682, 1351298697, 2417041796, 3049322572,\r\n 3331915920, 1416205885, 776857604, 3285139300, 3958052878, 2827736869,\r\n 2732653382, 673634403, 3448662350, 4142052618, 2924175390, 803316827,\r\n 2556980723, 1809719519, 2205249479, 807026263, 3737207727, 1660063152,\r\n 2347385850, 3940055652, 2705031697, 3732776249, 2485617015, 2611217952,\r\n 1704287377, 2937912522, 2770003689, 1281925730, 1484403080, 3448662350,\r\n 4142052618, 3800577675, 4006246654, 3590301190, 1383045692, 2775532180,\r\n 2047409740, 370225590, 3593883385, 2665983363, 4124623270, 812098782,\r\n 3649129432, 987898635, 1105321065, 3510044353, 1635779807, 2603310189,\r\n 3406155212, 1310608509, 4261334040, 2736907675, 3649129432, 1136057603,\r\n 1260505505, 4182860854, 2713105998, 2898889636, 59481748, 3749851601,\r\n 3486308946, 3150382593, 1062206242, 3264961684, 15328376, 1485152156,\r\n 370225590, 1981873012, 2859738748, 45288368, 2614616156, 2732653382,\r\n 775493141, 2147822146, 2601014836, 2629017746, 1186437898, 2367409068,\r\n 1213902940, 3632507154, 3900360178, 476780140, 1472233963, 2804161546,\r\n 3008276851, 738692330, 374418227, 315944413, 3905492369, 3570813810,\r\n 2571569899, 178912537, 2294589976, 1437953363, 2133299955, 572779678,\r\n 3092502836, 388784114, 2624227202, 1425443689, 3057273783, 2347385850,\r\n 1682466193, 2519244187, 2839578677, 3958567839, 2513912981, 2830218821,\r\n 427810014,\r\n]);\r\n//# sourceMappingURL=ifc-geometry-types.js.map","import * as WEBIFC from \"web-ifc\";\r\nimport { GeometryTypes } from \"./src/ifc-geometry-types\";\r\nimport { Event } from \"../../base-types\";\r\n/**\r\n * Object to export all the properties from an IFC to a JS object.\r\n */\r\nexport class IfcJsonExporter {\r\n constructor() {\r\n this.onLoadProgress = new Event();\r\n this.onPropertiesSerialized = new Event();\r\n this._progress = 0;\r\n }\r\n /**\r\n * Exports all the properties of an IFC into an array of JS objects.\r\n * @webIfc The instance of [web-ifc]{@link https://github.com/ifcjs/web-ifc} to use.\r\n * @modelID ID of the IFC model whose properties to extract.\r\n */\r\n async export(webIfc, modelID) {\r\n const geometriesIDs = await this.getAllGeometriesIDs(modelID, webIfc);\r\n let properties = {};\r\n properties.coordinationMatrix = webIfc.GetCoordinationMatrix(modelID);\r\n const allLinesIDs = await webIfc.GetAllLines(modelID);\r\n const linesCount = allLinesIDs.size();\r\n this._progress = 0.1;\r\n let counter = 0;\r\n for (let i = 0; i < linesCount; i++) {\r\n const id = allLinesIDs.get(i);\r\n if (!geometriesIDs.has(id)) {\r\n try {\r\n properties[id] = await webIfc.GetLine(modelID, id);\r\n }\r\n catch (e) {\r\n console.log(`Properties of the element ${id} could not be processed`);\r\n }\r\n counter++;\r\n }\r\n if (this.size !== undefined && counter > this.size) {\r\n await this.onPropertiesSerialized.trigger(properties);\r\n properties = null;\r\n properties = {};\r\n counter = 0;\r\n }\r\n if (i / linesCount > this._progress) {\r\n await this.onLoadProgress.trigger({\r\n progress: i,\r\n total: linesCount,\r\n });\r\n this._progress += 0.1;\r\n }\r\n }\r\n await this.onPropertiesSerialized.trigger(properties);\r\n properties = null;\r\n }\r\n async getAllGeometriesIDs(modelID, webIfc) {\r\n // Exclude location info of spatial structure\r\n const placementIDs = new Set();\r\n const structures = new Set();\r\n this.getStructure(WEBIFC.IFCPROJECT, structures, webIfc);\r\n this.getStructure(WEBIFC.IFCSITE, structures, webIfc);\r\n this.getStructure(WEBIFC.IFCBUILDING, structures, webIfc);\r\n this.getStructure(WEBIFC.IFCBUILDINGSTOREY, structures, webIfc);\r\n this.getStructure(WEBIFC.IFCSPACE, structures, webIfc);\r\n for (const id of structures) {\r\n const properties = webIfc.GetLine(0, id);\r\n const placementRef = properties.ObjectPlacement;\r\n if (!placementRef || placementRef.value === null) {\r\n continue;\r\n }\r\n const placementID = placementRef.value;\r\n placementIDs.add(placementID);\r\n const placementProps = webIfc.GetLine(0, placementID);\r\n const relPlacementID = placementProps.RelativePlacement;\r\n if (!relPlacementID || relPlacementID.value === null) {\r\n continue;\r\n }\r\n placementIDs.add(relPlacementID.value);\r\n const relPlacement = webIfc.GetLine(0, relPlacementID.value);\r\n const location = relPlacement.Location;\r\n if (location && location.value !== null) {\r\n placementIDs.add(location.value);\r\n }\r\n }\r\n const geometriesIDs = new Set();\r\n const geomTypesArray = Array.from(GeometryTypes);\r\n for (let i = 0; i < geomTypesArray.length; i++) {\r\n const category = geomTypesArray[i];\r\n // eslint-disable-next-line no-await-in-loop\r\n const ids = await webIfc.GetLineIDsWithType(modelID, category);\r\n const idsSize = ids.size();\r\n for (let j = 0; j < idsSize; j++) {\r\n const id = ids.get(j);\r\n if (placementIDs.has(id)) {\r\n continue;\r\n }\r\n geometriesIDs.add(id);\r\n }\r\n }\r\n return geometriesIDs;\r\n }\r\n getStructure(type, result, webIfc) {\r\n const found = webIfc.GetLineIDsWithType(0, type);\r\n const size = found.size();\r\n for (let i = 0; i < size; i++) {\r\n const id = found.get(i);\r\n result.add(id);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map","import { SimpleUIComponent, Dropdown, Button, TextInput } from \"../../../ui\";\r\nimport { IfcCategoryMap } from \"../../ifc-category-map\";\r\nexport class AttributeQueryUI extends SimpleUIComponent {\r\n // Is ok to use Type Assertion in this case?\r\n get query() {\r\n const attribute = this.attribute.value;\r\n const condition = this.condition.value;\r\n const operator = this.operator.value || null;\r\n const value = attribute === \"type\"\r\n ? this.getTypeConstant(this.ifcTypes.value)\r\n : this.value.value;\r\n const negateResult = this.negate.value === \"NOT A\";\r\n const query = {\r\n attribute,\r\n condition,\r\n value,\r\n negateResult,\r\n operator,\r\n };\r\n if (this.operator.visible)\r\n query.operator = this.operator.value;\r\n return query;\r\n }\r\n set query(value) {\r\n if (value.operator) {\r\n this.operator.value = value.operator;\r\n this.operator.visible = true;\r\n }\r\n this.attribute.value = value.attribute;\r\n this.condition.value = value.condition;\r\n this.negate.value = value.negateResult ? \"NOT A\" : \"A\";\r\n if (value.attribute === \"type\") {\r\n if (typeof value.value !== \"number\") {\r\n throw new Error(\"Corrupted IfcPropertiesFinder cached data!\");\r\n }\r\n this.value.value = \"\";\r\n this.ifcTypes.value = IfcCategoryMap[value.value];\r\n }\r\n else {\r\n this.ifcTypes.value = null;\r\n this.value.value = String(value.value);\r\n }\r\n }\r\n getTypeConstant(value) {\r\n for (const [key, val] of Object.entries(IfcCategoryMap)) {\r\n if (val === value)\r\n return Number(key);\r\n }\r\n return null;\r\n }\r\n constructor(components) {\r\n super(components, `
`);\r\n this.negate = new Dropdown(components);\r\n const negateClass = this.negate.domElement.classList;\r\n negateClass.remove(\"w-full\");\r\n negateClass.add(\"min-w-[4.5rem]\");\r\n this.negate.label = \"Sign\";\r\n this.negate.addOption(\"A\", \"NOT A\");\r\n this.negate.value = \"A\";\r\n this.operator = new Dropdown(components);\r\n this.operator.visible = false;\r\n this.operator.label = \"Operator\";\r\n this.operator.get().style.width = \"300px\";\r\n this.operator.addOption(\"AND\", \"OR\");\r\n this.attribute = new Dropdown(components);\r\n this.attribute.label = \"Attribute\";\r\n this.attribute.addOption(\"type\", \"Name\", \"PredefinedType\", \"NominalValue\", \"Description\");\r\n this.attribute.onChange.add((selection) => {\r\n const attributeIsType = selection === \"type\";\r\n this.value.visible = !attributeIsType;\r\n this.ifcTypes.visible = attributeIsType;\r\n });\r\n this.condition = new Dropdown(components);\r\n this.condition.label = \"Condition\";\r\n this.condition.addOption(\"is\", \"includes\", \"startsWith\", \"endsWith\", \"matches\");\r\n this.condition.value = this.condition.options[0];\r\n this.value = new TextInput(components);\r\n this.value.label = \"Value\";\r\n this.ifcTypes = new Dropdown(components);\r\n this.ifcTypes.allowSearch = true;\r\n this.ifcTypes.visible = false;\r\n this.ifcTypes.label = \"Value\";\r\n for (const type of Object.values(IfcCategoryMap)) {\r\n this.ifcTypes.addOption(type);\r\n }\r\n this.ifcTypes.value = \"IFCWALL\";\r\n this.removeBtn = new Button(components, { materialIconName: \"remove\" });\r\n this.removeBtn.visible = false;\r\n this.removeBtn.get().classList.remove(\"mt-auto\", \"hover:bg-ifcjs-200\");\r\n this.removeBtn.get().classList.add(\"mt-auto\", \"mb-2\", \"hover:bg-error\");\r\n this.removeBtn.onClick.add(async () => {\r\n if (this.parent instanceof SimpleUIComponent)\r\n this.parent.removeChild(this);\r\n await this.dispose();\r\n });\r\n this.addChild(this.operator, this.attribute, this.condition, this.negate, this.value, this.ifcTypes, this.removeBtn);\r\n this.attribute.value = \"Name\";\r\n }\r\n async dispose(onlyChildren = false) {\r\n await super.dispose(onlyChildren);\r\n await this.operator.dispose();\r\n await this.attribute.dispose();\r\n await this.condition.dispose();\r\n await this.value.dispose();\r\n await this.ifcTypes.dispose();\r\n await this.removeBtn.dispose();\r\n await this.negate.dispose();\r\n }\r\n}\r\n//# sourceMappingURL=attribute-query.js.map","import { SimpleUIComponent, Button, Dropdown } from \"../../../ui\";\r\nimport { AttributeQueryUI } from \"./attribute-query\";\r\nexport class QueryGroupUI extends SimpleUIComponent {\r\n get query() {\r\n const queriesMap = this.children.map((child) => {\r\n if (!(child instanceof AttributeQueryUI))\r\n return null;\r\n return child.query;\r\n });\r\n const queries = queriesMap.filter((query) => query !== null);\r\n const query = { queries };\r\n if (this.operator.visible)\r\n query.operator = this.operator.value;\r\n return query;\r\n }\r\n set query(value) {\r\n if (value.operator)\r\n this.operator.value = value.operator;\r\n for (const child of this.children) {\r\n if (!(child instanceof AttributeQueryUI))\r\n continue;\r\n this.removeChild(child);\r\n child.dispose();\r\n }\r\n let first = true;\r\n for (const [index, query] of value.queries.entries()) {\r\n // @ts-ignore\r\n if (!query.condition)\r\n continue;\r\n const attributeQuery = query;\r\n if (index === 0 && attributeQuery.operator) {\r\n delete attributeQuery.operator;\r\n }\r\n const attributeQueryUI = new AttributeQueryUI(this._components);\r\n attributeQueryUI.query = attributeQuery;\r\n this.addChild(attributeQueryUI);\r\n if (first) {\r\n first = false;\r\n }\r\n else {\r\n attributeQueryUI.removeBtn.visible = true;\r\n }\r\n }\r\n }\r\n constructor(components) {\r\n super(components, `
`);\r\n this.operator = new Dropdown(components);\r\n this.operator.visible = false;\r\n this.operator.label = null;\r\n this.operator.addOption(\"AND\", \"OR\");\r\n const topContainer = new SimpleUIComponent(components, `
`);\r\n const newRuleBtn = new Button(components, { materialIconName: \"add\" });\r\n newRuleBtn.get().classList.add(\"w-fit\");\r\n newRuleBtn.label = \"Add Rule\";\r\n newRuleBtn.onClick.add(() => {\r\n const propertyQuery = new AttributeQueryUI(components);\r\n propertyQuery.operator.visible = true;\r\n propertyQuery.operator.value = propertyQuery.operator.options[0];\r\n propertyQuery.removeBtn.visible = true;\r\n this.addChild(propertyQuery);\r\n });\r\n const newGroupBtn = new Button(components, { materialIconName: \"add\" });\r\n newGroupBtn.get().classList.add(\"w-fit\");\r\n newGroupBtn.label = \"Add Group\";\r\n this.removeBtn = new Button(components, { materialIconName: \"delete\" });\r\n this.removeBtn.label = \"Delete Group\";\r\n this.removeBtn.visible = false;\r\n this.removeBtn.onClick.add(async () => {\r\n if (this.parent instanceof SimpleUIComponent)\r\n this.parent.removeChild(this);\r\n await this.dispose();\r\n });\r\n topContainer.addChild(newRuleBtn, this.removeBtn);\r\n const propertyQuery = new AttributeQueryUI(components);\r\n this.addChild(topContainer, this.operator, propertyQuery);\r\n }\r\n async dispose(onlyChildren = false) {\r\n await super.dispose(onlyChildren);\r\n await this.operator.dispose();\r\n await this.removeBtn.dispose();\r\n }\r\n}\r\n//# sourceMappingURL=query-group.js.map","import { Event } from \"../../../base-types\";\r\nimport { Button, SimpleUIComponent } from \"../../../ui\";\r\nimport { QueryGroupUI } from \"./query-group\";\r\nexport class QueryBuilder extends SimpleUIComponent {\r\n get query() {\r\n const queriesMap = this.children.map((child) => {\r\n if (!(child instanceof QueryGroupUI))\r\n return null;\r\n return child.query;\r\n });\r\n return queriesMap.filter((query) => query !== null);\r\n }\r\n set query(value) {\r\n for (const child of this.children) {\r\n if (child instanceof QueryGroupUI) {\r\n this.removeChild(child);\r\n child.dispose();\r\n }\r\n }\r\n let first = true;\r\n for (const [index, group] of value.entries()) {\r\n if (index === 0 && group.operator) {\r\n delete group.operator;\r\n }\r\n const attributeQueryUI = new QueryGroupUI(this._components);\r\n attributeQueryUI.removeBtn.visible = true;\r\n attributeQueryUI.query = group;\r\n this.addChild(attributeQueryUI);\r\n if (first) {\r\n first = false;\r\n attributeQueryUI.removeBtn.visible = false;\r\n }\r\n }\r\n this.get().append(this.findButton.get());\r\n this.onQuerySet.trigger(value);\r\n }\r\n constructor(components) {\r\n super(components, `
`);\r\n this.onQuerySet = new Event();\r\n this.findButton = new Button(this._components, {\r\n materialIconName: \"search\",\r\n });\r\n this.findButton.label = \"Find\";\r\n this.findButton.alignment = \"center\";\r\n this.findButton\r\n .get()\r\n .classList.add(\"border\", \"border-solid\", \"border-ifcjs-120\", \"hover:border-ifcjs-200\");\r\n const topContainer = new SimpleUIComponent(this._components, `
`);\r\n const newGroupBtn = new Button(this._components, {\r\n materialIconName: \"add\",\r\n });\r\n newGroupBtn.get().classList.add(\"w-fit\");\r\n newGroupBtn.label = \"Add Group\";\r\n newGroupBtn.onClick.add(() => {\r\n const queryGroup = new QueryGroupUI(this._components);\r\n queryGroup.operator.visible = true;\r\n queryGroup.operator.value = queryGroup.operator.options[0];\r\n queryGroup.removeBtn.visible = true;\r\n this.addChild(queryGroup);\r\n this.get().append(this.findButton.get());\r\n });\r\n const resetBtn = new Button(this._components, {\r\n materialIconName: \"refresh\",\r\n });\r\n resetBtn.label = \"Reset\";\r\n topContainer.addChild(newGroupBtn);\r\n const queryEditor = new QueryGroupUI(this._components);\r\n this.addChild(topContainer, queryEditor, this.findButton);\r\n // this.query = [\r\n // {\r\n // queries: [\r\n // { attribute: \"Name\", condition: \"includes\", value: \"Acabado\" },\r\n // {\r\n // operator: \"AND\",\r\n // attribute: \"PredefinedType\",\r\n // condition: \"is\",\r\n // value: \"FLOOR\",\r\n // },\r\n // ],\r\n // },\r\n // ];\r\n }\r\n async dispose(onlyChildren = false) {\r\n await super.dispose(onlyChildren);\r\n await this.findButton.dispose();\r\n this.onQuerySet.reset();\r\n }\r\n}\r\n//# sourceMappingURL=query-builder.js.map","import * as WEBIFC from \"web-ifc\";\r\nimport { Event, Component, UIElement, } from \"../../base-types\";\r\nimport { IfcPropertiesUtils } from \"../IfcPropertiesUtils\";\r\nimport { Button, FloatingWindow } from \"../../ui\";\r\nimport { FragmentManager } from \"../../fragments/FragmentManager\";\r\nimport { QueryBuilder } from \"./src/query-builder\";\r\nimport { IfcPropertiesManager } from \"../IfcPropertiesManager\";\r\nexport class IfcPropertiesFinder extends Component {\r\n constructor(components) {\r\n super(components);\r\n this.onFound = new Event();\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this.enabled = true;\r\n this.uiElement = new UIElement();\r\n this._localStorageID = \"IfcPropertiesFinder\";\r\n this._indexedModels = {};\r\n this._noHandleAttributes = [\"type\"];\r\n this.onFragmentsDisposed = (data) => {\r\n delete this._indexedModels[data.groupID];\r\n };\r\n this._conditionFunctions = this.getConditionFunctions();\r\n const fragmentManager = components.tools.get(FragmentManager);\r\n fragmentManager.onFragmentsDisposed.add(this.onFragmentsDisposed);\r\n }\r\n init() {\r\n if (this.components.uiEnabled) {\r\n this.setUI();\r\n }\r\n }\r\n get() {\r\n return this._indexedModels;\r\n }\r\n async dispose() {\r\n this._indexedModels = {};\r\n this.onFound.reset();\r\n this.uiElement.dispose();\r\n await this.onDisposed.trigger();\r\n this.onDisposed.reset();\r\n }\r\n loadCached(id) {\r\n if (id) {\r\n this._localStorageID = `IfcPropertiesFinder-${id}`;\r\n }\r\n const serialized = localStorage.getItem(this._localStorageID);\r\n if (!serialized)\r\n return;\r\n const groups = JSON.parse(serialized);\r\n const queryBuilder = this.uiElement.get(\"query\");\r\n queryBuilder.query = groups;\r\n }\r\n deleteCache() {\r\n localStorage.removeItem(this._localStorageID);\r\n }\r\n setUI() {\r\n const main = new Button(this.components, {\r\n materialIconName: \"manage_search\",\r\n });\r\n const queryWindow = new FloatingWindow(this.components);\r\n this.components.ui.add(queryWindow);\r\n const fragments = this.components.tools.get(FragmentManager);\r\n // queryWindow.get().classList.add(\"overflow-visible\");\r\n queryWindow.get().style.width = \"700px\";\r\n queryWindow.get().style.height = \"420px\";\r\n queryWindow.visible = false;\r\n // queryWindow.resizeable = false;\r\n queryWindow.title = \"Model Queries\";\r\n main.onClick.add(() => {\r\n queryWindow.visible = !queryWindow.visible;\r\n });\r\n queryWindow.onVisible.add(() => (main.active = true));\r\n queryWindow.onHidden.add(() => (main.active = false));\r\n const query = new QueryBuilder(this.components);\r\n query.findButton.onClick.add(async () => {\r\n const model = fragments.groups[0];\r\n if (!model)\r\n return;\r\n await this.find();\r\n });\r\n queryWindow.addChild(query);\r\n this.uiElement.set({\r\n main,\r\n queryWindow,\r\n query,\r\n });\r\n }\r\n indexEntityRelations(model) {\r\n const map = {};\r\n const { properties } = IfcPropertiesManager.getIFCInfo(model);\r\n IfcPropertiesUtils.getRelationMap(properties, WEBIFC.IFCRELDEFINESBYPROPERTIES, (relatingID, relatedIDs) => {\r\n if (!map[relatingID])\r\n map[relatingID] = new Set();\r\n const props = [];\r\n IfcPropertiesUtils.getPsetProps(properties, relatingID, (propID) => {\r\n props.push(propID);\r\n map[relatingID].add(propID);\r\n if (!map[propID])\r\n map[propID] = new Set();\r\n map[propID].add(relatingID);\r\n });\r\n for (const relatedID of relatedIDs) {\r\n map[relatingID].add(relatedID);\r\n for (const propID of props)\r\n map[propID].add(relatedID);\r\n if (!map[relatedID])\r\n map[relatedID] = new Set();\r\n map[relatedID].add(relatedID);\r\n }\r\n });\r\n const ifcRelations = [\r\n WEBIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE,\r\n WEBIFC.IFCRELDEFINESBYTYPE,\r\n WEBIFC.IFCRELASSIGNSTOGROUP,\r\n ];\r\n for (const relation of ifcRelations) {\r\n IfcPropertiesUtils.getRelationMap(properties, relation, (relatingID, relatedIDs) => {\r\n if (!map[relatingID])\r\n map[relatingID] = new Set();\r\n for (const relatedID of relatedIDs) {\r\n map[relatingID].add(relatedID);\r\n if (!map[relatedID])\r\n map[relatedID] = new Set();\r\n map[relatedID].add(relatedID);\r\n }\r\n });\r\n }\r\n this._indexedModels[model.uuid] = map;\r\n return map;\r\n }\r\n async find(queryGroups, queryModels) {\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const queries = this.uiElement.get(\"query\");\r\n const models = queryModels || fragments.groups;\r\n const groups = queryGroups || queries.query;\r\n const result = {};\r\n this.cache();\r\n for (const model of models) {\r\n let map = this._indexedModels[model.uuid];\r\n if (!map)\r\n map = this.indexEntityRelations(model);\r\n let relations = [];\r\n for (const [index, group] of groups.entries()) {\r\n const excludedItems = new Set();\r\n const groupResult = this.simpleQuery(model, group, excludedItems);\r\n const groupRelations = [];\r\n for (const expressID of groupResult) {\r\n const relations = map[expressID];\r\n if (!relations)\r\n continue;\r\n groupRelations.push(expressID);\r\n for (const id of relations) {\r\n if (!excludedItems.has(id)) {\r\n groupRelations.push(id);\r\n }\r\n }\r\n }\r\n relations =\r\n group.operator === \"AND\" && index > 0\r\n ? this.getCommonElements(relations, groupRelations)\r\n : [...relations, ...groupRelations];\r\n }\r\n const modelEntities = new Set();\r\n for (const expressID in model.data) {\r\n const included = relations.includes(Number(expressID));\r\n if (!included)\r\n continue;\r\n modelEntities.add(Number(expressID));\r\n }\r\n const otherEntities = new Set();\r\n for (const expressID of relations) {\r\n const included = modelEntities.has(expressID);\r\n if (included)\r\n continue;\r\n otherEntities.add(expressID);\r\n }\r\n result[model.uuid] = { modelEntities, otherEntities };\r\n }\r\n const foundFragments = this.toFragmentMap(result);\r\n this.onFound.trigger(foundFragments);\r\n return foundFragments;\r\n }\r\n toFragmentMap(data) {\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const fragmentMap = {};\r\n for (const modelID in data) {\r\n const model = fragments.groups.find((m) => m.uuid === modelID);\r\n if (!model)\r\n continue;\r\n const matchingEntities = data[modelID].modelEntities;\r\n for (const expressID of matchingEntities) {\r\n const data = model.data[expressID];\r\n if (!data)\r\n continue;\r\n for (const key of data[0]) {\r\n const fragmentID = model.keyFragments[key];\r\n if (!fragmentMap[fragmentID]) {\r\n fragmentMap[fragmentID] = new Set();\r\n }\r\n fragmentMap[fragmentID].add(String(expressID));\r\n }\r\n }\r\n }\r\n return fragmentMap;\r\n }\r\n simpleQuery(model, queryGroup, excludedItems) {\r\n var _a;\r\n const properties = model.properties;\r\n if (!properties)\r\n throw new Error(\"Model has no properties\");\r\n let filteredProps = {};\r\n let iterations = 0;\r\n let matchingEntities = [];\r\n for (const query of queryGroup.queries) {\r\n let queryResult = [];\r\n const workingProps = query.operator === \"AND\" ? filteredProps : properties;\r\n const isAttributeQuery = query.condition; // Is there a better way?\r\n if (isAttributeQuery) {\r\n const matchingResult = this.getMatchingEntities(workingProps, query, excludedItems);\r\n queryResult = matchingResult.expressIDs;\r\n filteredProps = { ...filteredProps, ...matchingResult.entities };\r\n }\r\n else {\r\n queryResult = [\r\n ...this.simpleQuery(model, query, excludedItems),\r\n ];\r\n }\r\n matchingEntities =\r\n iterations === 0\r\n ? queryResult\r\n : this.combineArrays(matchingEntities, queryResult, (_a = query.operator) !== null && _a !== void 0 ? _a : \"AND\" // Defaults to AND if iterations > 0 and query.operator is not defined\r\n );\r\n iterations++;\r\n }\r\n return new Set(matchingEntities);\r\n }\r\n getMatchingEntities(entities, query, excludedItems) {\r\n const { attribute: attributeName, condition } = query;\r\n let { value } = query;\r\n const handleAttribute = !this._noHandleAttributes.includes(attributeName);\r\n const expressIDs = [];\r\n const matchingEntities = [];\r\n for (const expressID in entities) {\r\n const entity = entities[expressID];\r\n if (entity === undefined) {\r\n continue;\r\n }\r\n const attribute = entity[attributeName];\r\n let attributeValue = handleAttribute ? attribute === null || attribute === void 0 ? void 0 : attribute.value : attribute;\r\n if (attributeValue === undefined || attributeValue === null)\r\n continue;\r\n // TODO: Maybe the user can specify the value type in the finder menu, so we don't need this\r\n const type1 = typeof value;\r\n const type2 = typeof attributeValue;\r\n if (type1 === \"number\" && type2 === \"string\") {\r\n value = value.toString();\r\n }\r\n else if (type1 === \"string\" && type2 === \"number\") {\r\n attributeValue = attributeValue.toString();\r\n }\r\n let conditionMatches = this._conditionFunctions[condition](attributeValue, value);\r\n if (query.negateResult) {\r\n conditionMatches = !conditionMatches;\r\n }\r\n if (!conditionMatches) {\r\n if (query.negateResult) {\r\n excludedItems.add(entity.expressID);\r\n }\r\n continue;\r\n }\r\n expressIDs.push(entity.expressID);\r\n matchingEntities.push(entity);\r\n }\r\n return { expressIDs, entities: matchingEntities, excludedItems };\r\n }\r\n combineArrays(arrA, arrB, operator) {\r\n if (!operator)\r\n return arrB;\r\n return operator === \"AND\"\r\n ? this.arrayIntersection(arrA, arrB)\r\n : this.arrayUnion(arrA, arrB);\r\n }\r\n getCommonElements(...lists) {\r\n const result = [];\r\n const elementsCount = new Map();\r\n for (const list of lists) {\r\n const uniqueElements = new Set(list);\r\n for (const element of uniqueElements) {\r\n if (elementsCount.has(element)) {\r\n elementsCount.set(element, elementsCount.get(element) + 1);\r\n }\r\n else {\r\n elementsCount.set(element, 1);\r\n }\r\n }\r\n }\r\n for (const [element, count] of elementsCount) {\r\n if (count === lists.length) {\r\n result.push(element);\r\n }\r\n }\r\n return result;\r\n }\r\n arrayIntersection(arrA, arrB) {\r\n return arrA.filter((x) => arrB.includes(x));\r\n }\r\n arrayUnion(arrA, arrB) {\r\n return [...arrA, ...arrB];\r\n }\r\n cache() {\r\n const queryBuilder = this.uiElement.get(\"query\");\r\n const query = queryBuilder.query;\r\n const serialized = JSON.stringify(query);\r\n localStorage.setItem(this._localStorageID, serialized);\r\n }\r\n getConditionFunctions() {\r\n return {\r\n is: (leftValue, rightValue) => {\r\n return leftValue === rightValue;\r\n },\r\n includes: (leftValue, rightValue) => {\r\n return leftValue.toString().includes(rightValue.toString());\r\n },\r\n startsWith: (leftValue, rightValue) => {\r\n return leftValue.toString().startsWith(rightValue.toString());\r\n },\r\n endsWith: (leftValue, rightValue) => {\r\n return leftValue.toString().endsWith(rightValue.toString());\r\n },\r\n matches: (leftValue, rightValue) => {\r\n const regex = new RegExp(rightValue.toString());\r\n return regex.test(leftValue.toString());\r\n },\r\n };\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map"],"names":["GeometryTypes","Set","IfcJsonExporter","constructor","this","onLoadProgress","onPropertiesSerialized","_progress","async","webIfc","modelID","geometriesIDs","getAllGeometriesIDs","properties","coordinationMatrix","GetCoordinationMatrix","allLinesIDs","GetAllLines","linesCount","size","counter","i","id","get","has","GetLine","e","console","log","undefined","trigger","progress","total","placementIDs","structures","getStructure","placementRef","ObjectPlacement","value","placementID","add","relPlacementID","RelativePlacement","location","Location","geomTypesArray","Array","from","length","category","ids","GetLineIDsWithType","idsSize","j","type","result","found","AttributeQueryUI","query","attribute","condition","operator","getTypeConstant","ifcTypes","negateResult","negate","visible","Error","String","key","val","Object","entries","Number","components","super","negateClass","domElement","classList","remove","label","addOption","style","width","onChange","selection","attributeIsType","options","allowSearch","values","removeBtn","materialIconName","onClick","parent","removeChild","dispose","addChild","onlyChildren","QueryGroupUI","queries","children","map","child","filter","first","index","attributeQuery","attributeQueryUI","_components","topContainer","newRuleBtn","propertyQuery","newGroupBtn","QueryBuilder","group","append","findButton","onQuerySet","alignment","queryGroup","queryEditor","reset","IfcPropertiesFinder","onFound","onDisposed","enabled","uiElement","_localStorageID","_indexedModels","_noHandleAttributes","onFragmentsDisposed","data","groupID","_conditionFunctions","getConditionFunctions","tools","FragmentManager","init","uiEnabled","setUI","loadCached","serialized","localStorage","getItem","groups","JSON","parse","deleteCache","removeItem","main","queryWindow","ui","fragments","height","title","onVisible","active","onHidden","find","set","indexEntityRelations","model","IfcPropertiesManager","IfcPropertiesUtils","relatingID","relatedIDs","props","propID","push","relatedID","ifcRelations","relation","uuid","queryGroups","queryModels","models","cache","relations","excludedItems","groupResult","simpleQuery","groupRelations","expressID","getCommonElements","modelEntities","includes","otherEntities","foundFragments","toFragmentMap","fragmentMap","m","matchingEntities","fragmentID","keyFragments","_a","filteredProps","iterations","queryResult","workingProps","matchingResult","getMatchingEntities","expressIDs","entities","combineArrays","attributeName","handleAttribute","entity","attributeValue","type1","type2","toString","conditionMatches","arrA","arrB","arrayIntersection","arrayUnion","lists","elementsCount","Map","list","uniqueElements","element","count","x","stringify","setItem","is","leftValue","rightValue","startsWith","endsWith","matches","RegExp","test"],"sourceRoot":""}