diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 9bc102c2ce..01ffc3cd22 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -157,7 +157,7 @@ class UnassignMaterial(bpy.types.Operator): self.file, **{"product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)}, ) - Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) + Data.purge() return {"FINISHED"} diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py index 09c625a900..d01f3a78f8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py @@ -1,4 +1,5 @@ import ifcopenshell +import ifcopenshell.util.element class Usecase: @@ -9,11 +10,26 @@ class Usecase: self.settings[key] = value def execute(self): + if self.settings["product"].is_a("IfcTypeObject"): + material = ifcopenshell.util.element.get_material(self.settings["product"]) + if material.is_a() in ["IfcMaterialLayerSet", "IfcMaterialProfileSet"]: + for inverse in self.file.get_inverse(material): + if self.file.schema == "IFC2X3": + if not inverse.is_a("IfcMaterialLayerSetUsage"): + continue + for inverse2 in self.file.get_inverse(inverse): + if inverse2.is_a("IfcRelAssociatesMaterial"): + self.file.remove(inverse2) + else: + if not inverse.is_a("IfcMaterialUsageDefinition"): + continue + for rel in inverse.AssociatedTo: + self.file.remove(rel) + self.file.remove(inverse) + for rel in self.settings["product"].HasAssociations: if rel.is_a("IfcRelAssociatesMaterial"): - if rel.RelatingMaterial.is_a("IfcMaterialLayerSetUsage") or rel.RelatingMaterial.is_a( - "IfcMaterialProfileSetUsage" - ): + if rel.RelatingMaterial.is_a() in ["IfcMaterialLayerSetUsage", "IfcMaterialProfileSetUsage"]: self.file.remove(rel.RelatingMaterial) if len(rel.RelatedObjects) == 1: self.file.remove(rel) diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index 6c0668beb3..30c7bfa36c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -11,7 +11,12 @@ class Usecase: def execute(self): self.added_elements = set() - if self.settings["element"].is_a("IfcTypeProduct") and not self.file.by_guid(self.settings["element"].GlobalId): + if self.settings["element"].is_a("IfcTypeProduct"): + try: + self.file.by_guid(self.settings["element"].GlobalId) + return + except: + pass return self.append_type_product() def append_type_product(self):