getSolver() public static method

Convenience function.
public static getSolver ( ) : PatchedConicSolver
return PatchedConicSolver
コード例 #1
0
ファイル: PreciseNode.cs プロジェクト: mwerle/ksp-precisenode
        /// <summary>
        /// Overridden function from MonoBehavior
        /// </summary>
        internal void Update()
        {
            if (!FlightDriver.Pause && canShowNodeEditor)
            {
                PatchedConicSolver solver = NodeTools.getSolver();
                if (solver.maneuverNodes.Count > 0)
                {
                    if (!curState.hasNode() || !solver.maneuverNodes.Contains(curState.node))
                    {
                        // get the first one if we can't find the current or it's null
                        curState = new NodeManager(solver.maneuverNodes[0]);
                    }
                    else if (curState.hasNode())
                    {
                        curState.updateNode();
                        curState = curState.nextState();
                    }
                }
                else
                {
                    if (curState.hasNode())
                    {
                        curState = new NodeManager();
                        curState.resizeClockWindow = true;
                    }
                }
                processKeyInput();
            }

            intuitiveNodeGizmosManager.OnUpdate();
        }
コード例 #2
0
        /// <summary>
        /// Draws the Conics window.
        /// </summary>
        /// <param name="id">Identifier.</param>
        public void drawConicsWindow(int id)
        {
            PatchedConicSolver solver = NodeTools.getSolver();
            Color defaultColor        = GUI.backgroundColor;

            GUILayout.BeginVertical();

            // Conics mode controls
            GUILayout.BeginHorizontal();
            GUILayout.Label("Conics mode: ", GUILayout.Width(100));
            GUIParts.drawButton("0", (options.conicsMode == 0?Color.yellow:defaultColor), delegate() { options.setConicsMode(0); });
            GUIParts.drawButton("1", (options.conicsMode == 1?Color.yellow:defaultColor), delegate() { options.setConicsMode(1); });
            GUIParts.drawButton("2", (options.conicsMode == 2?Color.yellow:defaultColor), delegate() { options.setConicsMode(2); });
            GUIParts.drawButton("3", (options.conicsMode == 3?Color.yellow:defaultColor), delegate() { options.setConicsMode(3); });
            GUIParts.drawButton("4", (options.conicsMode == 4?Color.yellow:defaultColor), delegate() { options.setConicsMode(4); });
            GUILayout.EndHorizontal();

            // conics patch limit editor.
            GUILayout.BeginHorizontal();
            GUILayout.Label("Change Conics Samples", GUILayout.Width(200));
            GUIParts.drawButton("-", Color.red, delegate() { solver.DecreasePatchLimit(); });
            GUIParts.drawButton("+", Color.red, delegate() { solver.IncreasePatchLimit(); });
            GUILayout.EndHorizontal();

            GUILayout.EndVertical();
            GUI.DragWindow();
        }
