diff --git a/src/bonsai/bonsai/bim/module/material/operator.py b/src/bonsai/bonsai/bim/module/material/operator.py index 8e2fdc5701..307047af4a 100644 --- a/src/bonsai/bonsai/bim/module/material/operator.py +++ b/src/bonsai/bonsai/bim/module/material/operator.py @@ -371,10 +371,6 @@ class AddLayer(bpy.types.Operator, tool.Ifc.Operator): }, ) - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) - thickness = 0.1 # Arbitrary metric thickness for now - layer.LayerThickness = thickness / unit_scale - class ReorderMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.reorder_material_set_item" diff --git a/src/bonsai/bonsai/bim/module/model/handler.py b/src/bonsai/bonsai/bim/module/model/handler.py index f513017eef..824d93e989 100644 --- a/src/bonsai/bonsai/bim/module/model/handler.py +++ b/src/bonsai/bonsai/bim/module/model/handler.py @@ -49,6 +49,12 @@ def load_post(*args): "type.assign_type", "Bonsai.DumbWall.RegenerateFromType", wall.DumbWallPlaner().regenerate_from_type ) + ifcopenshell.api.add_post_listener( + "material.add_layer", "Bonsai.DumbSlab.RegenerateFromLayer", slab.DumbSlabPlaner().regenerate_from_layer + ) + ifcopenshell.api.add_post_listener( + "material.remove_layer", "Bonsai.DumbSlab.RegenerateFromLayer", slab.DumbSlabPlaner().regenerate_from_layer + ) ifcopenshell.api.add_post_listener( "material.edit_layer", "Bonsai.DumbSlab.RegenerateFromLayer", slab.DumbSlabPlaner().regenerate_from_layer ) diff --git a/src/bonsai/bonsai/bim/module/model/slab.py b/src/bonsai/bonsai/bim/module/model/slab.py index 1ddeee0b19..43337f090e 100644 --- a/src/bonsai/bonsai/bim/module/model/slab.py +++ b/src/bonsai/bonsai/bim/module/model/slab.py @@ -197,27 +197,42 @@ class DumbSlabGenerator: class DumbSlabPlaner: def regenerate_from_layer(self, usecase_path, ifc_file, settings): self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) - layer = settings["layer"] - thickness = settings["attributes"].get("LayerThickness") - if thickness is None: + + try: + # Called from materil.edit_layer + layer = settings["layer"] + thickness = settings["attributes"].get("LayerThickness") + if thickness is None: + return + layer_set = layer.ToMaterialLayerSet[0] + + except: + # Called from materil.add_layer or material.remove_layer + obj = bpy.context.active_object + element = tool.Ifc.get_entity(obj) + if not element: + return + material = ifcopenshell.util.element.get_material(element) + material_set_usage = tool.Ifc.get().by_id(material.id()) + layer_set = material_set_usage.ForLayerSet + + total_thickness = sum([l.LayerThickness for l in layer_set.MaterialLayers]) + if not total_thickness: return - for layer_set in layer.ToMaterialLayerSet: - total_thickness = sum([l.LayerThickness for l in layer_set.MaterialLayers]) - if not total_thickness: + + for inverse in ifc_file.get_inverse(layer_set): + if not inverse.is_a("IfcMaterialLayerSetUsage") or inverse.LayerSetDirection != "AXIS3": continue - for inverse in ifc_file.get_inverse(layer_set): - if not inverse.is_a("IfcMaterialLayerSetUsage") or inverse.LayerSetDirection != "AXIS3": - continue - if ifc_file.schema == "IFC2X3": - for rel in ifc_file.get_inverse(inverse): - if not rel.is_a("IfcRelAssociatesMaterial"): - continue - for element in rel.RelatedObjects: - self.change_thickness(element, total_thickness) - else: - for rel in inverse.AssociatedTo: - for element in rel.RelatedObjects: - self.change_thickness(element, total_thickness) + if ifc_file.schema == "IFC2X3": + for rel in ifc_file.get_inverse(inverse): + if not rel.is_a("IfcRelAssociatesMaterial"): + continue + for element in rel.RelatedObjects: + self.change_thickness(element, total_thickness) + else: + for rel in inverse.AssociatedTo: + for element in rel.RelatedObjects: + self.change_thickness(element, total_thickness) def regenerate_from_type(self, usecase_path, ifc_file, settings): relating_type = settings["relating_type"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py index 3b33ffa745..d20fff9533 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py @@ -80,10 +80,11 @@ def add_layer( # Great! Let's assign our material set to our wall type. ifcopenshell.api.material.assign_material(model, products=[wall_type], material=material_set) """ + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(file) settings = {"layer_set": layer_set, "material": material} layers = list(settings["layer_set"].MaterialLayers or []) - layer = file.create_entity("IfcMaterialLayer", **{"Material": settings["material"], "LayerThickness": 1.0}) + layer = file.create_entity("IfcMaterialLayer", **{"Material": settings["material"], "LayerThickness": 0.1 / unit_scale}) layers.append(layer) settings["layer_set"].MaterialLayers = layers return layer