Source code for RCAIDE.Library.Plots.Geometry.plot_layout_of_passenger_accommodations

# RCAIDE/Library/Plots/Geometry/plot_Layout_of_Passenger_Accommodations.py
#  
# Created:  Mar 2025, M. Clarke 

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports 
from RCAIDE.Library.Methods.Geometry.LOPA.compute_layout_of_passenger_accommodations import  compute_layout_of_passenger_accommodations

# python imports 
import plotly.graph_objects as go
import numpy as  np
import os
import sys
# ----------------------------------------------------------------------------------------------------------------------
#  plot_Layout_of_Passenger_Accommodations
# ---------------------------------------------------------------------------------------------------------------------- 
[docs] def plot_layout_of_passenger_accommodations(fuselage, save_figure = False, save_filename = "Vehicle_Geometry", show_figure = True): ''' Plot aircraft layout of passenger accommodations ''' if type(fuselage.layout_of_passenger_accommodations) != np.ndarray: compute_layout_of_passenger_accommodations(fuselage) LOPA = fuselage.layout_of_passenger_accommodations fig = go.Figure() # Set axes properties fig.update_xaxes(range=[min(LOPA[:,2]) - 1 , max(LOPA[:,2]) + 1], showgrid=False) fig.update_yaxes(range=[ min(LOPA[:,3]) - 1, max(LOPA[:,3]) + 1], showgrid=False) fig.update_yaxes( scaleanchor = "x", scaleratio = 1,) # Step 1: plot cabin bounds # get points at x min x_min_locs = np.where( LOPA[:,2] == min(LOPA[:,2]))[0] x_min = LOPA[x_min_locs[0],2] - LOPA[x_min_locs[0],5]/2 x_min_y_max = max(LOPA[x_min_locs,3] + LOPA[x_min_locs,6]/2 ) x_min_y_min = min(LOPA[x_min_locs,3] - LOPA[x_min_locs,6]/2 ) x_border_pts = [x_min, x_min] y_border_pts = [x_min_y_min, x_min_y_max] # get points at y max y_max_locs = np.where( LOPA[:,3] == max(LOPA[:,3]))[0] y_max = LOPA[y_max_locs[0],3] + LOPA[y_max_locs[0],6]/2 y_max_x_max = max(LOPA[y_max_locs,2] + LOPA[y_max_locs[0],5]/2) y_max_x_min = min(LOPA[y_max_locs,2] - LOPA[y_max_locs[0],5]/2) x_border_pts.append(y_max_x_min) x_border_pts.append(y_max_x_max) y_border_pts.append(y_max) y_border_pts.append(y_max) # get points at x max x_max_locs = np.where( LOPA[:,2] == max(LOPA[:,2]))[0] x_max = LOPA[x_max_locs[0],2] + LOPA[x_max_locs[0],5]/2 x_max_y_max = max(LOPA[x_max_locs,3] + LOPA[x_max_locs,6]/2) x_max_y_min = min(LOPA[x_max_locs,3] - LOPA[x_max_locs,6]/2) x_border_pts.append(x_max) x_border_pts.append(x_max) y_border_pts.append(x_max_y_max) y_border_pts.append(x_max_y_min) # get points at y min y_min_locs = np.where( LOPA[:,3] == min(LOPA[:,3]))[0] y_min = LOPA[y_min_locs[0],3] - LOPA[y_min_locs[0],6]/2 y_min_x_max = max(LOPA[y_min_locs,2] + LOPA[y_min_locs[0],5]/2) y_min_x_min = min(LOPA[y_min_locs,2] - LOPA[y_min_locs[0],5]/2) x_border_pts.append(y_min_x_max) x_border_pts.append(y_min_x_min) y_border_pts.append(y_min) y_border_pts.append(y_min) # loop through points and determine if there are duplicates y_border_pts = np.array(y_border_pts) x_border_pts = np.array(x_border_pts) # cut where y is negative port_idxs = np.where(y_border_pts<0)[0] starboard_x_points = np.delete(x_border_pts, port_idxs) starboard_y_points = np.delete(y_border_pts, port_idxs) fig.add_trace(go.Scatter( x=starboard_x_points, y=starboard_y_points, mode='lines', name='Line 1', line_color="darkblue", fill=None )) fig.add_trace(go.Scatter( x=starboard_x_points, y=-starboard_y_points, mode='lines', name='Line 2', line_color="darkblue", fill='tonexty' )) # Step 2: plot seats economoy_seat_colors = ["steelblue", "deepskyblue", "skyblue" ] business_seat_colors = ["seagreen", "mediumseagreen", "lightseagreen" ] first_seat_colors = ["indianred", "lightcoral", "lightpink" ] lavatory_color = ["sandybrown"] for i in range(len(LOPA)): x_center = LOPA[i,2] y_center = LOPA[i,3] s_l = LOPA[i,5] s_w = LOPA[i,6] F_c = LOPA[i,7] B_c = LOPA[i,8] E_c = LOPA[i,9] seat = LOPA[i,10] Em_row = LOPA[i,11] Gal_Lav = LOPA[i,12] if E_c == 1.0: if seat == 1.0: x0_pt = x_center - s_l / 2 x1_pt = x_center + s_l / 2 y0_pt = y_center - s_w / 2 y1_pt = y_center + s_w / 2 if Em_row == 1.0: fig.add_shape(type="rect", x0=x0_pt, y0=y0_pt, x1=x1_pt, y1=y1_pt, line=dict( color=economoy_seat_colors[0], width=2, ), fillcolor= economoy_seat_colors[1], ) else: fig.add_shape(type="rect", x0=x0_pt, y0=y0_pt, x1=x1_pt, y1=y1_pt, line=dict( color=economoy_seat_colors[0], width=2, ), fillcolor=economoy_seat_colors[2], ) if B_c == 1: if seat == 1: x0_pt = x_center - s_l / 2 x1_pt = x_center + s_l / 2 y0_pt = y_center - s_w / 2 y1_pt = y_center + s_w / 2 if Em_row == 1: fig.add_shape(type="rect", x0=x0_pt, y0=y0_pt, x1=x1_pt, y1=y1_pt, line=dict( color=business_seat_colors[0], width=2, ), fillcolor=business_seat_colors[1], ) else: fig.add_shape(type="rect", x0=x0_pt, y0=y0_pt, x1=x1_pt, y1=y1_pt, line=dict( color=business_seat_colors[0], width=2, ), fillcolor=business_seat_colors[2], ) if F_c == 1: if seat == 1: x0_pt = x_center - s_l / 2 x1_pt = x_center + s_l / 2 y0_pt = y_center - s_w / 2 y1_pt = y_center + s_w / 2 if Em_row == 1: fig.add_shape(type="rect", x0=x0_pt, y0=y0_pt, x1=x1_pt, y1=y1_pt, line=dict( color=first_seat_colors[0], width=2, ), fillcolor=first_seat_colors[1], ) else: fig.add_shape(type="rect", x0=x0_pt, y0=y0_pt, x1=x1_pt, y1=y1_pt, line=dict( color=first_seat_colors[0], width=2, ), fillcolor=first_seat_colors[2], ) if Gal_Lav == 1: x0_pt = x_center - s_l / 2 x1_pt = x_center + s_l / 2 y0_pt = y_center - s_w / 2 y1_pt = y_center + s_w / 2 fig.add_shape(type="rect", x0=x0_pt, y0=y0_pt, x1=x1_pt, y1=y1_pt, line=dict( color=lavatory_color[0], width=2, ), fillcolor=lavatory_color[0], ) # Use the first path from sys.path save_filename = os.path.join(sys.path[0], save_filename) if save_figure: fig.write_image(save_filename + ".png") if show_figure: fig.write_html( save_filename + '.html', auto_open=True) return