コード例 #3
0
ファイル: PreciseNode.cs プロジェクト: mwerle/ksp-precisenode
        private void drawTripWindow()
        {
            PatchedConicSolver solver = NodeTools.getSolver();

            GUILayout.BeginVertical();
            if (solver.maneuverNodes.Count < 1)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label("No nodes to show.", GUILayout.Width(200));
                GUILayout.EndHorizontal();
            }
            else
            {
                double total   = 0.0;
                double timeNow = Planetarium.GetUniversalTime();

                GUILayout.BeginHorizontal();
                GUILayout.Label("", GUILayout.Width(60));
                GUILayout.Label("Δv", GUILayout.Width(90));
                GUILayout.Label("Time Until", GUILayout.Width(200));
                GUILayout.Label("", GUILayout.Width(120));
                GUILayout.EndHorizontal();

                foreach (ManeuverNode curNode in solver.maneuverNodes)
                {
                    int    idx      = solver.maneuverNodes.IndexOf(curNode);
                    double timeDiff = curNode.UT - timeNow;
                    GUILayout.BeginHorizontal();
                    GUILayout.Label("Node " + (idx + 1), GUILayout.Width(60));
                    GUILayout.Label(curNode.DeltaV.magnitude.ToString("F2") + " m/s", GUILayout.Width(90));
                    GUILayout.Label(timeDiff.convertUTtoHumanDuration(), GUILayout.Width(200));
                    if (idx > 0)
                    {
                        GUIParts.drawButton("▲ Merge", Color.white, () => {
                            // schedule for next layout pass to not mess up maneuver nodes while iterating over them
                            scheduledForLayout.Add(() => {
                                solver.maneuverNodes[idx].mergeNodeDown();
                            });
                        });
                    }
                    GUILayout.EndHorizontal();
                    total += curNode.DeltaV.magnitude;
                }

                GUILayout.BeginHorizontal();
                GUILayout.Label("Total", GUILayout.Width(60));
                GUILayout.Label(total.ToString("F2") + " m/s", GUILayout.Width(90));
                GUILayout.Label("", GUILayout.Width(200));
                GUILayout.EndHorizontal();
            }

            GUILayout.EndVertical();
            GUI.DragWindow();
        }
コード例 #4
0
ファイル: Extensions.cs プロジェクト: lexxb/ksp-precisenode
        // calculation function for mergeNodeDown
        private static Orbit findPreviousOrbit(this ManeuverNode n)
        {
            PatchedConicSolver p = NodeTools.getSolver();
            int idx = p.maneuverNodes.IndexOf(n);

            if (idx > 0)
            {
                return(p.maneuverNodes[idx - 1].patch);
            }
            else
            {
                return(FlightGlobals.ActiveVessel.orbit);
            }
        }
コード例 #5
0
        public void drawTripWindow(int id)
        {
            PatchedConicSolver solver = NodeTools.getSolver();

            GUILayout.BeginVertical();
            if (solver.maneuverNodes.Count < 1)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label("No nodes to show.", GUILayout.Width(200));
                GUILayout.EndHorizontal();
            }
            else
            {
                double total   = 0.0;
                double timeNow = Planetarium.GetUniversalTime();

                GUILayout.BeginHorizontal();
                GUILayout.Label("", GUILayout.Width(60));
                GUILayout.Label("Δv", GUILayout.Width(90));
                GUILayout.Label("Time Until", GUILayout.Width(200));
                GUILayout.Label("", GUILayout.Width(120));
                GUILayout.EndHorizontal();

                foreach (ManeuverNode curNode in solver.maneuverNodes)
                {
                    int    idx      = solver.maneuverNodes.IndexOf(curNode);
                    double timeDiff = curNode.UT - timeNow;
                    GUILayout.BeginHorizontal();
                    GUILayout.Label("Node " + idx, GUILayout.Width(60));
                    GUILayout.Label(curNode.DeltaV.magnitude.ToString("F2") + "m/s", GUILayout.Width(90));
                    GUILayout.Label(NodeTools.convertUTtoHumanDuration(timeDiff), GUILayout.Width(200));
                    // these will be scheduled for during the next layout pass
                    if (idx > 0)
                    {
                        GUIParts.drawButton("merge ▲", Color.white, delegate() { scheduledForLayout.Add(new Action(() => { NodeTools.mergeNodeDown(solver.maneuverNodes[idx]); })); });
                    }
                    GUILayout.EndHorizontal();
                    total += curNode.DeltaV.magnitude;
                }

                GUILayout.BeginHorizontal();
                GUILayout.Label("Total", GUILayout.Width(60));
                GUILayout.Label(total.ToString("F2") + "m/s", GUILayout.Width(90));
                GUILayout.Label("", GUILayout.Width(200));
                GUILayout.EndHorizontal();
            }

            GUILayout.EndVertical();
            GUI.DragWindow();
        }
