Deleting a material set from a type now also purges usages from type instances

This commit is contained in:
Dion Moult
2021-08-08 20:56:31 +10:00
parent b696d302f9
commit 7abccbd713
3 changed files with 26 additions and 5 deletions
@@ -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"}
@@ -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)
@@ -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):