Polyline tool - Wall preview is now working for angled walls.

This commit is contained in:
Bruno Perdigão
2024-09-13 10:30:40 -03:00
parent 7ea3d63aa0
commit e83bdcc820
+56 -39
View File
@@ -23,8 +23,8 @@ import bonsai.tool as tool
from bonsai.bim.module.drawing.helper import format_distance from bonsai.bim.module.drawing.helper import format_distance
from dataclasses import dataclass from dataclasses import dataclass
from lark import Lark, Transformer from lark import Lark, Transformer
from math import degrees, radians, sin, cos from math import degrees, radians, sin, cos, tan
from mathutils import Vector from mathutils import Vector, Matrix
from typing import Optional from typing import Optional
@@ -280,27 +280,7 @@ 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):
vertices = [] # Get properties from object type
polyline_data = context.scene.BIMPolylineProperties.polyline_point
if len(polyline_data) < 2:
context.scene.BIMPolylineProperties.product_preview.clear()
return
for point in polyline_data:
vertices.append(
Vector((point.x, point.y, point.z))
)
bm = bmesh.new()
new_verts = [bm.verts.new(v) for v in vertices]
new_edges = [bm.edges.new((new_verts[i], new_verts[i + 1])) for i in range(len(new_verts) - 1)]
# bm.verts.ensure_lookup_table()
# bm.edges.ensure_lookup_table()
bm.verts.index_update()
bm.edges.index_update()
# Get thickness 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"]:
return return
@@ -308,39 +288,76 @@ 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)) # height = height * (1 / cos(x_angle))
direction = Vector((0.0, sin(x_angle), cos(x_angle))) angle_distortion = height * tan(x_angle)
scaled_direction = direction * height
base_vertices = []
top_vertices = []
polyline_data = context.scene.BIMPolylineProperties.polyline_point
if len(polyline_data) < 2:
context.scene.BIMPolylineProperties.product_preview.clear()
return
for point in polyline_data:
base_vertices.append(
Vector((point.x, point.y, point.z))
)
bm_base = bmesh.new()
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()
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)
new_verts = tool.Cad.offset_edges(bm, thickness)
if new_verts is not None: if new_verts is not None:
context.scene.BIMPolylineProperties.product_preview.clear() context.scene.BIMPolylineProperties.product_preview.clear()
for v in vertices: for v in base_vertices:
prop = context.scene.BIMPolylineProperties.product_preview.add() prop = context.scene.BIMPolylineProperties.product_preview.add()
prop.x = v.x prop.x = v.x
prop.y = v.y prop.y = v.y
prop.z = v.z + rl prop.z = v.z + rl
for v in new_verts[::-1]: for v in offset_base_verts[::-1]:
prop = context.scene.BIMPolylineProperties.product_preview.add() new_v = Vector((v.co.x, v.co.y, v.co.z))
prop.x = v.co.x
prop.y = v.co.y
prop.z = v.co.z + rl
for i, v in enumerate(vertices):
new_v = v + scaled_direction
prop = context.scene.BIMPolylineProperties.product_preview.add() prop = context.scene.BIMPolylineProperties.product_preview.add()
prop.x = new_v.x prop.x = new_v.x
prop.y = new_v.y prop.y = new_v.y
prop.z = new_v.z + rl prop.z = new_v.z + rl
for v in new_verts[::-1]: for v in top_vertices:
new_v = Vector((v.co.x, v.co.y, v.co.z)) + scaled_direction # new_v = v #+ scaled_direction
new_v = Vector((v.co.x, v.co.y, v.co.z))
prop = context.scene.BIMPolylineProperties.product_preview.add() prop = context.scene.BIMPolylineProperties.product_preview.add()
prop.x = new_v.x prop.x = new_v.x
prop.y = new_v.y prop.y = new_v.y
prop.z = new_v.z + rl prop.z = new_v.z + rl + height
for v in offset_top_verts[::-1]:
new_v = Vector((v.co.x, v.co.y, v.co.z))# + scaled_direction
prop = context.scene.BIMPolylineProperties.product_preview.add()
prop.x = new_v.x
prop.y = new_v.y
prop.z = new_v.z + rl + height
# bm_base.free()
# bm_top.free()
@classmethod @classmethod