From c00bcc78e91a439318f0c3c481c6d05bf06e9301 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 25 Jul 2021 14:06:49 +1000 Subject: [PATCH] Editing voids or dumb walls now auto enable dynamic voids, so openings work well with them. --- .../blenderbim/bim/module/model/opening.py | 22 +++++++++++++++++- .../blenderbim/bim/module/model/wall.py | 23 ++++++++++++++++++- .../blenderbim/bim/module/model/workspace.py | 5 ++-- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index 795035aa41..4a53b564dc 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -1,6 +1,8 @@ import bpy import bmesh import blenderbim.bim.handler +import ifcopenshell +import ifcopenshell.util.representation from blenderbim.bim.ifc import IfcStore from math import pi from bpy.types import Operator @@ -13,7 +15,7 @@ def element_listener(element, obj): def mode_callback(obj, data): - for obj in bpy.context.selected_objects + [bpy.context.active_object]: + for obj in set(bpy.context.selected_objects + [bpy.context.active_object]): if ( obj.mode != "EDIT" or not obj.data @@ -25,6 +27,24 @@ def mode_callback(obj, data): product = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id) if not product.is_a("IfcOpeningElement"): return + for rel in product.VoidsElements: + building_element_obj = IfcStore.get_element(rel.RelatingBuildingElement.id()) + if not building_element_obj: + continue + if [m for m in building_element_obj.modifiers if m.type == "BOOLEAN"]: + continue + representation = ifcopenshell.util.representation.get_representation( + rel.RelatingBuildingElement, "Model", "Body", "MODEL_VIEW" + ) + if not representation: + continue + bpy.ops.bim.switch_representation( + obj=building_element_obj.name, + should_switch_all_meshes=True, + should_reload=True, + ifc_definition_id=representation.id(), + disable_opening_subtractions=True, + ) IfcStore.edited_objs.add(obj) bm = bmesh.from_edit_mesh(obj.data) bmesh.ops.dissolve_limit(bm, angle_limit=pi / 180 * 1, verts=bm.verts, edges=bm.edges) diff --git a/src/blenderbim/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py index 761ecb7959..756dbb1a67 100644 --- a/src/blenderbim/blenderbim/bim/module/model/wall.py +++ b/src/blenderbim/blenderbim/bim/module/model/wall.py @@ -20,7 +20,7 @@ def element_listener(element, obj): def mode_callback(obj, data): - for obj in bpy.context.selected_objects + [bpy.context.active_object]: + for obj in set(bpy.context.selected_objects + [bpy.context.active_object]): if ( obj.mode != "EDIT" or not obj.data @@ -33,7 +33,28 @@ def mode_callback(obj, data): parametric = ifcopenshell.util.element.get_psets(product).get("EPset_Parametric") if not parametric or parametric["Engine"] != "BlenderBIM.DumbWall": return + if product.HasOpenings: + if [m for m in obj.modifiers if m.type == "BOOLEAN"]: + continue + representation = ifcopenshell.util.representation.get_representation( + product, "Model", "Body", "MODEL_VIEW" + ) + if not representation: + continue + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.bim.switch_representation( + obj=obj.name, + should_switch_all_meshes=True, + should_reload=True, + ifc_definition_id=representation.id(), + disable_opening_subtractions=True, + ) + bpy.ops.object.mode_set(mode='EDIT') IfcStore.edited_objs.add(obj) + bm = bmesh.from_edit_mesh(obj.data) + bmesh.ops.dissolve_limit(bm, angle_limit=pi / 180 * 1, verts=bm.verts, edges=bm.edges) + bmesh.update_edit_mesh(obj.data) + bm.free() class AddWallOpening(bpy.types.Operator): diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index 60ea85a1a2..ec391f669d 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -37,6 +37,7 @@ class BimTool(WorkSpaceTool): row.prop(props, "relating_type", text="") row.label(text="", icon="BLANK1") + row = layout.row(align=True) row.label(text="", icon="EVENT_SHIFT") row.label(text="Add Type Instance", icon="EVENT_A") @@ -54,8 +55,6 @@ class BimTool(WorkSpaceTool): row.label(text="", icon="EVENT_SHIFT") row.label(text="Mitre", icon="EVENT_Y") - - row = layout.row(align=True) row.label(text="Wall Tools") row = layout.row(align=True) @@ -86,11 +85,11 @@ class BimTool(WorkSpaceTool): row.label(text="Align Interior", icon="EVENT_V") row = layout.row(align=True) - row = layout.row(align=True) row.label(text="", icon="EVENT_ALT") row.label(text="Opening", icon="EVENT_O") + class Hotkey(bpy.types.Operator): bl_idname = "bim.hotkey" bl_label = "Hotkey"