コード例 #6
0
ファイル: PreciseNode.cs プロジェクト: mwerle/ksp-precisenode
        private void drawManeuverPager()
        {
            PatchedConicSolver solver = NodeTools.getSolver();

            int idx   = solver.maneuverNodes.IndexOf(curState.node);
            int count = solver.maneuverNodes.Count;

            GUILayout.BeginHorizontal();

            GUI.enabled = count > 1;
            if (GUILayout.Button("◀"))
            {
                if (idx > 0)
                {
                    curState.nextNode = solver.maneuverNodes[idx - 1];
                }
                else
                {
                    curState.nextNode = solver.maneuverNodes[count - 1];
                }
                curState.clearMemory();
            }
            GUI.enabled = true;
            if (GUILayout.Button("Node " + (idx + 1)))
            {
                MapView.MapCamera.SetTarget(curState.node.scaledSpaceTarget);
            }
            GUIParts.drawButton("Del", Color.red, () => {
                curState.node.RemoveSelf();
                //solver.RemoveManeuverNode(curState.node);
                curState.clearMemory();
            });
            GUI.enabled = count > 1;
            if (GUILayout.Button("▶"))
            {
                if (idx < (count - 1))
                {
                    curState.nextNode = solver.maneuverNodes[idx + 1];
                }
                else
                {
                    curState.nextNode = solver.maneuverNodes[0];
                }
                curState.clearMemory();
            }
            GUI.enabled = true;
            GUILayout.EndHorizontal();
        }
コード例 #7
0
ファイル: PreciseNode.cs プロジェクト: mwerle/ksp-precisenode
 internal void FixedUpdate()
 {
     if (!FlightDriver.Pause)
     {
         PatchedConicSolver solver = NodeTools.getSolver();
         if (options.removeUsedNodes && solver.maneuverNodes.Count > 0)
         {
             ManeuverNode node = solver.maneuverNodes[0];
             if (node.GetBurnVector(FlightGlobals.ActiveVessel.orbit).magnitude < options.usedNodeThreshold)
             {
                 solver.RemoveManeuverNode(node);
                 //TODO: Clean up states after removing the node.
             }
         }
     }
 }
コード例 #8
0
        private void UpdateIntuitiveManeuverHandlersList()
        {
            PatchedConicSolver solver = NodeTools.getSolver();

            if (solver != null)
            {
                List <ManeuverNode> nodes = solver.maneuverNodes;
                for (int i = 0; i < nodes.Count; i++)
                {
                    ManeuverNode node = nodes[i];
                    if ((node.attachedGizmo != null) && !isHandled(node))
                    {
                        this.maneuverGizmoHandlers.Add(new IntuitiveNodeGizmoHandler(this, node, options));
                    }
                }
            }
        }
コード例 #9
0
        public static void drawManeuverPager(NodeManager curState)
        {
            PatchedConicSolver solver = NodeTools.getSolver();

            GUILayout.BeginHorizontal();
            if (GUILayout.Button("<"))
            {
                int count = solver.maneuverNodes.Count;
                if (count > 1)
                {
                    // get the previous or last node
                    int idx = solver.maneuverNodes.IndexOf(curState.node);
                    if (idx == 0)
                    {
                        curState.nextNode = solver.maneuverNodes[--count];
                    }
                    else
                    {
                        curState.nextNode = solver.maneuverNodes[--idx];
                    }
                }
            }
            if (GUILayout.Button("Editing Node " + (solver.maneuverNodes.IndexOf(curState.node) + 1)))
            {
                MapView.MapCamera.SetTarget(curState.node.scaledSpaceTarget);
            }
            if (GUILayout.Button(">"))
            {
                int count = solver.maneuverNodes.Count;
                if (count > 1)
                {
                    // get the previous or last node
                    int idx = solver.maneuverNodes.IndexOf(curState.node);
                    if (idx == count - 1)
                    {
                        curState.nextNode = solver.maneuverNodes[0];
                    }
                    else
                    {
                        curState.nextNode = solver.maneuverNodes[++idx];
                    }
                }
            }
            GUILayout.EndHorizontal();
        }
