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.
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/PKG-INFO +1 -1
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/PKG-INFO +1 -1
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/SOURCES.txt +4 -2
- rcaide_gui-1.0.4/README.md +171 -0
- rcaide_gui-1.0.4/VERSION +1 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/main.py +9 -1
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/rcaide_io.py +27 -10
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/__init__.py +7 -5
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/geometry.py +9 -54
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/home/home.py +36 -23
- {rcaide_gui-1.0.2 → 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.2 → rcaide_gui-1.0.4}/tabs/solve/solve.py +1 -1
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/__init__.py +0 -1
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/visualize_geometry.py +167 -84
- rcaide_gui-1.0.2/README.md +0 -62
- rcaide_gui-1.0.2/VERSION +0 -1
- rcaide_gui-1.0.2/tabs/visualize_geometry/core_3d_viewer.py +0 -253
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/LICENSE +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/dependency_links.txt +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/entry_points.txt +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/requires.txt +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/RCAIDE_GUI.egg-info/top_level.txt +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/README_PyPI.md +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/animated_toggle.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/color.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/data_entry_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/image_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/common_widgets/unit_picker_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/pyproject.toml +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/setup.cfg +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/setup.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/aircraft_configs/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/aircraft_configs/aircraft_configs.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/analysis.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/aeroacoustics_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/aerodynamics_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/analysis_data_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/atmosphere_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/costs_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/energy_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/geometry_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/planets_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/propulsion_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/stability_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/analysis/widgets/weights_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/aircraft_configs.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/booms/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/booms/boom_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/cargo_bays/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/cargo_bays/cargo_bay_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/default_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/frames/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/energy_network/turbofan_network/widgets/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/fuselages/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/fuselages/fuselage_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/geometry_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/landing_gears/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/landing_gears/landing_gear_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/nacelles/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/converters/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/converters/converter_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/distributors/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/distributors/distributor_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/nacelles/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/nacelles/nacelle_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/powertrain_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/propulsors/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/propulsors/propulsor_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/sources/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/powertrain/sources/energy_source_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/vehicle_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/wings/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/frames/wings/wings_frame.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/booms/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/booms/boom_section_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/cargo_bays/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/cabin_class_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/cabin_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/fuselages/fuselage_section_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/geometry_data_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/landing_gears/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/nacelles/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/converters/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/converters/turboelectric_generator_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/distributors/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/distributors/fuel_line_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/modulators/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/modulators/esc_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/nacelles/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/nacelles/nacelle_section_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/powertrain_connector_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/powertrain_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/propulsors/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/propulsors/turbofan_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/fuel_tank_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/powertrain/sources/source_selector_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/wing_cs_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/geometry/widgets/wings/wing_section_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/home/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/flight_controls_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_analysis_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_segment_helper.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/mission/widgets/mission_segment_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_2D_noise_contour.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_3D_noise_contour.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_noise_certification_contour.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aeroacoustics/plot_noise_level.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aerodynamic_coefficients.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aerodynamic_forces.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_aircraft_aerodynamics.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_drag_components.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_lift_distribution.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_disc_performance.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/aerodynamics/plot_rotor_performance.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/common/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/common/plot_style.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/common/set_axes.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/create_plot_widgets.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/emissions/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/emissions/plot_emissions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_altitude_sfc_weight.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_cell_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_degradation.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_module_C_rates.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_module_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_pack_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_ragone_diagram.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_battery_temperature.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_electric_propulsor_efficiencies.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/energy/plot_propulsor_throttles.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_aircraft_velocities.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_flight_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/mission/plot_flight_trajectory.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_flight_forces_and_moments.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_lateral_stability.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/stability/plot_longitudinal_stability.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_air_cooled_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_cross_flow_heat_exchanger_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_reservoir_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_thermal_management_performance.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/thermal_management/plot_wavy_channel_conditions.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/plot_load_diagram.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/solve/plots/weights/plot_weight_breakdown.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/style_sheet.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/tab_widget.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/__init__.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/axes_gizmo.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/background.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/blueprint.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/camera.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/drag_aircraft.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/grid.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/measurement.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/features/screenshot.py +0 -0
- {rcaide_gui-1.0.2 → rcaide_gui-1.0.4}/tabs/visualize_geometry/geometry_helper_functions.py +0 -0
- {rcaide_gui-1.0.2 → 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
|
|
@@ -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).
|
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()
|
|
@@ -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
|
|
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.
|
|
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
|
-
|
|
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()
|