From 84959d1cf89f502852f2083c63beed6269cf7c6c Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 22 Jan 2021 15:52:48 +1100 Subject: [PATCH] You can now export container data from IFCCSV --- src/ifccsv/ifccsv.py | 12 ++++++------ src/ifcopenshell-python/ifcopenshell/util/element.py | 5 +++++ .../ifcopenshell/util/selector.py | 8 ++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/ifccsv/ifccsv.py b/src/ifccsv/ifccsv.py index 91e0ced797..6dbf949b2e 100755 --- a/src/ifccsv/ifccsv.py +++ b/src/ifccsv/ifccsv.py @@ -10,7 +10,7 @@ import lark import argparse -class IfcAttributeExtractor: +class IfcAttributeSetter: @staticmethod def set_element_key(ifc_file, element, key, value): if key == "type" and element.is_a() != value: @@ -22,14 +22,14 @@ class IfcAttributeExtractor: return element if key[0:3] == "Qto": qto, prop = key.split(".", 1) - qto = IfcAttributeExtractor.get_element_qto(element, qto_name) + qto = IfcAttributeSetter.get_element_qto(element, qto_name) if qto: - IfcAttributeExtractor.set_qto_property(qto, prop, value) + IfcAttributeSetter.set_qto_property(qto, prop, value) return element pset_name, prop = key.split(".", 1) - pset = IfcAttributeExtractor.get_element_pset(element, pset_name) + pset = IfcAttributeSetter.get_element_pset(element, pset_name) if pset: - IfcAttributeExtractor.set_pset_property(pset, prop, value) + IfcAttributeSetter.set_pset_property(pset, prop, value) return element return element @@ -149,7 +149,7 @@ class IfcCsv: for i, value in enumerate(row): if i == 0: continue # Skip GlobalId - element = IfcAttributeExtractor.set_element_key(ifc_file, element, headers[i], value) + element = IfcAttributeSetter.set_element_key(ifc_file, element, headers[i], value) ifc_file.write(ifc) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index b67ec58cf3..ddab485dc1 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -83,6 +83,11 @@ def get_material(element): return relationship.RelatingMaterial +def get_container(element): + if hasattr(element, "ContainedInStructure") and element.ContainedInStructure: + return element.ContainedInStructure[0].RelatingStructure + + def replace_attribute(element, old, new): for i, attribute in enumerate(element): if attribute == old: diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 416a178e8e..5317dec333 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -227,6 +227,14 @@ class Selector: except: return key = ".".join(key.split(".")[1:]) + elif "." in key and key.split(".")[0] == "container": + try: + element = ifcopenshell.util.element.get_container(element) + if not element: + return None + except: + return + key = ".".join(key.split(".")[1:]) info = element.get_info() if key in info: return info[key]