RCAIDE-GUI 1.0.3__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 (182) hide show
  1. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/PKG-INFO +1 -1
  2. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/PKG-INFO +1 -1
  3. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/SOURCES.txt +4 -2
  4. rcaide_gui-1.0.4/VERSION +1 -0
  5. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/main.py +9 -1
  6. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/rcaide_io.py +23 -6
  7. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/__init__.py +7 -5
  8. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/geometry.py +9 -54
  9. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/home/home.py +36 -23
  10. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/mission.py +8 -8
  11. rcaide_gui-1.0.4/tabs/results_viewer/__init__.py +1 -0
  12. rcaide_gui-1.0.4/tabs/results_viewer/results_viewer.py +861 -0
  13. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/solve.py +1 -1
  14. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/__init__.py +0 -1
  15. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/visualize_geometry.py +167 -84
  16. rcaide_gui-1.0.3/VERSION +0 -1
  17. rcaide_gui-1.0.3/tabs/visualize_geometry/core_3d_viewer.py +0 -253
  18. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/LICENSE +0 -0
  19. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/dependency_links.txt +0 -0
  20. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/entry_points.txt +0 -0
  21. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/requires.txt +0 -0
  22. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/top_level.txt +0 -0
  23. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/README.md +0 -0
  24. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/README_PyPI.md +0 -0
  25. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/__init__.py +0 -0
  26. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/animated_toggle.py +0 -0
  27. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/color.py +0 -0
  28. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/data_entry_widget.py +0 -0
  29. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/image_widget.py +0 -0
  30. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/unit_picker_widget.py +0 -0
  31. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/pyproject.toml +0 -0
  32. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/setup.cfg +0 -0
  33. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/setup.py +0 -0
  34. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/aircraft_configs/__init__.py +0 -0
  35. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/aircraft_configs/aircraft_configs.py +0 -0
  36. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/__init__.py +0 -0
  37. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/analysis.py +0 -0
  38. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/__init__.py +0 -0
  39. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/aeroacoustics_widget.py +0 -0
  40. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/aerodynamics_widget.py +0 -0
  41. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/analysis_data_widget.py +0 -0
  42. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/atmosphere_widget.py +0 -0
  43. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/costs_widget.py +0 -0
  44. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/energy_widget.py +0 -0
  45. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/geometry_widget.py +0 -0
  46. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/planets_widget.py +0 -0
  47. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/propulsion_widget.py +0 -0
  48. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/stability_widget.py +0 -0
  49. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/weights_widget.py +0 -0
  50. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/__init__.py +0 -0
  51. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/aircraft_configs.py +0 -0
  52. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/__init__.py +0 -0
  53. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/booms/__init__.py +0 -0
  54. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/booms/boom_frame.py +0 -0
  55. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/cargo_bays/__init__.py +0 -0
  56. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/cargo_bays/cargo_bay_frame.py +0 -0
  57. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/default_frame.py +0 -0
  58. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/__init__.py +0 -0
  59. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/__init__.py +0 -0
  60. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/frames/__init__.py +0 -0
  61. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/widgets/__init__.py +0 -0
  62. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/fuselages/__init__.py +0 -0
  63. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/fuselages/fuselage_frame.py +0 -0
  64. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/geometry_frame.py +0 -0
  65. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/landing_gears/__init__.py +0 -0
  66. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/landing_gears/landing_gear_frame.py +0 -0
  67. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/nacelles/__init__.py +0 -0
  68. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/__init__.py +0 -0
  69. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/converters/__init__.py +0 -0
  70. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/converters/converter_frame.py +0 -0
  71. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/distributors/__init__.py +0 -0
  72. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/distributors/distributor_frame.py +0 -0
  73. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/nacelles/__init__.py +0 -0
  74. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/nacelles/nacelle_frame.py +0 -0
  75. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/powertrain_frame.py +0 -0
  76. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/propulsors/__init__.py +0 -0
  77. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/propulsors/propulsor_frame.py +0 -0
  78. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/sources/__init__.py +0 -0
  79. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/sources/energy_source_frame.py +0 -0
  80. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/vehicle_frame.py +0 -0
  81. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/wings/__init__.py +0 -0
  82. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/wings/wings_frame.py +0 -0
  83. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/__init__.py +0 -0
  84. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/booms/__init__.py +0 -0
  85. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/booms/boom_section_widget.py +0 -0
  86. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/cargo_bays/__init__.py +0 -0
  87. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/__init__.py +0 -0
  88. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/cabin_class_widget.py +0 -0
  89. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/cabin_widget.py +0 -0
  90. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/fuselage_section_widget.py +0 -0
  91. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/geometry_data_widget.py +0 -0
  92. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/landing_gears/__init__.py +0 -0
  93. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/nacelles/__init__.py +0 -0
  94. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/__init__.py +0 -0
  95. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/converters/__init__.py +0 -0
  96. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/converters/turboelectric_generator_widget.py +0 -0
  97. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/distributors/__init__.py +0 -0
  98. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/distributors/fuel_line_widget.py +0 -0
  99. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/modulators/__init__.py +0 -0
  100. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/modulators/esc_widget.py +0 -0
  101. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/nacelles/__init__.py +0 -0
  102. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/nacelles/nacelle_section_widget.py +0 -0
  103. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/powertrain_connector_widget.py +0 -0
  104. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/powertrain_widget.py +0 -0
  105. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/propulsors/__init__.py +0 -0
  106. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/propulsors/turbofan_widget.py +0 -0
  107. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/__init__.py +0 -0
  108. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/fuel_tank_widget.py +0 -0
  109. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/source_selector_widget.py +0 -0
  110. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/__init__.py +0 -0
  111. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/wing_cs_widget.py +0 -0
  112. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/wing_section_widget.py +0 -0
  113. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/home/__init__.py +0 -0
  114. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/__init__.py +0 -0
  115. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/__init__.py +0 -0
  116. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/flight_controls_widget.py +0 -0
  117. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_analysis_widget.py +0 -0
  118. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_segment_helper.py +0 -0
  119. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_segment_widget.py +0 -0
  120. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/__init__.py +0 -0
  121. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/__init__.py +0 -0
  122. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/__init__.py +0 -0
  123. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_2D_noise_contour.py +0 -0
  124. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_3D_noise_contour.py +0 -0
  125. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_noise_certification_contour.py +0 -0
  126. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_noise_level.py +0 -0
  127. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/__init__.py +0 -0
  128. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aerodynamic_coefficients.py +0 -0
  129. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aerodynamic_forces.py +0 -0
  130. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aircraft_aerodynamics.py +0 -0
  131. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_drag_components.py +0 -0
  132. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_lift_distribution.py +0 -0
  133. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_conditions.py +0 -0
  134. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_disc_performance.py +0 -0
  135. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_performance.py +0 -0
  136. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/common/__init__.py +0 -0
  137. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/common/plot_style.py +0 -0
  138. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/common/set_axes.py +0 -0
  139. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/create_plot_widgets.py +0 -0
  140. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/emissions/__init__.py +0 -0
  141. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/emissions/plot_emissions.py +0 -0
  142. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/__init__.py +0 -0
  143. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_altitude_sfc_weight.py +0 -0
  144. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_cell_conditions.py +0 -0
  145. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_degradation.py +0 -0
  146. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_module_C_rates.py +0 -0
  147. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_module_conditions.py +0 -0
  148. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_pack_conditions.py +0 -0
  149. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_ragone_diagram.py +0 -0
  150. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_temperature.py +0 -0
  151. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_electric_propulsor_efficiencies.py +0 -0
  152. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_propulsor_throttles.py +0 -0
  153. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/__init__.py +0 -0
  154. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_aircraft_velocities.py +0 -0
  155. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_flight_conditions.py +0 -0
  156. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_flight_trajectory.py +0 -0
  157. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/__init__.py +0 -0
  158. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_flight_forces_and_moments.py +0 -0
  159. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_lateral_stability.py +0 -0
  160. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_longitudinal_stability.py +0 -0
  161. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/__init__.py +0 -0
  162. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_air_cooled_conditions.py +0 -0
  163. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_cross_flow_heat_exchanger_conditions.py +0 -0
  164. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_reservoir_conditions.py +0 -0
  165. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_thermal_management_performance.py +0 -0
  166. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_wavy_channel_conditions.py +0 -0
  167. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/__init__.py +0 -0
  168. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/plot_load_diagram.py +0 -0
  169. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/plot_weight_breakdown.py +0 -0
  170. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/style_sheet.py +0 -0
  171. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/tab_widget.py +0 -0
  172. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/__init__.py +0 -0
  173. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/axes_gizmo.py +0 -0
  174. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/background.py +0 -0
  175. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/blueprint.py +0 -0
  176. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/camera.py +0 -0
  177. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/drag_aircraft.py +0 -0
  178. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/grid.py +0 -0
  179. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/measurement.py +0 -0
  180. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/screenshot.py +0 -0
  181. {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/geometry_helper_functions.py +0 -0
  182. {rcaide_gui-1.0.3 → 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.3
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.3
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 @@
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()
@@ -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
@@ -354,7 +354,7 @@ def _build_dict_r_with_types(v):
354
354
 
355
355
  def _build_dict_base_with_types(base):
356
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')
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
  # ----------------------------------------------------------------------------------------------------------------------
@@ -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,7 +782,7 @@ 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
787
  from RCAIDE.Input_Output.import_data import analyses_setup as _analyses_setup
774
788
 
@@ -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()
@@ -155,8 +155,8 @@ class MissionProfileWidget(QWidget):
155
155
  def __init__(self, parent=None):
156
156
  super().__init__(parent)
157
157
  # Constrain the profile card so it remains readable in compact layouts.
158
- self.setMinimumHeight(220)
159
- self.setMaximumHeight(320)
158
+ self.setMinimumHeight(160)
159
+ self.setMaximumHeight(280)
160
160
  self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
161
161
  # Each phase entry is stored as (display_name, normalized_phase_type).
162
162
  self.phases = []
@@ -493,7 +493,7 @@ class MissionSummaryTable(QTableWidget):
493
493
  self.setItem(r, c, item)
494
494
  row_h = self.rowHeight(0) if self.rowCount() else 26
495
495
  visible_rows = max(4, min(self.rowCount(), 8))
496
- self.setMinimumHeight(self.horizontalHeader().height() + (row_h * visible_rows) + 10)
496
+ self.setMinimumHeight(min(self.horizontalHeader().height() + (row_h * visible_rows) + 10, 160))
497
497
  return
498
498
 
499
499
  if not segs:
@@ -505,7 +505,7 @@ class MissionSummaryTable(QTableWidget):
505
505
  self.setItem(0, 0, item)
506
506
  self.setSpan(0, 0, 1, 6)
507
507
  row_h = max(self.rowHeight(0), 26)
508
- self.setMinimumHeight(self.horizontalHeader().height() + (row_h * 4) + 10)
508
+ self.setMinimumHeight(min(self.horizontalHeader().height() + (row_h * 4) + 10, 160))
509
509
  return
510
510
 
511
511
  rows = []
@@ -589,7 +589,7 @@ class MissionSummaryTable(QTableWidget):
589
589
  self.resizeRowsToContents()
590
590
  row_h = self.rowHeight(0) if rows else 26
591
591
  visible_rows = max(4, min(len(rows), 8))
592
- self.setMinimumHeight(self.horizontalHeader().height() + (row_h * visible_rows) + 10)
592
+ self.setMinimumHeight(min(self.horizontalHeader().height() + (row_h * visible_rows) + 10, 160))
593
593
 
594
594
  def _row_clicked(self, row, col):
595
595
  # Navigate from summary row to the matching collapsible details panel.
@@ -788,9 +788,9 @@ class MissionWidget(TabWidget):
788
788
  right_v.addWidget(segments_box, 0)
789
789
  right_v.addWidget(details_box, 1)
790
790
 
791
- left_col.setMinimumWidth(540)
791
+ left_col.setMinimumWidth(300)
792
792
  left_col.setMaximumWidth(780)
793
- right_col.setMinimumWidth(760)
793
+ right_col.setMinimumWidth(400)
794
794
 
795
795
  content_splitter = QSplitter(Qt.Orientation.Horizontal)
796
796
  content_splitter.setChildrenCollapsible(False)
@@ -799,7 +799,7 @@ class MissionWidget(TabWidget):
799
799
  content_splitter.setStretchFactor(0, 1)
800
800
  content_splitter.setStretchFactor(1, 3)
801
801
  content_splitter.setHandleWidth(10)
802
- content_splitter.setSizes([640, 1120])
802
+ content_splitter.setSizes([320, 960])
803
803
 
804
804
  main_layout.addWidget(content_splitter)
805
805
 
@@ -0,0 +1 @@
1
+ from .results_viewer import *