From 4dc8a27e82b50d03e2d24389badb6729cf6b63db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Fri, 13 Sep 2024 11:39:55 -0300 Subject: [PATCH] Fix on polyline wall preview when dealing with closed loops. --- src/bonsai/bonsai/bim/module/cad/operator.py | 7 --- src/bonsai/bonsai/tool/cad.py | 4 +- src/bonsai/bonsai/tool/polyline.py | 50 ++++++++++++-------- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/cad/operator.py b/src/bonsai/bonsai/bim/module/cad/operator.py index 6fbe7ef4be..32dfde77e7 100644 --- a/src/bonsai/bonsai/bim/module/cad/operator.py +++ b/src/bonsai/bonsai/bim/module/cad/operator.py @@ -404,7 +404,6 @@ class CadOffset(bpy.types.Operator): # Create loops from edges loop_edges = set(edges) - print("L1", loop_edges) loops = [] while loop_edges: edge = loop_edges.pop() @@ -424,7 +423,6 @@ class CadOffset(bpy.types.Operator): has_found_connected_edge = True loops.append(loop) - print("L2", loops) for loop in loops: all_verts = {v.index for e in loop for v in e.verts} possible_v1s = [] @@ -463,7 +461,6 @@ class CadOffset(bpy.types.Operator): v1 = start - print("V1", v1) new_verts = [] processed_verts = set() # [v0] --> v1 --> v2 @@ -499,7 +496,6 @@ class CadOffset(bpy.types.Operator): normals = [] v1co = (wp.inverted() @ mw @ v1.co).to_2d() - print("V1CO", v1co) if v2: v2co = (wp.inverted() @ mw @ v2.co).to_2d() direction = (v2co - v1co).normalized() @@ -536,11 +532,8 @@ class CadOffset(bpy.types.Operator): if is_closed: bm.edges.new((new_verts[len(new_verts) - 1], new_verts[0])) - print("OP", new_verts) bm.verts.index_update() bm.edges.index_update() - print(bm.verts) - print(bm.edges) bmesh.update_edit_mesh(obj.data) return {"FINISHED"} diff --git a/src/bonsai/bonsai/tool/cad.py b/src/bonsai/bonsai/tool/cad.py index b2ca966155..b8e7b87761 100644 --- a/src/bonsai/bonsai/tool/cad.py +++ b/src/bonsai/bonsai/tool/cad.py @@ -635,8 +635,8 @@ class Cad: edges = [e for e in bm.edges] - # if len(edges) < 1: - # return self.cancel_message("NO_EDGES") + if len(edges) < 1: + return verts = set() [verts.update(e.verts) for e in edges] diff --git a/src/bonsai/bonsai/tool/polyline.py b/src/bonsai/bonsai/tool/polyline.py index d5f4375fce..550be9ea7b 100644 --- a/src/bonsai/bonsai/tool/polyline.py +++ b/src/bonsai/bonsai/tool/polyline.py @@ -280,6 +280,20 @@ class Polyline(bonsai.core.tool.Polyline): @classmethod def create_wall_preview_vertices(cls, context, relating_type): + def create_bmesh_from_vertices(vertices): + bm = bmesh.new() + + new_verts = [bm.verts.new(v) for v in base_vertices] + if is_closed: + new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] + new_edges.append(bm.edges.new((new_verts[-1], new_verts[0]))) # Add an edge between the last an first point to make it closed. + else: + new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] + + bm.verts.index_update() + bm.edges.index_update() + return bm + # Get properties from object type layers = tool.Model.get_material_layer_parameters(relating_type) if not layers["thickness"]: @@ -288,9 +302,7 @@ class Polyline(bonsai.core.tool.Polyline): height = float(context.scene.BIMModelProperties.extrusion_depth) rl = float(context.scene.BIMModelProperties.rl1) - print("RL", rl) x_angle = float(context.scene.BIMModelProperties.x_angle) - # height = height * (1 / cos(x_angle)) angle_distortion = height * tan(x_angle) base_vertices = [] @@ -304,28 +316,28 @@ class Polyline(bonsai.core.tool.Polyline): Vector((point.x, point.y, point.z)) ) - bm_base = bmesh.new() + is_closed = False + if (base_vertices[0].x == base_vertices[-1].x and + base_vertices[0].y == base_vertices[-1].y and + base_vertices[0].z == base_vertices[-1].z): + is_closed = True + base_vertices.pop(-1) # Remove the last point. The edges are going to inform that the shape is closed. - new_verts = [bm_base.verts.new(v) for v in base_vertices] - new_edges = [bm_base.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] - bm_base.verts.index_update() - bm_base.edges.index_update() + bm_base = create_bmesh_from_vertices(base_vertices) + bm_top = create_bmesh_from_vertices(base_vertices) offset_base_verts = tool.Cad.offset_edges(bm_base, thickness) - - bm_top = bmesh.new() - - new_verts = [bm_top.verts.new(v) for v in base_vertices] - new_edges = [bm_top.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)] - - bm_top.verts.index_update() - bm_top.edges.index_update() - top_vertices = tool.Cad.offset_edges(bm_top, angle_distortion) offset_top_verts = tool.Cad.offset_edges(bm_top, angle_distortion + thickness) - if new_verts is not None: + if is_closed: + base_vertices.append(base_vertices[0]) + offset_base_verts.append(offset_base_verts[0]) + top_vertices.append(top_vertices[0]) + offset_top_verts.append(offset_top_verts[0]) + + if offset_base_verts is not None: context.scene.BIMPolylineProperties.product_preview.clear() for v in base_vertices: prop = context.scene.BIMPolylineProperties.product_preview.add() @@ -356,8 +368,8 @@ class Polyline(bonsai.core.tool.Polyline): prop.z = new_v.z + rl + height - # bm_base.free() - # bm_top.free() + bm_base.free() + bm_top.free() @classmethod