From 8cc9678862b0c4b0edb45602565d61c87e7e50a8 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sun, 22 Feb 2026 09:45:26 -0600 Subject: [PATCH] refactor: generalize layer set class and method names Rename wall/slab-specific identifiers to layer-direction-neutral equivalents: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DumbWallPlaner → Layer2Planer - DumbSlabPlaner → Layer3Planer - recalculate_walls() → recalculate_layer2_elements() - regenerate_slab() → regenerate_layer3_element() - wall_objs → axis2_objs (material/operator.py) --- .../bonsai/bim/module/material/operator.py | 22 +++++----- src/bonsai/bonsai/bim/module/model/profile.py | 2 +- src/bonsai/bonsai/bim/module/model/slab.py | 6 +-- src/bonsai/bonsai/bim/module/model/wall.py | 12 +++--- src/bonsai/bonsai/core/model.py | 2 +- src/bonsai/bonsai/core/type.py | 4 +- src/bonsai/bonsai/tool/model.py | 42 +++++++++---------- 7 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/material/operator.py b/src/bonsai/bonsai/bim/module/material/operator.py index 4d72d66193..9a0eba62b0 100644 --- a/src/bonsai/bonsai/bim/module/material/operator.py +++ b/src/bonsai/bonsai/bim/module/material/operator.py @@ -386,8 +386,8 @@ class AddLayer(bpy.types.Operator, tool.Ifc.Operator): layer_set=layer_set, material=tool.Ifc.get().by_id(int(omprops.material)), ) - slab.DumbSlabPlaner().regenerate_from_layer_set(layer_set) - wall.DumbWallPlaner().regenerate_from_layer_set(layer_set) + slab.Layer3Planer().regenerate_from_layer_set(layer_set) + wall.Layer2Planer().regenerate_from_layer_set(layer_set) class ReorderMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator): @@ -425,8 +425,8 @@ class RemoveLayer(bpy.types.Operator, tool.Ifc.Operator): return {"CANCELLED"} ifcopenshell.api.material.remove_layer(tool.Ifc.get(), layer=layer) for material_set in material_sets: - slab.DumbSlabPlaner().regenerate_from_layer_set(material_set) - wall.DumbWallPlaner().regenerate_from_layer_set(material_set) + slab.Layer3Planer().regenerate_from_layer_set(material_set) + wall.Layer2Planer().regenerate_from_layer_set(material_set) class DuplicateLayer(bpy.types.Operator, tool.Ifc.Operator): @@ -615,8 +615,8 @@ class EditAssignedMaterial(bpy.types.Operator, tool.Ifc.Operator): attributes=attributes, ) - slab_planer = slab.DumbSlabPlaner() - wall_objs = [] + slab_planer = slab.Layer3Planer() + axis2_objs = [] for obj in objects: obj_element = tool.Ifc.get_entity(obj) @@ -634,10 +634,10 @@ class EditAssignedMaterial(bpy.types.Operator, tool.Ifc.Operator): if obj_material_usage.LayerSetDirection == "AXIS3": slab_planer.regenerate_from_occurence(obj_element, obj_material_usage) elif obj_material_usage.LayerSetDirection == "AXIS2": - wall_objs.append(obj) + axis2_objs.append(obj) - if wall_objs: - tool.Model.recalculate_walls(wall_objs) + if axis2_objs: + tool.Model.recalculate_layer2_elements(axis2_objs) if material_set_usage.is_a("IfcMaterialProfileSetUsage"): if "CardinalPoint" in attributes: @@ -785,8 +785,8 @@ class EditMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator): attributes=attributes, material=self.file.by_id(int(props.material_set_item_material)), ) - slab.DumbSlabPlaner().regenerate_from_layer(layer) - wall.DumbWallPlaner().regenerate_from_layer(layer) + slab.Layer3Planer().regenerate_from_layer(layer) + wall.Layer2Planer().regenerate_from_layer(layer) elif material.is_a("IfcMaterialProfileSet"): profile_def = None if mprops.profiles: diff --git a/src/bonsai/bonsai/bim/module/model/profile.py b/src/bonsai/bonsai/bim/module/model/profile.py index 4e16f9b296..7195531670 100644 --- a/src/bonsai/bonsai/bim/module/model/profile.py +++ b/src/bonsai/bonsai/bim/module/model/profile.py @@ -948,7 +948,7 @@ class Rotate90(bpy.types.Operator, tool.Ifc.Operator): obj.matrix_world @= rotate_matrix bpy.context.view_layer.update() DumbProfileRecalculator().recalculate(profile_objs) - tool.Model.recalculate_walls(layer2_objs) + tool.Model.recalculate_layer2_elements(layer2_objs) return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/slab.py b/src/bonsai/bonsai/bim/module/model/slab.py index 19a4adfa20..624dd7c554 100644 --- a/src/bonsai/bonsai/bim/module/model/slab.py +++ b/src/bonsai/bonsai/bim/module/model/slab.py @@ -199,7 +199,7 @@ class DumbSlabGenerator: return obj -class DumbSlabPlaner: +class Layer3Planer: def regenerate_from_layer_set_usage(self, usecase_path, ifc_file, settings): self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) obj = bpy.context.active_object @@ -901,7 +901,7 @@ class DrawPolylineSlab(bpy.types.Operator, PolylineOperator, tool.Ifc.Operator): usage=material_set_usage, attributes=attributes, ) - DumbSlabPlaner().regenerate_from_occurence(element, material_set_usage) + Layer3Planer().regenerate_from_occurence(element, material_set_usage) def modal(self, context, event): return IfcStore.execute_ifc_operator(self, context, event, method="MODAL") @@ -1003,5 +1003,5 @@ class RecalculateSlab(bpy.types.Operator, tool.Ifc.Operator): if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement.is_a("IfcWall"): walls.append(tool.Ifc.get_object(rel.RelatedElement)) - tool.Model.recalculate_walls(walls) + tool.Model.recalculate_layer2_elements(walls) return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/wall.py b/src/bonsai/bonsai/bim/module/model/wall.py index 7f4579df31..e30706d287 100644 --- a/src/bonsai/bonsai/bim/module/model/wall.py +++ b/src/bonsai/bonsai/bim/module/model/wall.py @@ -372,7 +372,7 @@ class RecalculateWall(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): objects = tool.Model.get_selected_mesh_ifc_objects() - tool.Model.recalculate_walls(objects) + tool.Model.recalculate_layer2_elements(objects) return {"FINISHED"} @@ -420,7 +420,7 @@ class ChangeExtrusionDepth(bpy.types.Operator, tool.Ifc.Operator): layer2_objs.append(obj) if layer2_objs: - tool.Model.recalculate_walls(layer2_objs) + tool.Model.recalculate_layer2_elements(layer2_objs) return {"FINISHED"} @@ -529,7 +529,7 @@ class ChangeExtrusionXAngle(bpy.types.Operator, tool.Ifc.Operator): obj.rotation_euler.z = current_z_rot if layer2_objs: - tool.Model.recalculate_walls(layer2_objs) + tool.Model.recalculate_layer2_elements(layer2_objs) return {"FINISHED"} @@ -641,7 +641,7 @@ class DrawPolylineWall(bpy.types.Operator, PolylineOperator, tool.Ifc.Operator): # if material.is_a("IfcMaterialLayerSetUsage"): attributes = {"OffsetFromReferenceLine": offset, "DirectionSense": direction_sense} ifcopenshell.api.material.edit_layer_usage(model, usage=material_set_usage, attributes=attributes) - tool.Model.recalculate_walls([wall["obj"]]) + tool.Model.recalculate_layer2_elements([wall["obj"]]) if walls: if is_polyline_closed: @@ -1034,7 +1034,7 @@ class DumbWallGenerator: return next(c for c in classes if "StandardCase" not in c) -class DumbWallPlaner: +class Layer2Planer: def regenerate_from_layer(self, layer: ifcopenshell.entity_instance) -> None: for layer_set in layer.ToMaterialLayerSet: self.regenerate_from_layer_set(layer_set) @@ -1055,7 +1055,7 @@ class DumbWallPlaner: else: for rel in inverse.AssociatedTo: walls.extend([tool.Ifc.get_object(e) for e in rel.RelatedObjects]) - tool.Model.recalculate_walls([w for w in set(walls) if w]) + tool.Model.recalculate_layer2_elements([w for w in set(walls) if w]) class DumbWallJoiner: diff --git a/src/bonsai/bonsai/core/model.py b/src/bonsai/bonsai/core/model.py index 6edce4d100..a0bd75dfbb 100644 --- a/src/bonsai/bonsai/core/model.py +++ b/src/bonsai/bonsai/core/model.py @@ -99,7 +99,7 @@ def offset_walls(ifc: type[tool.Ifc], blender: type[tool.Blender], model: type[t ] for obj in objs: model.offset_wall(obj, offset_type) - model.recalculate_walls(objs) + model.recalculate_layer2_elements(objs) def align_walls( diff --git a/src/bonsai/bonsai/core/type.py b/src/bonsai/bonsai/core/type.py index a203b9ff76..f08d1290ac 100644 --- a/src/bonsai/bonsai/core/type.py +++ b/src/bonsai/bonsai/core/type.py @@ -44,9 +44,9 @@ def assign_type( if (usage := model.get_usage_type(type)) == "PROFILE": model.regenerate_profile(obj) elif usage == "LAYER2": - model.recalculate_walls([obj]) + model.recalculate_layer2_elements([obj]) elif usage == "LAYER3": - model.regenerate_slab(obj) + model.regenerate_layer3_element(obj) else: type_data = type_tool.get_object_data(ifc.get_object(type)) if type_data: diff --git a/src/bonsai/bonsai/tool/model.py b/src/bonsai/bonsai/tool/model.py index 148f4a6b75..5bf5e80d88 100644 --- a/src/bonsai/bonsai/tool/model.py +++ b/src/bonsai/bonsai/tool/model.py @@ -2717,41 +2717,41 @@ class Model(bonsai.core.tool.Model): tool.Geometry.record_object_position(obj) @classmethod - def recalculate_walls(cls, walls: list[bpy.types.Object]) -> None: + def recalculate_layer2_elements(cls, objs: list[bpy.types.Object]) -> None: queue: set[tuple[ifcopenshell.entity_instance, bpy.types.Object]] = set() - for wall in walls: - element = tool.Ifc.get_entity(wall) - if tool.Ifc.is_moved(wall): - bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=wall) - queue.add((element, wall)) + for obj in objs: + element = tool.Ifc.get_entity(obj) + if tool.Ifc.is_moved(obj): + bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj) + queue.add((element, obj)) for rel in getattr(element, "ConnectedTo", []): - obj = tool.Ifc.get_object(rel.RelatedElement) - if tool.Ifc.is_moved(obj): - bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj) - queue.add((rel.RelatedElement, obj)) + connected_obj = tool.Ifc.get_object(rel.RelatedElement) + if tool.Ifc.is_moved(connected_obj): + bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=connected_obj) + queue.add((rel.RelatedElement, connected_obj)) for rel in getattr(element, "ConnectedFrom", []): - obj = tool.Ifc.get_object(rel.RelatingElement) - if tool.Ifc.is_moved(obj): - bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj) - queue.add((rel.RelatingElement, obj)) - for element, wall in queue: - if tool.Model.get_usage_type(element) == "LAYER2" and wall: + connected_obj = tool.Ifc.get_object(rel.RelatingElement) + if tool.Ifc.is_moved(connected_obj): + bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=connected_obj) + queue.add((rel.RelatingElement, connected_obj)) + for element, obj in queue: + if tool.Model.get_usage_type(element) == "LAYER2" and obj: # Use layer custom offset - custom_offset = tool.Model.get_material_layer_custom_offset(element, wall) + custom_offset = tool.Model.get_material_layer_custom_offset(element, obj) material = ifcopenshell.util.element.get_material(element) if material.is_a("IfcMaterialLayerSetUsage") and custom_offset is not None: material.OffsetFromReferenceLine = custom_offset - cls.recreate_wall(element, wall) + cls.recreate_wall(element, obj) @classmethod - def regenerate_slab(cls, obj: bpy.types.Object) -> None: - from bonsai.bim.module.model.slab import DumbSlabPlaner + def regenerate_layer3_element(cls, obj: bpy.types.Object) -> None: + from bonsai.bim.module.model.slab import Layer3Planer element = tool.Ifc.get_entity(obj) material_set = ifcopenshell.util.element.get_material(element, should_skip_usage=True) new_thickness = sum([l.LayerThickness for l in material_set.MaterialLayers]) - DumbSlabPlaner().change_thickness(element, new_thickness) + Layer3Planer().change_thickness(element, new_thickness) @classmethod def regenerate_profile(cls, obj: bpy.types.Object) -> None: