diff --git a/src/blenderbim/blenderbim/bim/module/model/column.py b/src/blenderbim/blenderbim/bim/module/model/column.py index 42db1491a4..9adf87eb59 100644 --- a/src/blenderbim/blenderbim/bim/module/model/column.py +++ b/src/blenderbim/blenderbim/bim/module/model/column.py @@ -152,9 +152,17 @@ class DumbColumnRegenerator: for element in rel.RelatedObjects: self.change_profile(element) + def regenerate_from_type(self, usecase_path, ifc_file, settings): + self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) + new_material = ifcopenshell.util.element.get_material(settings["relating_type"]) + if not new_material or not new_material.is_a("IfcMaterialProfileSet"): + return + self.change_profile(settings["related_object"]) + def change_profile(self, element): obj = IfcStore.get_element(element.id()) if not obj: return representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") - bpy.ops.bim.switch_representation(obj=obj.name, ifc_definition_id=representation.id(), should_reload=True) + if representation: + bpy.ops.bim.switch_representation(obj=obj.name, ifc_definition_id=representation.id(), should_reload=True) diff --git a/src/blenderbim/blenderbim/bim/module/model/handler.py b/src/blenderbim/blenderbim/bim/module/model/handler.py index e398e14a21..97f43322cb 100644 --- a/src/blenderbim/blenderbim/bim/module/model/handler.py +++ b/src/blenderbim/blenderbim/bim/module/model/handler.py @@ -55,3 +55,8 @@ def load_post(*args): "BlenderBIM.DumbColumn.RegenerateFromProfile", column.DumbColumnRegenerator().regenerate_from_profile, ) + ifcopenshell.api.add_post_listener( + "type.assign_type", + "BlenderBIM.DumbColumn.RegenerateFromType", + column.DumbColumnRegenerator().regenerate_from_type, + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py index ab74701846..2405d63f5a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py @@ -1,6 +1,7 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.util.element +import ifcopenshell.util.representation class Usecase: @@ -47,6 +48,8 @@ class Usecase: material_set = self.file.create_entity("IfcMaterialProfileSet") else: material_set = self.file.create_entity("IfcMaterialProfileSet") + + self.update_representation_profile(material_set) material_set_usage = self.create_profile_set_usage(material_set) self.create_material_association(material_set_usage) elif self.settings["type"] == "IfcMaterialList": @@ -54,6 +57,21 @@ class Usecase: material_set.Materials = [self.settings["material"]] self.create_material_association(material_set) + def update_representation_profile(self, material_set): + profile = material_set.CompositeProfile + if not profile and material_set.MaterialProfiles: + profile = material_set.MaterialProfiles[0].Profile + if not profile: + return + representation = ifcopenshell.util.representation.get_representation( + self.settings["product"], "Model", "Body", "MODEL_VIEW" + ) + if not representation: + return + for subelement in self.file.traverse(representation): + if subelement.is_a("IfcSweptAreaSolid"): + subelement.SweptArea = profile + def create_layer_set_usage(self, material_set): return self.file.create_entity( "IfcMaterialLayerSetUsage", diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py index 99ad9ec786..1592ec075c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py @@ -9,6 +9,7 @@ class Usecase: self.settings[key] = value def execute(self): + # TODO: handle composite profiles old_profile = self.settings["material_profile"].Profile self.settings["material_profile"].Profile = self.settings["profile"] for profile_set in self.settings["material_profile"].ToMaterialProfileSet: @@ -31,6 +32,8 @@ class Usecase: def change_profile(self, element): representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") + if not representation: + return for subelement in self.file.traverse(representation): if subelement.is_a("IfcSweptAreaSolid"): subelement.SweptArea = self.settings["profile"]