adjust window offset on transoms/mullions for symmetry #3271

Before -  https://i.imgur.com/DbEzJ9H.png
After - https://i.imgur.com/0CERh86.png

Added it for modifier preview and ifc 2d and 3d repr but still need to work some things in 3d representation (L shape lining is not always detected correctly).
This commit is contained in:
Andrej730
2023-06-19 15:13:59 +05:00
parent 20b63f530a
commit e89a9cd01c
2 changed files with 141 additions and 67 deletions
@@ -262,6 +262,7 @@ def create_bm_window(
frame_thickness, frame_thickness,
glass_thickness, glass_thickness,
position: Vector, position: Vector,
frame_position: Vector = None,
): ):
"""`lining_thickness` expected to be defined as a list, """`lining_thickness` expected to be defined as a list,
similarly to `create_bm_window_frame` `thickness` argument""" similarly to `create_bm_window_frame` `thickness` argument"""
@@ -269,7 +270,8 @@ def create_bm_window(
window_lining_verts = create_bm_window_frame(bm, lining_size, lining_thickness) window_lining_verts = create_bm_window_frame(bm, lining_size, lining_thickness)
# window frame # window frame
frame_position = V(lining_to_panel_offset_x, lining_to_panel_offset_y_full, lining_to_panel_offset_x) if frame_position is None:
frame_position = V(lining_to_panel_offset_x, lining_to_panel_offset_y_full, lining_to_panel_offset_x)
frame_verts = create_bm_window_frame(bm, frame_size, frame_thickness, frame_position) frame_verts = create_bm_window_frame(bm, frame_size, frame_thickness, frame_position)
# window glass # window glass
@@ -319,21 +321,35 @@ def update_window_modifier_bmesh(context):
unique_cols = len(set(panel_row)) unique_cols = len(set(panel_row))
for column_i, panel_i in enumerate(panel_row): for column_i, panel_i in enumerate(panel_row):
# detect mullion
has_mullion = unique_cols > 1
first_column = column_i == 0
last_column = column_i == unique_cols - 1
left_to_mullion = has_mullion and not last_column
right_to_mullion = has_mullion and not first_column
# detect transom
has_transom = unique_rows_in_col[column_i] > 1
first_row = row_i == 0
last_row = row_i == unique_rows_in_col[column_i] - 1
top_to_transom = has_transom and not first_row
bottom_to_transom = has_transom and not last_row
# calculate current panel dimensions # calculate current panel dimensions
if unique_cols > 1: if has_mullion:
if column_i == 0: if first_column:
panel_width = first_mullion_offset panel_width = first_mullion_offset
elif column_i == unique_cols - 1: elif last_column:
panel_width = overall_width - accumulated_width panel_width = overall_width - accumulated_width
else: else:
panel_width = second_mullion_offset - accumulated_width panel_width = second_mullion_offset - accumulated_width
else: else:
panel_width = overall_width panel_width = overall_width
if unique_rows_in_col[column_i] > 1: if has_transom:
if row_i == 0: if first_row:
panel_height = first_transom_offset panel_height = first_transom_offset
elif row_i == unique_rows_in_col[column_i] - 1: elif last_row:
panel_height = overall_height - accumulated_height[column_i] panel_height = overall_height - accumulated_height[column_i]
else: else:
panel_height = second_transom_offset - accumulated_height[column_i] panel_height = second_transom_offset - accumulated_height[column_i]
@@ -347,7 +363,9 @@ def update_window_modifier_bmesh(context):
frame_depth = props.frame_depth[panel_i] frame_depth = props.frame_depth[panel_i]
frame_thickness = props.frame_thickness[panel_i] frame_thickness = props.frame_thickness[panel_i]
base_frame_clear = lining_to_panel_offset_x + frame_thickness - lining_thickness
current_offset_x = base_frame_clear - frame_thickness + mullion_thickness
current_offset_z = base_frame_clear - frame_thickness + transom_thickness
# add window # add window
window_lining_size = V( window_lining_size = V(
panel_width, panel_width,
@@ -355,25 +373,30 @@ def update_window_modifier_bmesh(context):
panel_height, panel_height,
) )
# calculate lining thickness # calculate lining thickness and frame size / offset
# taking into account mullions and transoms # taking into account mullions and transoms
window_lining_thickness = [lining_thickness] * 4 window_lining_thickness = [
# mullion thickness mullion_thickness if right_to_mullion else lining_thickness,
if unique_cols > 1: transom_thickness if bottom_to_transom else lining_thickness,
if column_i != 0: mullion_thickness if left_to_mullion else lining_thickness,
window_lining_thickness[0] = mullion_thickness # left column transom_thickness if top_to_transom else lining_thickness,
if column_i != unique_cols - 1: ]
window_lining_thickness[2] = mullion_thickness # right column
# transom thickness lining_to_panel_offset_y_full = (lining_depth - frame_depth) + lining_to_panel_offset_y
if unique_rows_in_col[column_i] > 1: frame_position = V(
if row_i != 0: current_offset_x if right_to_mullion else lining_to_panel_offset_x,
window_lining_thickness[3] = transom_thickness # bottom row lining_to_panel_offset_y_full,
if row_i != unique_rows_in_col[column_i] - 1: current_offset_z if top_to_transom else lining_to_panel_offset_x
window_lining_thickness[1] = transom_thickness # top row )
frame_size = window_lining_size.copy() frame_size = window_lining_size.copy()
frame_size.y = frame_depth frame_size.y = frame_depth
frame_size = frame_size - V(lining_to_panel_offset_x * 2, 0, lining_to_panel_offset_x * 2)
frame_size.x -= current_offset_x if left_to_mullion else lining_to_panel_offset_x
frame_size.x -= current_offset_x if right_to_mullion else lining_to_panel_offset_x
frame_size.z -= current_offset_z if top_to_transom else lining_to_panel_offset_x
frame_size.z -= current_offset_z if bottom_to_transom else lining_to_panel_offset_x
window_position = V(accumulated_width, 0, accumulated_height[column_i]) window_position = V(accumulated_width, 0, accumulated_height[column_i])
lining_verts, panel_verts, glass_verts = create_bm_window( lining_verts, panel_verts, glass_verts = create_bm_window(
@@ -381,11 +404,12 @@ def update_window_modifier_bmesh(context):
window_lining_size, window_lining_size,
window_lining_thickness, window_lining_thickness,
lining_to_panel_offset_x, lining_to_panel_offset_x,
(lining_depth - frame_depth) + lining_to_panel_offset_y, lining_to_panel_offset_y_full,
frame_size, frame_size,
frame_thickness, frame_thickness,
glass_thickness, glass_thickness,
window_position, window_position,
frame_position
) )
built_panels.append(panel_i) built_panels.append(panel_i)
@@ -95,6 +95,7 @@ def create_ifc_window(
frame_thickness, frame_thickness,
glass_thickness, glass_thickness,
position: Vector, position: Vector,
frame_position: Vector = None,
): ):
"""`lining_thickness` expected to be defined as a list, """`lining_thickness` expected to be defined as a list,
similarly to `create_ifc_window_frame_simple` `thickness` argument""" similarly to `create_ifc_window_frame_simple` `thickness` argument"""
@@ -127,11 +128,12 @@ def create_ifc_window(
main_lining = create_ifc_window_frame_simple(builder, main_lining_size, lining_thickness) main_lining = create_ifc_window_frame_simple(builder, main_lining_size, lining_thickness)
lining_items.append(main_lining) lining_items.append(main_lining)
frame_position = V( if frame_position is None:
lining_to_panel_offset_x, frame_position = V(
lining_to_panel_offset_y_full, lining_to_panel_offset_x,
lining_to_panel_offset_x, lining_to_panel_offset_y_full,
) lining_to_panel_offset_x,
)
frame_extruded = create_ifc_window_frame_simple(builder, frame_size, frame_thickness, frame_position) frame_extruded = create_ifc_window_frame_simple(builder, frame_size, frame_thickness, frame_position)
@@ -272,19 +274,26 @@ class Usecase:
if panel_i in built_panels: if panel_i in built_panels:
continue continue
if unique_cols > 1: # detect mullion
if column_i == 0: has_mullion = unique_cols > 1
first_column = column_i == 0
last_column = column_i == unique_cols - 1
left_to_mullion = has_mullion and not last_column
right_to_mullion = has_mullion and not first_column
if has_mullion:
if first_column:
panel_width = first_mullion_offset panel_width = first_mullion_offset
elif column_i == unique_cols - 1: elif last_column:
panel_width = overall_width - accumulated_width panel_width = overall_width - accumulated_width
else: else:
panel_width = second_mullion_offset - accumulated_width panel_width = second_mullion_offset - accumulated_width
# mullion thickness # mullion thickness
if column_i != 0: if not first_column:
window_lining_thickness[0] = mullion_thickness # left column window_lining_thickness[0] = mullion_thickness # left column
closed_lining[0] = False closed_lining[0] = False
if column_i != unique_cols - 1: if not last_column:
window_lining_thickness[1] = mullion_thickness # right column window_lining_thickness[1] = mullion_thickness # right column
closed_lining[1] = False closed_lining[1] = False
else: else:
@@ -292,7 +301,9 @@ class Usecase:
frame_depth = panels[panel_i]["FrameDepth"] frame_depth = panels[panel_i]["FrameDepth"]
frame_thickness = panels[panel_i]["FrameThickness"] frame_thickness = panels[panel_i]["FrameThickness"]
lining_to_panel_offset_y_full = overall_depth - frame_depth lining_to_panel_offset_y_full = (lining_depth - frame_depth) + lining_to_panel_offset_y
base_frame_clear = lining_to_panel_offset_x + frame_thickness - lining_thickness
current_offset_x = base_frame_clear - frame_thickness + mullion_thickness
# add lining # add lining
cur_panel_items.append( cur_panel_items.append(
@@ -304,20 +315,22 @@ class Usecase:
) )
) )
def get_lining_shape(lining_thickness, closed=True, mirror=False): def get_lining_shape(lining_thickness, closed=True, mirror=False, x_offset=None):
if x_offset is None:
x_offset = lining_to_panel_offset_x
l_shape_check = window_l_shape_check( l_shape_check = window_l_shape_check(
lining_to_panel_offset_y_full, lining_to_panel_offset_y_full,
lining_depth, lining_depth,
lining_to_panel_offset_x, x_offset,
[lining_thickness], [lining_thickness],
) )
if l_shape_check: if l_shape_check:
lining_shape = builder.polyline( lining_shape = builder.polyline(
[ [
V(0, lining_depth), V(0, lining_depth),
V(lining_to_panel_offset_x, lining_depth), V(x_offset, lining_depth),
V( V(
lining_to_panel_offset_x, x_offset,
lining_to_panel_offset_y_full, lining_to_panel_offset_y_full,
), ),
V(lining_thickness, lining_to_panel_offset_y_full), V(lining_thickness, lining_to_panel_offset_y_full),
@@ -348,10 +361,15 @@ class Usecase:
cur_panel_items.extend( cur_panel_items.extend(
[ [
get_lining_shape(window_lining_thickness[0], closed=closed_lining[0]), get_lining_shape(
window_lining_thickness[0],
closed=closed_lining[0],
x_offset=current_offset_x if right_to_mullion else None,
),
get_lining_shape( get_lining_shape(
window_lining_thickness[1], window_lining_thickness[1],
closed=closed_lining[1], closed=closed_lining[1],
x_offset=current_offset_x if left_to_mullion else None,
mirror=True, mirror=True,
), ),
] ]
@@ -359,8 +377,15 @@ class Usecase:
# add frame # add frame
frame_items = [] frame_items = []
frame_position = V(lining_to_panel_offset_x, lining_to_panel_offset_y_full)
frame_width = panel_width - lining_to_panel_offset_x * 2 frame_position = V(
current_offset_x if right_to_mullion else lining_to_panel_offset_x,
lining_to_panel_offset_y_full,
)
frame_width = panel_width
frame_width -= current_offset_x if left_to_mullion else lining_to_panel_offset_x
frame_width -= current_offset_x if right_to_mullion else lining_to_panel_offset_x
frame_vertical = builder.rectangle(size=V(frame_thickness, frame_depth)) frame_vertical = builder.rectangle(size=V(frame_thickness, frame_depth))
frame_items.extend( frame_items.extend(
@@ -411,39 +436,40 @@ class Usecase:
unique_cols = len(set(panel_row)) unique_cols = len(set(panel_row))
for column_i, panel_i in enumerate(panel_row): for column_i, panel_i in enumerate(panel_row):
# calculate current panel dimensions
window_lining_thickness = [lining_thickness] * 4
if unique_cols > 1: # detect mullion
has_mullion = unique_cols > 1
first_column = column_i == 0
last_column = column_i == unique_cols - 1
left_to_mullion = has_mullion and not last_column
right_to_mullion = has_mullion and not first_column
# detect transom
has_transom = unique_rows_in_col[column_i] > 1
first_row = row_i == 0
last_row = row_i == unique_rows_in_col[column_i] - 1
top_to_transom = has_transom and not first_row
bottom_to_transom = has_transom and not last_row
# calculate current panel dimensions
if has_mullion:
# panel_width # panel_width
if column_i == 0: if first_column:
panel_width = first_mullion_offset panel_width = first_mullion_offset
elif column_i == unique_cols - 1: elif last_column:
panel_width = overall_width - accumulated_width panel_width = overall_width - accumulated_width
else: else:
panel_width = second_mullion_offset - accumulated_width panel_width = second_mullion_offset - accumulated_width
# mullion thickness
if column_i != 0:
window_lining_thickness[0] = mullion_thickness # left column
if column_i != unique_cols - 1:
window_lining_thickness[2] = mullion_thickness # right column
else: else:
panel_width = overall_width panel_width = overall_width
if unique_rows_in_col[column_i] > 1: if has_transom:
if row_i == 0: if first_row:
panel_height = first_transom_offset panel_height = first_transom_offset
elif row_i == unique_rows_in_col[column_i] - 1: elif last_row:
panel_height = overall_height - accumulated_height[column_i] panel_height = overall_height - accumulated_height[column_i]
else: else:
panel_height = second_transom_offset - accumulated_height[column_i] panel_height = second_transom_offset - accumulated_height[column_i]
# transom thickness
if row_i != 0:
window_lining_thickness[3] = transom_thickness # bottom row
if row_i != unique_rows_in_col[column_i] - 1:
window_lining_thickness[1] = transom_thickness # top row
else: else:
panel_height = overall_height panel_height = overall_height
@@ -455,16 +481,39 @@ class Usecase:
cur_panel = panels[panel_i] cur_panel = panels[panel_i]
frame_depth = cur_panel["FrameDepth"] frame_depth = cur_panel["FrameDepth"]
frame_thickness = cur_panel["FrameThickness"] frame_thickness = cur_panel["FrameThickness"]
lining_to_panel_offset_y_full = overall_depth - frame_depth base_frame_clear = lining_to_panel_offset_x + frame_thickness - lining_thickness
current_items = [] current_offset_x = base_frame_clear - frame_thickness + mullion_thickness
current_offset_z = base_frame_clear - frame_thickness + transom_thickness
frame_width = panel_width - lining_to_panel_offset_x * 2 # calculate lining thickness and frame size / offset
frame_height = panel_height - lining_to_panel_offset_x * 2 # taking into account mullions and transoms
window_lining_thickness = [
mullion_thickness if right_to_mullion else lining_thickness,
transom_thickness if bottom_to_transom else lining_thickness,
mullion_thickness if left_to_mullion else lining_thickness,
transom_thickness if top_to_transom else lining_thickness,
]
lining_to_panel_offset_y_full = (lining_depth - frame_depth) + lining_to_panel_offset_y
window_lining_size = V(panel_width, lining_depth, panel_height) window_lining_size = V(panel_width, lining_depth, panel_height)
frame_size = V(frame_width, frame_depth, frame_height) frame_size = window_lining_size.copy()
frame_size.y = frame_depth
frame_size.x -= current_offset_x if left_to_mullion else lining_to_panel_offset_x
frame_size.x -= current_offset_x if right_to_mullion else lining_to_panel_offset_x
frame_size.z -= current_offset_z if top_to_transom else lining_to_panel_offset_x
frame_size.z -= current_offset_z if bottom_to_transom else lining_to_panel_offset_x
window_panel_position = V(accumulated_width, 0, accumulated_height[column_i]) window_panel_position = V(accumulated_width, 0, accumulated_height[column_i])
frame_position = V(
current_offset_x if right_to_mullion else lining_to_panel_offset_x,
lining_to_panel_offset_y_full,
current_offset_z if top_to_transom else lining_to_panel_offset_x
)
# create window panel # create window panel
current_window_items = create_ifc_window( current_window_items = create_ifc_window(
builder, builder,
@@ -476,6 +525,7 @@ class Usecase:
frame_thickness, frame_thickness,
glass_thickness, glass_thickness,
window_panel_position, window_panel_position,
frame_position
) )
built_panels.append(panel_i) built_panels.append(panel_i)
window_items.extend(chain(*current_window_items)) window_items.extend(chain(*current_window_items))