# RCAIDE/Library/Methods/Geometry/LOPA/LOPA_functions.py
#
#
# Created: Mar 2025, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# get_seat_y_coords
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def get_seat_y_coords(cabin,cabin_class,cabin_class_origin):
n = cabin_class.number_of_seats_abrest
s_w = cabin_class.seat_width
ar_w = cabin_class.seat_arm_rest_width
n = cabin_class.number_of_seats_abrest
s_w = cabin_class.seat_width
ar_w = cabin_class.seat_arm_rest_width
a_w = cabin_class.aile_width
# determine number of aisles
if n > 7:
n_a = 1
else:
n_a = 2
# max cabin class width
total_arm_rest_width = ((n_a + 1) + n) * ar_w
total_seat_width = n * s_w
total_aisle_width = n_a * a_w
cabin_class_width = total_arm_rest_width + total_seat_width + total_aisle_width
cabin_class.cabin_class_width = cabin_class_width
ccw = cabin_class.cabin_class_width
if n == 1:
s_y_coord = ccw/ 2 - ar_w - s_w /2
elif n == 2:
y_1 = ccw/ 2 - ar_w - s_w /2
y_2 = -y_1
s_y_coord = np.array([y_1, y_2 ])
elif n == 3:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = y_1 - s_w - ar_w
s_y_coord = np.array([ y_1, y_2, y_3 ])
elif n == 4:
if cabin.wide_body:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = s_w /2 + ar_w
y_4 = -y_3
s_y_coord = np.array([ y_1, y_2, y_3,y_4 ])
else:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = y_1 - s_w - ar_w
y_4 = -y_3
s_y_coord = np.array([ y_1, y_2, y_3,y_4 ])
elif n == 5:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = y_1 - s_w - ar_w
y_4 = -y_3
y_5 = y_4 + s_w + ar_w
s_y_coord = np.array([ y_1, y_2, y_3,y_4,y_5 ])
elif n == 6:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = y_1 - s_w - ar_w
y_4 = -y_3
y_5 = y_3 - s_w - ar_w
y_6 = -y_5
s_y_coord = np.array([ y_1, y_2, y_3,y_4, y_5,y_6 ])
elif n == 7:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = y_1 - s_w - ar_w
y_4 = -y_3
y_5 = s_w + ar_w
y_6 = -y_5
y_7 = 0
s_y_coord = np.array([ y_1, y_2, y_3,y_4, y_5,y_6,y_7])
elif n == 8:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = y_1 - s_w - ar_w
y_4 = -y_3
y_5 = s_w /2 + ar_w
y_6 = -y_5
y_7 = y_5 + s_w + ar_w
y_8 = -y_7
s_y_coord = np.array([ y_1, y_2, y_3,y_4, y_5,y_6,y_7,y_8 ])
elif n == 9:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = y_1 - s_w - ar_w
y_4 = -y_3
y_5 = y_3 - s_w - ar_w
y_6 = -y_5
y_7 = s_w + ar_w
y_8 = -y_7
y_9 = 0
s_y_coord = np.array([ y_1, y_2, y_3,y_4, y_5,y_6,y_7,y_8,y_9])
elif n == 10:
y_1 = ccw / 2 - s_w /2 - ar_w
y_2 = -y_1
y_3 = y_1 - s_w - ar_w
y_4 = -y_3
y_5 = y_3 - s_w - ar_w
y_6 = -y_5
y_7 = s_w /2 + ar_w
y_8 = -y_7
y_9 = y_7 + s_w + ar_w
y_10 = -y_9
s_y_coord = np.array([ y_1, y_2, y_3,y_4, y_5,y_6,y_7,y_8,y_9,y_10 ])
cabin.width = 2 * (np.max(s_y_coord) + s_w /2 + ar_w)
s_y_coord += cabin_class_origin[1]
return s_y_coord , cabin_class_origin
# ----------------------------------------------------------------------------------------------------------------------
# get_seat_x_coords
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def get_seat_x_coords(cabin,cabin_class,cabin_class_origin):
n_r = cabin_class.number_of_rows
s_p = cabin_class.seat_pitch
gl_l = cabin.galley_lavatory_length
A_l = cabin.type_A_door_length
ex_p = cabin.emergency_exit_seat_pitch
gl_loc = cabin_class.galley_lavatory_percent_x_locations
ex_loc = cabin_class.emergency_exit_percent_x_locations
A_loc = cabin_class.type_A_exit_percent_x_locations
# place seats
s_x_coord = np.arange(0, n_r) * (s_p)
normalized_s_x_coord = s_x_coord / s_x_coord[-1]
# create vector of object types (seat,emergency exit,galley/lav,type-A exit)
object_type = np.zeros((len(s_x_coord),4))
object_type[:,0] = 1 # assign all seats
# shift for galley and lavatories
for i in range(len(gl_loc)):
var = normalized_s_x_coord -gl_loc[i]
loc = np.argmin(abs(var))
if loc == (n_r -1):
new_loc = s_x_coord[-1] + gl_l
s_x_coord = np.append( s_x_coord,new_loc )
object_type = np.vstack((object_type, np.array([0, 0, 1, 0]) ))
else:
object_type = np.insert(object_type,loc, np.array([0, 0, 1, 0]) , axis=0)
s_x_coord[loc:] += gl_l
s_x_coord = np.insert(s_x_coord, loc, s_x_coord[loc] - gl_l)
if object_type[loc+1, 0] == 1:
s_x_coord[loc+1:] += s_p / 2
# shift for type A exit
for i in range(len(A_loc)):
var = normalized_s_x_coord -A_loc[i]
loc = np.argmin(abs(var))
if loc == (n_r -1):
new_loc = s_x_coord[-1] + A_l
s_x_coord = np.append( s_x_coord,new_loc )
object_type = np.vstack((object_type, np.array([0, 0, 0, 1]) ))
else:
object_type = np.insert(object_type,loc, np.array([0, 0, 0, 1]) , axis=0)
s_x_coord[loc:] += A_l
s_x_coord = np.insert(s_x_coord, loc, s_x_coord[loc] - A_l)
#if object_type[loc+1, 0] == 1:
#s_x_coord[loc+1:] += s_p / 2
# shift for emergency rows
for i in range(len(ex_loc)):
var = normalized_s_x_coord -ex_loc[i]
loc = np.argmin(abs(var))
if loc == (n_r-1):
if object_type[-1,1] == 1:
object_type[-2,1] = 1
else:
object_type[-1,1] = 1
else:
if object_type[loc,1] == 1:
object_type[loc+1,1] = 1
s_x_coord[loc+1:] += (ex_p - s_p)
else:
object_type[loc,1] = 1
s_x_coord[loc:] += (ex_p - s_p)
if object_type[0, 0] == 1:
offset = s_p / 2
if object_type[0, 2] == 1:
offset = gl_l / 2
if object_type[0, 3] == 1:
offset = A_l / 2
s_x_coord += offset
if object_type[-1, 0] == 1:
offset_end = s_p / 2
if object_type[-1, 2] == 1:
offset_end= gl_l / 2
if object_type[-1, 3] == 1:
offset_end = A_l / 2
cabin_class.length = s_x_coord[-1] + offset_end
cabin.length += s_x_coord[-1] + offset_end
s_x_coord += cabin_class_origin[0]
cabin_class_origin[0] = s_x_coord[-1] + offset_end
return s_x_coord , object_type, cabin_class_origin
# ----------------------------------------------------------------------------------------------------------------------
# update_seat_map_layout_using_cabin_taper
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def update_seat_map_layout_using_cabin_taper(seat_data,cabin):
cabin_width = cabin.width
n_fr = cabin.nose.fineness_ratio
nose_length = cabin.width * n_fr
t_fr = cabin.tail.fineness_ratio
tail_length = cabin.width * t_fr
# remove components that fall outside of tapered nose region
theta1 = np.arctan(cabin_width/nose_length)
n_idxs = np.where(nose_length > seat_data[:,2])[0]
removed_indexes = []
for n_i in range(len(n_idxs)):
x0 = seat_data[n_i,2] - seat_data[n_i,5]/2
x1 = seat_data[n_i,2] + seat_data[n_i,5]/2
y0 = seat_data[n_i,3] - seat_data[n_i,6]/2
y1 = seat_data[n_i,3] + seat_data[n_i,6]/2
x_pts = np.array([x0, x1])
y_pts = np.array([y0, y1])
y_border = max(x_pts * np.tan(theta1))
if np.any( y_pts > y_border):
removed_indexes.append(n_idxs[n_i])
seat_data = np.delete(seat_data,(removed_indexes), axis=0)
# remove components that fall outside of tapered tail region
theta2 = np.arctan(cabin_width/tail_length)
tail_start = seat_data[-1,2] - tail_length
t_idxs = np.where(tail_start < seat_data[:,2])[0]
removed_indexes = []
for t_i in range(len(t_idxs)):
x0 = seat_data[t_i,2] - seat_data[t_i,5]/2
x1 = seat_data[t_i,2] + seat_data[t_i,5]/2
y0 = seat_data[t_i,3] - seat_data[t_i,6]/2
y1 = seat_data[t_i,3] + seat_data[t_i,6]/2
x_pts = np.array([x0, x1])
y_pts = np.array([y0, y1])
y_border = max(x_pts * np.tan(theta2))
if np.any( y_pts > y_border): # or remove_feature == True:
removed_indexes.append(t_idxs[t_i])
seat_data = np.delete(seat_data,(removed_indexes), axis=0)
return seat_data