From 08d6c0a2d8c707cbd12ecf25c18bc74554aa596b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 24 Jul 2021 22:08:50 +1000 Subject: [PATCH] Openings are now auto dissolved when authoring for easier editing. --- .../blenderbim/bim/module/model/handler.py | 4 ++- .../blenderbim/bim/module/model/opening.py | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/handler.py b/src/blenderbim/blenderbim/bim/module/model/handler.py index e24fbac6e3..58bfa687aa 100644 --- a/src/blenderbim/blenderbim/bim/module/model/handler.py +++ b/src/blenderbim/blenderbim/bim/module/model/handler.py @@ -1,7 +1,7 @@ import bpy import ifcopenshell import ifcopenshell.api -from blenderbim.bim.module.model import product, wall, slab, profile +from blenderbim.bim.module.model import product, wall, slab, profile, opening from blenderbim.bim.ifc import IfcStore from bpy.app.handlers import persistent @@ -17,6 +17,8 @@ def load_post(*args): product.regenerate_profile_usage, ) + IfcStore.add_element_listener(opening.element_listener) + IfcStore.add_element_listener(wall.element_listener) ifcopenshell.api.add_pre_listener( "geometry.add_representation", "BlenderBIM.DumbWall.EnsureSolid", wall.ensure_solid diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index e2dcdd33c2..795035aa41 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -1,10 +1,37 @@ import bpy import bmesh +import blenderbim.bim.handler +from blenderbim.bim.ifc import IfcStore +from math import pi from bpy.types import Operator from bpy.props import FloatProperty from bpy_extras.object_utils import AddObjectHelper, object_data_add +def element_listener(element, obj): + blenderbim.bim.handler.subscribe_to(obj, "mode", mode_callback) + + +def mode_callback(obj, data): + for obj in bpy.context.selected_objects + [bpy.context.active_object]: + if ( + obj.mode != "EDIT" + or not obj.data + or not isinstance(obj.data, (bpy.types.Mesh, bpy.types.Curve, bpy.types.TextCurve)) + or not obj.BIMObjectProperties.ifc_definition_id + or not bpy.context.scene.BIMProjectProperties.is_authoring + ): + return + product = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id) + if not product.is_a("IfcOpeningElement"): + return + 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() + + def add_object(self, context): bm = bmesh.new() bmesh.ops.create_cube(bm, size=self.size)