From 869bb22830d1a447e26df1dc6e534e165d18a105 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 10 Aug 2021 09:35:09 +1000 Subject: [PATCH] You can now import a cost schedule from an IFC project library --- .../blenderbim/bim/module/project/operator.py | 2 +- .../ifcopenshell/api/project/append_asset.py | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 92c493a91d..5b8a69c62e 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -172,7 +172,7 @@ class RefreshLibrary(bpy.types.Operator): self.props.active_library_element = "" types = IfcStore.library_file.wrapped_data.types_with_super() - for importable_type in ["IfcTypeProduct", "IfcMaterial"]: + for importable_type in ["IfcTypeProduct", "IfcMaterial", "IfcCostSchedule"]: if importable_type in types: new = self.props.library_elements.add() new.name = importable_type diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index 9088f11b3b..b0ea4066b8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -12,21 +12,33 @@ class Usecase: def execute(self): self.added_elements = set() if self.settings["element"].is_a("IfcTypeProduct"): - try: - self.file.by_guid(self.settings["element"].GlobalId) - return - except: - pass return self.append_type_product() elif self.settings["element"].is_a("IfcMaterial"): - if [e for e in self.file.by_type("IfcMaterial") if e.Name == self.settings["element"].Name]: - return return self.append_material() + elif self.settings["element"].is_a("IfcCostSchedule"): + return self.append_cost_schedule() + + def is_already_appended(self): + try: + self.file.by_guid(self.settings["element"].GlobalId) + return True + except: + return False def append_material(self): + if [e for e in self.file.by_type("IfcMaterial") if e.Name == self.settings["element"].Name]: + return return self.file.add(self.settings["element"]) + def append_cost_schedule(self): + if self.is_already_appended(): + return + self.whitelisted_inverse_attributes = {"IfcCostSchedule": ["Controls"], "IfcCostItem": ["IsNestedBy"]} + return self.add_element(self.settings["element"]) + def append_type_product(self): + if self.is_already_appended(): + return self.whitelisted_inverse_attributes = { "IfcObjectDefinition": ["HasAssociations"], "IfcMaterialDefinition": ["HasExternalReferences", "HasProperties"],