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.
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/PKG-INFO +1 -1
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/PKG-INFO +1 -1
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/SOURCES.txt +4 -2
- rcaide_gui-1.0.4/VERSION +1 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/main.py +9 -1
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/rcaide_io.py +23 -6
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/__init__.py +7 -5
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/geometry.py +9 -54
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/home/home.py +36 -23
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/mission.py +8 -8
- rcaide_gui-1.0.4/tabs/results_viewer/__init__.py +1 -0
- rcaide_gui-1.0.4/tabs/results_viewer/results_viewer.py +861 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/solve.py +1 -1
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/__init__.py +0 -1
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/visualize_geometry.py +167 -84
- rcaide_gui-1.0.3/VERSION +0 -1
- rcaide_gui-1.0.3/tabs/visualize_geometry/core_3d_viewer.py +0 -253
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/LICENSE +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/dependency_links.txt +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/entry_points.txt +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/requires.txt +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/top_level.txt +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/README.md +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/README_PyPI.md +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/animated_toggle.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/color.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/data_entry_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/image_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/common_widgets/unit_picker_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/pyproject.toml +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/setup.cfg +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/setup.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/aircraft_configs/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/aircraft_configs/aircraft_configs.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/analysis.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/aeroacoustics_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/aerodynamics_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/analysis_data_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/atmosphere_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/costs_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/energy_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/geometry_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/planets_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/propulsion_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/stability_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/analysis/widgets/weights_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/aircraft_configs.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/booms/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/booms/boom_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/cargo_bays/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/cargo_bays/cargo_bay_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/default_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/frames/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/widgets/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/fuselages/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/fuselages/fuselage_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/geometry_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/landing_gears/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/landing_gears/landing_gear_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/nacelles/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/converters/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/converters/converter_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/distributors/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/distributors/distributor_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/nacelles/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/nacelles/nacelle_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/powertrain_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/propulsors/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/propulsors/propulsor_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/sources/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/sources/energy_source_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/vehicle_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/wings/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/frames/wings/wings_frame.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/booms/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/booms/boom_section_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/cargo_bays/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/cabin_class_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/cabin_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/fuselage_section_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/geometry_data_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/landing_gears/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/nacelles/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/converters/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/converters/turboelectric_generator_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/distributors/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/distributors/fuel_line_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/modulators/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/modulators/esc_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/nacelles/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/nacelles/nacelle_section_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/powertrain_connector_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/powertrain_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/propulsors/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/propulsors/turbofan_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/fuel_tank_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/source_selector_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/wing_cs_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/wing_section_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/home/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/flight_controls_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_analysis_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_segment_helper.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_segment_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_2D_noise_contour.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_3D_noise_contour.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_noise_certification_contour.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_noise_level.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aerodynamic_coefficients.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aerodynamic_forces.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aircraft_aerodynamics.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_drag_components.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_lift_distribution.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_disc_performance.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_performance.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/common/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/common/plot_style.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/common/set_axes.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/create_plot_widgets.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/emissions/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/emissions/plot_emissions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_altitude_sfc_weight.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_cell_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_degradation.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_module_C_rates.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_module_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_pack_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_ragone_diagram.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_temperature.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_electric_propulsor_efficiencies.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_propulsor_throttles.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_aircraft_velocities.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_flight_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_flight_trajectory.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_flight_forces_and_moments.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_lateral_stability.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_longitudinal_stability.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_air_cooled_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_cross_flow_heat_exchanger_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_reservoir_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_thermal_management_performance.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_wavy_channel_conditions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/plot_load_diagram.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/plot_weight_breakdown.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/style_sheet.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/tab_widget.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/__init__.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/axes_gizmo.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/background.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/blueprint.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/camera.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/drag_aircraft.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/grid.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/measurement.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/screenshot.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/tabs/visualize_geometry/geometry_helper_functions.py +0 -0
- {rcaide_gui-1.0.3 → rcaide_gui-1.0.4}/utilities.py +0 -0
|
@@ -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
|
rcaide_gui-1.0.4/VERSION
ADDED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
9
|
-
from . import
|
|
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, "
|
|
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
|
-
|
|
166
|
-
self.
|
|
167
|
-
self.
|
|
168
|
-
|
|
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 =
|
|
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
|
|
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(
|
|
243
|
+
body_layout.setContentsMargins(30, 40, 30, 40)
|
|
245
244
|
body_layout.setSpacing(30)
|
|
246
|
-
body_layout.setAlignment(Qt.AlignmentFlag.
|
|
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(
|
|
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.
|
|
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,
|
|
322
|
-
mission_layout.setSpacing(
|
|
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(
|
|
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(
|
|
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,
|
|
477
|
-
self._normal_mission_size = QSize(550,
|
|
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.
|
|
481
|
-
self.
|
|
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.
|
|
521
|
-
self.mission_frame.
|
|
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(
|
|
159
|
-
self.setMaximumHeight(
|
|
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(
|
|
791
|
+
left_col.setMinimumWidth(300)
|
|
792
792
|
left_col.setMaximumWidth(780)
|
|
793
|
-
right_col.setMinimumWidth(
|
|
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([
|
|
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 *
|