Fix on polyline wall preview when dealing with closed loops.

This commit is contained in:
Bruno Perdigão
2024-09-13 11:39:55 -03:00
parent e83bdcc820
commit 4dc8a27e82
3 changed files with 33 additions and 28 deletions
@@ -404,7 +404,6 @@ class CadOffset(bpy.types.Operator):
# Create loops from edges # Create loops from edges
loop_edges = set(edges) loop_edges = set(edges)
print("L1", loop_edges)
loops = [] loops = []
while loop_edges: while loop_edges:
edge = loop_edges.pop() edge = loop_edges.pop()
@@ -424,7 +423,6 @@ class CadOffset(bpy.types.Operator):
has_found_connected_edge = True has_found_connected_edge = True
loops.append(loop) loops.append(loop)
print("L2", loops)
for loop in loops: for loop in loops:
all_verts = {v.index for e in loop for v in e.verts} all_verts = {v.index for e in loop for v in e.verts}
possible_v1s = [] possible_v1s = []
@@ -463,7 +461,6 @@ class CadOffset(bpy.types.Operator):
v1 = start v1 = start
print("V1", v1)
new_verts = [] new_verts = []
processed_verts = set() processed_verts = set()
# [v0] --> v1 --> v2 # [v0] --> v1 --> v2
@@ -499,7 +496,6 @@ class CadOffset(bpy.types.Operator):
normals = [] normals = []
v1co = (wp.inverted() @ mw @ v1.co).to_2d() v1co = (wp.inverted() @ mw @ v1.co).to_2d()
print("V1CO", v1co)
if v2: if v2:
v2co = (wp.inverted() @ mw @ v2.co).to_2d() v2co = (wp.inverted() @ mw @ v2.co).to_2d()
direction = (v2co - v1co).normalized() direction = (v2co - v1co).normalized()
@@ -536,11 +532,8 @@ class CadOffset(bpy.types.Operator):
if is_closed: if is_closed:
bm.edges.new((new_verts[len(new_verts) - 1], new_verts[0])) bm.edges.new((new_verts[len(new_verts) - 1], new_verts[0]))
print("OP", new_verts)
bm.verts.index_update() bm.verts.index_update()
bm.edges.index_update() bm.edges.index_update()
print(bm.verts)
print(bm.edges)
bmesh.update_edit_mesh(obj.data) bmesh.update_edit_mesh(obj.data)
return {"FINISHED"} return {"FINISHED"}
+2 -2
View File
@@ -635,8 +635,8 @@ class Cad:
edges = [e for e in bm.edges] edges = [e for e in bm.edges]
# if len(edges) < 1: if len(edges) < 1:
# return self.cancel_message("NO_EDGES") return
verts = set() verts = set()
[verts.update(e.verts) for e in edges] [verts.update(e.verts) for e in edges]
+31 -19
View File
@@ -280,6 +280,20 @@ class Polyline(bonsai.core.tool.Polyline):
@classmethod @classmethod
def create_wall_preview_vertices(cls, context, relating_type): 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 # Get properties from object type
layers = tool.Model.get_material_layer_parameters(relating_type) layers = tool.Model.get_material_layer_parameters(relating_type)
if not layers["thickness"]: if not layers["thickness"]:
@@ -288,9 +302,7 @@ class Polyline(bonsai.core.tool.Polyline):
height = float(context.scene.BIMModelProperties.extrusion_depth) height = float(context.scene.BIMModelProperties.extrusion_depth)
rl = float(context.scene.BIMModelProperties.rl1) rl = float(context.scene.BIMModelProperties.rl1)
print("RL", rl)
x_angle = float(context.scene.BIMModelProperties.x_angle) x_angle = float(context.scene.BIMModelProperties.x_angle)
# height = height * (1 / cos(x_angle))
angle_distortion = height * tan(x_angle) angle_distortion = height * tan(x_angle)
base_vertices = [] base_vertices = []
@@ -304,28 +316,28 @@ class Polyline(bonsai.core.tool.Polyline):
Vector((point.x, point.y, point.z)) 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 = create_bmesh_from_vertices(base_vertices)
bm_base.edges.index_update() bm_top = create_bmesh_from_vertices(base_vertices)
offset_base_verts = tool.Cad.offset_edges(bm_base, thickness) 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) top_vertices = tool.Cad.offset_edges(bm_top, angle_distortion)
offset_top_verts = tool.Cad.offset_edges(bm_top, angle_distortion + thickness) 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() context.scene.BIMPolylineProperties.product_preview.clear()
for v in base_vertices: for v in base_vertices:
prop = context.scene.BIMPolylineProperties.product_preview.add() prop = context.scene.BIMPolylineProperties.product_preview.add()
@@ -356,8 +368,8 @@ class Polyline(bonsai.core.tool.Polyline):
prop.z = new_v.z + rl + height prop.z = new_v.z + rl + height
# bm_base.free() bm_base.free()
# bm_top.free() bm_top.free()
@classmethod @classmethod