From 9dcb5b103c773e0337627d6a7c4c799de72f20c2 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 2 Sep 2024 20:14:30 +1000 Subject: [PATCH] Fix #5237. Fix bug where flipping or splitting walls didn't take into account project units and voids were misplaced. --- src/bonsai/bonsai/bim/module/model/opening.py | 1 - src/bonsai/bonsai/bim/module/model/wall.py | 7 +++++++ src/bonsai/bonsai/bim/module/void/operator.py | 1 - 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/model/opening.py b/src/bonsai/bonsai/bim/module/model/opening.py index 55ccf90c31..5434f345a0 100644 --- a/src/bonsai/bonsai/bim/module/model/opening.py +++ b/src/bonsai/bonsai/bim/module/model/opening.py @@ -66,7 +66,6 @@ class FilledOpeningGenerator: target: Optional[Vector] = None, ) -> None: props = bpy.context.scene.BIMModelProperties - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) opening_thickness_si = 0.0 filling = tool.Ifc.get_entity(filling_obj) diff --git a/src/bonsai/bonsai/bim/module/model/wall.py b/src/bonsai/bonsai/bim/module/model/wall.py index 010566808e..104426feb0 100644 --- a/src/bonsai/bonsai/bim/module/model/wall.py +++ b/src/bonsai/bonsai/bim/module/model/wall.py @@ -1041,6 +1041,8 @@ class DumbWallJoiner: self.recreate_wall(element1, wall1, axis, body) def split(self, wall1, target): + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + element1 = tool.Ifc.get_entity(wall1) if not element1: return @@ -1064,6 +1066,7 @@ class DumbWallJoiner: r.RelatedOpeningElement for r in element1.HasOpenings if not r.RelatedOpeningElement.HasFillings ]: opening_matrix = Matrix(ifcopenshell.util.placement.get_local_placement(opening.ObjectPlacement).tolist()) + opening_matrix.translation *= unit_scale opening_location = opening_matrix.translation _, opening_position = mathutils.geometry.intersect_point_line(opening_location.to_2d(), *axis1["reference"]) if opening_position > cut_percentage: @@ -1075,6 +1078,7 @@ class DumbWallJoiner: r.RelatedOpeningElement for r in element2.HasOpenings if not r.RelatedOpeningElement.HasFillings ]: opening_matrix = Matrix(ifcopenshell.util.placement.get_local_placement(opening.ObjectPlacement).tolist()) + opening_matrix.translation *= unit_scale opening_location = opening_matrix.translation _, opening_position = mathutils.geometry.intersect_point_line(opening_location.to_2d(), *axis1["reference"]) if opening_position < cut_percentage: @@ -1097,6 +1101,8 @@ class DumbWallJoiner: self.recreate_wall(element2, wall2, axis2["reference"], axis2["reference"]) def flip(self, wall1): + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + if tool.Ifc.is_moved(wall1): bonsai.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=wall1) @@ -1125,6 +1131,7 @@ class DumbWallJoiner: filling_matrixes = {} for opening in [r.RelatedOpeningElement for r in element1.HasOpenings]: opening_matrix = Matrix(ifcopenshell.util.placement.get_local_placement(opening.ObjectPlacement).tolist()) + opening_matrix.translation *= unit_scale location = opening_matrix.translation location_on_base = tool.Cad.point_on_edge(location, axis1["base"]) location_on_side = tool.Cad.point_on_edge(location, axis1["side"]) diff --git a/src/bonsai/bonsai/bim/module/void/operator.py b/src/bonsai/bonsai/bim/module/void/operator.py index 3f30028e56..18fe3407ca 100644 --- a/src/bonsai/bonsai/bim/module/void/operator.py +++ b/src/bonsai/bonsai/bim/module/void/operator.py @@ -43,7 +43,6 @@ class AddOpening(bpy.types.Operator, tool.Ifc.Operator): return True def _execute(self, context): - props = context.scene.BIMModelProperties selected_objects = context.selected_objects target_object = selected_objects[0]