diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index 02bb6d9ccf..98aab49a8c 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -281,6 +281,9 @@ class AddBoolean(Operator, tool.Ifc.Operator): is_global=True, should_sync_changes_first=False, ) + + tool.Ifc.unlink(obj=obj2) + bpy.data.objects.remove(obj2) return {"FINISHED"} @@ -307,7 +310,7 @@ class ShowBooleans(Operator, tool.Ifc.Operator, AddObjectHelper): boolean_obj = self.create_half_space_solid() position = boolean.BaseSurface.Position position = Matrix(ifcopenshell.util.placement.get_axis2placement(position).tolist()) - boolean_obj.matrix_world = position + boolean_obj.matrix_world = obj.matrix_world @ position boolean_obj.data.BIMMeshProperties.ifc_boolean_id = boolean.id() boolean_obj.data.BIMMeshProperties.obj = obj return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index cdd4cb2326..1ff439f105 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -146,8 +146,6 @@ class BimTool(WorkSpaceTool): op = row.operator("bim.change_layer_length", icon="FILE_REFRESH", text="") op.length = props.length - row = layout.row() - row.label(text="Join") row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_E") @@ -162,18 +160,9 @@ class BimTool(WorkSpaceTool): row.operator("bim.hotkey", text="Mitre").hotkey = "S_Y" row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_G") - row.operator("bim.hotkey", text="Regen Connections").hotkey = "S_G" - row = layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_M") row.operator("bim.hotkey", text="Merge").hotkey = "S_M" row = layout.row(align=True) - row.operator("bim.join_wall", icon="X", text="Disconnect").join_type = "" - - row = layout.row() - row.label(text="Wall Tools") - row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_F") row.operator("bim.hotkey", text="Flip").hotkey = "S_F" @@ -181,7 +170,11 @@ class BimTool(WorkSpaceTool): row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_S") row.operator("bim.hotkey", text="Split").hotkey = "S_S" - + row = layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_G") + row.operator("bim.hotkey", text="Regen").hotkey = "S_G" + row.operator("bim.join_wall", icon="X", text="").join_type = "" if ifc_class == "IfcSlabType": if not context.active_object: pass @@ -203,8 +196,6 @@ class BimTool(WorkSpaceTool): op = row.operator("bim.change_profile_depth", icon="FILE_REFRESH", text="") op.depth = props.extrusion_depth - row = layout.row() - row.label(text="Join") row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_E") @@ -224,9 +215,8 @@ class BimTool(WorkSpaceTool): row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_G") - row.operator("bim.hotkey", text="Regen Connections").hotkey = "S_G" - row = layout.row(align=True) - row.operator("bim.extend_profile", icon="X", text="Disconnect").join_type = "" + row.operator("bim.hotkey", text="Regen").hotkey = "S_G" + row.operator("bim.extend_profile", icon="X", text="").join_type = "" if props.ifc_class in ( "IfcCableCarrierSegmentType", diff --git a/src/blenderbim/blenderbim/bim/module/void/__init__.py b/src/blenderbim/blenderbim/bim/module/void/__init__.py index c2afbcbaf6..e264da4404 100644 --- a/src/blenderbim/blenderbim/bim/module/void/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/void/__init__.py @@ -28,6 +28,7 @@ classes = ( operator.ToggleDecompositionParenting, prop.VoidProperties, ui.BIM_PT_voids, + ui.BIM_PT_booleans, ) diff --git a/src/blenderbim/blenderbim/bim/module/void/data.py b/src/blenderbim/blenderbim/bim/module/void/data.py new file mode 100644 index 0000000000..73909b93b2 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/void/data.py @@ -0,0 +1,54 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2022 Dion Moult +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +import bpy +import blenderbim.tool as tool + + +def refresh(): + BooleansData.is_loaded = False + + +class BooleansData: + data = {} + is_loaded = False + + @classmethod + def load(cls): + cls.data = {"total_booleans": cls.total_booleans()} + cls.is_loaded = True + + @classmethod + def total_booleans(cls): + obj = bpy.context.active_object + if ( + not obj.data + or not hasattr(obj.data, "BIMMeshProperties") + or not obj.data.BIMMeshProperties.ifc_definition_id + ): + return 0 + representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) + total_booleans = 0 + for item in representation.Items: + while True: + if item.is_a("IfcBooleanResult"): + total_booleans += 1 + item = item.FirstOperand + else: + break + return total_booleans diff --git a/src/blenderbim/blenderbim/bim/module/void/ui.py b/src/blenderbim/blenderbim/bim/module/void/ui.py index c17e1922ed..0ac342dff9 100644 --- a/src/blenderbim/blenderbim/bim/module/void/ui.py +++ b/src/blenderbim/blenderbim/bim/module/void/ui.py @@ -20,6 +20,7 @@ import bpy from bpy.types import Panel from ifcopenshell.api.void.data import Data from blenderbim.bim.ifc import IfcStore +from blenderbim.bim.module.void.data import BooleansData class BIM_PT_voids(Panel): @@ -115,3 +116,42 @@ class BIM_PT_voids(Panel): row = self.layout.row(align=True) row.label(text=opening["Name"], icon="SELECT_INTERSECT") row.operator("bim.remove_filling", icon="X", text="") + + +class BIM_PT_booleans(Panel): + bl_label = "IFC Booleans" + bl_idname = "BIM_PT_booleans" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "data" + + @classmethod + def poll(cls, context): + return ( + context.active_object is not None + and context.active_object.type == "MESH" + and hasattr(context.active_object.data, "BIMMeshProperties") + and ( + context.active_object.data.BIMMeshProperties.ifc_definition_id + or context.active_object.data.BIMMeshProperties.ifc_boolean_id + ) + ) + + def draw(self, context): + if not BooleansData.is_loaded: + BooleansData.load() + + if not context.active_object.data: + return + layout = self.layout + props = context.active_object.data.BIMMeshProperties + + if context.active_object.data.BIMMeshProperties.ifc_definition_id: + row = layout.row(align=True) + row.label(text=f"{BooleansData.data['total_booleans']} Booleans Found") + row.operator("bim.add_boolean", text="", icon="ADD") + row.operator("bim.show_booleans", text="", icon="HIDE_OFF") + row.operator("bim.hide_booleans", text="", icon="HIDE_ON") + elif context.active_object.data.BIMMeshProperties.ifc_boolean_id: + row = layout.row() + row.operator("bim.remove_booleans", text="Remove Boolean", icon="X")