コード例 #10
0
ファイル: Extensions.cs プロジェクト: lexxb/ksp-precisenode
        /// <summary>
        /// Merges the given node into the next lowest node (n's index - 1).  If there is no lower node, does nothing.
        /// </summary>
        /// <param name="n">The ManeuverNode to merge down.</param>
        internal static void mergeNodeDown(this ManeuverNode n)
        {
            PatchedConicSolver p = NodeTools.getSolver();
            Orbit o     = FlightGlobals.ActiveVessel.orbit;
            int   nodes = p.maneuverNodes.Count;
            int   idx   = p.maneuverNodes.IndexOf(n);

            // if we're the last or only node, don't bother.
            if (idx == 0 || nodes < 2)
            {
                return;
            }
            ManeuverNode mergeInto = p.maneuverNodes[idx - 1];

            Vector3d deltaV = mergeBurnVectors(mergeInto.UT, mergeInto, n.patch);

            mergeInto.OnGizmoUpdated(deltaV, mergeInto.UT);
            p.maneuverNodes.Remove(n);
        }
コード例 #11
0
        internal static void drawConicsControls(PreciseNodeOptions options)
        {
            PatchedConicSolver solver = NodeTools.getSolver();
            Color defaultColor        = GUI.backgroundColor;

            // Conics mode controls
            GUILayout.BeginHorizontal();
            GUILayout.Label("Conics mode: ", GUILayout.Width(100));
            for (int mode = 0; mode <= 4; mode++)
            {
                drawButton(mode.ToString(), (options.conicsMode == mode) ? Color.yellow : defaultColor, () => {
                    options.setConicsMode(mode);
                });
            }
            GUILayout.EndHorizontal();

            // conics patch limit editor.
            GUILayout.BeginHorizontal();
            GUILayout.Label("Change conics samples:", GUILayout.Width(200));
            drawPlusMinusButtons(solver.IncreasePatchLimit, solver.DecreasePatchLimit);
            GUILayout.EndHorizontal();
        }
コード例 #12
0
ファイル: PreciseNode.cs プロジェクト: mwerle/ksp-precisenode
        /// <summary>
        /// Draws the Clock window.
        /// </summary>
        private void drawClockWindow()
        {
            Color  defaultColor = GUI.backgroundColor;
            double timeNow      = Planetarium.GetUniversalTime();
            String timeUT       = timeNow.ToString("F0");
            String timeHuman    = timeNow.convertUTtoHumanTime();

            GUILayout.BeginVertical();

            GUIParts.drawDoubleLabel("Time:", 35, timeHuman, 150);
            GUIParts.drawDoubleLabel("UT:", 35, Math.Floor(timeNow).ToString("F0"), 150);

            if (showTimeNext)
            {
                double next      = 0.0;
                string labelText = "";
                if (NodeTools.getSolver().maneuverNodes.Count > 0)
                {
                    // protection from index out of range errors.
                    // should probably handle this better.
                    next = timeNow - NodeTools.getSolver().maneuverNodes[0].UT;
                }
                if (next < 0)
                {
                    labelText = "T-" + next.convertUTtoHumanDuration();
                }
                else
                {
                    labelText = "T+" + next.convertUTtoHumanDuration();
                }
                GUIParts.drawDoubleLabel("Next:", 35, labelText, 150);
            }

            GUILayout.EndVertical();
            GUI.DragWindow();
        }
