New booleans UI panel to manage representation boolean stack

This commit is contained in:
Dion Moult
2022-10-02 23:35:37 +11:00
parent e9a063ccbd
commit 9c91ee31e5
5 changed files with 106 additions and 18 deletions
@@ -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"}
@@ -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",
@@ -28,6 +28,7 @@ classes = (
operator.ToggleDecompositionParenting,
prop.VoidProperties,
ui.BIM_PT_voids,
ui.BIM_PT_booleans,
)
@@ -0,0 +1,54 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2022 Dion Moult <dion@thinkmoult.com>
#
# 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 <http://www.gnu.org/licenses/>.
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
@@ -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")