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
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"}
+2 -2
View File
@@ -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]
+31 -19
View File
@@ -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