RCAIDE-GUI 1.0.2__tar.gz → 1.0.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/PKG-INFO +1 -1
  2. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/PKG-INFO +1 -1
  3. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/SOURCES.txt +4 -2
  4. rcaide_gui-1.0.4/README.md +171 -0
  5. rcaide_gui-1.0.4/VERSION +1 -0
  6. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/main.py +9 -1
  7. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/rcaide_io.py +27 -10
  8. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/__init__.py +7 -5
  9. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/geometry.py +9 -54
  10. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/home/home.py +36 -23
  11. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/mission.py +8 -8
  12. rcaide_gui-1.0.4/tabs/results_viewer/__init__.py +1 -0
  13. rcaide_gui-1.0.4/tabs/results_viewer/results_viewer.py +861 -0
  14. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/solve.py +1 -1
  15. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/__init__.py +0 -1
  16. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/visualize_geometry.py +167 -84
  17. rcaide_gui-1.0.2/README.md +0 -62
  18. rcaide_gui-1.0.2/VERSION +0 -1
  19. rcaide_gui-1.0.2/tabs/visualize_geometry/core_3d_viewer.py +0 -253
  20. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/LICENSE +0 -0
  21. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/dependency_links.txt +0 -0
  22. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/entry_points.txt +0 -0
  23. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/requires.txt +0 -0
  24. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/top_level.txt +0 -0
  25. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/README_PyPI.md +0 -0
  26. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/__init__.py +0 -0
  27. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/animated_toggle.py +0 -0
  28. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/color.py +0 -0
  29. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/data_entry_widget.py +0 -0
  30. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/image_widget.py +0 -0
  31. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/unit_picker_widget.py +0 -0
  32. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/pyproject.toml +0 -0
  33. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/setup.cfg +0 -0
  34. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/setup.py +0 -0
  35. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/aircraft_configs/__init__.py +0 -0
  36. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/aircraft_configs/aircraft_configs.py +0 -0
  37. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/__init__.py +0 -0
  38. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/analysis.py +0 -0
  39. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/__init__.py +0 -0
  40. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/aeroacoustics_widget.py +0 -0
  41. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/aerodynamics_widget.py +0 -0
  42. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/analysis_data_widget.py +0 -0
  43. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/atmosphere_widget.py +0 -0
  44. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/costs_widget.py +0 -0
  45. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/energy_widget.py +0 -0
  46. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/geometry_widget.py +0 -0
  47. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/planets_widget.py +0 -0
  48. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/propulsion_widget.py +0 -0
  49. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/stability_widget.py +0 -0
  50. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/weights_widget.py +0 -0
  51. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/__init__.py +0 -0
  52. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/aircraft_configs.py +0 -0
  53. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/__init__.py +0 -0
  54. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/booms/__init__.py +0 -0
  55. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/booms/boom_frame.py +0 -0
  56. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/cargo_bays/__init__.py +0 -0
  57. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/cargo_bays/cargo_bay_frame.py +0 -0
  58. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/default_frame.py +0 -0
  59. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/__init__.py +0 -0
  60. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/__init__.py +0 -0
  61. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/frames/__init__.py +0 -0
  62. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/widgets/__init__.py +0 -0
  63. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/fuselages/__init__.py +0 -0
  64. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/fuselages/fuselage_frame.py +0 -0
  65. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/geometry_frame.py +0 -0
  66. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/landing_gears/__init__.py +0 -0
  67. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/landing_gears/landing_gear_frame.py +0 -0
  68. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/nacelles/__init__.py +0 -0
  69. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/__init__.py +0 -0
  70. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/converters/__init__.py +0 -0
  71. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/converters/converter_frame.py +0 -0
  72. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/distributors/__init__.py +0 -0
  73. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/distributors/distributor_frame.py +0 -0
  74. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/nacelles/__init__.py +0 -0
  75. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/nacelles/nacelle_frame.py +0 -0
  76. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/powertrain_frame.py +0 -0
  77. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/propulsors/__init__.py +0 -0
  78. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/propulsors/propulsor_frame.py +0 -0
  79. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/sources/__init__.py +0 -0
  80. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/sources/energy_source_frame.py +0 -0
  81. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/vehicle_frame.py +0 -0
  82. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/wings/__init__.py +0 -0
  83. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/wings/wings_frame.py +0 -0
  84. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/__init__.py +0 -0
  85. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/booms/__init__.py +0 -0
  86. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/booms/boom_section_widget.py +0 -0
  87. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/cargo_bays/__init__.py +0 -0
  88. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/__init__.py +0 -0
  89. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/cabin_class_widget.py +0 -0
  90. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/cabin_widget.py +0 -0
  91. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/fuselage_section_widget.py +0 -0
  92. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/geometry_data_widget.py +0 -0
  93. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/landing_gears/__init__.py +0 -0
  94. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/nacelles/__init__.py +0 -0
  95. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/__init__.py +0 -0
  96. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/converters/__init__.py +0 -0
  97. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/converters/turboelectric_generator_widget.py +0 -0
  98. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/distributors/__init__.py +0 -0
  99. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/distributors/fuel_line_widget.py +0 -0
  100. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/modulators/__init__.py +0 -0
  101. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/modulators/esc_widget.py +0 -0
  102. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/nacelles/__init__.py +0 -0
  103. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/nacelles/nacelle_section_widget.py +0 -0
  104. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/powertrain_connector_widget.py +0 -0
  105. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/powertrain_widget.py +0 -0
  106. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/propulsors/__init__.py +0 -0
  107. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/propulsors/turbofan_widget.py +0 -0
  108. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/__init__.py +0 -0
  109. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/fuel_tank_widget.py +0 -0
  110. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/source_selector_widget.py +0 -0
  111. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/__init__.py +0 -0
  112. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/wing_cs_widget.py +0 -0
  113. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/wing_section_widget.py +0 -0
  114. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/home/__init__.py +0 -0
  115. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/__init__.py +0 -0
  116. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/__init__.py +0 -0
  117. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/flight_controls_widget.py +0 -0
  118. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_analysis_widget.py +0 -0
  119. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_segment_helper.py +0 -0
  120. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_segment_widget.py +0 -0
  121. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/__init__.py +0 -0
  122. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/__init__.py +0 -0
  123. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/__init__.py +0 -0
  124. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_2D_noise_contour.py +0 -0
  125. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_3D_noise_contour.py +0 -0
  126. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_noise_certification_contour.py +0 -0
  127. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_noise_level.py +0 -0
  128. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/__init__.py +0 -0
  129. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aerodynamic_coefficients.py +0 -0
  130. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aerodynamic_forces.py +0 -0
  131. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aircraft_aerodynamics.py +0 -0
  132. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_drag_components.py +0 -0
  133. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_lift_distribution.py +0 -0
  134. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_conditions.py +0 -0
  135. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_disc_performance.py +0 -0
  136. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_performance.py +0 -0
  137. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/common/__init__.py +0 -0
  138. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/common/plot_style.py +0 -0
  139. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/common/set_axes.py +0 -0
  140. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/create_plot_widgets.py +0 -0
  141. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/emissions/__init__.py +0 -0
  142. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/emissions/plot_emissions.py +0 -0
  143. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/__init__.py +0 -0
  144. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_altitude_sfc_weight.py +0 -0
  145. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_cell_conditions.py +0 -0
  146. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_degradation.py +0 -0
  147. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_module_C_rates.py +0 -0
  148. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_module_conditions.py +0 -0
  149. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_pack_conditions.py +0 -0
  150. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_ragone_diagram.py +0 -0
  151. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_temperature.py +0 -0
  152. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_electric_propulsor_efficiencies.py +0 -0
  153. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_propulsor_throttles.py +0 -0
  154. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/__init__.py +0 -0
  155. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_aircraft_velocities.py +0 -0
  156. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_flight_conditions.py +0 -0
  157. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_flight_trajectory.py +0 -0
  158. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/__init__.py +0 -0
  159. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_flight_forces_and_moments.py +0 -0
  160. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_lateral_stability.py +0 -0
  161. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_longitudinal_stability.py +0 -0
  162. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/__init__.py +0 -0
  163. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_air_cooled_conditions.py +0 -0
  164. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_cross_flow_heat_exchanger_conditions.py +0 -0
  165. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_reservoir_conditions.py +0 -0
  166. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_thermal_management_performance.py +0 -0
  167. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_wavy_channel_conditions.py +0 -0
  168. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/__init__.py +0 -0
  169. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/plot_load_diagram.py +0 -0
  170. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/plot_weight_breakdown.py +0 -0
  171. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/style_sheet.py +0 -0
  172. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/tab_widget.py +0 -0
  173. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/__init__.py +0 -0
  174. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/axes_gizmo.py +0 -0
  175. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/background.py +0 -0
  176. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/blueprint.py +0 -0
  177. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/camera.py +0 -0
  178. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/drag_aircraft.py +0 -0
  179. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/grid.py +0 -0
  180. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/measurement.py +0 -0
  181. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/screenshot.py +0 -0
  182. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/geometry_helper_functions.py +0 -0
  183. {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: RCAIDE-GUI
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary: RCAIDE Graphical User Interface: interactive desktop application for aircraft design and analysis
5
5
  License: MIT License
6
6
  Classifier: Development Status :: 4 - Beta
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: RCAIDE-GUI
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary: RCAIDE Graphical User Interface: interactive desktop application for aircraft design and analysis
5
5
  License: MIT License
6
6
  Classifier: Development Status :: 4 - Beta
@@ -108,6 +108,8 @@ utilities.py
108
108
  ./tabs/mission/widgets/mission_analysis_widget.py
109
109
  ./tabs/mission/widgets/mission_segment_helper.py
110
110
  ./tabs/mission/widgets/mission_segment_widget.py
111
+ ./tabs/results_viewer/__init__.py
112
+ ./tabs/results_viewer/results_viewer.py
111
113
  ./tabs/solve/__init__.py
112
114
  ./tabs/solve/solve.py
113
115
  ./tabs/solve/plots/__init__.py
@@ -160,7 +162,6 @@ utilities.py
160
162
  ./tabs/solve/plots/weights/plot_load_diagram.py
161
163
  ./tabs/solve/plots/weights/plot_weight_breakdown.py
162
164
  ./tabs/visualize_geometry/__init__.py
163
- ./tabs/visualize_geometry/core_3d_viewer.py
164
165
  ./tabs/visualize_geometry/geometry_helper_functions.py
165
166
  ./tabs/visualize_geometry/visualize_geometry.py
166
167
  ./tabs/visualize_geometry/features/__init__.py
@@ -276,6 +277,8 @@ tabs/mission/widgets/flight_controls_widget.py
276
277
  tabs/mission/widgets/mission_analysis_widget.py
277
278
  tabs/mission/widgets/mission_segment_helper.py
278
279
  tabs/mission/widgets/mission_segment_widget.py
280
+ tabs/results_viewer/__init__.py
281
+ tabs/results_viewer/results_viewer.py
279
282
  tabs/solve/__init__.py
280
283
  tabs/solve/solve.py
281
284
  tabs/solve/plots/__init__.py
@@ -328,7 +331,6 @@ tabs/solve/plots/weights/__init__.py
328
331
  tabs/solve/plots/weights/plot_load_diagram.py
329
332
  tabs/solve/plots/weights/plot_weight_breakdown.py
330
333
  tabs/visualize_geometry/__init__.py
331
- tabs/visualize_geometry/core_3d_viewer.py
332
334
  tabs/visualize_geometry/geometry_helper_functions.py
333
335
  tabs/visualize_geometry/visualize_geometry.py
334
336
  tabs/visualize_geometry/features/__init__.py
@@ -0,0 +1,171 @@
1
+ <p align="center">
2
+ <img src="app_data/images/logo.png" alt="RCAIDE GUI logo" width="140">
3
+ </p>
4
+
5
+ <h1 align="center">RCAIDE GUI</h1>
6
+
7
+ <p align="center">
8
+ <strong>A visual aircraft design, analysis, and mission simulation workspace powered by RCAIDE.</strong>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://pepy.tech/projects/rcaide-gui">
13
+ <img src="https://static.pepy.tech/badge/rcaide-gui" alt="PyPI Downloads">
14
+ </a>
15
+ <a href="https://pypi.org/project/RCAIDE-GUI/">
16
+ <img src="https://img.shields.io/pypi/v/RCAIDE-GUI?label=PyPI" alt="PyPI Version">
17
+ </a>
18
+ <a href="LICENSE">
19
+ <img src="https://img.shields.io/badge/license-MIT-0B7285" alt="License">
20
+ </a>
21
+ <a href="https://github.com/leadsgroup/RCAIDE_GUI/stargazers">
22
+ <img src="https://img.shields.io/github/stars/leadsgroup/RCAIDE_GUI?style=social" alt="GitHub Stars">
23
+ </a>
24
+ </p>
25
+
26
+ <p align="center">
27
+ <a href="https://www.rcaide.leadsresearchgroup.com/gui/">Website</a>
28
+ |
29
+ <a href="https://www.docs.rcaide.leadsresearchgroup.com/install.html">Documentation</a>
30
+ </p>
31
+
32
+ <p align="center">
33
+ <img src="app_data/images/Home%20(3).png" alt="RCAIDE GUI home screen" width="92%">
34
+ </p>
35
+
36
+ ## What is RCAIDE GUI?
37
+
38
+ To make user interaction with [RCAIDE](https://pypi.org/project/RCAIDE-LEADS/) easier and more intuitive, the RCAIDE Graphical User Interface (GUI) was developed. Implemented as a Python desktop application, the GUI provides a structured and visual workflow that guides users through the aircraft design process in a more organized and simplified way. Rather than working with scattered inputs and manual scripting, users can define the vehicle, configure analyses, and construct missions within a single environment.
39
+
40
+ The interface is arranged to follow the typical aircraft design workflow, making it easier for users to navigate the design process while reducing the likelihood of technical setup mistakes. By keeping all stages of development within one system, users can focus more on aircraft design decisions rather than software configuration and implementation details.
41
+
42
+ Developed and maintained by the [Lab for Electric Aircraft Design and Sustainability](https://www.leadsresearchgroup.com/).
43
+
44
+ ## Quick Start
45
+
46
+ Install from PyPI:
47
+
48
+ ```bash
49
+ pip install RCAIDE-GUI
50
+ ```
51
+
52
+ Launch the desktop app:
53
+
54
+ ```bash
55
+ rcaide-gui
56
+ ```
57
+
58
+ Or run from source:
59
+
60
+ ```bash
61
+ python main.py
62
+ ```
63
+
64
+ ## Design Workflow
65
+
66
+ ```mermaid
67
+ %%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#FFFFFF', 'primaryBorderColor': '#0891B2', 'primaryTextColor': '#111827', 'lineColor': '#0891B2', 'fontFamily': 'Inter, ui-sans-serif, system-ui, sans-serif'}, 'flowchart': {'curve': 'linear', 'nodeSpacing': 48, 'rankSpacing': 56}}}%%
68
+ flowchart LR
69
+ VS["Vehicle Setup"]
70
+ GV["Geometry Visualization"]
71
+ CS["Configurations"]
72
+ AS["Analyses"]
73
+ MS["Mission Setup"]
74
+ SIM["Mission Simulation"]
75
+
76
+ VS --> GV
77
+ GV --> CS
78
+ CS --> AS
79
+ AS --> MS
80
+ MS --> SIM
81
+
82
+ classDef workflow fill:#FFFFFF,stroke:#0891B2,stroke-width:2px,color:#111827;
83
+ class VS,GV,CS,AS,MS,SIM workflow;
84
+ linkStyle default stroke:#0891B2,stroke-width:2px;
85
+ ```
86
+
87
+ ## Application Tour
88
+
89
+ <table>
90
+ <tr>
91
+ <td width="50%">
92
+ <h3>Vehicle Setup</h3>
93
+ <p>The Vehicle Setup tab serves as the foundation of the aircraft design process. Users can create and modify aircraft geometry through a component-based workflow, adding wings, fuselages, landing gear, propulsors, booms, and other vehicle components. A live aircraft preview allows users to verify geometry and placement in real time, while the vehicle details panel provides access to all design parameters and properties.
94
+ </p>
95
+ </td>
96
+ <td width="50%">
97
+ <img src="app_data/images/Vehicle%20Setup%20(1).png" alt="Vehicle Setup tab">
98
+ </td>
99
+ </tr>
100
+ <tr>
101
+ <td width="50%">
102
+ <img src="app_data/images/Geometry_Visualization%20(1).png" alt="Geometry Visualization tab">
103
+ </td>
104
+ <td width="50%">
105
+ <h3>Geometry Visualization</h3>
106
+ <p>The Geometry Visualization tab provides a dedicated 3D environment for inspecting aircraft geometry. Powered by VTK, the viewer supports interactive rotation, zooming, measurement tools, customizable colors and transparency, predefined viewing angles, and image export capabilities. This environment allows users to verify component placement and evaluate aircraft geometry before running analyses.</p>
107
+ </td>
108
+ </tr>
109
+ <tr>
110
+ <td width="50%">
111
+ <h3>Configurations Setup</h3>
112
+ <p>The Configurations Setup tab allows users to define aircraft operating states for different phases of flight, including takeoff, cruise, landing, and custom mission conditions. Users can configure control surface deflections, landing gear deployment, and active propulsion systems while maintaining a clear connection to the baseline vehicle geometry. These configurations are later used throughout the mission and analysis workflow.</p>
113
+ </td>
114
+ <td width="50%">
115
+ <img src="app_data/images/Configurations%20(1).png" alt="Configurations Setup tab">
116
+ </td>
117
+ </tr>
118
+ <tr>
119
+ <td width="50%">
120
+ <img src="app_data/images/Mission%20Analysis%20(1).png" alt="Analyses Setup tab">
121
+ </td>
122
+ <td width="50%">
123
+ <h3>Analyses Setup</h3>
124
+ <p>The Analyses Setup tab provides access to RCAIDE's multidisciplinary analysis capabilities through a graphical interface. Users can configure aerodynamic methods, atmospheric models, weight estimation approaches, and aeroacoustic settings without directly interacting with Python code. The available options mirror those found within RCAIDE's analysis framework, ensuring consistency between GUI-based and script-based workflows.</p>
125
+ </td>
126
+ </tr>
127
+ <tr>
128
+ <td width="50%">
129
+ <h3>Mission Setup</h3>
130
+ <p>The Mission Setup tab enables users to create complete flight profiles through an intuitive visual workflow. Mission segments such as takeoff, climb, cruise, descent, and landing can be added and customized with specific operating conditions, solver settings, and control points. Each segment can also be linked to previously defined vehicle configurations and analyses, creating a fully integrated mission definition process.</p>
131
+ </td>
132
+ <td width="50%">
133
+ <img src="app_data/images/Mission%20Setup%20(1).png" alt="Mission Setup tab">
134
+ </td>
135
+ </tr>
136
+ <tr>
137
+ <td width="50%">
138
+ <img src="app_data/images/Mission%20Simulation%20(1).png" alt="Mission Simulation tab">
139
+ </td>
140
+ <td width="50%">
141
+ <h3>Mission Simulation</h3>
142
+ <p>The Mission Simulation tab is where aircraft designs are evaluated using RCAIDE's analysis framework. Once the vehicle, configurations, analyses, and mission profile have been defined, simulations can be executed directly from the GUI. Results are presented through plots and numerical outputs, including performance metrics, fuel burn, range, energy consumption, flight time, and stability characteristics, which can be exported for further analysis.</p>
143
+ </td>
144
+ </tr>
145
+ </table>
146
+
147
+ ## Why Use It?
148
+
149
+ | Capability | What it unlocks |
150
+ | --- | --- |
151
+ | Visual aircraft setup | Create and modify complex aircraft models without hand-writing setup scripts. |
152
+ | Live geometry feedback | Catch sizing, placement, and configuration issues early in the design process. |
153
+ | Connected analysis workflow | Move from geometry to configurations, analyses, missions, and results in one desktop environment. |
154
+ | RCAIDE integration | Use the same open-source design and analysis ecosystem behind scripted RCAIDE workflows. |
155
+
156
+ ## Requirements
157
+
158
+ - Python 3.9 or newer
159
+ - PyQt6
160
+ - pyvista and pyvistaqt
161
+ - RCAIDE-LEADS, installed automatically with `RCAIDE-GUI`
162
+
163
+ For platform-specific setup notes, see the [RCAIDE installation guide](https://www.docs.rcaide.leadsresearchgroup.com/install.html).
164
+
165
+ ## Contributing
166
+
167
+ Contributions are welcome! If you want to add methods, improve documentation, or fix issues, start with the [RCAIDE contribution guidelines](https://www.docs.rcaide.leadsresearchgroup.com/contributing.html), then open a pull request against this repository.
168
+
169
+ ## Get in Touch
170
+
171
+ Share feedback, report issues, and request features through [GitHub Issues](https://github.com/leadsgroup/RCAIDE_GUI/issues). For broader discussion with users and maintainers, join [GitHub Discussions](https://github.com/leadsgroup/RCAIDE_LEADS/discussions).
@@ -0,0 +1 @@
1
+ 1.0.4
@@ -62,13 +62,21 @@ class App(QMainWindow):
62
62
  self.widgets.append((analysis.get_widget(), "Analyses Setup"))
63
63
  self.widgets.append((mission.get_widget(), "Mission Setup"))
64
64
  self.widgets.append((solve.get_widget(), "Mission Simulation"))
65
+ # Results Viewer reads the last mission.evaluate() output stored in rcaide_io.rcaide_results.
66
+ self.widgets.append((results_viewer.get_widget(), "Results Viewer"))
65
67
  # self.widgets.append((shared_analysis_widget, "Multidisciplinary Analyses"))
66
68
 
67
69
  for widget, name in self.widgets:
68
70
  self.tabs.addTab(widget, name)
69
71
 
70
72
  self.setCentralWidget(self.tabs)
71
- self.resize(1280, 720)
73
+ screen = QApplication.primaryScreen()
74
+ if screen:
75
+ ag = screen.availableGeometry()
76
+ self.resize(min(1280, ag.width()), min(ag.height() - 30, 836))
77
+ else:
78
+ self.resize(1280, 836)
79
+ self.setMinimumSize(700, 480)
72
80
 
73
81
  def on_tab_change(self, index: int):
74
82
  current_frame = self.tabs.currentWidget()
@@ -5,7 +5,7 @@ import importlib
5
5
  import numpy as np
6
6
  import types as _types_module
7
7
  from collections import OrderedDict
8
- from RCAIDE.load import read_RCAIDE_json_dict
8
+ from RCAIDE.Input_Output.load import read_RCAIDE_json_dict
9
9
  from RCAIDE.Framework.Core import Data, DataOrdered
10
10
 
11
11
  _ROOT = os.path.dirname(os.path.abspath(__file__))
@@ -99,7 +99,7 @@ def repair_local_file_paths(value, source_dir=None):
99
99
 
100
100
 
101
101
  def repair_airfoil_path(path, source_dir=None):
102
- if not path or os.path.exists(path):
102
+ if not path:
103
103
  return path
104
104
  basename = os.path.basename(path)
105
105
  if source_dir:
@@ -110,7 +110,7 @@ def repair_airfoil_path(path, source_dir=None):
110
110
  candidate = os.path.join(search_dir, basename)
111
111
  if os.path.exists(candidate):
112
112
  return candidate
113
- return path
113
+ return basename if basename else path
114
114
 
115
115
 
116
116
  # ----------------------------------------------------------------------------------------------------------------------
@@ -344,7 +344,7 @@ def _build_dict_r_with_types(v):
344
344
  if module and qualname and not qualname.startswith('<'):
345
345
  ret['__type__'] = f"{module}.{qualname}"
346
346
 
347
- _skip = ('_component_root_map', '_energy_network_root_map', '_base', '_diff')
347
+ _skip = ('_component_root_map', '_energy_network_root_map', '_base', '_diff', 'vehicle')
348
348
  for k in keys:
349
349
  if k in _skip:
350
350
  continue
@@ -353,8 +353,8 @@ def _build_dict_r_with_types(v):
353
353
 
354
354
 
355
355
  def _build_dict_base_with_types(base):
356
- """Top-level serialisation: like RCAIDE.save.build_dict_base but includes __type__."""
357
- _skip = ('_component_root_map', '_energy_network_root_map', '_base', '_diff')
356
+ """Top-level serialisation: like RCAIDE.Input_Output.save.build_dict_base but includes __type__."""
357
+ _skip = ('_component_root_map', '_energy_network_root_map', '_base', '_diff', 'vehicle')
358
358
  base_dict = {}
359
359
  for k in base.keys():
360
360
  if k in _skip:
@@ -412,6 +412,9 @@ rcaide_analyses = RCAIDE.Framework.Analyses.Analysis.Container() # type:
412
412
 
413
413
  mission_data = []
414
414
  rcaide_mission = RCAIDE.Framework.Mission.Sequential_Segments()
415
+ # Last in-memory mission output. Set by the Solve tab after mission.evaluate()
416
+ # and browsed by the Results Viewer so users can inspect values without rerunning.
417
+ rcaide_results = None
415
418
 
416
419
 
417
420
  # ----------------------------------------------------------------------------------------------------------------------
@@ -420,7 +423,7 @@ rcaide_mission = RCAIDE.Framework.Mission.Sequential_Segments()
420
423
 
421
424
  def vehicle_to_ui_format(vehicle_obj):
422
425
  """Convert a RCAIDE vehicle object to UI format for display in frames."""
423
- from RCAIDE.save import build_dict_base
426
+ from RCAIDE.Input_Output.save import build_dict_base
424
427
  from tabs.geometry.frames import VehicleFrame
425
428
 
426
429
  vehicle_dict = make_json_safe(build_dict_base(vehicle_obj))
@@ -702,6 +705,17 @@ def vehicle_dict_to_ui_list_structure(vehicle_dict):
702
705
  _DIFF_SKIP = frozenset({'_component_root_map', '_energy_network_root_map', '_base', '_diff'})
703
706
 
704
707
 
708
+ def _coerce_leaf(new_val, obj, key):
709
+ """Coerce a JSON list back to numpy array when the target attribute is already an ndarray."""
710
+ if isinstance(new_val, list):
711
+ try:
712
+ if isinstance(obj[key], np.ndarray):
713
+ return np.array(new_val)
714
+ except Exception:
715
+ pass
716
+ return new_val
717
+
718
+
705
719
  def _apply_diff_to_obj(obj, diff_dict):
706
720
  """Walk a stripped diff dict and apply every leaf value to obj via key navigation."""
707
721
  for key, value in diff_dict.items():
@@ -715,7 +729,7 @@ def _apply_diff_to_obj(obj, diff_dict):
715
729
  pass
716
730
  else:
717
731
  try:
718
- obj[key] = value
732
+ obj[key] = _coerce_leaf(value, obj, key)
719
733
  except (KeyError, TypeError, AttributeError):
720
734
  pass
721
735
 
@@ -768,9 +782,9 @@ def write_to_json():
768
782
 
769
783
 
770
784
  def read_from_json(data_str, source_dir=None):
771
- global rcaide_vehicle, vehicle, rcaide_configs, config_data, analysis_data, mission_data, propulsor_names, rcaide_analyses
785
+ global rcaide_vehicle, vehicle, rcaide_configs, config_data, analysis_data, mission_data, propulsor_names, rcaide_analyses, rcaide_results
772
786
  from RCAIDE.Library.Components.Configs.Config import Config
773
- from RCAIDE.import_rcaide_data import analyses_setup as _analyses_setup
787
+ from RCAIDE.Input_Output.import_data import analyses_setup as _analyses_setup
774
788
 
775
789
  data = json.loads(data_str, object_pairs_hook=OrderedDict)
776
790
  rcaide_vehicle_dict = data["rcaide_vehicle"]
@@ -806,6 +820,9 @@ def read_from_json(data_str, source_dir=None):
806
820
  config_data = []
807
821
  analysis_data = data.get("analysis_data", [])
808
822
  mission_data = data.get("mission_data", [])
823
+ # Loaded aircraft files do not include runtime mission results; clear any
824
+ # previous run so the Results Viewer cannot show stale data for a new file.
825
+ rcaide_results = None
809
826
 
810
827
  rcaide_analyses = _analyses_setup(analysis_data, rcaide_configs)
811
828
 
@@ -2,9 +2,11 @@
2
2
  from .tab_widget import *
3
3
  from . import aircraft_configs
4
4
  from . import analysis
5
- from . import geometry
6
- from . import home
7
- from . import mission
8
- from . import solve
9
- from . import visualize_geometry
5
+ from . import geometry
6
+ from . import home
7
+ from . import mission
8
+ # Exposes the post-simulation results browser as a main application tab.
9
+ from . import results_viewer
10
+ from . import solve
11
+ from . import visualize_geometry
10
12
 
@@ -4,7 +4,6 @@
4
4
  import RCAIDE
5
5
 
6
6
  # RCAIDE-GUI imports
7
- from tabs.visualize_geometry.core_3d_viewer import Core3DViewer
8
7
  from tabs.geometry.frames import *
9
8
  from tabs import TabWidget
10
9
  from tabs.visualize_geometry.visualize_geometry import VisualizeGeometryWidget
@@ -12,14 +11,12 @@ from utilities import set_data
12
11
  import rcaide_io
13
12
 
14
13
  # PyQt imports
15
- from PyQt6.QtCore import QEasingCurve, QEvent, QPropertyAnimation, QTimer
16
14
  from PyQt6.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QComboBox, QStackedLayout, QTreeWidget, QTreeWidgetItem, \
17
15
  QLabel, QLineEdit, QApplication
18
16
 
19
17
  # Python imports
20
18
  from typing import Type
21
19
  import vtk
22
- import os
23
20
 
24
21
  # Maps geometry tab name → rcaide_io.vehicle container attribute name.
25
22
  _TAB_TO_CONTAINER = {
@@ -125,7 +122,7 @@ class GeometryWidget(TabWidget):
125
122
 
126
123
  vehicle_item = QTreeWidgetItem(["Vehicle"])
127
124
  self.tree.addTopLevelItem(vehicle_item)
128
- self.tree_frame_layout.addWidget(self.tree)
125
+ self.tree_frame_layout.addWidget(self.tree, 3)
129
126
  self.tree.expandAll()
130
127
 
131
128
  # Reuse the full Geometry Visualization widget as an embedded preview.
@@ -139,7 +136,9 @@ class GeometryWidget(TabWidget):
139
136
  # Hide advanced controls in Vehicle Setup; keep only the 3D viewport.
140
137
  if hasattr(self.preview_widget, "toolbar"):
141
138
  self.preview_widget.toolbar.hide()
142
- if hasattr(self.preview_widget, "colorbar_widget") and self.preview_widget.colorbar_widget:
139
+ if hasattr(self.preview_widget, "colorbar_scroll"):
140
+ self.preview_widget.colorbar_scroll.hide()
141
+ elif hasattr(self.preview_widget, "colorbar_widget") and self.preview_widget.colorbar_widget:
143
142
  self.preview_widget.colorbar_widget.hide()
144
143
  self.preview_widget.setMinimumHeight(180)
145
144
 
@@ -162,27 +161,16 @@ class GeometryWidget(TabWidget):
162
161
  font-weight: 600;
163
162
  }
164
163
  """)
165
- # Keep preview compact by default and widen it on hover without re-parenting.
166
- self._preview_hovered = False
167
- self._preview_base_width = 300
168
- self._preview_hover_width = 660
169
- self.preview_container.setMinimumWidth(self._preview_base_width)
170
- self.preview_container.setMaximumWidth(self._preview_hover_width)
171
- self.preview_container.setMaximumHeight(300)
172
- self._preview_width_anim = QPropertyAnimation(self.preview_container, b"minimumWidth", self)
173
- self._preview_width_anim.setDuration(160)
174
- self._preview_width_anim.setEasingCurve(QEasingCurve.Type.OutCubic)
175
- self.preview_container.installEventFilter(self)
176
- self.preview_widget.installEventFilter(self)
177
- if hasattr(self.preview_widget, "vtkWidget"):
178
- self.preview_widget.vtkWidget.installEventFilter(self)
179
-
180
- self.tree_frame_layout.addWidget(self.preview_container, 1)
164
+ self.preview_container.setMinimumWidth(250)
165
+ self.preview_container.setMinimumHeight(220)
166
+ self.preview_container.setMaximumHeight(350)
167
+
181
168
  app = QApplication.instance()
182
169
  if app is not None:
183
170
  # Fallback cleanup hook in case closeEvent order differs by platform.
184
171
  app.aboutToQuit.connect(self._cleanup_preview)
185
172
 
173
+ self.tree_frame_layout.addWidget(self.preview_container, 2)
186
174
  self.right_layout.addLayout(self.main_layout)
187
175
  base_layout.addLayout(self.tree_frame_layout, 1)
188
176
  base_layout.addLayout(self.right_layout, 4)
@@ -412,39 +400,6 @@ class GeometryWidget(TabWidget):
412
400
  # Refresh preview when this tab becomes active.
413
401
  self.preview_widget.run_solve()
414
402
 
415
- def eventFilter(self, watched, event):
416
- watched_preview = watched in {
417
- self.preview_container,
418
- self.preview_widget,
419
- getattr(self.preview_widget, "vtkWidget", None),
420
- }
421
- if watched_preview:
422
- if event.type() == QEvent.Type.Enter:
423
- self._set_preview_hover_state(True)
424
- elif event.type() == QEvent.Type.Leave:
425
- # Delay so transitions between child widgets don't collapse immediately.
426
- QTimer.singleShot(0, self._sync_preview_hover_state)
427
- return super().eventFilter(watched, event)
428
-
429
- def _sync_preview_hover_state(self):
430
- vtk_widget = getattr(self.preview_widget, "vtkWidget", None)
431
- hovered = (
432
- self.preview_container.underMouse()
433
- or self.preview_widget.underMouse()
434
- or (vtk_widget.underMouse() if vtk_widget else False)
435
- )
436
- self._set_preview_hover_state(hovered)
437
-
438
- def _set_preview_hover_state(self, hovered: bool):
439
- if self._preview_hovered == hovered:
440
- return
441
- self._preview_hovered = hovered
442
- target = self._preview_hover_width if hovered else self._preview_base_width
443
- self._preview_width_anim.stop()
444
- self._preview_width_anim.setStartValue(self.preview_container.minimumWidth())
445
- self._preview_width_anim.setEndValue(target)
446
- self._preview_width_anim.start()
447
-
448
403
  def closeEvent(self, event):
449
404
  # Clean embedded VTK resources before QWidget teardown.
450
405
  self._cleanup_preview()
@@ -11,7 +11,7 @@ from PyQt6.QtCore import qInstallMessageHandler
11
11
  from PyQt6.QtGui import QPixmap, QDesktopServices
12
12
  from PyQt6.QtWidgets import (
13
13
  QFrame, QGridLayout, QPushButton, QSizePolicy,
14
- QWidget, QHBoxLayout, QVBoxLayout, QLabel, QGraphicsOpacityEffect
14
+ QWidget, QHBoxLayout, QVBoxLayout, QLabel, QGraphicsOpacityEffect, QStackedLayout
15
15
  )
16
16
  from PyQt6.QtWidgets import QApplication
17
17
 
@@ -30,7 +30,7 @@ def suppress_qt_warnings(mode, context, message):
30
30
  print(message)
31
31
  qInstallMessageHandler(suppress_qt_warnings)
32
32
 
33
- BANNER_HEIGHT = 320 # Default banner image height in pixels
33
+ BANNER_HEIGHT = 400 # Default banner image height in pixels
34
34
  VERTICAL_FOCUS = 0.3 # Vertical offset ratio (0 = top, 1 = bottom crop focus)
35
35
 
36
36
 
@@ -207,6 +207,7 @@ class HomeWidget(TabWidget):
207
207
  # Layout that stacks title and subtitle vertically
208
208
  overlay_layout = QVBoxLayout()
209
209
  overlay_layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
210
+ overlay_layout.setSpacing(4)
210
211
  overlay_layout.addWidget(self.rcaide_label)
211
212
  overlay_layout.addWidget(self.leads_label)
212
213
 
@@ -216,14 +217,11 @@ class HomeWidget(TabWidget):
216
217
  overlay_widget.setStyleSheet("background:transparent;")
217
218
 
218
219
  # --- Layout for the banner container ---
219
- # Banner image first, then text overlay on top
220
+ # Banner image first, then text labels below it within the container
220
221
  banner_layout = QVBoxLayout(banner_container)
221
222
  banner_layout.setContentsMargins(0, 0, 0, 0)
222
223
  banner_layout.addWidget(self.banner)
223
- banner_layout.addWidget(
224
- overlay_widget,
225
- alignment=Qt.AlignmentFlag.AlignCenter
226
- )
224
+ banner_layout.addWidget(overlay_widget, alignment=Qt.AlignmentFlag.AlignCenter)
227
225
 
228
226
  # Add banner section to the main layout
229
227
  base_layout.addLayout(header_layout)
@@ -240,10 +238,11 @@ class HomeWidget(TabWidget):
240
238
  border-top: 1px solid #11293C;
241
239
  }
242
240
  """)
241
+ body_bg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
243
242
  body_layout = QHBoxLayout(body_bg)
244
- body_layout.setContentsMargins(60, 16, 100, 16)
243
+ body_layout.setContentsMargins(30, 40, 30, 40)
245
244
  body_layout.setSpacing(30)
246
- body_layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
245
+ body_layout.setAlignment(Qt.AlignmentFlag.AlignHCenter)
247
246
 
248
247
  # --- Left Column: How To Use GUI Flowchart Image ---
249
248
  self.flowchart_frame = QFrame()
@@ -261,12 +260,13 @@ class HomeWidget(TabWidget):
261
260
 
262
261
  # Load High-Resolution Flowchart Image
263
262
  original_pix = QPixmap(os.path.join(_IMG, "flowchart.png"))
263
+ self._original_pix = original_pix
264
264
  if not original_pix.isNull():
265
265
  screen = QApplication.primaryScreen()
266
266
  dpr = screen.devicePixelRatio() if screen else 1.0
267
267
  highres_pix = original_pix.scaled(
268
268
  int(620 * dpr),
269
- int(320 * dpr),
269
+ int(200 * dpr),
270
270
  Qt.AspectRatioMode.KeepAspectRatio,
271
271
  Qt.TransformationMode.SmoothTransformation
272
272
  )
@@ -278,12 +278,10 @@ class HomeWidget(TabWidget):
278
278
  self.flowchart_image = QLabel()
279
279
  self.flowchart_image.setPixmap(highres_pix)
280
280
  self.flowchart_image.setAlignment(Qt.AlignmentFlag.AlignCenter)
281
- self.flowchart_image.setFixedSize(620, 320)
281
+ self.flowchart_image.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
282
282
  self.flowchart_image.setStyleSheet("border:none; background:transparent;")
283
283
 
284
- flowchart_layout.addStretch(1)
285
284
  flowchart_layout.addWidget(self.flowchart_image, alignment=Qt.AlignmentFlag.AlignCenter)
286
- flowchart_layout.addStretch(1)
287
285
 
288
286
  # --- Right Column: Load Aircraft / Mission Or Start From Scratch ---
289
287
  self.mission_frame = QFrame()
@@ -318,8 +316,8 @@ QPushButton:hover {
318
316
  }
319
317
  """)
320
318
  mission_layout = QVBoxLayout(self.mission_frame)
321
- mission_layout.setContentsMargins(45, 16, 45, 16)
322
- mission_layout.setSpacing(14)
319
+ mission_layout.setContentsMargins(45, 8, 45, 8)
320
+ mission_layout.setSpacing(8)
323
321
  mission_layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
324
322
 
325
323
  # --- Mission Panel Title Section ---
@@ -375,7 +373,7 @@ QPushButton:hover {
375
373
  # Button to load a predefined aircraft and mission setup
376
374
  load_btn = QPushButton("Load Aircraft and Mission")
377
375
  load_btn.setMinimumWidth(230)
378
- load_btn.setFixedHeight(42)
376
+ load_btn.setFixedHeight(36)
379
377
 
380
378
  # Add button to the same row
381
379
  load_row.addWidget(load_btn)
@@ -403,7 +401,7 @@ QPushButton:hover {
403
401
  # Button to start a new mission from scratch
404
402
  scratch_btn = QPushButton("Start from Scratch")
405
403
  scratch_btn.setMinimumWidth(250)
406
- scratch_btn.setFixedHeight(42)
404
+ scratch_btn.setFixedHeight(36)
407
405
 
408
406
  scratch_container = QVBoxLayout()
409
407
  scratch_container.setContentsMargins(0, 0, 0, 0)
@@ -473,12 +471,13 @@ QPushButton:hover {
473
471
  scratch_btn.clicked.connect(handle_scratch_click)
474
472
 
475
473
  # Sizes
476
- self._normal_flowchart_size = QSize(620, 320)
477
- self._normal_mission_size = QSize(550, 310)
474
+ self._normal_flowchart_size = QSize(620, 200)
475
+ self._normal_mission_size = QSize(550, 200)
478
476
  self._fullscreen_scale = 1.55
479
477
 
480
- self.flowchart_frame.setFixedSize(self._normal_flowchart_size)
481
- self.mission_frame.setFixedSize(self._normal_mission_size)
478
+ self.flowchart_frame.setMinimumSize(self._normal_flowchart_size)
479
+ self.flowchart_frame.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
480
+ self.mission_frame.setMinimumSize(self._normal_mission_size)
482
481
 
483
482
  body_layout.addWidget(self.flowchart_frame)
484
483
  body_layout.addWidget(self.mission_frame)
@@ -517,8 +516,22 @@ QPushButton:hover {
517
516
  mission_h = int(self._normal_mission_size.height() * scale)
518
517
 
519
518
  # Apply new sizes
520
- self.flowchart_frame.setFixedSize(flow_w, flow_h)
521
- self.mission_frame.setFixedSize(mission_w, mission_h)
519
+ self.flowchart_frame.setMinimumSize(flow_w, flow_h)
520
+ self.mission_frame.setMinimumSize(mission_w, mission_h)
521
+
522
+ # Rescale flowchart image to fill the actual frame height
523
+ actual_h = max(self.flowchart_frame.height(), flow_h)
524
+ if not self._original_pix.isNull():
525
+ screen = QApplication.primaryScreen()
526
+ dpr = screen.devicePixelRatio() if screen else 1.0
527
+ scaled = self._original_pix.scaled(
528
+ int(flow_w * dpr),
529
+ int(actual_h * dpr),
530
+ Qt.AspectRatioMode.KeepAspectRatio,
531
+ Qt.TransformationMode.SmoothTransformation,
532
+ )
533
+ scaled.setDevicePixelRatio(dpr)
534
+ self.flowchart_image.setPixmap(scaled)
522
535
 
523
536
  # Refresh layout and redraw
524
537
  self.updateGeometry()