From 21a62116a8e859f8b32c4c97c1d8f9e2f4cc4d42 Mon Sep 17 00:00:00 2001 From: Gorgious56 Date: Thu, 2 Jan 2025 11:17:48 +0100 Subject: [PATCH] You can now hide all openings by pressing ESCAPE in the 3D Viewport - Also fix CTD on UNDO after pressing ESCAPE due to previous commit --- .../bonsai/bim/module/geometry/operator.py | 5 +- .../bonsai/bim/module/model/__init__.py | 1 + src/bonsai/bonsai/bim/module/model/opening.py | 53 +++++++++++++------ 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index ea5f5d8a85..4e954af69f 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -1846,13 +1846,16 @@ class OverridePasteBuffer(bpy.types.Operator): class OverrideEscape(bpy.types.Operator): bl_idname = "bim.override_escape" bl_label = "Override Escape" + bl_options = {"REGISTER", "UNDO"} def execute(self, context): if context.scene.BIMGeometryProperties.mode == "ITEM": tool.Geometry.disable_item_mode() - if context.scene.BIMGeometryProperties.mode == "EDIT": + elif context.scene.BIMGeometryProperties.mode == "EDIT": bpy.ops.bim.override_mode_set_object("INVOKE_DEFAULT", should_save=False) tool.Geometry.disable_item_mode() + elif context.scene.BIMModelProperties.openings: + bpy.ops.bim.hide_all_openings() return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/__init__.py b/src/bonsai/bonsai/bim/module/model/__init__.py index f30e194204..2988a4b2d3 100644 --- a/src/bonsai/bonsai/bim/module/model/__init__.py +++ b/src/bonsai/bonsai/bim/module/model/__init__.py @@ -84,6 +84,7 @@ classes = ( opening.CloneOpening, opening.FlipFill, opening.HideBooleans, + opening.HideAllOpenings, opening.HideOpenings, opening.RecalculateFill, opening.RemoveBooleans, diff --git a/src/bonsai/bonsai/bim/module/model/opening.py b/src/bonsai/bonsai/bim/module/model/opening.py index 180684cd4d..12a38ad0c0 100644 --- a/src/bonsai/bonsai/bim/module/model/opening.py +++ b/src/bonsai/bonsai/bim/module/model/opening.py @@ -855,6 +855,41 @@ class ShowOpenings(Operator, tool.Ifc.Operator): return {"FINISHED"} +def get_openings_from_objects(objects): + to_delete = set() + for obj in objects: + element = tool.Ifc.get_entity(obj) + if not element or not hasattr(element, "HasOpenings"): + continue + if element.is_a("IfcOpeningElement"): + element = element.VoidsElements[0].RelatingBuildingElement + obj = tool.Ifc.get_object(element) + opening_elts = [r.RelatedOpeningElement for r in element.HasOpenings] + for opening_elt in opening_elts: + opening_obj = tool.Ifc.get_object(opening_elt) + if opening_obj: + to_delete.add((opening_elt, opening_obj)) + return to_delete + + +def hide_openings(objects): + for opening, opening_obj in get_openings_from_objects(objects): + tool.Ifc.unlink(element=opening) + bpy.data.objects.remove(opening_obj) + tool.Model.clear_scene_openings() + + +class HideAllOpenings(Operator, tool.Ifc.Operator): + bl_idname = "bim.hide_all_openings" + bl_label = "Hide All Openings" + bl_description = "Hide every single opening" + bl_options = {"REGISTER", "UNDO"} + + def _execute(self, context): + hide_openings(context.scene.objects) + return {"FINISHED"} + + class HideOpenings(Operator, tool.Ifc.Operator): bl_idname = "bim.hide_openings" bl_label = "Hide" @@ -862,23 +897,7 @@ class HideOpenings(Operator, tool.Ifc.Operator): bl_options = {"REGISTER", "UNDO"} def _execute(self, context): - to_delete = set() - for obj in context.selected_objects: - element = tool.Ifc.get_entity(obj) - if not element: - continue - if element.is_a("IfcOpeningElement"): - element = element.VoidsElements[0].RelatingBuildingElement - obj = tool.Ifc.get_object(element) - openings = [r.RelatedOpeningElement for r in element.HasOpenings] - for opening in openings: - opening_obj = tool.Ifc.get_object(opening) - if opening_obj: - to_delete.add((opening, opening_obj)) - for opening, opening_obj in to_delete: - tool.Ifc.unlink(element=opening) - bpy.data.objects.remove(opening_obj) - tool.Model.clear_scene_openings() + hide_openings(context.selected_objects) return {"FINISHED"}