コード例 #13
0
ファイル: PreciseNode.cs プロジェクト: mwerle/ksp-precisenode
        /// <summary>
        /// Draws the Node Editor window.
        /// </summary>
        private void drawMainWindow()
        {
            Color defaultColor        = GUI.backgroundColor;
            Color contentColor        = GUI.contentColor;
            Color curColor            = defaultColor;
            PatchedConicSolver solver = NodeTools.getSolver();

            // Options button
            if (showOptions)
            {
                GUI.backgroundColor = Color.green;
            }
            if (GUI.Button(new Rect(options.mainWindowPos.width - 48, 2, 22, 18), "O"))
            {
                showOptions = !showOptions;
            }
            GUI.backgroundColor = defaultColor;

            // Keymapping button
            if (showKeymapper)
            {
                GUI.backgroundColor = Color.green;
            }
            if (GUI.Button(new Rect(options.mainWindowPos.width - 24, 2, 22, 18), "K"))
            {
                showKeymapper = !showKeymapper;
            }
            GUI.backgroundColor = defaultColor;

            GUILayout.BeginVertical();
            if (options.showManeuverPager)
            {
                drawManeuverPager();
            }

            // Human-readable time
            GUIParts.drawDoubleLabel("Time:", 100, curState.currentUT().convertUTtoHumanTime(), 150);

            // Increment buttons
            GUILayout.BeginHorizontal();
            GUILayout.Label("Increment:", GUILayout.Width(100));
            GUIParts.drawButton("0.01", (options.increment == 0.01?Color.yellow:defaultColor), () => { options.increment = 0.01; });
            GUIParts.drawButton("0.1", (options.increment == 0.1?Color.yellow:defaultColor), () => { options.increment = 0.1; });
            GUIParts.drawButton("1", (options.increment == 1?Color.yellow:defaultColor), () => { options.increment = 1; });
            GUIParts.drawButton("10", (options.increment == 10?Color.yellow:defaultColor), () => { options.increment = 10; });
            GUIParts.drawButton("100", (options.increment == 100?Color.yellow:defaultColor), () => { options.increment = 100; });
            GUILayout.EndHorizontal();

            drawTimeControls(contentColor);

            GUILayout.BeginHorizontal();
            GUILayout.BeginVertical();
            drawProgradeControls(contentColor);
            drawNormalControls(contentColor);
            drawRadialControls(contentColor);
            GUILayout.EndVertical();
            GUILayout.BeginVertical(GUILayout.ExpandHeight(true));
            GUIParts.drawButton("MS", defaultColor, () => {
                curState.memorize();
            }, GUILayout.ExpandHeight(true));
            GUI.enabled = curState.HasMemorized;
            GUIParts.drawButton("MR", defaultColor, () => {
                curState.recallMemory();
            }, GUILayout.ExpandHeight(true));
            GUI.enabled = true;
            GUILayout.EndVertical();
            GUILayout.EndHorizontal();

            // total delta-V display
            GUIParts.drawDoubleLabel("Total Δv:", 100, curState.currentMagnitude().ToString("0.##") + " m/s", 130);

            drawEAngle();
            drawEncounter(defaultColor);

            // Conics mode controls
            if (options.showConics)
            {
                GUIParts.drawConicsControls(options);
            }

            // trip info button and vessel focus buttons
            GUILayout.BeginHorizontal();
            GUIParts.drawButton("Trip Info", (options.showTrip?Color.yellow:defaultColor), () => { options.showTrip = !options.showTrip; });
            GUIParts.drawButton("Focus on Vessel", defaultColor, () => {
                MapObject mapObject = PlanetariumCamera.fetch.targets.Find(o => (o.vessel != null) && o.vessel.Equals(FlightGlobals.ActiveVessel));
                MapView.MapCamera.SetTarget(mapObject);
            });
            GUILayout.EndHorizontal();

            GUILayout.EndVertical();
            GUI.DragWindow();
        }
