Example #1
0
 internal bool TryParsePreviousCoastDuration(string str, out double value)
 {
     value = 0;
     if (!FlightPlanner.TryParseTimeSpan(str, out TimeSpan ts))
     {
         return(false);
     }
     value = ts.TotalSeconds;
     return(true);
 }
Example #2
0
        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[] { }));
        }
Example #3
0
 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();
 }
Example #4
0
 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();
 }
Example #5
0
            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);
            }
Example #6
0
            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);
            }
Example #7
0
 internal string FormatPreviousCoastDuration(double value)
 {
     return(FlightPlanner.FormatPositiveTimeSpan(TimeSpan.FromSeconds(value)));
 }
Example #8
0
            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);
            }