From 8405ee4926db6386b6a26de5a05ce2a1144455a7 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 Mar 2023 11:28:36 +0500 Subject: [PATCH] Fixed bug dissolve limit in generate hipped roof (e69452883) Now it will work fine in both edit and object mode --- src/blenderbim/blenderbim/bim/module/model/roof.py | 11 ++++++++--- src/blenderbim/blenderbim/tool/blender.py | 9 +++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/roof.py b/src/blenderbim/blenderbim/bim/module/model/roof.py index 47f82da157..d13846444e 100644 --- a/src/blenderbim/blenderbim/bim/module/model/roof.py +++ b/src/blenderbim/blenderbim/bim/module/model/roof.py @@ -53,8 +53,13 @@ class GenerateHippedRoof(bpy.types.Operator, tool.Ifc.Operator): self.report({"ERROR"}, "Need to select some object first.") return {"CANCELLED"} - # TODO: include this operator in bim.generate_hipped_roof - # bpy.ops.mesh.dissolve_limited() + bm = tool.Blender.get_bmesh_for_mesh(obj.data) + # argument values are the defaults for `bpy.ops.mesh.dissolve_limited` + bmesh.ops.dissolve_limit( + bm, angle_limit=0.0872665, use_dissolve_boundaries=False, delimit={"NORMAL"}, edges=bm.edges[:] + ) + tool.Blender.apply_bmesh(obj.data, bm) + generate_hipped_roof(obj, self.mode, self.height, self.angle) return {"FINISHED"} @@ -179,7 +184,7 @@ def update_roof_modifier_bmesh(context): # apply dissolve limit seems to get more correct results with `generate_hipped_roof` # argument values are the defaults for `bpy.ops.mesh.dissolve_limited` bmesh.ops.dissolve_limit( - bm, angle_limit=0.0872665, use_dissolve_boundaries=False, delimit={"NORMAL"}, verts=bm.verts[:] + bm, angle_limit=0.0872665, use_dissolve_boundaries=False, delimit={"NORMAL"}, verts=bm.edges[:] ) tool.Blender.apply_bmesh(obj.data, bm) diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 3ed5df5689..ddf9e774d1 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -109,8 +109,13 @@ class Blender: bpy.context.object.update_from_editmode() else: bm.to_mesh(mesh) - - bm.free() + # only freeing bmesh if object is in OBJECT mode + # because if it's in EDIT mode + # freeing mesh will result in dead bmeshes from `bmesh.from_edit_mesh(mesh)` + # until you restart EDIT mode + # which may result in errors when some other scripts will try to get bmesh + bm.free() + mesh.update() @classmethod