mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 23:36:20 +00:00
Add handlers to update layer when adding and removing material layer
This commit is contained in:
@@ -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):
|
class ReorderMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator):
|
||||||
bl_idname = "bim.reorder_material_set_item"
|
bl_idname = "bim.reorder_material_set_item"
|
||||||
|
|||||||
@@ -49,6 +49,12 @@ def load_post(*args):
|
|||||||
"type.assign_type", "Bonsai.DumbWall.RegenerateFromType", wall.DumbWallPlaner().regenerate_from_type
|
"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(
|
ifcopenshell.api.add_post_listener(
|
||||||
"material.edit_layer", "Bonsai.DumbSlab.RegenerateFromLayer", slab.DumbSlabPlaner().regenerate_from_layer
|
"material.edit_layer", "Bonsai.DumbSlab.RegenerateFromLayer", slab.DumbSlabPlaner().regenerate_from_layer
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -197,27 +197,42 @@ class DumbSlabGenerator:
|
|||||||
class DumbSlabPlaner:
|
class DumbSlabPlaner:
|
||||||
def regenerate_from_layer(self, usecase_path, ifc_file, settings):
|
def regenerate_from_layer(self, usecase_path, ifc_file, settings):
|
||||||
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file)
|
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file)
|
||||||
layer = settings["layer"]
|
|
||||||
thickness = settings["attributes"].get("LayerThickness")
|
try:
|
||||||
if thickness is None:
|
# 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
|
return
|
||||||
for layer_set in layer.ToMaterialLayerSet:
|
|
||||||
total_thickness = sum([l.LayerThickness for l in layer_set.MaterialLayers])
|
for inverse in ifc_file.get_inverse(layer_set):
|
||||||
if not total_thickness:
|
if not inverse.is_a("IfcMaterialLayerSetUsage") or inverse.LayerSetDirection != "AXIS3":
|
||||||
continue
|
continue
|
||||||
for inverse in ifc_file.get_inverse(layer_set):
|
if ifc_file.schema == "IFC2X3":
|
||||||
if not inverse.is_a("IfcMaterialLayerSetUsage") or inverse.LayerSetDirection != "AXIS3":
|
for rel in ifc_file.get_inverse(inverse):
|
||||||
continue
|
if not rel.is_a("IfcRelAssociatesMaterial"):
|
||||||
if ifc_file.schema == "IFC2X3":
|
continue
|
||||||
for rel in ifc_file.get_inverse(inverse):
|
for element in rel.RelatedObjects:
|
||||||
if not rel.is_a("IfcRelAssociatesMaterial"):
|
self.change_thickness(element, total_thickness)
|
||||||
continue
|
else:
|
||||||
for element in rel.RelatedObjects:
|
for rel in inverse.AssociatedTo:
|
||||||
self.change_thickness(element, total_thickness)
|
for element in rel.RelatedObjects:
|
||||||
else:
|
self.change_thickness(element, total_thickness)
|
||||||
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):
|
def regenerate_from_type(self, usecase_path, ifc_file, settings):
|
||||||
relating_type = settings["relating_type"]
|
relating_type = settings["relating_type"]
|
||||||
|
|||||||
@@ -80,10 +80,11 @@ def add_layer(
|
|||||||
# Great! Let's assign our material set to our wall type.
|
# Great! Let's assign our material set to our wall type.
|
||||||
ifcopenshell.api.material.assign_material(model, products=[wall_type], material=material_set)
|
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}
|
settings = {"layer_set": layer_set, "material": material}
|
||||||
|
|
||||||
layers = list(settings["layer_set"].MaterialLayers or [])
|
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)
|
layers.append(layer)
|
||||||
settings["layer_set"].MaterialLayers = layers
|
settings["layer_set"].MaterialLayers = layers
|
||||||
return layer
|
return layer
|
||||||
|
|||||||
Reference in New Issue
Block a user