internal bool TryParsePreviousCoastDuration(string str, out double value) { value = 0; if (!FlightPlanner.TryParseTimeSpan(str, out TimeSpan ts)) { return(false); } value = ts.TotalSeconds; return(true); }
private static IList <Locationwp> GetCurrentFlightPlan(FlightPlanner flightPlanner) { if (flightPlanner == null) { return(new List <Locationwp>()); } var getFlightPlanLocations = flightPlanner.GetType().GetMethod("GetFlightPlanLocations", BindingFlags.Instance | BindingFlags.NonPublic); return((IList <Locationwp>)getFlightPlanLocations.Invoke(flightPlanner, new object[] { })); }
public MainWindow(PrincipiaPluginAdapter adapter, FlightPlanner flight_planner, ReferenceFrameSelector plotting_frame_selector, PredictedVessel predicted_vessel) : base(adapter) { adapter_ = adapter; flight_planner_ = flight_planner; plotting_frame_selector_ = plotting_frame_selector; predicted_vessel_ = predicted_vessel; Show(); }
public BurnEditor(PrincipiaPluginAdapter adapter, IntPtr plugin, Vessel vessel, double initial_time) { Δv_tangent_ = new DifferentialSlider(label: "Δv tangent", unit: "m / s", log10_lower_rate: Log10ΔvLowerRate, log10_upper_rate: Log10ΔvUpperRate, text_colour: XKCDColors.NeonYellow); Δv_normal_ = new DifferentialSlider(label: "Δv normal", unit: "m / s", log10_lower_rate: Log10ΔvLowerRate, log10_upper_rate: Log10ΔvUpperRate, text_colour: XKCDColors.AquaBlue); Δv_binormal_ = new DifferentialSlider(label: "Δv binormal", unit: "m / s", log10_lower_rate: Log10ΔvLowerRate, log10_upper_rate: Log10ΔvUpperRate, text_colour: XKCDColors.PurplePink); initial_time_ = new DifferentialSlider( label: "t initial", unit: null, log10_lower_rate: Log10TimeLowerRate, log10_upper_rate: Log10TimeUpperRate, min_value: 0, max_value: double.PositiveInfinity, formatter: value => FlightPlanner.FormatTimeSpan( TimeSpan.FromSeconds( Planetarium.GetUniversalTime() - value))); initial_time_.value = initial_time; reference_frame_selector_ = new ReferenceFrameSelector( adapter, plugin, ReferenceFrameChanged, "Manœuvring frame"); plugin_ = plugin; vessel_ = vessel; adapter_ = adapter; reference_frame_selector_.Reset( adapter_.plotting_frame_selector_.get().FrameParameters()); ComputeEngineCharacteristics(); }
private KSP.UI.Screens.Mapview.MapNode MakePoolNode() { var new_node = KSP.UI.Screens.Mapview.MapNode.Create( "apsis", // If we see this colour, something has gone wrong. XKCDColors.Pale, pixelSize: 32, hoverable: true, pinnable: true, blocksInput: true); new_node.OnClick += (KSP.UI.Screens.Mapview.MapNode node, Mouse.Buttons buttons) => { if (buttons == Mouse.Buttons.Left) { MapNodeProperties properties = properties_[node]; if (PlanetariumCamera.fetch.target != properties.associated_map_object) { PlanetariumCamera.fetch.SetTarget( properties.associated_map_object); } } }; new_node.OnUpdateVisible += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.IconData icon) => { icon.visible = properties_[node].visible; icon.color = properties_[node].colour; }; new_node.OnUpdateType += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.TypeData type) => { MapNodeProperties properties = properties_[node]; type.oType = properties.object_type; switch (properties.object_type) { case MapObject.ObjectType.PatchTransition: type.pType = KSP.UI.Screens.Mapview.MapNode.PatchTransitionNodeType.Impact; break; case MapObject.ObjectType.ApproachIntersect: type.aType = KSP.UI.Screens.Mapview.MapNode.ApproachNodeType. CloseApproachOwn; break; } }; new_node.OnUpdateCaption += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.CaptionData caption) => { var properties = properties_[node]; string source; switch (properties.source) { case NodeSource.FlightPlan: source = "Planned"; break; case NodeSource.Prediction: source = "Predicted"; break; default: throw Log.Fatal($"Unexpected node source {properties.source}"); } switch (properties.object_type) { case MapObject.ObjectType.Periapsis: case MapObject.ObjectType.Apoapsis: { string apsis_name = properties.object_type == MapObject.ObjectType.Periapsis ? "Periapsis" : "Apoapsis"; CelestialBody celestial = properties.reference_frame.selected_celestial; Vector3d position = properties.world_position; double speed = properties.velocity.magnitude; caption.Header = $@"{source} {celestial.name} {apsis_name} :\n{ celestial.GetAltitude(position):N0} m".ToString( Culture.culture); caption.captionLine2 = $"{speed:N0} m/s".ToString(Culture.culture); break; } case MapObject.ObjectType.AscendingNode: case MapObject.ObjectType.DescendingNode: { string node_name = properties.object_type == MapObject.ObjectType.AscendingNode ? "Ascending Node" : "Descending Node"; string plane = properties.reference_frame.ReferencePlaneDescription(); caption.Header = $"{source} {node_name} :\n{plane}"; caption.captionLine2 = $"{properties.velocity.z:N0} m/s".ToString(Culture.culture); break; } case MapObject.ObjectType.ApproachIntersect: { Vessel target_vessel = properties.reference_frame.target_override; double separation = (target_vessel.GetWorldPos3D() - properties.world_position).magnitude; double speed = properties.velocity.magnitude; caption.Header = $@"{source} Target Approach : {separation:N0} m".ToString( Culture.culture); caption.captionLine2 = $"{speed:N0} m/s".ToString(Culture.culture); break; } case MapObject.ObjectType.PatchTransition: { CelestialBody celestial = properties.reference_frame.selected_celestial; caption.Header = $"{source} {celestial.name} Impact"; caption.captionLine1 = ""; caption.captionLine2 = ""; break; } } if (properties.object_type != MapObject.ObjectType.PatchTransition) { caption.captionLine1 = "T" + FlightPlanner.FormatTimeSpan(TimeSpan.FromSeconds( Planetarium.GetUniversalTime() - properties.time)); } }; new_node.OnUpdatePosition += (KSP.UI.Screens.Mapview.MapNode node) => ScaledSpace.LocalToScaledSpace(properties_[node].world_position); return(new_node); }
private KSP.UI.Screens.Mapview.MapNode MakePoolNode() { var new_node = KSP.UI.Screens.Mapview.MapNode.Create( "apsis", // If we see this colour, something has gone wrong. XKCDColors.Pale, pixelSize: 32, hoverable: true, pinnable: true, blocksInput: true); new_node.OnClick += (KSP.UI.Screens.Mapview.MapNode node, Mouse.Buttons buttons) => { if (buttons == Mouse.Buttons.Left) { if (properties_[node].vessel != null) { if (PlanetariumCamera.fetch.target != properties_[node].vessel.mapObject) { PlanetariumCamera.fetch.SetTarget( properties_[node].vessel.mapObject); } } else if (PlanetariumCamera.fetch.target != properties_[node].celestial.MapObject) { PlanetariumCamera.fetch.SetTarget( properties_[node].celestial.MapObject); } } }; new_node.OnUpdateVisible += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.IconData icon) => { if (!properties_[node].visible) { icon.visible = false; return; } CelestialBody celestial = properties_[node].celestial; UnityEngine.Color colour = celestial.orbit == null ? XKCDColors.SunshineYellow : celestial.orbitDriver.Renderer.nodeColor; colour.a = 1; icon.visible = true; if (properties_[node].object_type == MapObject.ObjectType.Periapsis && properties_[node].celestial.GetAltitude( properties_[node].world_position) < 0) { // Make sure we see impacts. colour = XKCDColors.Orange; } if (properties_[node].object_type == MapObject.ObjectType.ApproachIntersect) { colour = XKCDColors.Chartreuse; } icon.color = colour; }; new_node.OnUpdateType += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.TypeData type) => { if (properties_[node].object_type == MapObject.ObjectType.Periapsis && properties_[node].celestial.GetAltitude( properties_[node].world_position) < 0) { type.oType = MapObject.ObjectType.PatchTransition; type.pType = KSP.UI.Screens.Mapview.MapNode.PatchTransitionNodeType.Impact; } else if (properties_[node].object_type == MapObject.ObjectType.ApproachIntersect) { type.oType = properties_[node].object_type; type.aType = KSP.UI.Screens.Mapview.MapNode.ApproachNodeType .CloseApproachOwn; } else { type.oType = properties_[node].object_type; } }; new_node.OnUpdateCaption += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.CaptionData caption) => { if (properties_[node].object_type == MapObject.ObjectType.Periapsis || properties_[node].object_type == MapObject.ObjectType.Apoapsis) { String name = properties_[node].object_type == MapObject.ObjectType.Periapsis ? "Periapsis" : "Apoapsis"; caption.Header = properties_[node].celestial.name + " " + name + " : <color=" + XKCDColors.HexFormat.Chartreuse + ">" + properties_[node].celestial.GetAltitude( properties_[node].world_position).ToString( "N0", Culture.culture) + " m</color>"; caption.captionLine2 = properties_[node].velocity.magnitude.ToString("N0", Culture.culture) + " m/s"; } else if (properties_[node].object_type == MapObject.ObjectType.AscendingNode || properties_[node].object_type == MapObject.ObjectType.DescendingNode) { String name = properties_[node].object_type == MapObject.ObjectType.AscendingNode ? "Ascending Node" : "Descending Node"; caption.Header = name; caption.captionLine2 = properties_[node].velocity.z.ToString("N0", Culture.culture) + " m/s out of plane"; } else if (properties_[node].object_type == MapObject.ObjectType.ApproachIntersect) { caption.Header = "Target Approach : <color=" + XKCDColors.HexFormat.Chartreuse + ">" + (properties_[node].vessel.GetWorldPos3D() - properties_[node].world_position) .magnitude.ToString("N0", Culture.culture) + " m</color>"; caption.captionLine2 = properties_[node].velocity.magnitude.ToString("N0", Culture.culture) + " m/s"; } caption.captionLine1 = "T" + FlightPlanner.FormatTimeSpan(TimeSpan.FromSeconds( Planetarium.GetUniversalTime() - properties_[node].time)); if (properties_[node].celestial.GetAltitude( properties_[node].world_position) < 0 && properties_[node].object_type == MapObject.ObjectType.Periapsis) { caption.Header = properties_[node].celestial.name + " Impact<color=" + XKCDColors.HexFormat.Chartreuse + "></color>"; caption.captionLine1 = ""; caption.captionLine2 = ""; } switch (properties_[node].source) { case NodeSource.FLIGHT_PLAN: caption.Header = "Planned " + caption.Header; break; case NodeSource.PREDICTION: caption.Header = "Predicted " + caption.Header; break; default: throw Log.Fatal("Unexpected node source " + properties_[node].source); } }; new_node.OnUpdatePosition += (KSP.UI.Screens.Mapview.MapNode node) => ScaledSpace.LocalToScaledSpace( properties_[node].world_position); return(new_node); }
internal string FormatPreviousCoastDuration(double value) { return(FlightPlanner.FormatPositiveTimeSpan(TimeSpan.FromSeconds(value))); }
private void AddMapNodeToPool() { var new_node = KSP.UI.Screens.Mapview.MapNode.Create( "apsis", // If we see this colour, something has gone wrong. XKCDColors.Pale, pixelSize: 32, hoverable: true, pinnable: true, blocksInput: true); new_node.OnUpdateVisible += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.IconData icon) => { CelestialBody celestial = properties_[node].celestial; UnityEngine.Color colour = celestial.orbit == null ? XKCDColors.SunshineYellow : celestial.orbitDriver.Renderer.nodeColor; colour.a = 1; icon.visible = true; if (properties_[node].celestial.GetAltitude( properties_[node].world_position) < 0) { // Make sure we see impacts. colour = XKCDColors.Orange; } icon.color = colour; }; new_node.OnUpdateType += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.TypeData type) => { if (properties_[node].celestial.GetAltitude( properties_[node].world_position) < 0) { type.oType = MapObject.ObjectType.PatchTransition; type.pType = KSP.UI.Screens.Mapview.MapNode.PatchTransitionNodeType.Impact; } else { type.oType = properties_[node].object_type; } }; new_node.OnUpdateCaption += (KSP.UI.Screens.Mapview.MapNode node, KSP.UI.Screens.Mapview.MapNode.CaptionData caption) => { String name = properties_[node].object_type == MapObject.ObjectType.Periapsis ? "Periapsis" : "Apoapsis"; caption.Header = properties_[node].celestial.name + " " + name + " : <color=" + XKCDColors.HexFormat.Chartreuse + ">" + properties_[node].celestial.GetAltitude( properties_[node].world_position).ToString("N0", Culture.culture) + " m</color>"; caption.captionLine1 = "T" + FlightPlanner.FormatTimeSpan(TimeSpan.FromSeconds( Planetarium.GetUniversalTime() - properties_[node].time)); if (properties_[node].celestial.GetAltitude( properties_[node].world_position) < 0) { caption.Header = properties_[node].celestial.name + " Impact<color=" + XKCDColors.HexFormat.Chartreuse + "></color>"; caption.captionLine1 = ""; } switch (properties_[node].source) { case NodeSource.FLIGHT_PLAN: caption.Header = "Planned " + caption.Header; break; case NodeSource.PREDICTION: caption.Header = "Predicted " + caption.Header; break; default: throw Log.Fatal("Unexpected node source " + properties_[node].source); } }; new_node.OnUpdatePosition += (KSP.UI.Screens.Mapview.MapNode node) => ScaledSpace.LocalToScaledSpace( properties_[node].world_position); nodes_.Add(new_node); }