| 98 | |
| 99 | # TODO: name is unused? |
| 100 | def parse(self, ifc_file: ifcopenshell.file, name=None): |
| 101 | for category_name, category_config in self.config["categories"].items(): |
| 102 | for element in category_config["get_category_elements"](ifc_file): |
| 103 | get_element_data: Union[GetElementDataCallBack, dict[str, Any]] |
| 104 | get_element_data = category_config["get_element_data"] |
| 105 | |
| 106 | if isinstance(get_element_data, dict): |
| 107 | data = {} |
| 108 | for key, query in get_element_data.items(): |
| 109 | data[key] = ifcopenshell.util.selector.get_element_value(element, query) |
| 110 | elif isinstance(get_element_data, Callable): |
| 111 | data = get_element_data(ifc_file, element) or {} |
| 112 | |
| 113 | get_custom_element_data = self.get_custom_element_data.get(category_name, lambda x, y: None) |
| 114 | if isinstance(get_custom_element_data, dict): |
| 115 | custom_data = {} |
| 116 | for key, query in get_custom_element_data.items(): |
| 117 | custom_data[key] = ifcopenshell.util.selector.get_element_value(element, query) |
| 118 | elif isinstance(get_custom_element_data, Callable): |
| 119 | custom_data = get_custom_element_data(ifc_file, element) or {} |
| 120 | |
| 121 | data.update(custom_data) |
| 122 | |
| 123 | if data: |
| 124 | key = "-".join([str(data[k]) for k in category_config["keys"]]) |
| 125 | # TODO: duplicate_keys are never used? |
| 126 | if key in self.categories[category_name]: |
| 127 | self.duplicate_keys.append((self.categories[category_name][key], data)) |
| 128 | self.categories[category_name][key] = data |
| 129 | |
| 130 | def federate(self, paths: list[str]) -> None: |
| 131 | for path in paths: |