public void RenderButton() { string vessel_guid = predicted_vessel?.id.ToString(); var now = DateTime.UtcNow; if (vessel_guid == null) { orbit_description_ = null; } else { if (should_request_analysis && (Shown() || (!last_background_analysis_time_.HasValue || (now - last_background_analysis_time_) > TimeSpan.FromSeconds(2)))) { last_background_analysis_time_ = now; // Keep refreshing the analysis (albeit at a reduced rate) even when the // analyser is not shown, so that the analysis button can display an // up-to-date one-line summary. RequestAnalysis(); } OrbitAnalysis analysis = GetAnalysis(); CelestialBody primary = analysis.primary_index.HasValue ? FlightGlobals.Bodies[analysis.primary_index.Value] : null; orbit_description_ = OrbitDescription( primary, analysis.elements, analysis.recurrence, analysis.ground_track, (int?)(analysis.mission_duration / analysis.elements?.nodal_period)); } RenderButton(ButtonText(orbit_description_)); }
protected override void RenderWindow(int window_id) { string vessel_guid = predicted_vessel?.id.ToString(); if (vessel_guid == null) { return; } using (new UnityEngine.GUILayout.VerticalScope(GUILayoutWidth(8))) { if (should_request_analysis) { mission_duration_.Render(enabled: true); } var multiline_style = Style.Multiline(UnityEngine.GUI.skin.label); float two_lines = multiline_style.CalcHeight( new UnityEngine.GUIContent("1\n2"), Width(1)); float five_lines = multiline_style.CalcHeight( new UnityEngine.GUIContent("1\n2\n3\n4\n5"), Width(1)); UnityEngine.GUILayout.Label(AnalysingText(), multiline_style, UnityEngine.GUILayout.Height(two_lines)); OrbitAnalysis analysis = GetAnalysis(); if (autodetect_recurrence_ && analysis.recurrence.HasValue && analysis.recurrence.Value.number_of_revolutions != 0 && analysis.recurrence.Value.cto != 0) { revolutions_per_cycle_ = analysis.recurrence.Value.number_of_revolutions; days_per_cycle_ = analysis.recurrence.Value.cto; } UnityEngine.GUILayout.HorizontalScrollbar( value: 0, size: (float)analysis.progress_of_next_analysis, leftValue: 0, rightValue: 1); OrbitalElements? elements = analysis.elements; OrbitRecurrence? recurrence = analysis.recurrence; OrbitGroundTrack?ground_track = analysis.ground_track; double mission_duration = analysis.mission_duration; CelestialBody primary = analysis.primary_index.HasValue ? FlightGlobals.Bodies[analysis.primary_index.Value] : null; orbit_description_ = OrbitDescription( primary, elements, recurrence, ground_track, (int?)(mission_duration / elements?.nodal_period)); Style.HorizontalLine(); string duration_in_revolutions; if (elements.HasValue) { int sidereal_revolutions = (int)(mission_duration / elements.Value.sidereal_period); int nodal_revolutions = (int)(mission_duration / elements.Value.nodal_period); int anomalistic_revolutions = (int)(mission_duration / elements.Value.anomalistic_period); int ground_track_cycles = analysis.recurrence.HasValue ? nodal_revolutions / analysis.recurrence. Value.number_of_revolutions : 0; string duration_in_ground_track_cycles = ground_track_cycles > 0 ? $" ({ground_track_cycles.FormatN(0)} ground track cycles)" : ""; duration_in_revolutions = $@"{ sidereal_revolutions.FormatN(0)} sidereal revolutions{"\n"}{ nodal_revolutions.FormatN(0)} nodal revolutions{ duration_in_ground_track_cycles}{"\n"}{ anomalistic_revolutions.FormatN(0)} anomalistic revolutions"; } else { duration_in_revolutions = "could not determine elements; mission duration may be shorter " + "than a revolution, or trajectory may not be gravitationally bound"; if (primary != null) { duration_in_revolutions += $" to {primary.NameWithArticle()}."; } multiline_style = Style.Warning(multiline_style); } string analysis_description = primary == null ? $@"{predicted_vessel.vesselName} is not gravitationally bound over { mission_duration.FormatDuration(show_seconds: false)}" : $@"Orbit of {predicted_vessel.vesselName} with respect to { primary.NameWithArticle()} over { mission_duration.FormatDuration(show_seconds : false)}:{"\n"}{ duration_in_revolutions}"; UnityEngine.GUILayout.Label( analysis_description, multiline_style, UnityEngine.GUILayout.Height(five_lines)); Style.HorizontalLine(); RenderOrbitalElements(elements, primary); Style.HorizontalLine(); RenderOrbitRecurrence(recurrence, primary); Style.HorizontalLine(); RenderOrbitGroundTrack(ground_track, primary); } UnityEngine.GUI.DragWindow(); }
protected override void RenderWindow(int window_id) { string vessel_guid = predicted_vessel?.id.ToString(); if (vessel_guid == null) { return; } using (new UnityEngine.GUILayout.VerticalScope(GUILayoutWidth(12))) { if (should_request_analysis) { mission_duration_.Render(enabled: true); } var multiline_style = Style.Multiline(UnityEngine.GUI.skin.label); float two_lines = multiline_style.CalcHeight( new UnityEngine.GUIContent("1一\n2二"), Width(1)); float five_lines = multiline_style.CalcHeight( new UnityEngine.GUIContent("1一\n2二\n3三\n4四\n5五"), Width(1)); UnityEngine.GUILayout.Label(AnalysingText(), multiline_style, UnityEngine.GUILayout.Height(two_lines)); OrbitAnalysis analysis = GetAnalysis(); if (autodetect_recurrence_ && analysis.recurrence.HasValue && analysis.recurrence.Value.number_of_revolutions != 0 && analysis.recurrence.Value.cto != 0) { revolutions_per_cycle_ = analysis.recurrence.Value.number_of_revolutions; days_per_cycle_ = analysis.recurrence.Value.cto; } UnityEngine.GUILayout.HorizontalScrollbar( value: 0, size: (float)analysis.progress_of_next_analysis, leftValue: 0, rightValue: 1); OrbitalElements? elements = analysis.elements; OrbitRecurrence? recurrence = analysis.recurrence; OrbitGroundTrack?ground_track = analysis.ground_track; double mission_duration = analysis.mission_duration; CelestialBody primary = analysis.primary_index.HasValue ? FlightGlobals.Bodies[ analysis.primary_index.Value] : null; orbit_description_ = OrbitDescription(primary, elements, recurrence, ground_track, (int?)(mission_duration / elements?.nodal_period)); Style.HorizontalLine(); string duration_in_revolutions; if (elements.HasValue) { int sidereal_revolutions = (int)(mission_duration / elements.Value.sidereal_period); int nodal_revolutions = (int)(mission_duration / elements.Value.nodal_period); int anomalistic_revolutions = (int)(mission_duration / elements.Value.anomalistic_period); int ground_track_cycles = analysis.recurrence.HasValue ? nodal_revolutions / analysis.recurrence.Value. number_of_revolutions : 0; string duration_in_ground_track_cycles = ground_track_cycles > 0 ? Localizer.Format( "#Principia_OrbitAnalyser_Duration_GroundTrackCycles", ground_track_cycles.FormatN(0)) : ""; duration_in_revolutions = Localizer.Format( "#Principia_OrbitAnalyser_Duration_Revolutions", sidereal_revolutions.FormatN(0), nodal_revolutions.FormatN(0), duration_in_ground_track_cycles, anomalistic_revolutions.FormatN(0)); } else { if (primary == null) { duration_in_revolutions = Localizer.Format( "#Principia_OrbitAnalyser_Warning_NoElements1"); } else { duration_in_revolutions = Localizer.Format( "#Principia_OrbitAnalyser_Warning_NoElements2", primary.NameWithArticle()); } multiline_style = Style.Warning(multiline_style); } string analysis_description = primary == null ? Localizer.Format( "#Principia_OrbitAnalyser_Warning_NoPrimary", predicted_vessel.vesselName, mission_duration.FormatDuration(show_seconds: false)) : Localizer.Format( "#Principia_OrbitAnalyser_AnalysisDescription", predicted_vessel.vesselName, primary.NameWithArticle(), mission_duration.FormatDuration(show_seconds: false), duration_in_revolutions); UnityEngine.GUILayout.Label(analysis_description, multiline_style, UnityEngine.GUILayout.Height(five_lines)); Style.HorizontalLine(); RenderLowestAltitude(elements, primary); Style.HorizontalLine(); UnityEngine.GUILayout.Label( Localizer.Format("#Principia_OrbitAnalyser_Elements_MeanElements")); RenderOrbitalElements(elements, primary); Style.HorizontalLine(); UnityEngine.GUILayout.Label( Localizer.Format("#Principia_OrbitAnalyser_GroundTrack")); RenderOrbitRecurrence(recurrence, primary); Style.LineSpacing(); RenderOrbitGroundTrack(ground_track, primary); } UnityEngine.GUI.DragWindow(); }
protected override void RenderWindow(int window_id) { using (new UnityEngine.GUILayout.VerticalScope(GUILayoutWidth(8))) { Vessel vessel = FlightGlobals.ActiveVessel; if (plugin == IntPtr.Zero || vessel == null || !plugin.HasVessel(vessel.id.ToString())) { Hide(); return; } CelestialBody primary = adapter_.plotting_frame_selector_.selected_celestial; mission_duration_.Render(enabled: true); var multiline_style = Style.Multiline(UnityEngine.GUI.skin.label); float two_lines = multiline_style.CalcHeight( new UnityEngine.GUIContent("1\n2"), Width(1)); float five_lines = multiline_style.CalcHeight( new UnityEngine.GUIContent("1\n2\n3\n4\n5"), Width(1)); UnityEngine.GUILayout.Label( $@"Analysing orbit of {vessel.vesselName} with respect to { primary.NameWithArticle()}...", multiline_style, UnityEngine.GUILayout.Height(two_lines)); OrbitAnalysis analysis = plugin.VesselRefreshAnalysis( vessel.id.ToString(), primary.flightGlobalsIndex, mission_duration_.value, autodetect_recurrence_ ? null : (int?)revolutions_per_cycle_, autodetect_recurrence_ ? null : (int?)days_per_cycle_, ground_track_revolution_); if (autodetect_recurrence_ && analysis.recurrence.number_of_revolutions != 0 && analysis.recurrence.cto != 0) { revolutions_per_cycle_ = analysis.recurrence.number_of_revolutions; days_per_cycle_ = analysis.recurrence.cto; } UnityEngine.GUILayout.HorizontalScrollbar( value: 0, size: (float)analysis.progress_of_next_analysis, leftValue: 0, rightValue: 1); OrbitalElements? elements = null; OrbitRecurrence? recurrence = null; OrbitGroundTrack?ground_track = null; double mission_duration = analysis.mission_duration; if (analysis.elements_has_value) { elements = analysis.elements; } if (analysis.recurrence_has_value) { recurrence = analysis.recurrence; } if (analysis.ground_track_has_value) { ground_track = analysis.ground_track; } primary = FlightGlobals.Bodies[analysis.primary_index]; Style.HorizontalLine(); string duration_in_revolutions; if (elements.HasValue) { int sidereal_revolutions = (int)(mission_duration / elements.Value.sidereal_period); int nodal_revolutions = (int)(mission_duration / elements.Value.nodal_period); int anomalistic_revolutions = (int)(mission_duration / elements.Value.anomalistic_period); int ground_track_cycles = analysis.recurrence_has_value ? nodal_revolutions / analysis.recurrence.number_of_revolutions : 0; string duration_in_ground_track_cycles = ground_track_cycles > 0 ? $" ({ground_track_cycles.FormatN(0)} ground track cycles)" : ""; duration_in_revolutions = $@"{ sidereal_revolutions.FormatN(0)} sidereal revolutions{"\n"}{ nodal_revolutions.FormatN(0)} nodal revolutions{ duration_in_ground_track_cycles}{"\n"}{ anomalistic_revolutions.FormatN(0)} anomalistic revolutions"; } else { duration_in_revolutions = "could not determine elements; mission duration may be shorter " + "than a revolution, or trajectory may not be gravitationally " + $"bound to {primary.NameWithArticle()}."; multiline_style = Style.Warning(multiline_style); } string analysis_description = $@"Orbit of {vessel.vesselName} with respect to { primary.NameWithArticle()} over { mission_duration.FormatDuration(show_seconds : false)}:{"\n"}{ duration_in_revolutions}"; UnityEngine.GUILayout.Label( analysis_description, multiline_style, UnityEngine.GUILayout.Height(five_lines)); Style.HorizontalLine(); RenderOrbitalElements(elements); Style.HorizontalLine(); RenderOrbitRecurrence(recurrence, primary); Style.HorizontalLine(); RenderOrbitGroundTrack(ground_track, primary); } UnityEngine.GUI.DragWindow(); }