{"version":3,"file":"vendor.openbim-components-edf05b2e.e82f3ad8902bd0db.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/ifc/IfcJsonExporter/index.js","webpack://client-app/./node_modules/openbim-components/src/ifc/IfcJsonExporter/src/ifc-geometry-types.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":["import * as WEBIFC from \"web-ifc\";\r\nimport { GeometryTypes } from \"./src/ifc-geometry-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 /**\r\n * Exports all the properties of an IFC into an array of JS objects.\r\n * @param webIfc The instance of [web-ifc]{@link https://github.com/ThatOpen/engine_web-ifc} to use.\r\n * @param modelID ID of the IFC model whose properties to extract.\r\n * @param indirect whether to get the indirect relationships as well.\r\n * @param recursiveSpatial whether to get the properties of spatial items recursively\r\n * to make the location data available (e.g. absolute position of building).\r\n */\r\n async export(webIfc, modelID, indirect = false, recursiveSpatial = true) {\r\n const properties = {};\r\n const allIfcEntities = new Set(webIfc.GetIfcEntityList(modelID));\r\n // let finalCount = 0;\r\n // Spatial items get their properties recursively to make\r\n // the location data available (e.g. absolute position of building)\r\n const spatialStructure = new Set([\r\n WEBIFC.IFCPROJECT,\r\n WEBIFC.IFCSITE,\r\n WEBIFC.IFCBUILDING,\r\n WEBIFC.IFCBUILDINGSTOREY,\r\n WEBIFC.IFCSPACE,\r\n ]);\r\n for (const type of spatialStructure) {\r\n allIfcEntities.add(type);\r\n }\r\n for (const type of allIfcEntities) {\r\n if (GeometryTypes.has(type)) {\r\n continue;\r\n }\r\n const recursive = spatialStructure.has(type) && recursiveSpatial;\r\n const ids = webIfc.GetLineIDsWithType(modelID, type);\r\n // const allIDs = this._webIfc.GetAllLines(0);\r\n for (const id of ids) {\r\n const property = webIfc.GetLine(0, id, recursive, indirect);\r\n properties[property.expressID] = property;\r\n }\r\n }\r\n return properties;\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map","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 { 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\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 await 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 async indexEntityRelations(model) {\r\n const map = {};\r\n await IfcPropertiesUtils.getRelationMap(model, WEBIFC.IFCRELDEFINESBYPROPERTIES, async (relatingID, relatedIDs) => {\r\n if (!map[relatingID])\r\n map[relatingID] = new Set();\r\n const props = [];\r\n await IfcPropertiesUtils.getPsetProps(model, 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 await IfcPropertiesUtils.getRelationMap(model, relation, async (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 = await this.indexEntityRelations(model);\r\n }\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] of model.data) {\r\n const included = relations.includes(expressID);\r\n if (included) {\r\n modelEntities.add(expressID);\r\n }\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 await 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.get(expressID);\r\n if (!data)\r\n continue;\r\n for (const key of data[0]) {\r\n const fragmentID = model.keyFragments.get(key);\r\n if (!fragmentID) {\r\n throw new Error(\"Fragment ID not found!\");\r\n }\r\n if (!fragmentMap[fragmentID]) {\r\n fragmentMap[fragmentID] = new Set();\r\n }\r\n fragmentMap[fragmentID].add(expressID);\r\n }\r\n }\r\n }\r\n return fragmentMap;\r\n }\r\n simpleQuery(model, queryGroup, excludedItems) {\r\n const properties = model.getLocalProperties();\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, query.operator ?? \"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?.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":["IfcJsonExporter","webIfc","modelID","indirect","recursiveSpatial","properties","allIfcEntities","Set","GetIfcEntityList","spatialStructure","type","add","has","recursive","ids","GetLineIDsWithType","id","property","GetLine","expressID","GeometryTypes","AttributeQueryUI","query","attribute","this","value","condition","operator","getTypeConstant","ifcTypes","negateResult","negate","visible","Error","String","key","val","Object","entries","Number","constructor","components","super","negateClass","domElement","classList","remove","label","addOption","get","style","width","onChange","selection","attributeIsType","options","allowSearch","values","removeBtn","materialIconName","onClick","async","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","trigger","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","IfcPropertiesUtils","getRelationMap","relatingID","relatedIDs","props","getPsetProps","propID","push","relatedID","ifcRelations","relation","uuid","queryGroups","queryModels","models","result","cache","relations","excludedItems","groupResult","simpleQuery","groupRelations","getCommonElements","modelEntities","includes","otherEntities","foundFragments","toFragmentMap","fragmentMap","m","matchingEntities","fragmentID","keyFragments","getLocalProperties","filteredProps","iterations","queryResult","workingProps","matchingResult","getMatchingEntities","expressIDs","entities","combineArrays","attributeName","handleAttribute","entity","undefined","attributeValue","type1","type2","toString","conditionMatches","arrA","arrB","arrayIntersection","arrayUnion","lists","elementsCount","Map","list","uniqueElements","element","count","length","x","stringify","setItem","is","leftValue","rightValue","startsWith","endsWith","matches","RegExp","test"],"sourceRoot":""}