コード例 #14
0
        /// <summary>
        /// Draws the Node Editor window.
        /// </summary>
        /// <param name="id">Identifier.</param>
        public void drawMainWindow(int id)
        {
            Color defaultColor        = GUI.backgroundColor;
            Color contentColor        = GUI.contentColor;
            Color curColor            = defaultColor;
            PatchedConicSolver solver = NodeTools.getSolver();

            // Options button
            if (showOptions)
            {
                GUI.backgroundColor = Color.green;
            }
            if (GUI.Button(new Rect(options.mainWindowPos.width - 48, 2, 22, 18), "O"))
            {
                showOptions = !showOptions;
            }
            GUI.backgroundColor = defaultColor;

            // Keymapping button
            if (showKeymapper)
            {
                GUI.backgroundColor = Color.green;
            }
            if (GUI.Button(new Rect(options.mainWindowPos.width - 24, 2, 22, 18), "K"))
            {
                showKeymapper = !showKeymapper;
            }
            GUI.backgroundColor = defaultColor;

            GUILayout.BeginVertical();
            if (options.showManeuverPager)
            {
                GUIParts.drawManeuverPager(curState);
            }

            // Human-readable time
            GUIParts.drawDoubleLabel("Time:", 100, NodeTools.convertUTtoHumanTime(curState.currentUT()), 130);

            // Increment buttons
            GUILayout.BeginHorizontal();
            GUILayout.Label("Increment:", GUILayout.Width(100));
            GUIParts.drawButton("0.01", (options.increment == 0.01?Color.yellow:defaultColor), delegate() { options.increment = 0.01; });
            GUIParts.drawButton("0.1", (options.increment == 0.1?Color.yellow:defaultColor), delegate() { options.increment = 0.1; });
            GUIParts.drawButton("1", (options.increment == 1?Color.yellow:defaultColor), delegate() { options.increment = 1; });
            GUIParts.drawButton("10", (options.increment == 10?Color.yellow:defaultColor), delegate() { options.increment = 10; });
            GUIParts.drawButton("100", (options.increment == 100?Color.yellow:defaultColor), delegate() { options.increment = 100; });
            GUILayout.EndHorizontal();

            drawTimeControls(contentColor);
            drawProgradeControls(contentColor);
            drawNormalControls(contentColor);
            drawRadialControls(contentColor);

            // total delta-V display
            GUIParts.drawDoubleLabel("Total delta-V:", 100, curState.currentMagnitude().ToString("0.##") + "m/s", 130);

            drawEAngle();
            drawEncounter(defaultColor);

            // Conics mode controls
            GUILayout.BeginHorizontal();
            GUILayout.Label("Conics mode: ", GUILayout.Width(100));
            GUIParts.drawButton("0", (options.conicsMode == 0?Color.yellow:defaultColor), delegate() { options.setConicsMode(0); });
            GUIParts.drawButton("1", (options.conicsMode == 1?Color.yellow:defaultColor), delegate() { options.setConicsMode(1); });
            GUIParts.drawButton("2", (options.conicsMode == 2?Color.yellow:defaultColor), delegate() { options.setConicsMode(2); });
            GUIParts.drawButton("3", (options.conicsMode == 3?Color.yellow:defaultColor), delegate() { options.setConicsMode(3); });
            GUIParts.drawButton("4", (options.conicsMode == 4?Color.yellow:defaultColor), delegate() { options.setConicsMode(4); });
            GUILayout.EndHorizontal();

            // conics patch limit editor.
            GUILayout.BeginHorizontal();
            GUILayout.Label("Change Conics Samples", GUILayout.Width(200));
            GUIParts.drawButton("-", Color.red, delegate() { solver.DecreasePatchLimit(); });
            GUIParts.drawButton("+", Color.red, delegate() { solver.IncreasePatchLimit(); });
            GUILayout.EndHorizontal();

            // trip info button and vessel focus buttons
            GUILayout.BeginHorizontal();
            GUIParts.drawButton("Trip Info", (options.showTrip?Color.yellow:defaultColor), delegate() { options.showTrip = !options.showTrip; });
            GUIParts.drawButton("Focus on Vessel", defaultColor, delegate() { MapView.MapCamera.SetTarget(FlightGlobals.ActiveVessel.vesselName); });
            GUILayout.EndHorizontal();

            GUILayout.EndVertical();
            GUI.DragWindow();
        }