protected override void WindowGUI(int windowID) { if (btNormal == null) { btNormal = new GUIStyle(GUI.skin.button); btNormal.normal.textColor = btNormal.focused.textColor = Color.white; btNormal.hover.textColor = btNormal.active.textColor = Color.yellow; btNormal.onNormal.textColor = btNormal.onFocused.textColor = btNormal.onHover.textColor = btNormal.onActive.textColor = Color.green; btNormal.padding = new RectOffset(8, 8, 8, 8); btActive = new GUIStyle(btNormal); btActive.active = btActive.onActive; btActive.normal = btActive.onNormal; btActive.onFocused = btActive.focused; btActive.hover = btActive.onHover; btAuto = new GUIStyle(btNormal); btAuto.normal.textColor = Color.red; btAuto.onActive = btAuto.onFocused = btAuto.onHover = btAuto.onNormal = btAuto.active = btAuto.focused = btAuto.hover = btAuto.normal; } if (core.attitude.enabled && !core.attitude.users.Contains(this)) { GUILayout.Button("AUTO", btAuto, GUILayout.ExpandWidth(true)); } else { GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); TargetButton(Target.OFF); TargetButton(Target.KILLROT); TargetButton(Target.NODE); GUILayout.EndHorizontal(); GUILayout.Label("Mode:"); GUILayout.BeginHorizontal(); ModeButton(Mode.ORBITAL); ModeButton(Mode.SURFACE); ModeButton(Mode.TARGET); ModeButton(Mode.ADVANCED); GUILayout.EndHorizontal(); switch (mode) { case Mode.ORBITAL: GUILayout.BeginHorizontal(); TargetButton(Target.PROGRADE); TargetButton(Target.NORMAL_PLUS); TargetButton(Target.RADIAL_PLUS); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); TargetButton(Target.RETROGRADE); TargetButton(Target.NORMAL_MINUS); TargetButton(Target.RADIAL_MINUS); GUILayout.EndHorizontal(); break; case Mode.SURFACE: GuiUtils.SimpleTextBox("HDG:", srfHdg); GuiUtils.SimpleTextBox("PIT:", srfPit); if (GUILayout.Button("EXECUTE", GUILayout.ExpandWidth(true))) { target = Target.SURFACE; Engage(); } break; case Mode.TARGET: if (core.target.NormalTargetExists) { GUILayout.BeginHorizontal(); TargetButton(Target.TARGET_PLUS); TargetButton(Target.RELATIVE_PLUS); TargetButton(Target.PARALLEL_PLUS); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); TargetButton(Target.TARGET_MINUS); TargetButton(Target.RELATIVE_MINUS); TargetButton(Target.PARALLEL_MINUS); GUILayout.EndHorizontal(); } else { GUILayout.Label("Please select a target"); } break; case Mode.ADVANCED: GUILayout.Label("Reference:"); advReference = (AttitudeReference)GuiUtils.ArrowSelector((int)advReference, Enum.GetValues(typeof(AttitudeReference)).Length, advReference.ToString()); GUILayout.Label("Direction:"); advDirection = (Vector6.Direction)GuiUtils.ArrowSelector((int)advDirection, Enum.GetValues(typeof(Vector6.Direction)).Length, advDirection.ToString()); if (GUILayout.Button("EXECUTE", btNormal, GUILayout.ExpandWidth(true))) { target = Target.ADVANCED; Engage(); } break; case Mode.AUTO: break; } GUILayout.EndVertical(); } base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); if (editedWindow == null) { editedWindow = core.GetComputerModule <MechJebModuleCustomInfoWindow>(); } if (editedWindow == null) { if (GUILayout.Button("New window")) { AddNewWindow(); } } else { GUILayout.BeginHorizontal(); if (GUILayout.Button("New window")) { AddNewWindow(); } if (GUILayout.Button("Delete window")) { RemoveCurrentWindow(); } GUILayout.EndHorizontal(); } if (editedWindow != null) { List <MechJebModuleCustomInfoWindow> allWindows = core.GetComputerModules <MechJebModuleCustomInfoWindow>(); GUILayout.BeginHorizontal(); GUILayout.Label("Title:", GUILayout.ExpandWidth(false)); int editedWindowIndex = allWindows.IndexOf(editedWindow); editedWindowIndex = GuiUtils.ArrowSelector(editedWindowIndex, allWindows.Count, () => { editedWindow.title = GUILayout.TextField(editedWindow.title, GUILayout.Width(120), GUILayout.ExpandWidth(false)); }); editedWindow = allWindows[editedWindowIndex]; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Show in:"); editedWindow.showInFlight = GUILayout.Toggle(editedWindow.showInFlight, "Flight", GUILayout.Width(60)); editedWindow.showInEditor = GUILayout.Toggle(editedWindow.showInEditor, "Editor"); GUILayout.EndHorizontal(); GUILayout.Label("Window contents (click to edit):"); GUILayout.BeginVertical(GUILayout.Height(100)); scrollPos = GUILayout.BeginScrollView(scrollPos); for (int i = 0; i < editedWindow.items.Count; i++) { GUIStyle s = new GUIStyle(GUI.skin.label); if (i == selectedItemIndex) { s.normal.textColor = Color.yellow; } if (GUILayout.Button(editedWindow.items[i].description, s)) { selectedItemIndex = i; } } GUILayout.EndScrollView(); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); if (!(selectedItemIndex >= 0 && selectedItemIndex < editedWindow.items.Count)) { selectedItemIndex = -1; } if (GUILayout.Button("Remove") && selectedItemIndex != -1) { editedWindow.items.RemoveAt(selectedItemIndex); } if (GUILayout.Button("Move up") && selectedItemIndex != -1) { if (selectedItemIndex > 0) { InfoItem item = editedWindow.items[selectedItemIndex]; editedWindow.items.RemoveAt(selectedItemIndex); editedWindow.items.Insert(selectedItemIndex - 1, item); selectedItemIndex -= 1; } } if (GUILayout.Button("Move down") && selectedItemIndex != -1) { if (selectedItemIndex < editedWindow.items.Count) { InfoItem item = editedWindow.items[selectedItemIndex]; editedWindow.items.RemoveAt(selectedItemIndex); editedWindow.items.Insert(selectedItemIndex + 1, item); selectedItemIndex += 1; } } GUILayout.EndHorizontal(); GUILayout.Label("Click an item to add it to the info window:"); itemCategory = (InfoItem.Category)GuiUtils.ArrowSelector((int)itemCategory, numCategories, itemCategory.ToString()); scrollPos2 = GUILayout.BeginScrollView(scrollPos2); foreach (InfoItem item in registry.Where(it => it.category == itemCategory).OrderBy(it => it.description)) { if (GUILayout.Button(item.description, GuiUtils.yellowOnHover)) { editedWindow.items.Add(item); } } GUILayout.EndScrollView(); } GUILayout.Label("Window presets:", new GUIStyle(GUI.skin.label) { alignment = TextAnchor.MiddleCenter }); presetIndex = GuiUtils.ArrowSelector(presetIndex, CustomWindowPresets.presets.Length, () => { if (GUILayout.Button(CustomWindowPresets.presets[presetIndex].name)) { MechJebModuleCustomInfoWindow newWindow = CreateWindowFromSharingString(CustomWindowPresets.presets[presetIndex].sharingString); if (newWindow != null) { editedWindow = newWindow; } } }); GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { if (btNormal == null) { btNormal = new GUIStyle(GUI.skin.button); btNormal.normal.textColor = btNormal.focused.textColor = Color.white; btNormal.hover.textColor = btNormal.active.textColor = Color.yellow; btNormal.onNormal.textColor = btNormal.onFocused.textColor = btNormal.onHover.textColor = btNormal.onActive.textColor = Color.green; btNormal.padding = new RectOffset(8, 8, 8, 8); btActive = new GUIStyle(btNormal); btActive.active = btActive.onActive; btActive.normal = btActive.onNormal; btActive.onFocused = btActive.focused; btActive.hover = btActive.onHover; } GUILayout.BeginVertical(); if (autopilot != null) { if (autopilot.enabled) { if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button1")))//Disengage autopilot { autopilot.users.Remove(this); } } else { if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button2")))//Engage autopilot { autopilot.users.Add(this); } } if (ascentPathIdx == ascentType.PVG) { if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button3")))//Reset Guidance (DO NOT PRESS) { core.guidance.Reset(); } GUILayout.BeginHorizontal(); // EditorStyles.toolbar); if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button4"), autopilot.showTargeting ? btActive : btNormal, GUILayout.ExpandWidth(true))) //"TARG" { autopilot.showTargeting = !autopilot.showTargeting; } if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button5"), autopilot.showGuidanceSettings ? btActive : btNormal, GUILayout.ExpandWidth(true))) //GUID { autopilot.showGuidanceSettings = !autopilot.showGuidanceSettings; } if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button6"), autopilot.showSettings ? btActive : btNormal, GUILayout.ExpandWidth(true))) //OPTS { autopilot.showSettings = !autopilot.showSettings; } if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button7"), autopilot.showStatus ? btActive : btNormal, GUILayout.ExpandWidth(true))) //STATUS { autopilot.showStatus = !autopilot.showStatus; } GUILayout.EndHorizontal(); } else if (ascentPathIdx == ascentType.GRAVITYTURN) { GUILayout.BeginHorizontal(); // EditorStyles.toolbar); if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button8"), autopilot.showTargeting ? btActive : btNormal, GUILayout.ExpandWidth(true))) //TARG { autopilot.showTargeting = !autopilot.showTargeting; } if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button9"), autopilot.showGuidanceSettings ? btActive : btNormal, GUILayout.ExpandWidth(true))) //GUID { autopilot.showGuidanceSettings = !autopilot.showGuidanceSettings; } if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button10"), autopilot.showSettings ? btActive : btNormal, GUILayout.ExpandWidth(true))) //OPTS { autopilot.showSettings = !autopilot.showSettings; } GUILayout.EndHorizontal(); } else if (ascentPathIdx == ascentType.CLASSIC) { GUILayout.BeginHorizontal(); // EditorStyles.toolbar); if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button11"), autopilot.showTargeting ? btActive : btNormal, GUILayout.ExpandWidth(true))) //TARG { autopilot.showTargeting = !autopilot.showTargeting; } if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button12"), autopilot.showSettings ? btActive : btNormal, GUILayout.ExpandWidth(true))) //OPTS { autopilot.showSettings = !autopilot.showSettings; } GUILayout.EndHorizontal(); } if (autopilot.showTargeting) { if (ascentPathIdx == ascentType.PVG) { GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label1"), autopilot.desiredOrbitAltitude, "km"); //Target Periapsis GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label2"), pvgascent.desiredApoapsis, "km"); //Target Apoapsis: if (pvgascent.desiredApoapsis >= 0 && pvgascent.desiredApoapsis < autopilot.desiredOrbitAltitude) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.yellow; GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label3"), s);//Ap < Pe: circularizing orbit } if (pvgascent.desiredApoapsis < 0) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = XKCDColors.Orange; GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label4"), s);//Hyperbolic target orbit (neg Ap) } } else { GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label5"), autopilot.desiredOrbitAltitude, "km");//Orbit altitude } GUIStyle si = new GUIStyle(GUI.skin.label); if (Math.Abs(desiredInclination) < Math.Abs(vesselState.latitude) - 2.001) { si.onHover.textColor = si.onNormal.textColor = si.normal.textColor = XKCDColors.Orange; } GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label6"), si, GUILayout.ExpandWidth(true));//Orbit inc. desiredInclination.text = GUILayout.TextField(desiredInclination.text, GUILayout.ExpandWidth(true), GUILayout.Width(100)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button13")))//Current { desiredInclination.val = vesselState.latitude; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (Math.Abs(desiredInclination) < Math.Abs(vesselState.latitude) - 2.001) { GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label7", Math.Abs(vesselState.latitude) - Math.Abs(desiredInclination)), si);//inc {0:F1}º below current latitude } GUILayout.EndHorizontal(); autopilot.desiredInclination = desiredInclination; } if (autopilot.showGuidanceSettings) { if (ascentPathIdx == ascentType.GRAVITYTURN) { GUILayout.BeginVertical(); GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label8"), gtascent.turnStartAltitude, "km"); //Turn start altitude: GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label9"), gtascent.turnStartVelocity, "m/s"); //Turn start velocity: GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label10"), gtascent.turnStartPitch, "deg"); //Turn start pitch: GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label11"), gtascent.intermediateAltitude, "km"); //Intermediate altitude: GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label12"), gtascent.holdAPTime, "s"); //Hold AP Time: GUILayout.EndVertical(); } else if (ascentPathIdx == ascentType.PVG) { GUILayout.BeginVertical(); GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label13"), pvgascent.pitchStartVelocity, "m/s"); //Booster Pitch start: GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label14"), pvgascent.pitchRate, "°/s"); //Booster Pitch rate: GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label15"), core.guidance.pvgInterval, "s"); //Guidance Interval: if (core.guidance.pvgInterval < 1 || core.guidance.pvgInterval > 30) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.yellow; GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label16"), s); //Guidance intervals are limited to between 1s and 30s } GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label17"), autopilot.limitQa, "Pa-rad"); //Qα limit if (autopilot.limitQa < 100 || autopilot.limitQa > 4000) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.yellow; if (autopilot.limitQa < 100) { GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label18"), s);//Qα limit cannot be set to lower than 100 Pa-rad } else if (autopilot.limitQa > 10000) { GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label19"), s);//Qα limit cannot be set to higher than 10000 Pa-rad } else { GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label20"), s);//Qα limit is recommended to be 1000 to 4000 Pa-rad } } pvgascent.omitCoast = GUILayout.Toggle(pvgascent.omitCoast, Localizer.Format("#MechJeb_Ascent_checkbox1"));//Omit Coast GUILayout.EndVertical(); } } autopilot.limitQaEnabled = (ascentPathIdx == ascentType.PVG); // this is mandatory for PVG if (autopilot.showSettings) { ToggleAscentNavballGuidanceInfoItem(); if (ascentPathIdx != ascentType.PVG) { core.thrust.LimitToPreventOverheatsInfoItem(); //core.thrust.LimitToTerminalVelocityInfoItem(); core.thrust.LimitToMaxDynamicPressureInfoItem(); core.thrust.LimitAccelerationInfoItem(); core.thrust.LimitThrottleInfoItem(); core.thrust.LimiterMinThrottleInfoItem(); core.thrust.LimitElectricInfoItem(); } else { core.thrust.LimitToPreventOverheatsInfoItem(); //core.thrust.LimitToTerminalVelocityInfoItem(); core.thrust.LimitToMaxDynamicPressureInfoItem(); //core.thrust.LimitAccelerationInfoItem(); //core.thrust.LimitThrottleInfoItem(); core.thrust.LimiterMinThrottleInfoItem(); //core.thrust.LimitElectricInfoItem(); GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label21")); //FIXME: g-limiter is down for maintenance core.thrust.limitAcceleration = false; core.thrust.limitThrottle = false; core.thrust.limitToTerminalVelocity = false; core.thrust.electricThrottle = false; } GUILayout.BeginHorizontal(); autopilot.forceRoll = GUILayout.Toggle(autopilot.forceRoll, Localizer.Format("#MechJeb_Ascent_checkbox2"));//Force Roll if (autopilot.forceRoll) { GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label22"), autopilot.verticalRoll, "º", 30f); //climb GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label23"), autopilot.turnRoll, "º", 30f); //turn } GUILayout.EndHorizontal(); if (ascentPathIdx != ascentType.PVG) { GUILayout.BeginHorizontal(); GUIStyle s = new GUIStyle(GUI.skin.toggle); if (autopilot.limitingAoA) { s.onHover.textColor = s.onNormal.textColor = Color.green; } autopilot.limitAoA = GUILayout.Toggle(autopilot.limitAoA, Localizer.Format("#MechJeb_Ascent_checkbox3"), s, GUILayout.ExpandWidth(true));//Limit AoA to autopilot.maxAoA.text = GUILayout.TextField(autopilot.maxAoA.text, GUILayout.Width(30)); GUILayout.Label("º (" + autopilot.currentMaxAoA.ToString("F1") + "°)", GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(25); if (autopilot.limitAoA) { GUIStyle sl = new GUIStyle(GUI.skin.label); if (autopilot.limitingAoA && vesselState.dynamicPressure < autopilot.aoALimitFadeoutPressure) { sl.normal.textColor = sl.hover.textColor = Color.green; } GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_Ascent_label24"), autopilot.aoALimitFadeoutPressure, "Pa", 50, sl);//Dynamic Pressure Fadeout } GUILayout.EndHorizontal(); autopilot.limitQaEnabled = false; // this is only for PVG } if (ascentPathIdx == ascentType.CLASSIC) { // corrective steering only applies to Classic GUILayout.BeginHorizontal(); autopilot.correctiveSteering = GUILayout.Toggle(autopilot.correctiveSteering, Localizer.Format("#MechJeb_Ascent_checkbox4"), GUILayout.ExpandWidth(false));//Corrective steering if (autopilot.correctiveSteering) { GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label25"), GUILayout.ExpandWidth(false));//Gain autopilot.correctiveSteeringGain.text = GUILayout.TextField(autopilot.correctiveSteeringGain.text, GUILayout.Width(40)); } GUILayout.EndHorizontal(); } autopilot.autostage = GUILayout.Toggle(autopilot.autostage, Localizer.Format("#MechJeb_Ascent_checkbox5"));//Autostage if (autopilot.autostage) { core.staging.AutostageSettingsInfoItem(); } autopilot.autodeploySolarPanels = GUILayout.Toggle(autopilot.autodeploySolarPanels, Localizer.Format("#MechJeb_Ascent_checkbox6"));//Auto-deploy solar panels autopilot.autoDeployAntennas = GUILayout.Toggle(autopilot.autoDeployAntennas, Localizer.Format("#MechJeb_Ascent_checkbox7"));//Auto-deploy antennas GUILayout.BeginHorizontal(); core.node.autowarp = GUILayout.Toggle(core.node.autowarp, Localizer.Format("#MechJeb_Ascent_checkbox8"));//Auto-warp if (ascentPathIdx != ascentType.PVG) { autopilot.skipCircularization = GUILayout.Toggle(autopilot.skipCircularization, Localizer.Format("#MechJeb_Ascent_checkbox9"));//Skip Circularization } else { // skipCircularization is always true for Optimizer autopilot.skipCircularization = true; } GUILayout.EndHorizontal(); } if (autopilot.showStatus) { if (ascentPathIdx == ascentType.PVG) { if (core.guidance.solution != null) { for (int i = core.guidance.solution.num_segments; i > 0; i--) { GUILayout.Label(String.Format("{0}: {1}", i, core.guidance.solution.ArcString(vesselState.time, i - 1))); } } GUILayout.BeginHorizontal(); GUILayout.Label(String.Format("vgo: {0:F1}", core.guidance.vgo), GUILayout.Width(100)); GUILayout.Label(String.Format("heading: {0:F1}", core.guidance.heading), GUILayout.Width(100)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(String.Format("tgo: {0:F3}", core.guidance.tgo), GUILayout.Width(100)); GUILayout.Label(String.Format("pitch: {0:F1}", core.guidance.pitch), GUILayout.Width(100)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUIStyle si = new GUIStyle(GUI.skin.label); if (core.guidance.isStable()) { si.onHover.textColor = si.onNormal.textColor = si.normal.textColor = XKCDColors.Green; } else if (core.guidance.isInitializing() || core.guidance.status == PVGStatus.FINISHED) { si.onHover.textColor = si.onNormal.textColor = si.normal.textColor = XKCDColors.Orange; } else { si.onHover.textColor = si.onNormal.textColor = si.normal.textColor = XKCDColors.Red; } GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label26") + core.guidance.status, si);//Guidance Status: GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label27") + core.guidance.successful_converges, GUILayout.Width(100)); //converges: GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label28") + core.guidance.last_lm_status, GUILayout.Width(100)); //status: GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("n: " + core.guidance.last_lm_iteration_count + "(" + core.guidance.max_lm_iteration_count + ")", GUILayout.Width(100)); GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label29") + GuiUtils.TimeToDHMS(core.guidance.staleness));//staleness: GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(String.Format("znorm: {0:G5}", core.guidance.last_znorm)); GUILayout.EndHorizontal(); if (core.guidance.last_failure_cause != null) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.red; GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label30") + core.guidance.last_failure_cause, s);//LAST FAILURE: GUILayout.EndHorizontal(); } if (vessel.situation != Vessel.Situations.LANDED && vessel.situation != Vessel.Situations.PRELAUNCH && vessel.situation != Vessel.Situations.SPLASHED) { double m0 = atmoStats[vessel.currentStage].startMass; double thrust = atmoStats[vessel.currentStage].startThrust; if (Math.Abs(vesselState.mass - m0) / m0 > 0.01) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.yellow; GUILayout.BeginHorizontal(); GUILayout.Label(String.Format(Localizer.Format("#MechJeb_Ascent_label31") + "{0:F1}%", (vesselState.mass - m0) / m0 * 100.0), s);//MASS IS OFF BY GUILayout.EndHorizontal(); } if (Math.Abs(vesselState.thrustCurrent - thrust) / thrust > 0.01) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.yellow; GUILayout.BeginHorizontal(); GUILayout.Label(String.Format(Localizer.Format("#MechJeb_Ascent_label32") + "{0:F1}%", (vesselState.thrustCurrent - thrust) / thrust * 100.0), s);//THRUST IS OFF BY GUILayout.EndHorizontal(); } } } } if (vessel.LandedOrSplashed) { if (core.target.NormalTargetExists) { if (core.node.autowarp) { GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label33"), GUILayout.ExpandWidth(true)); //Launch countdown: autopilot.warpCountDown.text = GUILayout.TextField(autopilot.warpCountDown.text, GUILayout.Width(60)); GUILayout.Label("s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } if (!launchingToPlane && !launchingToRendezvous && !launchingToInterplanetary) { // disable plane/rendezvous/interplanetary for now if (ascentPathIdx != ascentType.PVG) { GUILayout.BeginHorizontal(); if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button14"), GUILayout.ExpandWidth(false))) //Launch to rendezvous: { launchingToRendezvous = true; autopilot.StartCountdown(vesselState.time + LaunchTiming.TimeToPhaseAngle(autopilot.launchPhaseAngle, mainBody, vesselState.longitude, core.target.TargetOrbit)); } autopilot.launchPhaseAngle.text = GUILayout.TextField(autopilot.launchPhaseAngle.text, GUILayout.Width(60)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } GUILayout.BeginHorizontal(); if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button15"), GUILayout.ExpandWidth(false))) //Launch into plane of target { launchingToPlane = true; autopilot.StartCountdown(vesselState.time + LaunchTiming.TimeToPlane(autopilot.launchLANDifference, mainBody, vesselState.latitude, vesselState.longitude, core.target.TargetOrbit)); } autopilot.launchLANDifference.text = GUILayout.TextField( autopilot.launchLANDifference.text, GUILayout.Width(60)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); if (core.target.TargetOrbit.referenceBody == orbit.referenceBody.referenceBody) { if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button16"))) //Launch at interplanetary window { launchingToInterplanetary = true; //compute the desired launch date OrbitalManeuverCalculator.DeltaVAndTimeForHohmannTransfer(mainBody.orbit, core.target.TargetOrbit, vesselState.time, out interplanetaryWindowUT); double desiredOrbitPeriod = 2 * Math.PI * Math.Sqrt( Math.Pow(mainBody.Radius + autopilot.desiredOrbitAltitude, 3) / mainBody.gravParameter); //launch just before the window, but don't try to launch in the past interplanetaryWindowUT -= 3 * desiredOrbitPeriod; interplanetaryWindowUT = Math.Max(vesselState.time + autopilot.warpCountDown, interplanetaryWindowUT); autopilot.StartCountdown(interplanetaryWindowUT); } } } } else { launchingToInterplanetary = launchingToPlane = launchingToRendezvous = false; GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label34")); //Select a target for a timed launch. } if (launchingToInterplanetary || launchingToPlane || launchingToRendezvous) { string message = ""; if (launchingToInterplanetary) { message = Localizer.Format("#MechJeb_Ascent_msg1"); //Launching at interplanetary window } else if (launchingToPlane) { desiredInclination = MuUtils.Clamp(core.target.TargetOrbit.inclination, Math.Abs(vesselState.latitude), 180 - Math.Abs(vesselState.latitude)); desiredInclination *= Math.Sign(Vector3d.Dot(core.target.TargetOrbit.SwappedOrbitNormal(), Vector3d.Cross(vesselState.CoM - mainBody.position, mainBody.transform.up))); message = Localizer.Format("#MechJeb_Ascent_msg2"); //Launching to target plane } else if (launchingToRendezvous) { message = "#MechJeb_Ascent_msg3"; //Launching to rendezvous } if (autopilot.tMinus > 3 * vesselState.deltaT) { message += ": T-" + GuiUtils.TimeToDHMS(autopilot.tMinus, 1); } GUILayout.Label(message); if (GUILayout.Button(Localizer.Format("#MechJeb_Ascent_button17")))//Abort { launchingToInterplanetary = launchingToPlane = launchingToRendezvous = autopilot.timedLaunch = false; } } } if (autopilot.enabled) { GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label35") + autopilot.status);//Autopilot status: } if (core.DeactivateControl) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.red; GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label36"), s);//CONTROL DISABLED (AVIONICS) } } if (!vessel.patchedConicsUnlocked() && ascentPathIdx != ascentType.PVG) { GUILayout.Label(Localizer.Format("#MechJeb_Ascent_label37"));//"Warning: MechJeb is unable to circularize without an upgraded Tracking Station." } GUILayout.BeginHorizontal(); autopilot.ascentPathIdxPublic = (ascentType)GuiUtils.ComboBox.Box((int)autopilot.ascentPathIdxPublic, autopilot.ascentPathList, this); GUILayout.EndHorizontal(); if (autopilot.ascentMenu != null) { autopilot.ascentMenu.enabled = GUILayout.Toggle(autopilot.ascentMenu.enabled, Localizer.Format("#MechJeb_Ascent_checkbox10")); //Edit ascent path } GUILayout.EndVertical(); base.WindowGUI(windowID); }
public void AllStageStats() { MechJebModuleStageStats stats = core.GetComputerModule <MechJebModuleStageStats>(); stats.RequestUpdate(this); int numStages = stats.atmoStats.Length; var stages = Enumerable.Range(0, numStages); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Stage stats", GUILayout.ExpandWidth(true)); if (GUILayout.Button("All stats", GUILayout.ExpandWidth(false))) { if (showInitialMass) { showInitialTWR = showVacDeltaV = showVacTime = showAtmoDeltaV = showAtmoTime = true; showInitialMass = showFinalMass = showMaxTWR = false; } else { showInitialMass = showInitialTWR = showMaxTWR = showVacDeltaV = showVacTime = showAtmoDeltaV = showAtmoTime = true; } } GUILayout.EndHorizontal(); double geeASL = (HighLogic.LoadedSceneIsEditor ? 1 : mainBody.GeeASL); GUILayout.BeginHorizontal(); DrawStageStatsColumn("Stage", stages.Select(s => s.ToString())); if (showInitialMass) { showInitialMass = !DrawStageStatsColumn("Start mass", stages.Select(s => stats.vacStats[s].startMass.ToString("F1") + " t")); } if (showFinalMass) { showFinalMass = !DrawStageStatsColumn("End mass", stages.Select(s => stats.vacStats[s].endMass.ToString("F1") + " t")); } if (showInitialTWR) { showInitialTWR = !DrawStageStatsColumn("TWR", stages.Select(s => stats.vacStats[s].StartTWR(geeASL).ToString("F2"))); } if (showMaxTWR) { showMaxTWR = !DrawStageStatsColumn("Max TWR", stages.Select(s => stats.vacStats[s].MaxTWR(geeASL).ToString("F2"))); } if (showAtmoDeltaV) { showAtmoDeltaV = !DrawStageStatsColumn("Atmo ΔV", stages.Select(s => stats.atmoStats[s].deltaV.ToString("F0") + " m/s")); } if (showAtmoTime) { showAtmoTime = !DrawStageStatsColumn("Atmo time", stages.Select(s => GuiUtils.TimeToDHMS(stats.atmoStats[s].deltaTime))); } if (showVacDeltaV) { showVacDeltaV = !DrawStageStatsColumn("Vac ΔV", stages.Select(s => stats.vacStats[s].deltaV.ToString("F0") + " m/s")); } if (showVacTime) { showVacTime = !DrawStageStatsColumn("Vac time", stages.Select(s => GuiUtils.TimeToDHMS(stats.vacStats[s].deltaTime))); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
void DrawGUIPrediction() { ReentrySimulation.Result result = predictor.Result; if (result != null) { switch (result.outcome) { case ReentrySimulation.Outcome.LANDED: GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_label9")); //Landing Predictions: GUILayout.Label(Coordinates.ToStringDMS(result.endPosition.latitude, result.endPosition.longitude) + "\nASL:" + MuUtils.ToSI(result.endASL, -1, 4) + "m"); GUILayout.Label(result.body.GetExperimentBiomeSafe(result.endPosition.latitude, result.endPosition.longitude)); double error = Vector3d.Distance(mainBody.GetWorldSurfacePosition(result.endPosition.latitude, result.endPosition.longitude, 0) - mainBody.position, mainBody.GetWorldSurfacePosition(core.target.targetLatitude, core.target.targetLongitude, 0) - mainBody.position); GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_Label10") + MuUtils.ToSI(error, 0) + "m" + Localizer.Format("#MechJeb_LandingGuidance_Label11") + result.maxDragGees.ToString("F1") + "g" + Localizer.Format("#MechJeb_LandingGuidance_Label12") + result.deltaVExpended.ToString("F1") + "m/s" + Localizer.Format("#MechJeb_LandingGuidance_Label13") + (vessel.Landed ? "0.0s" : GuiUtils.TimeToDHMS(result.endUT - Planetarium.GetUniversalTime(), 1))); //Target difference = \nMax drag: \nDelta-v needed: \nTime to land: break; case ReentrySimulation.Outcome.AEROBRAKED: GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_Label14")); //Predicted orbit after aerobraking: Orbit o = result.AeroBrakeOrbit(); if (o.eccentricity > 1) { GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_Label15") + o.eccentricity.ToString("F2")); //Hyperbolic, eccentricity = } else { GUILayout.Label(MuUtils.ToSI(o.PeA, 3) + "m x " + MuUtils.ToSI(o.ApA, 3) + "m"); } GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_Label16", result.maxDragGees.ToString("F1")) + Localizer.Format("#MechJeb_LandingGuidance_Label17", GuiUtils.TimeToDHMS(result.aeroBrakeUT - Planetarium.GetUniversalTime(), 1))); //Max drag:<<1>>g \nExit atmosphere in: break; case ReentrySimulation.Outcome.NO_REENTRY: GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_Label18_1") + MuUtils.ToSI(orbit.PeA, 3) + "m Pe > " + MuUtils.ToSI(mainBody.RealMaxAtmosphereAltitude(), 3) + (mainBody.atmosphere ? Localizer.Format("#MechJeb_LandingGuidance_Label18_2") : Localizer.Format("#MechJeb_LandingGuidance_Label18_3"))); //"Orbit does not reenter:\n""m atmosphere height""m ground" break; case ReentrySimulation.Outcome.TIMED_OUT: GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_Label19")); //Reentry simulation timed out. break; } } }
protected override void WindowGUI(int windowID) { if (!core.target.NormalTargetExists) { GUILayout.Label("Select a target to rendezvous with."); base.WindowGUI(windowID); return; } if (core.target.TargetOrbit.referenceBody != orbit.referenceBody) { GUILayout.Label("Rendezvous target must be in the same sphere of influence."); base.WindowGUI(windowID); return; } GUILayout.BeginVertical(); //Information readouts: GuiUtils.SimpleLabel("Rendezvous target", core.target.Name); const double leadTime = 30; GuiUtils.SimpleLabel("Target orbit", MuUtils.ToSI(core.target.TargetOrbit.PeA, 3) + "m x " + MuUtils.ToSI(core.target.TargetOrbit.ApA, 3) + "m"); GuiUtils.SimpleLabel("Current orbit", MuUtils.ToSI(orbit.PeA, 3) + "m x " + MuUtils.ToSI(orbit.ApA, 3) + "m"); GuiUtils.SimpleLabel("Relative inclination", orbit.RelativeInclination(core.target.TargetOrbit).ToString("F2") + "º"); double closestApproachTime = orbit.NextClosestApproachTime(core.target.TargetOrbit, vesselState.time); GuiUtils.SimpleLabel("Time until closest approach", GuiUtils.TimeToDHMS(closestApproachTime - vesselState.time)); GuiUtils.SimpleLabel("Separation at closest approach", MuUtils.ToSI(orbit.Separation(core.target.TargetOrbit, closestApproachTime), 0) + "m"); //Maneuver planning buttons: if (GUILayout.Button("Align Planes")) { double UT; Vector3d dV; if (orbit.AscendingNodeExists(core.target.TargetOrbit)) { dV = OrbitalManeuverCalculator.DeltaVAndTimeToMatchPlanesAscending(orbit, core.target.TargetOrbit, vesselState.time, out UT); } else { dV = OrbitalManeuverCalculator.DeltaVAndTimeToMatchPlanesDescending(orbit, core.target.TargetOrbit, vesselState.time, out UT); } vessel.RemoveAllManeuverNodes(); vessel.PlaceManeuverNode(orbit, dV, UT); } GUILayout.BeginHorizontal(); if (GUILayout.Button("Establish new orbit at")) { double phasingOrbitRadius = phasingOrbitAltitude + mainBody.Radius; vessel.RemoveAllManeuverNodes(); if (orbit.ApR < phasingOrbitRadius) { double UT1 = vesselState.time + leadTime; Vector3d dV1 = OrbitalManeuverCalculator.DeltaVToChangeApoapsis(orbit, UT1, phasingOrbitRadius); vessel.PlaceManeuverNode(orbit, dV1, UT1); Orbit transferOrbit = vessel.patchedConicSolver.maneuverNodes[0].nextPatch; double UT2 = transferOrbit.NextApoapsisTime(UT1); Vector3d dV2 = OrbitalManeuverCalculator.DeltaVToCircularize(transferOrbit, UT2); vessel.PlaceManeuverNode(transferOrbit, dV2, UT2); } else if (orbit.PeR > phasingOrbitRadius) { double UT1 = vesselState.time + leadTime; Vector3d dV1 = OrbitalManeuverCalculator.DeltaVToChangePeriapsis(orbit, UT1, phasingOrbitRadius); vessel.PlaceManeuverNode(orbit, dV1, UT1); Orbit transferOrbit = vessel.patchedConicSolver.maneuverNodes[0].nextPatch; double UT2 = transferOrbit.NextPeriapsisTime(UT1); Vector3d dV2 = OrbitalManeuverCalculator.DeltaVToCircularize(transferOrbit, UT2); vessel.PlaceManeuverNode(transferOrbit, dV2, UT2); } else { double UT = orbit.NextTimeOfRadius(vesselState.time, phasingOrbitRadius); Vector3d dV = OrbitalManeuverCalculator.DeltaVToCircularize(orbit, UT); vessel.PlaceManeuverNode(orbit, dV, UT); } } phasingOrbitAltitude.text = GUILayout.TextField(phasingOrbitAltitude.text, GUILayout.Width(70)); GUILayout.Label("km", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); if (GUILayout.Button("Intercept with Hohmann transfer")) { double UT; Vector3d dV = OrbitalManeuverCalculator.DeltaVAndTimeForHohmannTransfer(orbit, core.target.TargetOrbit, vesselState.time, out UT); vessel.RemoveAllManeuverNodes(); vessel.PlaceManeuverNode(orbit, dV, UT); } if (GUILayout.Button("Match velocities at closest approach")) { double UT = closestApproachTime; Vector3d dV = OrbitalManeuverCalculator.DeltaVToMatchVelocities(orbit, UT, core.target.TargetOrbit); vessel.RemoveAllManeuverNodes(); vessel.PlaceManeuverNode(orbit, dV, UT); } if (GUILayout.Button("Get closer")) { double UT = vesselState.time; double interceptUT = UT + 100; Vector3d dV = OrbitalManeuverCalculator.DeltaVToInterceptAtTime(orbit, UT, core.target.TargetOrbit, interceptUT, 10); vessel.RemoveAllManeuverNodes(); vessel.PlaceManeuverNode(orbit, dV, UT); } if (core.node != null) { if (vessel.patchedConicSolver.maneuverNodes.Any() && !core.node.enabled) { if (GUILayout.Button("Execute next node")) { core.node.ExecuteOneNode(this); } if (vessel.patchedConicSolver.maneuverNodes.Count > 1) { if (GUILayout.Button("Execute all nodes")) { core.node.ExecuteAllNodes(this); } } } else if (core.node.enabled) { if (GUILayout.Button("Abort node execution")) { core.node.Abort(); } } GUILayout.BeginHorizontal(); core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp", GUILayout.ExpandWidth(true)); GUILayout.Label("Tolerance:", GUILayout.ExpandWidth(false)); core.node.tolerance.text = GUILayout.TextField(core.node.tolerance.text, GUILayout.Width(35), GUILayout.ExpandWidth(false)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { core.node.tolerance.val += 0.1; } if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { core.node.tolerance.val -= core.node.tolerance.val > 0.1 ? 0.1 : 0.0; } if (GUILayout.Button("R", GUILayout.ExpandWidth(false))) { core.node.tolerance.val = 0.1; } GUILayout.Label("m/s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { if (!core.target.NormalTargetExists) { GUILayout.Label("Choose a target to dock with"); base.WindowGUI(windowID); return; } GUILayout.BeginVertical(); if (!(core.target.Target is ModuleDockingNode)) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.yellow; } bool onAxisNodeExists = false; foreach (ModuleDockingNode node in vessel.GetModules <ModuleDockingNode>()) { if (Vector3d.Angle(node.GetTransform().forward, vessel.ReferenceTransform.up) < 2) { onAxisNodeExists = true; break; } } if (!onAxisNodeExists) { GUIStyle s = new GUIStyle(GUI.skin.label); s.normal.textColor = Color.yellow; GUILayout.Label("Warning: this vessel is not controlled from a docking node. Right click the desired docking node on this vessel and select \"Control from here.\"", s); } bool active = GUILayout.Toggle(autopilot.enabled, "Autopilot enabled"); GuiUtils.SimpleTextBox("Speed limit", autopilot.speedLimit, "m/s"); if (autopilot.enabled != active) { if (active) { autopilot.users.Add(this); } else { autopilot.users.Remove(this); } } if (autopilot.enabled) { GUILayout.Label("Status: " + autopilot.status); Vector3d error = core.rcs.targetVelocity - vesselState.velocityVesselOrbit; double error_x = Vector3d.Dot(error, vessel.GetTransform().right); double error_y = Vector3d.Dot(error, vessel.GetTransform().forward); double error_z = Vector3d.Dot(error, vessel.GetTransform().up); GUILayout.Label("Error X: " + error_x.ToString("F2") + " m/s [L/J]"); GUILayout.Label("Error Y: " + error_y.ToString("F2") + " m/s [I/K]"); GUILayout.Label("Error Z: " + error_z.ToString("F2") + " m/s [H/N]"); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); bool showingGuidance = (core.target.Target != null && core.target.Name == TARGET_NAME); if (showingGuidance) { GUILayout.Label("The purple circle on the navball points along the ascent path."); if (GUILayout.Button("Stop showing navball guidance")) { core.target.Unset(); } } else if (GUILayout.Button("Show navball ascent path guidance")) { core.target.SetDirectionTarget(TARGET_NAME); } if (autopilot != null) { if (autopilot.enabled) { if (GUILayout.Button("Disengage autopilot")) { autopilot.users.Remove(this); } } else { if (GUILayout.Button("Engage autopilot")) { autopilot.users.Add(this); } } ascentPath = autopilot.ascentPath; GuiUtils.SimpleTextBox("Orbit altitude", autopilot.desiredOrbitAltitude, "km"); autopilot.desiredInclination = desiredInclination; } GuiUtils.SimpleTextBox("Orbit inclination", desiredInclination, "º"); core.thrust.LimitToPreventOverheatsInfoItem(); core.thrust.LimitToTerminalVelocityInfoItem(); core.thrust.LimitAccelerationInfoItem(); autopilot.correctiveSteering = GUILayout.Toggle(autopilot.correctiveSteering, "Corrective steering"); autopilot.autostage = GUILayout.Toggle(autopilot.autostage, "Autostage"); if (autopilot.autostage) { core.staging.AutostageSettingsInfoItem(); } core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp"); if (autopilot != null && vessel.LandedOrSplashed) { if (core.target.NormalTargetExists) { if (!launchingToPlane && !launchingToRendezvous) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Launch to rendezvous:", GUILayout.ExpandWidth(false))) { launchingToRendezvous = true; } autopilot.launchPhaseAngle.text = GUILayout.TextField(autopilot.launchPhaseAngle.text, GUILayout.Width(60)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } if (!launchingToPlane && !launchingToRendezvous && GUILayout.Button("Launch into plane of target")) { launchingToPlane = true; } } else { launchingToPlane = launchingToRendezvous = false; GUILayout.Label("Select a target for a timed launch."); } if (launchingToPlane || launchingToRendezvous) { double tMinus; if (launchingToPlane) { tMinus = LaunchTiming.TimeToPlane(mainBody, vesselState.latitude, vesselState.longitude, core.target.Orbit); } else { tMinus = LaunchTiming.TimeToPhaseAngle(autopilot.launchPhaseAngle, mainBody, vesselState.longitude, core.target.Orbit); } double launchTime = vesselState.time + tMinus; core.warp.WarpToUT(launchTime); if (launchingToPlane) { desiredInclination = core.target.Orbit.inclination; desiredInclination *= Math.Sign(Vector3d.Dot(core.target.Orbit.SwappedOrbitNormal(), Vector3d.Cross(vesselState.CoM - mainBody.position, mainBody.transform.up))); } if (autopilot.enabled) { core.warp.WarpToUT(launchTime); } GUILayout.Label("Launching to " + (launchingToPlane ? "target plane" : "rendezvous") + ": T-" + MuUtils.ToSI(tMinus, 0) + "s"); if (tMinus < 3 * vesselState.deltaT) { if (autopilot.enabled) { Staging.ActivateNextStage(); } launchingToPlane = launchingToRendezvous = false; } if (GUILayout.Button("Abort")) { launchingToPlane = launchingToRendezvous = false; } } } if (autopilot != null && autopilot.enabled) { GUILayout.Label("Autopilot status: " + autopilot.status); } MechJebModuleAscentPathEditor editor = core.GetComputerModule <MechJebModuleAscentPathEditor>(); if (editor != null) { editor.enabled = GUILayout.Toggle(editor.enabled, "Edit ascent path"); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
public void AllStageStats() { // Unity throws an exception if we change our layout between the Layout event and // the Repaint event, so only get new data right before the Layout event. if (Event.current.type == EventType.Layout) { MechJebModuleStageStats stats = core.GetComputerModule <MechJebModuleStageStats>(); vacStats = stats.vacStats; atmoStats = stats.atmoStats; stats.RequestUpdate(this); } int numStages = atmoStats.Length; var stages = Enumerable.Range(0, numStages); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Stage stats", GUILayout.ExpandWidth(true)); double geeASL; if (HighLogic.LoadedSceneIsEditor) { // We're in the VAB/SPH TWRbody = (int)GuiUtils.ArrowSelector(TWRbody, FlightGlobals.Bodies.Count, FlightGlobals.Bodies[(int)TWRbody].GetName()); geeASL = FlightGlobals.Bodies[TWRbody].GeeASL; } else { // We're in flight geeASL = mainBody.GeeASL; } if (GUILayout.Button("All stats", GUILayout.ExpandWidth(false))) { // NK detect necessity of atmo initial TWR bool hasMFE = false; if (HighLogic.LoadedSceneIsEditor) { foreach (Part p in parts) { if (p.Modules.Contains("ModuleEngineConfigs") || p.Modules.Contains("ModuleHybridEngine") || p.Modules.Contains("ModuleHybridEngines")) { hasMFE = true; break; } } } else { hasMFE = vesselState.hasMFE; } if (showInitialMass) { showInitialTWR = showVacDeltaV = showVacTime = showAtmoDeltaV = showAtmoTime = true; showAtmoInitialTWR = hasMFE; // NK showInitialMass = showFinalMass = showMaxTWR = false; } else { showInitialMass = showInitialTWR = showMaxTWR = showVacDeltaV = showVacTime = showAtmoDeltaV = showAtmoTime = true; showAtmoInitialTWR = hasMFE; // NK } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); DrawStageStatsColumn("Stage", stages.Select(s => s.ToString())); if (showInitialMass) { showInitialMass = !DrawStageStatsColumn("Start mass", stages.Select(s => vacStats[s].startMass.ToString("F1") + " t")); } if (showFinalMass) { showFinalMass = !DrawStageStatsColumn("End mass", stages.Select(s => vacStats[s].endMass.ToString("F1") + " t")); } if (showInitialTWR) { showInitialTWR = !DrawStageStatsColumn("TWR", stages.Select(s => vacStats[s].StartTWR(geeASL).ToString("F2"))); } if (showAtmoInitialTWR) { showAtmoInitialTWR = !DrawStageStatsColumn("SLT", stages.Select(s => atmoStats[s].StartTWR(geeASL).ToString("F2"))); // NK } if (showMaxTWR) { showMaxTWR = !DrawStageStatsColumn("Max TWR", stages.Select(s => vacStats[s].MaxTWR(geeASL).ToString("F2"))); } if (showAtmoDeltaV) { showAtmoDeltaV = !DrawStageStatsColumn("Atmo ΔV", stages.Select(s => atmoStats[s].deltaV.ToString("F0") + " m/s")); } if (showAtmoTime) { showAtmoTime = !DrawStageStatsColumn("Atmo time", stages.Select(s => GuiUtils.TimeToDHMS(atmoStats[s].deltaTime))); } if (showVacDeltaV) { showVacDeltaV = !DrawStageStatsColumn("Vac ΔV", stages.Select(s => vacStats[s].deltaV.ToString("F0") + " m/s")); } if (showVacTime) { showVacTime = !DrawStageStatsColumn("Vac time", stages.Select(s => GuiUtils.TimeToDHMS(vacStats[s].deltaTime))); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); bool wasEnabled = balancer.smartTranslation; GUILayout.BeginHorizontal(); balancer.smartTranslation = GUILayout.Toggle(balancer.smartTranslation, "Smart translation", GUILayout.Width(130)); GUILayout.EndHorizontal(); if (wasEnabled != balancer.smartTranslation) { balancer.ResetThrusterForces(); if (balancer.smartTranslation) { balancer.users.Add(this); } else { balancer.users.Remove(this); } } if (balancer.smartTranslation) { // Overdrive double oldOverdrive = balancer.overdrive; double oldOverdriveScale = balancer.overdriveScale; double oldFactorTorque = balancer.tuningParamFactorTorque; double oldFactorTranslate = balancer.tuningParamFactorTranslate; double oldFactorWaste = balancer.tuningParamFactorWaste; GuiUtils.SimpleTextBox("Overdrive", balancer.overdrive, "%"); double sliderVal = GUILayout.HorizontalSlider((float)balancer.overdrive, 0.0F, 1.0F); int sliderPrecision = 3; if (Math.Round(Math.Abs(sliderVal - oldOverdrive), sliderPrecision) > 0) { double rounded = Math.Round(sliderVal, sliderPrecision); balancer.overdrive = new EditableDoubleMult(rounded, 0.01); } GUILayout.Label("Overdrive increases power when possible, at the cost of RCS fuel efficiency."); balancer.rcsForRotation = GUILayout.Toggle(balancer.rcsForRotation, "Use RCS for rotation"); // Advanced options balancer.advancedOptions = GUILayout.Toggle(balancer.advancedOptions, "Advanced options"); if (balancer.advancedOptions) { // This doesn't work properly, and it might not even be needed. //balancer.smartRotation = GUILayout.Toggle(balancer.smartRotation, "Smart rotation"); GuiUtils.SimpleTextBox("Overdrive scale", balancer.overdriveScale); GuiUtils.SimpleTextBox("Torque factor", balancer.tuningParamFactorTorque); GuiUtils.SimpleTextBox("Translate factor", balancer.tuningParamFactorTranslate); GuiUtils.SimpleTextBox("Waste factor", balancer.tuningParamFactorWaste); } // Apply tuning parameters. if (oldOverdrive != balancer.overdrive || oldOverdriveScale != balancer.overdriveScale || oldFactorTorque != balancer.tuningParamFactorTorque || oldFactorTranslate != balancer.tuningParamFactorTranslate || oldFactorWaste != balancer.tuningParamFactorWaste) { balancer.UpdateTuningParameters(); } } if (balancer.smartTranslation) { balancer.users.Add(this); } else { balancer.users.Remove(this); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
public override void DoParametersGUI(Orbit o, double universalTime, MechJebModuleTargetController target) { GuiUtils.SimpleTextBox("New Semi-Major Axis:", newSMA, "km"); timeSelector.DoChooseTimeGUI(); }
protected override void WindowGUI(int windowID) { if (path == null) { GUILayout.Label("Path is null!!!1!!1!1!1111!11eleven"); base.WindowGUI(windowID); return; } if (lastMaxAtmosphereAltitude != mainBody.RealMaxAtmosphereAltitude()) { lastMaxAtmosphereAltitude = mainBody.RealMaxAtmosphereAltitude(); UpdateAtmoTexture(pathTexture, mainBody, path.autoPath ? path.autoTurnEndAltitude : path.turnEndAltitude); } GUILayout.BeginVertical(); double oldTurnShapeExponent = path.turnShapeExponent; path.autoPath = GUILayout.Toggle(path.autoPath, "Automatic Altitude Turn", GUILayout.ExpandWidth(false)); if (path.autoPath) { GUILayout.BeginHorizontal(); GUILayout.Label("Altitude: ", GUILayout.Width(60)); // 1 to 200 / 200 = 0.5% to 105%, without this mess would the slider cause lots of garbage floats like 0.9999864 path.autoTurnPerc = Mathf.Floor(GUILayout.HorizontalSlider(path.autoTurnPerc * 200f, 1f, 210.5f)) / 200f; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Velocity: ", GUILayout.Width(60)); path.autoTurnSpdFactor = Mathf.Floor(GUILayout.HorizontalSlider(path.autoTurnSpdFactor * 2f, 8f, 160f)) / 2f; GUILayout.EndHorizontal(); } if (path.autoPath) { GUILayout.BeginHorizontal(); GUILayout.Label("Turn start when Altitude is ", GUILayout.ExpandWidth(false)); GUILayout.Label(MuUtils.ToSI(path.autoTurnStartAltitude, -1, 2) + "m", GUILayout.ExpandWidth(false)); GUILayout.Label("or Velocity reach ", GUILayout.ExpandWidth(false)); GUILayout.Label(MuUtils.ToSI(path.autoTurnStartVelocity, -1, 3) + "m/s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Turn end altitude: "); GUILayout.Label(MuUtils.ToSI(path.autoTurnEndAltitude, -1, 2) + "m", new GUIStyle(GUI.skin.label) { alignment = TextAnchor.MiddleRight }, GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); } else { GuiUtils.SimpleTextBox("Turn start altitude:", path.turnStartAltitude, "km"); GuiUtils.SimpleTextBox("Turn start velocity:", path.turnStartVelocity, "m/s"); GuiUtils.SimpleTextBox("Turn end altitude:", path.turnEndAltitude, "km"); } GuiUtils.SimpleTextBox("Final flight path angle:", path.turnEndAngle, "°"); GuiUtils.SimpleTextBox("Turn shape:", path.turnShapeExponent, "%"); // Round the slider's value (0..1) to sliderPrecision decimal places. const int sliderPrecision = 3; double sliderTurnShapeExponent = GUILayout.HorizontalSlider((float)path.turnShapeExponent, 0.0F, 1.0F); if (Math.Round(Math.Abs(sliderTurnShapeExponent - oldTurnShapeExponent), sliderPrecision) > 0) { path.turnShapeExponent = new EditableDoubleMult(Math.Round(sliderTurnShapeExponent, sliderPrecision), 0.01); } GUILayout.Box(pathTexture); if (Event.current.type == EventType.Repaint) { Rect r = GUILayoutUtility.GetLastRect(); r.xMin += GUI.skin.box.margin.left; r.yMin += GUI.skin.box.margin.top; r.xMax -= GUI.skin.box.margin.right; r.yMax -= GUI.skin.box.margin.bottom; float scale = (float)((path.autoPath ? path.autoTurnEndAltitude : path.turnEndAltitude) / r.height); DrawnPath(r, scale, scale, path, Color.red); DrawnTrajectory(r, path, recorder); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { //DefaultAscentPath path = (DefaultAscentPath)core.GetComputerModule<MechJebModuleAscentAutopilot>().ascentPath; if (oldMainBody != mainBody || lastMaximumAltitude != graphStates[(int)recordType.AltitudeASL].maximum || height != backgroundTexture.height) { UpdateScale(); lastMaximumAltitude = graphStates[(int)recordType.AltitudeASL].maximum; if (height != backgroundTexture.height) { Object.Destroy(backgroundTexture); backgroundTexture = new Texture2D(1, height); } MechJebModuleAscentPathEditor.UpdateAtmoTexture(backgroundTexture, vessel.mainBody, lastMaximumAltitude, realAtmo); oldMainBody = mainBody; } GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Button(paused ? "Resume" : "Pause", GUILayout.ExpandWidth(false))) { paused = !paused; } if (GUILayout.Button(downrange ? "Downrange" : "Time", GUILayout.ExpandWidth(false))) { downrange = !downrange; } //GUILayout.Label("Size " + (8 * typeCount * recorder.history.Length >> 10).ToString() + "kB", GUILayout.ExpandWidth(false)); GUILayout.Label("Time " + GuiUtils.TimeToDHMS(recorder.timeSinceMark), GUILayout.ExpandWidth(false)); GUILayout.Label("Downrange " + MuUtils.ToSI(recorder.history[recorder.historyIdx].downRange, -2) + "m", GUILayout.ExpandWidth(false)); //GUILayout.Label("", GUILayout.ExpandWidth(true)); GUILayout.FlexibleSpace(); if (GUILayout.Button("Mark", GUILayout.ExpandWidth(false))) { ResetScale(); // TODO : should check something else to catch Mark calls from other code recorder.Mark(); } if (GUILayout.Button("Reset Scale", GUILayout.ExpandWidth(false))) { ResetScale(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); autoScale = GUILayout.Toggle(autoScale, "Auto Scale", GUILayout.ExpandWidth(false)); if (!autoScale && GUILayout.Button("-", GUILayout.ExpandWidth(false))) { if (downrange) { downrangeScale--; } else { timeScale--; } } float maxX = (float)(downrange ? recorder.maximums[(int)recordType.DownRange] : recorder.maximums[(int)recordType.TimeSinceMark]); double maxXScaled = (downrange ? maxX : maxX / precision) / width; double autoScaleX = Math.Max(Math.Ceiling(Math.Log(maxXScaled, 2)), 0); double manualScaleX = downrange ? downrangeScale : timeScale; double activeScaleX = autoScale ? autoScaleX : manualScaleX; double scaleX = downrange ? Math.Pow(2, activeScaleX) : precision *Math.Pow(2, activeScaleX); GUILayout.Label((downrange ? MuUtils.ToSI(scaleX, -1, 2) + "m/px" : GuiUtils.TimeToDHMS(scaleX, 1) + "/px"), GUILayout.ExpandWidth(false)); if (!autoScale && GUILayout.Button("+", GUILayout.ExpandWidth(false))) { if (downrange) { downrangeScale++; } else { timeScale++; } } if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { hSize--; } GUILayout.Label(width.ToString(), GUILayout.ExpandWidth(false)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { hSize++; } GUILayout.Label("x", GUILayout.ExpandWidth(false)); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { vSize--; } GUILayout.Label(height.ToString(), GUILayout.ExpandWidth(false)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { vSize++; } timeScale = Mathf.Clamp(timeScale, 0, 20); downrangeScale = Mathf.Clamp(downrangeScale, 0, 20); hSize = Mathf.Clamp(hSize, 1, 20); vSize = Mathf.Clamp(vSize, 1, 10); bool oldRealAtmo = realAtmo; realAtmo = GUILayout.Toggle(realAtmo, "Real Atmo", GUILayout.ExpandWidth(false)); if (oldRealAtmo != realAtmo) { MechJebModuleAscentPathEditor.UpdateAtmoTexture(backgroundTexture, vessel.mainBody, lastMaximumAltitude, realAtmo); } //GUILayout.Label("", GUILayout.ExpandWidth(true)); GUILayout.FlexibleSpace(); if (GUILayout.Button("CSV", GUILayout.ExpandWidth(false))) { recorder.DumpCSV(); } GUILayout.Label("Storage: " + (100 * (recorder.historyIdx) / (float)recorder.history.Length).ToString("F1") + "%", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); Color color = GUI.color; //ascentPath = GUILayout.Toggle(ascentPath, "Ascent path", GUILayout.ExpandWidth(false)); stages = GUILayout.Toggle(stages, "Stages", GUILayout.ExpandWidth(false)); GUI.color = Color.white; graphStates[(int)recordType.AltitudeASL].display = GUILayout.Toggle(graphStates[(int)recordType.AltitudeASL].display, "Altitude", GUILayout.ExpandWidth(false)); GUI.color = Color.grey; graphStates[(int)recordType.AltitudeTrue].display = GUILayout.Toggle(graphStates[(int)recordType.AltitudeTrue].display, "True Altitude", GUILayout.ExpandWidth(false)); GUI.color = Color.red; graphStates[(int)recordType.Acceleration].display = GUILayout.Toggle(graphStates[(int)recordType.Acceleration].display, "Acceleration", GUILayout.ExpandWidth(false)); GUI.color = Color.yellow; graphStates[(int)recordType.SpeedSurface].display = GUILayout.Toggle(graphStates[(int)recordType.SpeedSurface].display, "Surface speed", GUILayout.ExpandWidth(false)); GUI.color = Color.magenta; graphStates[(int)recordType.SpeedOrbital].display = GUILayout.Toggle(graphStates[(int)recordType.SpeedOrbital].display, "Orbital speed", GUILayout.ExpandWidth(false)); GUI.color = Color.cyan; graphStates[(int)recordType.Q].display = GUILayout.Toggle(graphStates[(int)recordType.Q].display, "Q", GUILayout.ExpandWidth(false)); GUI.color = Color.green; graphStates[(int)recordType.AoA].display = GUILayout.Toggle(graphStates[(int)recordType.AoA].display, "AoA", GUILayout.ExpandWidth(false)); GUI.color = XKCDColors.GreenTeal; graphStates[(int)recordType.Pitch].display = GUILayout.Toggle(graphStates[(int)recordType.Pitch].display, "Pitch", GUILayout.ExpandWidth(false)); GUI.color = XKCDColors.CandyPink; graphStates[(int)recordType.Mass].display = GUILayout.Toggle(graphStates[(int)recordType.Mass].display, "Mass", GUILayout.ExpandWidth(false)); GUI.color = color; GUILayout.EndHorizontal(); GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.Space(50); GUILayout.Box(Texture2D.blackTexture, GUILayout.Width(width), GUILayout.Height(height)); Rect r = GUILayoutUtility.GetLastRect(); DrawScaleLabels(r); GUILayout.BeginVertical(); //GUILayout.Label("X " + MuUtils.ToSI(hPos, -1, 2) + " " + MuUtils.ToSI(hPos + scaleX * width, -1, 2), GUILayout.Width(110)); color = GUI.color; if (!graphStates[scaleIdx].display) { int newIdx = 0; while (newIdx < typeCount && !graphStates[newIdx].display) { newIdx++; } if (newIdx == typeCount) { newIdx = 0; } scaleIdx = newIdx; } if (graphStates[(int)recordType.AltitudeASL].display) { GUI.color = Color.white; //if (GUILayout.Toggle(scaleIdx == (int)recordType.AltitudeASL, "ASL " + MuUtils.ToSI(graphStates[(int)recordType.AltitudeASL].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.AltitudeASL].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.AltitudeASL, "ASL", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.AltitudeASL; } } if (graphStates[(int)recordType.AltitudeTrue].display) { GUI.color = Color.grey; //if (GUILayout.Toggle(scaleIdx == (int)recordType.AltitudeTrue, "AGL " + MuUtils.ToSI(graphStates[(int)recordType.AltitudeTrue].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.AltitudeTrue].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.AltitudeTrue, "AGL", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.AltitudeTrue; } } if (graphStates[(int)recordType.Acceleration].display) { GUI.color = Color.red; //if (GUILayout.Toggle(scaleIdx == (int)recordType.Acceleration, "Acc " + MuUtils.ToSI(graphStates[(int)recordType.Acceleration].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.Acceleration].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.Acceleration, "Acc", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.Acceleration; } } if (graphStates[(int)recordType.SpeedSurface].display) { GUI.color = Color.yellow; //if (GUILayout.Toggle(scaleIdx == (int)recordType.SpeedSurface, "SrfVel " + MuUtils.ToSI(graphStates[(int)recordType.SpeedSurface].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.SpeedSurface].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.SpeedSurface, "SrfVel", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.SpeedSurface; } } if (graphStates[(int)recordType.SpeedOrbital].display) { GUI.color = Color.magenta; //if (GUILayout.Toggle(scaleIdx == (int)recordType.SpeedOrbital, "ObtVel " + MuUtils.ToSI(graphStates[(int)recordType.SpeedOrbital].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.SpeedOrbital].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.SpeedOrbital, "ObtVel", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.SpeedOrbital; } } if (graphStates[(int)recordType.Q].display) { GUI.color = Color.cyan; //if (GUILayout.Toggle(scaleIdx == (int)recordType.Q, "Q " + MuUtils.ToSI(graphStates[(int)recordType.Q].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.Q].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.Q, "Q", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.Q; } } if (graphStates[(int)recordType.AoA].display) { GUI.color = Color.green; //if (GUILayout.Toggle(scaleIdx == (int)recordType.AoA, "AoA " + MuUtils.ToSI(graphStates[(int)recordType.AoA].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.AoA].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.AoA, "AoA", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.AoA; } } if (graphStates[(int)recordType.Pitch].display) { GUI.color = XKCDColors.GreenTeal; //if (GUILayout.Toggle(scaleIdx == (int)recordType.Pitch, "Pitch " + MuUtils.ToSI(graphStates[(int)recordType.Pitch].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.Pitch].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.Pitch, "Pitch", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.Pitch; } } if (graphStates[(int)recordType.Mass].display) { GUI.color = XKCDColors.CandyPink; //if (GUILayout.Toggle(scaleIdx == (int)recordType.Mass, "Mass " + MuUtils.ToSI(graphStates[(int)recordType.Mass].minimum, -1, 3) + " " + MuUtils.ToSI(graphStates[(int)recordType.Mass].maximum, -1, 3), GUILayout.ExpandWidth(true))) if (GUILayout.Toggle(scaleIdx == (int)recordType.Mass, "Mass", GUILayout.ExpandWidth(true))) { scaleIdx = (int)recordType.Mass; } } GUI.color = color; GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.Space(10); GUILayout.BeginHorizontal(); float visibleX = (float)(width * scaleX); float rightValue = Mathf.Max(visibleX, maxX); if (follow) { hPos = rightValue - visibleX; } hPos = GUILayout.HorizontalScrollbar(hPos, visibleX, 0, rightValue); follow = GUILayout.Toggle(follow, "", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); if (Event.current.type == EventType.Repaint) { UpdateScale(); if (graphStates[(int)recordType.AltitudeASL].display || graphStates[(int)recordType.AltitudeTrue].display) { GUI.DrawTexture(r, backgroundTexture, ScaleMode.StretchToFill); } if (stages) { DrawnStages(r, scaleX, downrange); } if (graphStates[(int)recordType.AltitudeASL].display) { DrawnPath(r, recordType.AltitudeASL, hPos, scaleX, downrange, Color.white); } if (graphStates[(int)recordType.AltitudeTrue].display) { DrawnPath(r, recordType.AltitudeTrue, hPos, scaleX, downrange, Color.grey); } if (graphStates[(int)recordType.Acceleration].display) { DrawnPath(r, recordType.Acceleration, hPos, scaleX, downrange, Color.red); } if (graphStates[(int)recordType.SpeedSurface].display) { DrawnPath(r, recordType.SpeedSurface, hPos, scaleX, downrange, Color.yellow); } if (graphStates[(int)recordType.SpeedOrbital].display) { DrawnPath(r, recordType.SpeedOrbital, hPos, scaleX, downrange, Color.magenta); } if (graphStates[(int)recordType.Q].display) { DrawnPath(r, recordType.Q, hPos, scaleX, downrange, Color.cyan); } if (graphStates[(int)recordType.AoA].display) { DrawnPath(r, recordType.AoA, hPos, scaleX, downrange, Color.green); } if (graphStates[(int)recordType.Pitch].display) { DrawnPath(r, recordType.Pitch, hPos, scaleX, downrange, XKCDColors.GreenTeal); } if (graphStates[(int)recordType.Mass].display) { DrawnPath(r, recordType.Mass, hPos, scaleX, downrange, XKCDColors.CandyPink); } // Fix : the scales are different so the result is not useful //if (ascentPath) // MechJebModuleAscentPathEditor.DrawnPath(r, (float)hScale, (float)graphStates[(int)recordType.AltitudeASL].scale, path, Color.gray); width = 128 * hSize; height = 128 * vSize; } GUILayout.EndVertical(); base.WindowGUI(windowID); }
string GetStringValue(object value) { if (value == null) { return("null"); } if (value is string) { return((string)value + " " + units); } if (value is int) { return(((int)value).ToString() + " " + units); } double doubleValue = -999; if (value is double) { doubleValue = (double)value; } else if (value is float) { doubleValue = (float)value; } else if (value is MovingAverage) { doubleValue = (MovingAverage)value; } else if (value is Vector3d) { doubleValue = ((Vector3d)value).magnitude; } else if (value is Vector3) { doubleValue = ((Vector3)value).magnitude; } else if (value is EditableDouble) { doubleValue = (EditableDouble)value; } if (format == TIME) { return(GuiUtils.TimeToDHMS(doubleValue, timeDecimalPlaces)); } else if (format == ANGLE) { return(Coordinates.AngleToDMS(doubleValue)); } else if (format == ANGLE_NS) { return(Coordinates.AngleToDMS(doubleValue) + " " + (doubleValue > 0 ? "N" : "S")); } else if (format == ANGLE_EW) { return(Coordinates.AngleToDMS(doubleValue) + " " + (doubleValue > 0 ? "E" : "W")); } else if (format == SI) { return(MuUtils.ToSI(doubleValue, siMaxPrecision, siSigFigs) + units); } else { return(doubleValue.ToString(format) + " " + units); } }
public EditableTime(double seconds) : base(seconds) { _text = GuiUtils.TimeToDHMS(seconds); }
private void DoPorkchopGui(Orbit o, double universalTime, MechJebModuleTargetController target) { if (worker == null || (plot == null && Event.current.type == EventType.Repaint)) { return; } string dv = " - "; string departure = " - "; string duration = " - "; if (worker.Finished && worker.computed.GetLength(1) == porkchop_Height) { if (plot == null && Event.current.type == EventType.Layout) { plot = new PlotArea( worker.minDepartureTime, worker.maxDepartureTime, worker.minTransferTime, worker.maxTransferTime, new Porkchop(worker.computed).texture, (xmin, xmax, ymin, ymax) => { minDepartureTime = Math.Max(xmin, universalTime); maxDepartureTime = xmax; minTransferTime = Math.Max(ymin, 3600); maxTransferTime = ymax; GUI.changed = true; }); plot.selectedPoint = new int[] { worker.bestDate, worker.bestDuration }; } } if (plot != null) { var point = plot.selectedPoint; if (plot.hoveredPoint != null) { point = plot.hoveredPoint; } var p = worker.computed[point[0], point[1]]; if (p != null) { dv = MuUtils.ToSI(p.dV.magnitude) + "m/s"; if (worker.DateFromIndex(point[0]) < Planetarium.GetUniversalTime()) { departure = "any time now"; } else { departure = GuiUtils.TimeToDHMS(worker.DateFromIndex(point[0]) - Planetarium.GetUniversalTime()); } duration = GuiUtils.TimeToDHMS(worker.DurationFromIndex(point[1])); } plot.DoGUI(); if (!plot.draggable) { _draggable = false; } } else { GUIStyle progressStyle = new GUIStyle { font = GuiUtils.skin.font, fontSize = GuiUtils.skin.label.fontSize, fontStyle = GuiUtils.skin.label.fontStyle, normal = { textColor = GuiUtils.skin.label.normal.textColor } }; GUILayout.Box("Computing: " + worker.Progress + "%", progressStyle, new GUILayoutOption[] { GUILayout.Width(windowWidth), GUILayout.Height(porkchop_Height) }); } GUILayout.BeginHorizontal(); GUILayout.Label("ΔV: " + dv); GUILayout.FlexibleSpace(); if (GUILayout.Button("Reset", GuiUtils.yellowOnHover)) { ComputeTimes(o, target.TargetOrbit, universalTime); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Select: "); GUILayout.FlexibleSpace(); if (GUILayout.Button("Lowest ΔV")) { plot.selectedPoint = new int[] { worker.bestDate, worker.bestDuration }; GUI.changed = false; } if (GUILayout.Button("ASAP")) { int bestDuration = 0; for (int i = 1; i < worker.computed.GetLength(1); i++) { if (worker.computed[0, bestDuration].dV.sqrMagnitude > worker.computed[0, i].dV.sqrMagnitude) { bestDuration = i; } } plot.selectedPoint = new int[] { 0, bestDuration }; GUI.changed = false; } GUILayout.EndHorizontal(); GUILayout.Label("Departure in " + departure); GUILayout.Label("Transit duration " + duration); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); GuiUtils.SimpleTextBox("Kp", Kp); GuiUtils.SimpleTextBox("Ki", Ki); GuiUtils.SimpleTextBox("Kd", Kd); GuiUtils.SimpleTextBox("Tf", Tf); GuiUtils.SimpleTextBox("Ki_limit", Ki_limit); GuiUtils.SimpleTextBox("Factor", factor); GUILayout.BeginHorizontal(); GUILayout.Label("prevError", GUILayout.ExpandWidth(true)); GUILayout.Label(MuUtils.PrettyPrint(core.attitude.pid.prevError), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("|prevError|", GUILayout.ExpandWidth(true)); GUILayout.Label(core.attitude.pid.prevError.magnitude.ToString("F3"), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("intAccum", GUILayout.ExpandWidth(true)); GUILayout.Label(MuUtils.PrettyPrint(core.attitude.pid.intAccum), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("|intAccum|", GUILayout.ExpandWidth(true)); GUILayout.Label(core.attitude.pid.intAccum.magnitude.ToString("F3"), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); double precision = Math.Max(0.5, Math.Min(10.0, (Math.Min(vesselState.torqueAvailable.x, vesselState.torqueAvailable.z) + vesselState.torqueThrustPYAvailable * vessel.ctrlState.mainThrottle) * 20.0 / vesselState.MoI.magnitude)); GUILayout.BeginHorizontal(); GUILayout.Label("precision", GUILayout.ExpandWidth(true)); GUILayout.Label(precision.ToString("F3"), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); Vector3d torque = new Vector3d( vesselState.torqueAvailable.x + vesselState.torqueThrustPYAvailable * vessel.ctrlState.mainThrottle, vesselState.torqueAvailable.y, vesselState.torqueAvailable.z + vesselState.torqueThrustPYAvailable * vessel.ctrlState.mainThrottle ); GUILayout.BeginHorizontal(); GUILayout.Label("torque", GUILayout.ExpandWidth(true)); GUILayout.Label(MuUtils.PrettyPrint(torque), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("|torque|", GUILayout.ExpandWidth(true)); GUILayout.Label(torque.magnitude.ToString("F3"), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); Vector3d inertia = Vector3d.Scale( vesselState.angularMomentum.Sign(), Vector3d.Scale( Vector3d.Scale(vesselState.angularMomentum, vesselState.angularMomentum), Vector3d.Scale(torque, vesselState.MoI).Invert() ) ); GUILayout.BeginHorizontal(); GUILayout.Label("inertia", GUILayout.ExpandWidth(true)); GUILayout.Label(MuUtils.PrettyPrint(inertia), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("|inertia|", GUILayout.ExpandWidth(true)); GUILayout.Label(inertia.magnitude.ToString("F3"), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.EndVertical(); if ((Kp != core.attitude.Kp) || (Ki != core.attitude.Ki) || (Kd != core.attitude.Kd)) { core.attitude.Kp = Kp; core.attitude.Ki = Ki; core.attitude.Kd = Kd; core.attitude.Ki_limit = Ki_limit; core.attitude.pid = new PIDControllerV(Kp, Ki, Kd, Ki_limit, -Ki_limit); } core.attitude.drive_factor = factor; core.attitude.Tf = Tf; base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); if (core.target.PositionTargetExists) { GUILayout.Label("Target coordinates:"); core.target.targetLatitude.DrawEditGUI(EditableAngle.Direction.NS); core.target.targetLongitude.DrawEditGUI(EditableAngle.Direction.EW); GUILayout.Label(ScienceUtil.GetExperimentBiome(core.target.targetBody, core.target.targetLatitude, core.target.targetLongitude)); // Display the ASL of the taget location GUILayout.Label("Target ASL: " + MuUtils.ToSI(core.vessel.mainBody.TerrainAltitude(core.target.targetLatitude, core.target.targetLongitude), -1, 4) + "m"); } else { if (GUILayout.Button("Enter target coordinates")) { core.target.SetPositionTarget(mainBody, core.target.targetLatitude, core.target.targetLongitude); } } if (GUILayout.Button("Pick target on map")) { core.target.PickPositionTargetOnMap(); } List <LandingSite> availableLandingSites = landingSites.Where(p => p.body == mainBody).ToList(); if (availableLandingSites.Any()) { GUILayout.BeginHorizontal(); landingSiteIdx = GuiUtils.ComboBox.Box(landingSiteIdx, availableLandingSites.Select(p => p.name).ToArray(), this); if (GUILayout.Button("Set", GUILayout.ExpandWidth(false))) { core.target.SetPositionTarget(mainBody, availableLandingSites[landingSiteIdx].latitude, availableLandingSites[landingSiteIdx].longitude); } GUILayout.EndHorizontal(); } DrawGUITogglePredictions(); if (autopilot != null) { GUILayout.Label("Autopilot:"); if (autopilot.enabled) { if (GUILayout.Button("Abort autoland")) { autopilot.StopLanding(); } } else { GUILayout.BeginHorizontal(); if (!core.target.PositionTargetExists) { GUI.enabled = false; } if (GUILayout.Button("Land at target")) { autopilot.LandAtPositionTarget(this); } GUI.enabled = true; if (GUILayout.Button("Land somewhere")) { autopilot.LandUntargeted(this); } GUILayout.EndHorizontal(); } GuiUtils.SimpleTextBox("Touchdown speed:", autopilot.touchdownSpeed, "m/s", 35); if (autopilot != null) { core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp"); } autopilot.deployGears = GUILayout.Toggle(autopilot.deployGears, "Deploy Landing Gear"); GuiUtils.SimpleTextBox("Stage Limit:", autopilot.limitGearsStage, "", 35); autopilot.deployChutes = GUILayout.Toggle(autopilot.deployChutes, "Deploy Parachutes"); predictor.deployChutes = autopilot.deployChutes; GuiUtils.SimpleTextBox("Stage Limit:", autopilot.limitChutesStage, "", 35); predictor.limitChutesStage = autopilot.limitChutesStage; if (autopilot.enabled) { GUILayout.Label("Status: " + autopilot.status); string parachuteInfo = autopilot.ParachuteControlInfo; if (null != parachuteInfo) { GUILayout.Label(parachuteInfo); } } } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); GUILayout.Label("When guidance is enabled, the purple circle on the navball points along the ascent path."); ToggleAscentNavballGuidanceInfoItem(); if (autopilot != null) { if (autopilot.enabled) { if (GUILayout.Button("Disengage autopilot")) { autopilot.users.Remove(this); } } else { if (GUILayout.Button("Engage autopilot")) { autopilot.users.Add(this); } } GuiUtils.SimpleTextBox("Orbit altitude", autopilot.desiredOrbitAltitude, "km"); autopilot.desiredInclination = desiredInclination; GUIStyle si = new GUIStyle(GUI.skin.label); if (!autopilot.enabled && Math.Abs(desiredInclination) < Math.Abs(vesselState.latitude)) { si.onHover.textColor = si.onNormal.textColor = XKCDColors.Orange; } GuiUtils.SimpleTextBox("Orbit inclination", desiredInclination, "º"); core.thrust.LimitToPreventOverheatsInfoItem(); //core.thrust.LimitToTerminalVelocityInfoItem(); core.thrust.LimitToMaxDynamicPressureInfoItem(); core.thrust.LimitAccelerationInfoItem(); core.thrust.LimitThrottleInfoItem(); core.thrust.LimiterMinThrottleInfoItem(); core.thrust.LimitElectricInfoItem(); GUILayout.BeginHorizontal(); autopilot.forceRoll = GUILayout.Toggle(autopilot.forceRoll, "Force Roll"); if (autopilot.forceRoll) { GuiUtils.SimpleTextBox("climb", autopilot.verticalRoll, "º", 30f); GuiUtils.SimpleTextBox("turn", autopilot.turnRoll, "º", 30f); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUIStyle s = new GUIStyle(GUI.skin.toggle); if (autopilot.limitingAoA) { s.onHover.textColor = s.onNormal.textColor = Color.green; } autopilot.limitAoA = GUILayout.Toggle(autopilot.limitAoA, "Limit AoA to", s, GUILayout.ExpandWidth(true)); autopilot.maxAoA.text = GUILayout.TextField(autopilot.maxAoA.text, GUILayout.Width(30)); GUILayout.Label("º (" + autopilot.currentMaxAoA.ToString("F1") + "°)", GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(25); if (autopilot.limitAoA) { GUIStyle sl = new GUIStyle(GUI.skin.label); if (autopilot.limitingAoA && vesselState.dynamicPressure < autopilot.aoALimitFadeoutPressure) { sl.normal.textColor = sl.hover.textColor = Color.green; } GuiUtils.SimpleTextBox("Dynamic Pressure Fadeout", autopilot.aoALimitFadeoutPressure, "pa", 50, sl); } GUILayout.EndHorizontal(); autopilot.correctiveSteering = GUILayout.Toggle(autopilot.correctiveSteering, "Corrective steering"); autopilot.autostage = GUILayout.Toggle(autopilot.autostage, "Autostage"); if (autopilot.autostage) { core.staging.AutostageSettingsInfoItem(); } autopilot.autodeploySolarPanels = GUILayout.Toggle(autopilot.autodeploySolarPanels, "Auto-deploy solar panels"); GUILayout.BeginHorizontal(); core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp"); autopilot.skipCircularization = GUILayout.Toggle(autopilot.skipCircularization, "Skip Circularization"); GUILayout.EndHorizontal(); if (vessel.LandedOrSplashed) { if (core.target.NormalTargetExists) { if (core.node.autowarp) { GUILayout.BeginHorizontal(); GUILayout.Label("Launch countdown:", GUILayout.ExpandWidth(true)); autopilot.warpCountDown.text = GUILayout.TextField(autopilot.warpCountDown.text, GUILayout.Width(60)); GUILayout.Label("s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } if (!launchingToPlane && !launchingToRendezvous && !launchingToInterplanetary) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Launch to rendezvous:", GUILayout.ExpandWidth(false))) { launchingToRendezvous = true; autopilot.StartCountdown(vesselState.time + LaunchTiming.TimeToPhaseAngle(autopilot.launchPhaseAngle, mainBody, vesselState.longitude, core.target.TargetOrbit)); } autopilot.launchPhaseAngle.text = GUILayout.TextField(autopilot.launchPhaseAngle.text, GUILayout.Width(60)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Launch into plane of target", GUILayout.ExpandWidth(false))) { launchingToPlane = true; autopilot.StartCountdown(vesselState.time + LaunchTiming.TimeToPlane(autopilot.launchLANDifference, mainBody, vesselState.latitude, vesselState.longitude, core.target.TargetOrbit)); } autopilot.launchLANDifference.text = GUILayout.TextField( autopilot.launchLANDifference.text, GUILayout.Width(60)); GUILayout.Label("º", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); if (core.target.TargetOrbit.referenceBody == orbit.referenceBody.referenceBody) { if (GUILayout.Button("Launch at interplanetary window")) { launchingToInterplanetary = true; //compute the desired launch date OrbitalManeuverCalculator.DeltaVAndTimeForHohmannTransfer(mainBody.orbit, core.target.TargetOrbit, vesselState.time, out interplanetaryWindowUT); double desiredOrbitPeriod = 2 * Math.PI * Math.Sqrt( Math.Pow(mainBody.Radius + autopilot.desiredOrbitAltitude, 3) / mainBody.gravParameter); //launch just before the window, but don't try to launch in the past interplanetaryWindowUT -= 3 * desiredOrbitPeriod; interplanetaryWindowUT = Math.Max(vesselState.time + autopilot.warpCountDown, interplanetaryWindowUT); autopilot.StartCountdown(interplanetaryWindowUT); } } } } else { launchingToInterplanetary = launchingToPlane = launchingToRendezvous = false; GUILayout.Label("Select a target for a timed launch."); } if (launchingToInterplanetary || launchingToPlane || launchingToRendezvous) { string message = ""; if (launchingToInterplanetary) { message = "Launching at interplanetary window"; } else if (launchingToPlane) { desiredInclination = core.target.TargetOrbit.inclination; desiredInclination *= Math.Sign(Vector3d.Dot(core.target.TargetOrbit.SwappedOrbitNormal(), Vector3d.Cross(vesselState.CoM - mainBody.position, mainBody.transform.up))); message = "Launching to target plane"; } else if (launchingToRendezvous) { message = "Launching to rendezvous"; } if (autopilot.tMinus > 3 * vesselState.deltaT) { message += ": T-" + GuiUtils.TimeToDHMS(autopilot.tMinus, 1); } GUILayout.Label(message); if (GUILayout.Button("Abort")) { launchingToInterplanetary = launchingToPlane = launchingToRendezvous = autopilot.timedLaunch = false; } } } if (autopilot.enabled) { GUILayout.Label("Autopilot status: " + autopilot.status); } } if (!vessel.patchedConicsUnlocked()) { GUILayout.Label("Warning: MechJeb is unable to circularize without an upgraded Tracking Station."); } MechJebModuleAscentPathEditor editor = core.GetComputerModule <MechJebModuleAscentPathEditor>(); if (editor != null) { editor.enabled = GUILayout.Toggle(editor.enabled, "Edit ascent path"); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); if (core.target.PositionTargetExists) { var ASL = core.vessel.mainBody.TerrainAltitude(core.target.targetLatitude, core.target.targetLongitude); GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_label1"));//Target coordinates: GUILayout.BeginHorizontal(); core.target.targetLatitude.DrawEditGUI(EditableAngle.Direction.NS); if (GUILayout.Button("▲")) { moveByMeter(ref core.target.targetLatitude, 10, ASL); } GUILayout.Label("10m"); if (GUILayout.Button("▼")) { moveByMeter(ref core.target.targetLatitude, -10, ASL); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); core.target.targetLongitude.DrawEditGUI(EditableAngle.Direction.EW); if (GUILayout.Button("◄")) { moveByMeter(ref core.target.targetLongitude, -10, ASL); } GUILayout.Label("10m"); if (GUILayout.Button("►")) { moveByMeter(ref core.target.targetLongitude, 10, ASL); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("ASL: " + MuUtils.ToSI(ASL, -1, 4) + "m"); GUILayout.Label(core.target.targetBody.GetExperimentBiomeSafe(core.target.targetLatitude, core.target.targetLongitude)); GUILayout.EndHorizontal(); } else { if (GUILayout.Button(Localizer.Format("#MechJeb_LandingGuidance_button1")))//Enter target coordinates { core.target.SetPositionTarget(mainBody, core.target.targetLatitude, core.target.targetLongitude); } } if (GUILayout.Button(Localizer.Format("#MechJeb_LandingGuidance_button2"))) { core.target.PickPositionTargetOnMap(); //Pick target on map } List <LandingSite> availableLandingSites = landingSites.Where(p => p.body == mainBody).ToList(); if (availableLandingSites.Any()) { GUILayout.BeginHorizontal(); landingSiteIdx = GuiUtils.ComboBox.Box(landingSiteIdx, availableLandingSites.Select(p => p.name).ToArray(), this); if (GUILayout.Button("Set", GUILayout.ExpandWidth(false))) { core.target.SetPositionTarget(mainBody, availableLandingSites[landingSiteIdx].latitude, availableLandingSites[landingSiteIdx].longitude); } GUILayout.EndHorizontal(); } DrawGUITogglePredictions(); if (core.landing != null) { GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_label2"));//Autopilot: predictor.maxOrbits = core.landing.enabled ? 0.5 : 4; predictor.noSkipToFreefall = !core.landing.enabled; if (core.landing.enabled) { if (GUILayout.Button(Localizer.Format("#MechJeb_LandingGuidance_button3"))) { core.landing.StopLanding(); //Abort autoland } } else { GUILayout.BeginHorizontal(); if (!core.target.PositionTargetExists || vessel.LandedOrSplashed) { GUI.enabled = false; } if (GUILayout.Button(Localizer.Format("#MechJeb_LandingGuidance_button4"))) { core.landing.LandAtPositionTarget(this); //Land at target } GUI.enabled = !vessel.LandedOrSplashed; if (GUILayout.Button(Localizer.Format("#MechJeb_LandingGuidance_button5"))) { core.landing.LandUntargeted(this); //Land somewhere } GUI.enabled = true; GUILayout.EndHorizontal(); } GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_LandingGuidance_label3"), core.landing.touchdownSpeed, "m/s", 35);//Touchdown speed: if (core.landing != null) { core.node.autowarp = GUILayout.Toggle(core.node.autowarp, Localizer.Format("#MechJeb_LandingGuidance_checkbox1")); //Auto-warp } core.landing.deployGears = GUILayout.Toggle(core.landing.deployGears, Localizer.Format("#MechJeb_LandingGuidance_checkbox2")); //Deploy Landing Gear GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_LandingGuidance_label4"), core.landing.limitGearsStage, "", 35); //"Stage Limit:" core.landing.deployChutes = GUILayout.Toggle(core.landing.deployChutes, Localizer.Format("#MechJeb_LandingGuidance_checkbox3")); //Deploy Parachutes predictor.deployChutes = core.landing.deployChutes; GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_LandingGuidance_label5"), core.landing.limitChutesStage, "", 35); //Stage Limit: predictor.limitChutesStage = core.landing.limitChutesStage; core.landing.rcsAdjustment = GUILayout.Toggle(core.landing.rcsAdjustment, Localizer.Format("#MechJeb_LandingGuidance_checkbox4")); //Use RCS for small adjustment if (core.landing.enabled) { GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_label6") + core.landing.status); //Status: GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_label7") + (core.landing.CurrentStep != null ? core.landing.CurrentStep.GetType().Name : "N/A")); //Step: GUILayout.Label(Localizer.Format("#MechJeb_LandingGuidance_label8") + (core.landing.descentSpeedPolicy != null ? core.landing.descentSpeedPolicy.GetType().Name : "N/A") + " (" + core.landing.UseAtmosphereToBrake().ToString() + ")"); //Mode //GUILayout.Label("DecEndAlt: " + core.landing.DecelerationEndAltitude().ToString("F2")); //var dragLength = mainBody.DragLength(core.landing.LandingAltitude, core.landing.vesselAverageDrag, vesselState.mass); //GUILayout.Label("Drag Length: " + ( dragLength < double.MaxValue ? dragLength.ToString("F2") : "infinite")); // //string parachuteInfo = core.landing.ParachuteControlInfo; //if (null != parachuteInfo) //{ // GUILayout.Label(parachuteInfo); //} } } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Warp to: ", GUILayout.ExpandWidth(false)); warpTarget = (WarpTarget)GuiUtils.ComboBox.Box((int)warpTarget, warpTargetStrings, this); GUILayout.EndHorizontal(); if (warpTarget == WarpTarget.Time) { GUILayout.BeginHorizontal(); GUILayout.Label("Warp for: ", GUILayout.ExpandWidth(true)); timeOffset.text = GUILayout.TextField(timeOffset.text, GUILayout.Width(100)); GUILayout.EndHorizontal(); } else if (warpTarget == WarpTarget.PhaseAngleT) { // I wonder if I should check for target that don't make sense if (!core.target.NormalTargetExists) { GUILayout.Label("You need a target"); } else { GuiUtils.SimpleTextBox("Phase Angle:", phaseAngle, "º", 60); } } GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("Lead time: ", leadTime, ""); if (warping) { if (GUILayout.Button("Abort")) { warping = false; core.warp.MinimumWarp(true); } } else { if (GUILayout.Button("Warp")) { warping = true; switch (warpTarget) { case WarpTarget.Periapsis: targetUT = orbit.NextPeriapsisTime(vesselState.time); break; case WarpTarget.Apoapsis: if (orbit.eccentricity < 1) { targetUT = orbit.NextApoapsisTime(vesselState.time); } break; case WarpTarget.SoI: if (orbit.patchEndTransition != Orbit.PatchTransitionType.FINAL) { targetUT = orbit.EndUT; } break; case WarpTarget.Node: if (vessel.patchedConicsUnlocked() && vessel.patchedConicSolver.maneuverNodes.Any()) { targetUT = vessel.patchedConicSolver.maneuverNodes[0].UT; } break; case WarpTarget.Time: targetUT = vesselState.time + timeOffset; break; case WarpTarget.PhaseAngleT: if (core.target.NormalTargetExists) { Orbit reference; if (core.target.TargetOrbit.referenceBody == orbit.referenceBody) { reference = orbit; // we orbit arround the same body } else { reference = orbit.referenceBody.orbit; } // From Kerbal Alarm Clock double angleChangePerSec = (360 / core.target.TargetOrbit.period) - (360 / reference.period); double currentAngle = reference.PhaseAngle(core.target.TargetOrbit, vesselState.time); double angleDigff = currentAngle - phaseAngle; if (angleDigff > 0 && angleChangePerSec > 0) { angleDigff -= 360; } if (angleDigff < 0 && angleChangePerSec < 0) { angleDigff += 360; } double TimeToTarget = Math.Floor(Math.Abs(angleDigff / angleChangePerSec)); targetUT = vesselState.time + TimeToTarget; } break; case WarpTarget.AtmosphericEntry: try { targetUT = OrbitExtensions.NextTimeOfRadius(vessel.orbit, vesselState.time, vesselState.mainBody.Radius + vesselState.mainBody.RealMaxAtmosphereAltitude()); } catch { warping = false; } break; case WarpTarget.SuicideBurn: try { targetUT = OrbitExtensions.SuicideBurnCountdown(orbit, vesselState, vessel) + vesselState.time; } catch { warping = false; } break; default: targetUT = vesselState.time; break; } } } GUILayout.EndHorizontal(); core.warp.useQuickWarpInfoItem(); if (warping) { GUILayout.Label("Warping to " + (leadTime > 0 ? GuiUtils.TimeToDHMS(leadTime) + " before " : "") + warpTargetStrings[(int)warpTarget] + "."); } core.warp.ControlWarpButton(); GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); if (core.target.PositionTargetExists) { GUILayout.Label("Target coordinates:"); core.target.targetLatitude.DrawEditGUI(EditableAngle.Direction.NS); core.target.targetLongitude.DrawEditGUI(EditableAngle.Direction.EW); } else { if (GUILayout.Button("Enter target coordinates")) { core.target.SetPositionTarget(mainBody, core.target.targetLatitude, core.target.targetLongitude); } } if (GUILayout.Button("Pick target on map")) { core.target.PickPositionTargetOnMap(); } if (mainBody.bodyName.ToLower().Contains("kerbin")) { if (GUILayout.Button("Target KSC")) { core.target.SetPositionTarget(mainBody, -0.10267, -74.57538); } } core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp"); bool active = GUILayout.Toggle(predictor.enabled, "Show landing predictions"); if (predictor.enabled != active) { if (active) { predictor.users.Add(this); } else { predictor.users.Remove(this); } } if (predictor.enabled) { predictor.makeAerobrakeNodes = GUILayout.Toggle(predictor.makeAerobrakeNodes, "Show aerobrake nodes"); DrawGUIPrediction(); } if (autopilot != null) { GUILayout.Label("Autopilot:"); if (autopilot.enabled) { if (GUILayout.Button("Abort autoland")) { autopilot.StopLanding(); } } else { GUILayout.BeginHorizontal(); if (!core.target.PositionTargetExists) { GUI.enabled = false; } if (GUILayout.Button("Land at target")) { autopilot.LandAtPositionTarget(this); } GUI.enabled = true; if (GUILayout.Button("Land somewhere")) { autopilot.LandUntargeted(this); } GUILayout.EndHorizontal(); } GuiUtils.SimpleTextBox("Touchdown speed:", autopilot.touchdownSpeed, "m/s", 35); if (autopilot.enabled) { GUILayout.Label("Status: " + autopilot.status); } } GUILayout.EndVertical(); GUI.DragWindow(); }
protected override void WindowGUI(int windowID) { GUILayout.BeginVertical(); //core.GetComputerModule<MechJebModuleCustomWindowEditor>().registry.Find(i => i.id == "Toggle:AttitudeController.useSAS").DrawItem(); core.attitude.RCS_auto = GUILayout.Toggle(core.attitude.RCS_auto, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox1"));//RCS auto mode int currentController = core.attitude.activeController; if (GUILayout.Toggle(currentController == 0, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox2")))//MJAttitudeController { currentController = 0; } if (GUILayout.Toggle(currentController == 1, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox3")))//KosAttitudeController { currentController = 1; } if (GUILayout.Toggle(currentController == 2, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox4")))//HybridController { currentController = 2; } if (GUILayout.Toggle(currentController == 3, "BetterController")) { currentController = 3; } GUILayout.BeginHorizontal(); GUILayout.Space(20); GUILayout.BeginVertical(); core.attitude.Controller.GUI(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); if (currentController != core.attitude.activeController) { core.attitude.SetActiveController(currentController); } showInfos = GUILayout.Toggle(showInfos, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox5"));//Show Numbers if (showInfos) { GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label1"), GUILayout.ExpandWidth(true));//Axis Control GUILayout.Label(MuUtils.PrettyPrint(core.attitude.AxisState, "F0"), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label2"), GUILayout.ExpandWidth(true));//Torque GUILayout.Label("|" + core.attitude.torque.magnitude.ToString("F3") + "| " + MuUtils.PrettyPrint(core.attitude.torque), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label3"), GUILayout.ExpandWidth(true));//torqueReactionSpeed GUILayout.Label( "|" + vesselState.torqueReactionSpeed.magnitude.ToString("F3") + "| " + MuUtils.PrettyPrint(vesselState.torqueReactionSpeed), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); Vector3d ratio = Vector3d.Scale(vesselState.MoI, core.attitude.torque.InvertNoNaN()); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label4"), GUILayout.ExpandWidth(true));//MOI / torque GUILayout.Label("|" + ratio.magnitude.ToString("F3") + "| " + MuUtils.PrettyPrint(ratio), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label5"), GUILayout.ExpandWidth(true));//MOI GUILayout.Label("|" + vesselState.MoI.magnitude.ToString("F3") + "| " + MuUtils.PrettyPrint(vesselState.MoI), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label6"), GUILayout.ExpandWidth(true));//Angular Velocity GUILayout.Label("|" + vessel.angularVelocity.magnitude.ToString("F3") + "| " + MuUtils.PrettyPrint(vessel.angularVelocity), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label7"), GUILayout.ExpandWidth(true));//"Angular M" GUILayout.Label( "|" + vesselState.angularMomentum.magnitude.ToString("F3") + "| " + MuUtils.PrettyPrint(vesselState.angularMomentum), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label8"), GUILayout.ExpandWidth(true));//fixedDeltaTime GUILayout.Label(TimeWarp.fixedDeltaTime.ToString("F3"), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } MechJebModuleDebugArrows arrows = core.GetComputerModule <MechJebModuleDebugArrows>(); GuiUtils.SimpleTextBox(Localizer.Format("#MechJeb_AttitudeAdjust_Label9"), arrows.arrowsLength, "", 50); //Arrows length arrows.seeThrough = GUILayout.Toggle(arrows.seeThrough, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox6")); //Visible through object arrows.comSphereActive = GUILayout.Toggle(arrows.comSphereActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox7"), GUILayout.ExpandWidth(false)); //Display the CoM arrows.colSphereActive = GUILayout.Toggle(arrows.colSphereActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox8"), GUILayout.ExpandWidth(false)); //Display the CoL arrows.cotSphereActive = GUILayout.Toggle(arrows.cotSphereActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox9"), GUILayout.ExpandWidth(false)); //Display the CoT GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("#MechJeb_AttitudeAdjust_Label10"), GUILayout.ExpandWidth(true)); //Radius of Sphere arrows.comSphereRadius.text = GUILayout.TextField(arrows.comSphereRadius.text, GUILayout.Width(40)); GUILayout.EndHorizontal(); arrows.displayAtCoM = GUILayout.Toggle(arrows.displayAtCoM, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox10")); //Arrows origins at the CoM arrows.srfVelocityArrowActive = GUILayout.Toggle(arrows.srfVelocityArrowActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox11")); //Pod Surface Velocity (green) arrows.obtVelocityArrowActive = GUILayout.Toggle(arrows.obtVelocityArrowActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox12")); //Pod Orbital Velocity (red) arrows.dotArrowActive = GUILayout.Toggle(arrows.dotArrowActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox13")); //Direction of Thrust (purple pink) arrows.forwardArrowActive = GUILayout.Toggle(arrows.forwardArrowActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox14")); //Command Pod Forward (electric blue) //arrows.avgForwardArrowActive = GUILayout.Toggle(arrows.avgForwardArrowActive, "Forward Avg (blue)"); arrows.requestedAttitudeArrowActive = GUILayout.Toggle(arrows.requestedAttitudeArrowActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox15")); //Requested Attitude (gray) arrows.debugArrowActive = GUILayout.Toggle(arrows.debugArrowActive, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox16")); //Debug (magenta) arrows.debugArrow2Active = GUILayout.Toggle(arrows.debugArrow2Active, Localizer.Format("#MechJeb_AttitudeAdjust_checkbox17")); //Debug2 (light blue) GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { if (vessel.patchedConicSolver.maneuverNodes.Count == 0) { GUILayout.Label("No maneuver nodes to edit."); RelativityModeSelectUI(); base.WindowGUI(windowID); return; } GUILayout.BeginVertical(); ManeuverNode oldNode = node; if (vessel.patchedConicSolver.maneuverNodes.Count == 1) { node = vessel.patchedConicSolver.maneuverNodes[0]; } else { if (!vessel.patchedConicSolver.maneuverNodes.Contains(node)) { node = vessel.patchedConicSolver.maneuverNodes[0]; } int nodeIndex = vessel.patchedConicSolver.maneuverNodes.IndexOf(node); int numNodes = vessel.patchedConicSolver.maneuverNodes.Count; nodeIndex = GuiUtils.ArrowSelector(nodeIndex, numNodes, "Maneuver node #" + (nodeIndex + 1)); node = vessel.patchedConicSolver.maneuverNodes[nodeIndex]; } if (node != oldNode) { prograde = node.DeltaV.z; radialPlus = node.DeltaV.x; normalPlus = node.DeltaV.y; } if (gizmo != node.attachedGizmo) { if (gizmo != null) { gizmo.OnGizmoUpdated -= GizmoUpdateHandler; } gizmo = node.attachedGizmo; if (gizmo != null) { gizmo.OnGizmoUpdated += GizmoUpdateHandler; } } GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("Prograde:", prograde, "m/s", 60); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { prograde -= progradeDelta; node.OnGizmoUpdated(new Vector3d(radialPlus, normalPlus, prograde), node.UT); } progradeDelta.text = GUILayout.TextField(progradeDelta.text, GUILayout.Width(50)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { prograde += progradeDelta; node.OnGizmoUpdated(new Vector3d(radialPlus, normalPlus, prograde), node.UT); } GUILayout.Label("m/s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("Radial+:", radialPlus, "m/s", 60); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { radialPlus -= radialPlusDelta; node.OnGizmoUpdated(new Vector3d(radialPlus, normalPlus, prograde), node.UT); } radialPlusDelta.text = GUILayout.TextField(radialPlusDelta.text, GUILayout.Width(50)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { radialPlus += radialPlusDelta; node.OnGizmoUpdated(new Vector3d(radialPlus, normalPlus, prograde), node.UT); } GUILayout.Label("m/s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("Normal+:", normalPlus, "m/s", 60); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { normalPlus -= normalPlusDelta; node.OnGizmoUpdated(new Vector3d(radialPlus, normalPlus, prograde), node.UT); } normalPlusDelta.text = GUILayout.TextField(normalPlusDelta.text, GUILayout.Width(50)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { normalPlus += normalPlusDelta; node.OnGizmoUpdated(new Vector3d(radialPlus, normalPlus, prograde), node.UT); } GUILayout.Label("m/s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Set delta to:", GUILayout.ExpandWidth(true)); if (GUILayout.Button("0.01", GUILayout.ExpandWidth(true))) { progradeDelta = radialPlusDelta = normalPlusDelta = 0.01; } if (GUILayout.Button("0.1", GUILayout.ExpandWidth(true))) { progradeDelta = radialPlusDelta = normalPlusDelta = 0.1; } if (GUILayout.Button("1", GUILayout.ExpandWidth(true))) { progradeDelta = radialPlusDelta = normalPlusDelta = 1; } if (GUILayout.Button("10", GUILayout.ExpandWidth(true))) { progradeDelta = radialPlusDelta = normalPlusDelta = 10; } if (GUILayout.Button("100", GUILayout.ExpandWidth(true))) { progradeDelta = radialPlusDelta = normalPlusDelta = 100; } GUILayout.EndHorizontal(); if (GUILayout.Button("Update")) { node.OnGizmoUpdated(new Vector3d(radialPlus, normalPlus, prograde), node.UT); } GUILayout.BeginHorizontal(); GUILayout.Label("Shift time", GUILayout.ExpandWidth(true)); if (GUILayout.Button("-o", GUILayout.ExpandWidth(false))) { node.OnGizmoUpdated(node.DeltaV, node.UT - node.patch.period); } if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { node.OnGizmoUpdated(node.DeltaV, node.UT - timeOffset); } timeOffset.text = GUILayout.TextField(timeOffset.text, GUILayout.Width(100)); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { node.OnGizmoUpdated(node.DeltaV, node.UT + timeOffset); } if (GUILayout.Button("+o", GUILayout.ExpandWidth(false))) { node.OnGizmoUpdated(node.DeltaV, node.UT + node.patch.period); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Snap node to", GUILayout.ExpandWidth(true))) { Orbit o = node.patch; double UT = node.UT; switch (snap) { case Snap.PERIAPSIS: UT = o.NextPeriapsisTime(UT - o.period / 2); //period is who-knows-what for e > 1, but this should still work break; case Snap.APOAPSIS: if (o.eccentricity < 1) { UT = o.NextApoapsisTime(UT - o.period / 2); } break; case Snap.EQ_ASCENDING: if (o.AscendingNodeEquatorialExists()) { UT = o.TimeOfAscendingNodeEquatorial(UT - o.period / 2); } break; case Snap.EQ_DESCENDING: if (o.DescendingNodeEquatorialExists()) { UT = o.TimeOfDescendingNodeEquatorial(UT - o.period / 2); } break; case Snap.REL_ASCENDING: if (core.target.NormalTargetExists && core.target.TargetOrbit.referenceBody == o.referenceBody) { if (o.AscendingNodeExists(core.target.TargetOrbit)) { UT = o.TimeOfAscendingNode(core.target.TargetOrbit, UT - o.period / 2); } } break; case Snap.REL_DESCENDING: if (core.target.NormalTargetExists && core.target.TargetOrbit.referenceBody == o.referenceBody) { if (o.DescendingNodeExists(core.target.TargetOrbit)) { UT = o.TimeOfDescendingNode(core.target.TargetOrbit, UT - o.period / 2); } } break; } node.OnGizmoUpdated(node.DeltaV, UT); } snap = (Snap)GuiUtils.ArrowSelector((int)snap, numSnaps, snapStrings[(int)snap]); GUILayout.EndHorizontal(); RelativityModeSelectUI(); if (core.node != null) { if (vessel.patchedConicSolver.maneuverNodes.Count > 0 && !core.node.enabled) { if (GUILayout.Button("Execute next node")) { core.node.ExecuteOneNode(this); } if (vessel.patchedConicSolver.maneuverNodes.Count > 1) { if (GUILayout.Button("Execute all nodes")) { core.node.ExecuteAllNodes(this); } } } else if (core.node.enabled) { if (GUILayout.Button("Abort node execution")) { core.node.Abort(); } } GUILayout.BeginHorizontal(); core.node.autowarp = GUILayout.Toggle(core.node.autowarp, "Auto-warp", GUILayout.ExpandWidth(true)); GUILayout.Label("Tolerance:", GUILayout.ExpandWidth(false)); core.node.tolerance.text = GUILayout.TextField(core.node.tolerance.text, GUILayout.Width(35), GUILayout.ExpandWidth(false)); GUILayout.Label("m/s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } GUILayout.EndVertical(); base.WindowGUI(windowID); }
protected override void WindowGUI(int windowID) { if (btNormal == null) { btNormal = new GUIStyle(GUI.skin.button); btNormal.normal.textColor = btNormal.focused.textColor = Color.white; btNormal.hover.textColor = btNormal.active.textColor = Color.yellow; btNormal.onNormal.textColor = btNormal.onFocused.textColor = btNormal.onHover.textColor = btNormal.onActive.textColor = Color.green; btNormal.padding = new RectOffset(8, 8, 8, 8); btActive = new GUIStyle(btNormal); btActive.active = btActive.onActive; btActive.normal = btActive.onNormal; btActive.onFocused = btActive.focused; btActive.hover = btActive.onHover; btAuto = new GUIStyle(btNormal); btAuto.normal.textColor = Color.red; btAuto.onActive = btAuto.onFocused = btAuto.onHover = btAuto.onNormal = btAuto.active = btAuto.focused = btAuto.hover = btAuto.normal; } // If any other module use the attitude controler then let them do it if (core.attitude.enabled && core.attitude.users.Count(u => !this.Equals(u)) > 0) { if (autoDisableSmartASS) { target = Target.OFF; if (core.attitude.users.Contains(this)) { core.attitude.users.Remove(this); // so we don't suddenly turn on when the other autopilot finishes } } GUILayout.Button("AUTO", btAuto, GUILayout.ExpandWidth(true)); } else { GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); TargetButton(Target.OFF); TargetButton(Target.KILLROT); if (vessel.patchedConicsUnlocked()) { TargetButton(Target.NODE); } else { GUILayout.Button("-", GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); } GUILayout.EndHorizontal(); GUILayout.Label("Mode:"); GUILayout.BeginHorizontal(); ModeButton(Mode.ORBITAL); ModeButton(Mode.SURFACE); ModeButton(Mode.TARGET); ModeButton(Mode.ADVANCED); GUILayout.EndHorizontal(); switch (mode) { case Mode.ORBITAL: GUILayout.BeginHorizontal(); TargetButton(Target.PROGRADE); TargetButton(Target.NORMAL_PLUS); TargetButton(Target.RADIAL_PLUS); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); TargetButton(Target.RETROGRADE); TargetButton(Target.NORMAL_MINUS); TargetButton(Target.RADIAL_MINUS); GUILayout.EndHorizontal(); ForceRoll(); break; case Mode.SURFACE: double val = (GameSettings.MODIFIER_KEY.GetKey() ? 5 : 1); // change by 5 if the mod_key is held down, else by 1 GUILayout.BeginHorizontal(); TargetButton(Target.SURFACE_PROGRADE); TargetButton(Target.SURFACE_RETROGRADE); TargetButtonNoEngage(Target.SURFACE); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); TargetButton(Target.HORIZONTAL_PLUS); TargetButton(Target.HORIZONTAL_MINUS); TargetButton(Target.VERTICAL_PLUS); GUILayout.EndHorizontal(); if (target == Target.SURFACE) { GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("HDG", srfHdg, "°", 37); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { srfHdg -= val; Engage(false); } if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { srfHdg += val; Engage(false); } if (GUILayout.Button("0", GUILayout.ExpandWidth(false))) { srfHdg = 0; Engage(false); } if (GUILayout.Button("90", GUILayout.Width(35))) { srfHdg = 90; Engage(false); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("PIT", srfPit, "°", 37); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { srfPit -= val; Engage(false); } if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { srfPit += val; Engage(false); } if (GUILayout.Button("0", GUILayout.ExpandWidth(false))) { srfPit = 0; Engage(false); } if (GUILayout.Button("90", GUILayout.Width(35))) { srfPit = 90; Engage(false); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("ROL", srfRol, "°", 37); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { srfRol -= val; Engage(false); } if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { srfRol += val; Engage(false); } if (GUILayout.Button("0", GUILayout.ExpandWidth(false))) { srfRol = 0; Engage(false); } if (GUILayout.Button("180", GUILayout.Width(35))) { srfRol = 180; Engage(false); } GUILayout.EndHorizontal(); if (GUILayout.Button("EXECUTE")) { Engage(); } } else if (target == Target.SURFACE_PROGRADE || target == Target.SURFACE_RETROGRADE) { GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("ROL", srfVelRol, "°", 37); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { srfVelRol -= val; Engage(false); } if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { srfVelRol += val; Engage(false); } if (GUILayout.Button("CUR", GUILayout.ExpandWidth(false))) { srfVelRol = -vesselState.vesselRoll.value; Engage(false); } if (GUILayout.Button("0", GUILayout.ExpandWidth(false))) { srfVelRol = 0; Engage(false); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("PIT", srfVelPit, "°", 37); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { srfVelPit -= val; Engage(false); } if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { srfVelPit += val; Engage(false); } if (GUILayout.Button("CUR", GUILayout.ExpandWidth(false))) { srfVelPit = vesselState.AoA.value; Engage(false); } if (GUILayout.Button("0", GUILayout.ExpandWidth(false))) { srfVelPit = 0; Engage(false); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GuiUtils.SimpleTextBox("YAW", srfVelYaw, "°", 37); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { srfVelYaw -= val; Engage(false); } if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { srfVelYaw += val; Engage(false); } if (GUILayout.Button("CUR", GUILayout.ExpandWidth(false))) { srfVelYaw = -vesselState.AoS.value; Engage(false); } if (GUILayout.Button("0", GUILayout.ExpandWidth(false))) { srfVelYaw = 0; Engage(false); } GUILayout.EndHorizontal(); } break; case Mode.TARGET: if (core.target.NormalTargetExists) { GUILayout.BeginHorizontal(); TargetButton(Target.TARGET_PLUS); TargetButton(Target.RELATIVE_PLUS); TargetButton(Target.PARALLEL_PLUS); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); TargetButton(Target.TARGET_MINUS); TargetButton(Target.RELATIVE_MINUS); TargetButton(Target.PARALLEL_MINUS); GUILayout.EndHorizontal(); ForceRoll(); } else { GUILayout.Label("Please select a target"); } break; case Mode.ADVANCED: GUILayout.Label("Reference:"); advReference = (AttitudeReference)GuiUtils.ComboBox.Box((int)advReference, ReferenceTexts, this); GUILayout.Label("Direction:"); advDirection = (Vector6.Direction)GuiUtils.ComboBox.Box((int)advDirection, directionTexts, directionTexts); ForceRoll(); if (GUILayout.Button("EXECUTE", btNormal, GUILayout.ExpandWidth(true))) { target = Target.ADVANCED; Engage(); } break; case Mode.AUTO: break; } GUILayout.EndVertical(); } base.WindowGUI(windowID); }