diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index e2e9919551..11745bdf7a 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -318,6 +318,10 @@ class EnableEditingAssignedMaterial(bpy.types.Operator): material_set_class = "IfcMaterialLayerSet" elif product_data["type"] == "IfcMaterialProfileSet": material_set_data = Data.profile_sets[product_data["id"]] + elif product_data["type"] == "IfcMaterialProfileSetUsage": + profile_set_usage = Data.profile_set_usages[product_data["id"]] + material_set_data = Data.profile_sets[profile_set_usage["ForProfileSet"]] + material_set_class = "IfcMaterialProfileSet" elif product_data["type"] == "IfcMaterialList": material_set_data = Data.lists[product_data["id"]] else: @@ -409,7 +413,7 @@ class EnableEditingMaterialSetItem(bpy.types.Operator): material_set_item_data = Data.constituents[self.material_set_item] elif product_data["type"] == "IfcMaterialLayerSet" or product_data["type"] == "IfcMaterialLayerSetUsage": material_set_item_data = Data.layers[self.material_set_item] - elif product_data["type"] == "IfcMaterialProfileSet": + elif product_data["type"] == "IfcMaterialProfileSet" or product_data["type"] == "IfcMaterialProfileSetUsage": material_set_item_data = Data.profiles[self.material_set_item] else: material_set_item_data = {} @@ -542,7 +546,7 @@ class EditMaterialSetItem(bpy.types.Operator): }, ) Data.load_layers() - elif product_data["type"] == "IfcMaterialProfileSet": + elif product_data["type"] == "IfcMaterialProfileSet" or product_data["type"] == "IfcMaterialProfileSetUsage": profile_attributes = {} for attribute in props.material_set_item_profile_attributes: if attribute.data_type == "string": diff --git a/src/blenderbim/blenderbim/bim/module/material/prop.py b/src/blenderbim/blenderbim/bim/module/material/prop.py index 6b39d95691..4bd7093d69 100644 --- a/src/blenderbim/blenderbim/bim/module/material/prop.py +++ b/src/blenderbim/blenderbim/bim/module/material/prop.py @@ -70,6 +70,7 @@ def getMaterialTypes(self, context): "IfcMaterialLayerSet", "IfcMaterialLayerSetUsage", "IfcMaterialProfileSet", + "IfcMaterialProfileSetUsage", "IfcMaterialList", ] if IfcStore.get_file().schema == "IFC2X3": diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index 591fa8ccb3..262a920ef3 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -82,6 +82,13 @@ class BIM_PT_object_material(Panel): self.set_items = self.material_set_data["MaterialProfiles"] or [] self.set_data = Data.profiles self.set_item_name = "profile" + elif self.product_data["type"] == "IfcMaterialProfileSetUsage": + self.material_set_usage = Data.profile_set_usages[self.product_data["id"]] + self.material_set_id = self.material_set_usage["ForProfileSet"] + self.material_set_data = Data.profile_sets[self.material_set_id] + self.set_items = self.material_set_data["MaterialProfiles"] or [] + self.set_data = Data.profiles + self.set_item_name = "profile" elif self.product_data["type"] == "IfcMaterialList": self.material_set_id = self.product_data["id"] self.material_set_data = Data.lists[self.material_set_id] diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py index f7fc4be564..8e7147ee67 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py @@ -24,18 +24,28 @@ class Usecase: elif self.settings["type"] == "IfcMaterialProfileSet": material_set = self.file.create_entity(self.settings["type"]) self.create_material_association(material_set) + elif self.settings["type"] == "IfcMaterialProfileSetUsage": + material_set = self.file.create_entity("IfcMaterialProfileSet") + material_set_usage = self.create_profile_set_usage(material_set) + self.create_material_association(material_set_usage) elif self.settings["type"] == "IfcMaterialList": material_set = self.file.create_entity(self.settings["type"]) material_set.Materials = [self.settings["material"]] self.create_material_association(material_set) def create_layer_set_usage(self, material_set): - return self.file.create_entity("IfcMaterialLayerSetUsage", **{ - "ForLayerSet": material_set, - "LayerSetDirection": "AXIS2" if self.settings["product"].is_a("IfcWall") else "AXIS3", - "DirectionSense": "POSITIVE", - "OffsetFromReferenceLine": 0 - }) + return self.file.create_entity( + "IfcMaterialLayerSetUsage", + **{ + "ForLayerSet": material_set, + "LayerSetDirection": "AXIS2" if self.settings["product"].is_a("IfcWall") else "AXIS3", + "DirectionSense": "POSITIVE", + "OffsetFromReferenceLine": 0, + } + ) + + def create_profile_set_usage(self, material_set): + return self.file.create_entity("IfcMaterialProfileSetUsage", **{"ForProfileSet": material_set}) def assign_ifc_material(self): rel = self.get_rel_associates_material(self.settings["material"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/data.py b/src/ifcopenshell-python/ifcopenshell/api/material/data.py index 1c39d5b20f..6d1c68e5da 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/data.py @@ -6,8 +6,10 @@ class Data: materials = {} constituent_sets = {} constituents = {} + layer_sets_usages = {} layer_sets = {} layers = {} + profile_set_usages = {} profile_sets = {} profiles = {} lists = {} @@ -23,6 +25,7 @@ class Data: cls.layer_set_usages = {} cls.layer_sets = {} cls.layers = {} + cls.profile_set_usages = {} cls.profile_sets = {} cls.profiles = {} cls.lists = {} @@ -41,6 +44,7 @@ class Data: cls.load_layers() cls.load_layer_usages() cls.load_profiles() + cls.load_profile_usages() cls.load_lists() cls.is_loaded = True @@ -68,6 +72,11 @@ class Data: cls.layer_set_usages = {} cls.load_element("IfcMaterialLayerSetUsage", cls.layer_set_usages) + @classmethod + def load_profile_usages(cls): + cls.profile_set_usages = {} + cls.load_element("IfcMaterialProfileSetUsage", cls.profile_set_usages) + @classmethod def load_profiles(cls): cls.profile_sets = {} @@ -109,6 +118,4 @@ class Data: @classmethod def load_association(cls, association, product_id): material_select = association.RelatingMaterial - if material_select.is_a("IfcMaterialProfileSetUsage"): # TODO: implement usages - material_select = material_select.ForProfileSet cls.products[product_id] = {"type": material_select.is_a(), "id": material_select.id()}