private static bool isSame(QStage qs, QStage qStage, bool forceVAC = false) { if (qs.Atmosphere == qStage.Atmosphere && !qs.Atmosphere) { return(qs.Body == qStage.Body); } return(qs.Body == qStage.Body && qs.Atmosphere == qStage.Atmosphere && qs.Mach == qStage.Mach && qs.Altitude == qStage.Altitude); }
public QStage(QStage qStage) { Body = (qStage.Body != null ? qStage.Body : QTools.Home); Atmosphere = qStage.Atmosphere; Altitude = qStage.Altitude; atmCorrected = qStage.atmCorrected; vacStage = qStage.vacStage; atmStage = qStage.atmStage; }
public static double GetMach(int stageIndex) { QStage _qStage = QStages[stageIndex]; if (_qStage == null) { return(-1f); } return(_qStage.Mach); }
public static bool GetatmCorrected(int stageIndex) { QStage _qStage = QStages[stageIndex]; if (_qStage == null) { return(false); } return(_qStage.atmCorrected); }
public static double GetAltitude(int stageIndex) { QStage _qStage = QStages[stageIndex]; if (_qStage == null) { return(-1f); } return(_qStage.Altitude); }
public static bool GetAtmosphere(int stageIndex) { QStage _qStage = QStages[stageIndex]; if (_qStage == null) { return(false); } return(_qStage.Atmosphere); }
public static CelestialBody GetBody(int stageIndex) { QStage _qStage = QStages[stageIndex]; if (_qStage == null) { return(null); } return(_qStage.Body); }
public static Stage GetvacStage(int stageIndex) { QStage _qStage = QStages[stageIndex]; if (_qStage == null) { return(null); } return(_qStage.vacStage); }
public double totalDeltaV(int index) { double _totalDeltaV = 0; for (int i = index; i > 0; i--) { QStage _qStage = QStages [i]; _totalDeltaV += _qStage.deltaV; } return(_totalDeltaV); }
public static void ClearAllStages() { int _qStageCount = QStages.Count; for (int i = 0; i < _qStageCount; i++) { QStage _qStage = QStages [i]; _qStage.ClearStages(i); } Log("ClearAllStages", "QStage"); }
public double inverseTotalDeltaV(int index) { int _qStageCount = QStages.Count; double _totalDeltaV = 0; for (int i = index; i < _qStageCount; i++) { QStage _qStage = QStages [i]; _totalDeltaV += _qStage.deltaV; } return(_totalDeltaV); }
private UIListItemContainer CreateBodyStage(int stageIndex, QStage qStage) { if (QSettings.Instance.VesselEngineer_hideEmptyStages && (qStage.deltaV == 0 || qStage.maxThrustToWeight == 0)) { return(null); } UIListItemContainer _item = GCascadingList.CreateBody(textEditorStage(stageIndex, qStage.Body, qStage.Atmosphere), textEngineer(stageIndex, qStage), true); _item.AddInputDelegate(new EZInputDelegate(SetConfig)); Log("Create body Stage: " + stageIndex, "QEditor"); return(_item); }
public static QStage CreateQStage(CelestialBody body = null, bool atmosphere = false, double mach = 0d, float altitude = 0f, bool atmcorrected = false, Stage vacstage = null, Stage atmstage = null) { QStage _qStage; _qStage = new QStage(body, atmosphere, mach, altitude, atmcorrected, vacstage, atmstage); Log("QStage created: " + (body == null ? QTools.Home.bodyName : body.bodyName), "QStage"); Log("\tAtmosphere: \t" + atmosphere, "QStage"); Log("\tMach: \t\t" + mach, "QStage"); Log("\tAltitude: \t\t" + altitude, "QStage"); QStages.Add(_qStage); return(_qStage); }
private static void LogSet(int i, Stage stage, QStage qStage) { Log("Set Stage: " + i, "QStage"); Log("\tBody : \t\t" + qStage.Body.bodyName, "QStage"); Log("\tAtmosphere: \t" + qStage.Atmosphere, "QStage"); if (qStage.Atmosphere) { Log("\t\tCalculation: " + CelestialBodies.SelectedBody.GetAtmospheres(qStage.Altitude), "QStage"); Log("\tMach: \t\t" + qStage.Mach, "QStage"); Log("\tAltitude: \t\t" + qStage.Altitude, "QStage"); } Log("\tdeltaV: \t\t" + stage.deltaV, "QStage"); Log("\tTWR: \t\t" + stage.thrustToWeight, "QStage"); Log("\tmaxTWR: \t\t" + stage.maxThrustToWeight, "QStage"); }
internal static void Init(QStage qStage) { CelestialBodies.SetSelectedBody(qStage.Body.bodyName); SimManager.Gravity = QTools.Gravity(qStage.Body); BuildAdvanced.Altitude = qStage.Altitude; SimManager.Atmosphere = (qStage.Atmosphere ? CelestialBodies.SelectedBody.GetAtmospheres(BuildAdvanced.Altitude) : 0d); SimManager.Mach = qStage.Mach; SimManager.OnReady += GetSimManagerResults; Log("Simulation inited: \t" + qStage.Body.bodyName, "QVessel"); Log("\tGravity: \t\t" + SimManager.Gravity, "QVessel"); Log("\tAtmosphere: \t" + qStage.Atmosphere, "QVessel"); Log("\t\tCalculation: " + SimManager.Atmosphere, "QVessel"); Log("\tMach: \t\t" + SimManager.Mach, "QVessel"); Log("\tAltitude: \t\t" + BuildAdvanced.Altitude, "QVessel"); }
internal static IEnumerator calcWithATM() { RESTART: List <QStage> _qStagesToCalculate = QStage.uniqueCalc; QStage.ClearAllStages(); int _qStageCount = _qStagesToCalculate.Count; Log(string.Format("Start {0} calculations ...", _qStagesToCalculate.Count), "QVessel"); if (_qStageCount == 0) { QEditor.Instance.UpdateEngineer("Vessel"); Log("No calcul needs", "QVessel"); yield break; } QEditor.Instance.UpdateEngineer("Vessel", true); for (int i = 0; i < _qStageCount; i++) { yield return(new WaitForFixedUpdate()); QStage _qStage = _qStagesToCalculate [i]; Init(_qStage); Stages = null; StartSim(); while (Stages == null && !simEnded) { yield return(0); } QStage.setAllStages(Stages, _qStage); yield return(new WaitForSeconds(0.2f)); if (calculationToRestart) { calculationToRestart = false; Log("Calculation restarted", "QVessel"); goto RESTART; } } QEditor.Instance.UpdateEngineer("Vessel"); QEditor.Instance.calculation = null; Log("Calculation finished", "QVessel"); }
private void Update() { if (!QStockToolbar.isActive) { return; } if (appIsLive) { Vessel _vessel = FlightGlobals.ActiveVessel; if (_vessel != null) { if (TimeWarp.WarpMode == TimeWarp.Modes.LOW || TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate) { QStage _qStage = new QStage(_vessel.mainBody, _vessel.atmDensity != 0d, _vessel.mach, (float)_vessel.altitude); QVessel.Init(_qStage); QVessel.StartSim(); } } } }
public static void setAllStages(Stage[] stages, QStage qStageCalc) { if (qStageCalc.Body == null) { qStageCalc.Body = QTools.Home; } int _qStageCount = QStages.Count; int _stageLength = stages.Length; if (_qStageCount < _stageLength) { Populate(); } for (int i = 0; i < _stageLength; i++) { if (_qStageCount <= i) { Warning("Wrong stage count: " + i, "QStage"); Warning("\t_qStageCount " + _qStageCount, "QStage"); Warning("\t_stageLength " + _stageLength, "QStage"); Warning("\tQStage.stagesCount " + stagesCount, "QStage"); break; } QStage _qStage = QStages[i]; Stage _stage = stages[i]; if (qStageCalc.Body == _qStage.Body) { if (!qStageCalc.Atmosphere) { LogSet(i, _stage, qStageCalc); _qStage.vacStage = _stage; } else if (isSame(_qStage, qStageCalc)) { LogSet(i, _stage, qStageCalc); _qStage.atmStage = _stage; } } } Log("setAllStages", "QStage"); }
protected string textEngineer(int stageIndex, QStage qStage, bool color = true) { return((color ? colorValue : string.Empty) + textDeltaV(qStage.deltaV, (QSettings.Instance.VesselEngineer_showStageInverseTotaldV ? qStage.inverseTotalDeltaV(stageIndex) : qStage.totalDeltaV(stageIndex))) + textLine(false) + textTWR(qStage.thrustToWeight, qStage.maxThrustToWeight)); }
private void MainSettings(int id) { GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Box("Options", GUILayout.Height(25)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); QSettings.Instance.AllVesselEngineer_Disable = GUILayout.Toggle(QSettings.Instance.AllVesselEngineer_Disable, "Always disable", GUILayout.Width(290)); if (!QSettings.Instance.AllVesselEngineer_Disable) { GUILayout.FlexibleSpace(); QSettings.Instance.FlightVesselEngineer_Disable = GUILayout.Toggle(QSettings.Instance.FlightVesselEngineer_Disable, "Disable in Flight", GUILayout.Width(290)); GUILayout.FlexibleSpace(); QSettings.Instance.EditorVesselEngineer_Simple = GUILayout.Toggle(QSettings.Instance.EditorVesselEngineer_Simple, "Editor calculation only on VAC", GUILayout.Width(290)); GUILayout.EndHorizontal(); GUILayout.Space(5); GUILayout.BeginHorizontal(); QSettings.Instance.VesselEngineer_hidedeltaV = GUILayout.Toggle(QSettings.Instance.VesselEngineer_hidedeltaV, "Hide deltaV", GUILayout.Width(290)); GUILayout.FlexibleSpace(); QSettings.Instance.VesselEngineer_hideTWR = GUILayout.Toggle(QSettings.Instance.VesselEngineer_hideTWR, "Hide TWR", GUILayout.Width(290)); GUILayout.FlexibleSpace(); QSettings.Instance.VesselEngineer_hideEmptyStages = GUILayout.Toggle(QSettings.Instance.VesselEngineer_hideEmptyStages, "Hide stage with no deltaV/TWR", GUILayout.Width(290)); GUILayout.EndHorizontal(); GUILayout.Space(5); GUILayout.BeginHorizontal(); QSettings.Instance.VesselEngineer_showEmptyTWR = GUILayout.Toggle(QSettings.Instance.VesselEngineer_showEmptyTWR, "Show max TWR", GUILayout.Width(290)); GUILayout.FlexibleSpace(); QSettings.Instance.VesselEngineer_showStageTotaldV = GUILayout.Toggle(QSettings.Instance.VesselEngineer_showStageTotaldV, "Show Total deltaV on stage", GUILayout.Width(290)); if (QSettings.Instance.VesselEngineer_showStageTotaldV && QSettings.Instance.VesselEngineer_showStageTotaldV == QSettings.Instance.VesselEngineer_showStageInverseTotaldV) { QSettings.Instance.VesselEngineer_showStageInverseTotaldV = false; } GUILayout.FlexibleSpace(); QSettings.Instance.VesselEngineer_showStageInverseTotaldV = GUILayout.Toggle(QSettings.Instance.VesselEngineer_showStageInverseTotaldV, "Show inverse Total deltaV on stage", GUILayout.Width(290)); if (QSettings.Instance.VesselEngineer_showStageInverseTotaldV && QSettings.Instance.VesselEngineer_showStageTotaldV == QSettings.Instance.VesselEngineer_showStageInverseTotaldV) { QSettings.Instance.VesselEngineer_showStageTotaldV = false; } GUILayout.EndHorizontal(); GUILayout.Space(5); GUILayout.BeginHorizontal(); QSettings.Instance.Debug = GUILayout.Toggle(QSettings.Instance.Debug, "Show debug logs", GUILayout.Width(290)); GUILayout.EndHorizontal(); GUILayout.Space(5); if (!QSettings.Instance.EditorVesselEngineer_Simple) { GUILayout.BeginHorizontal(); GUILayout.Box("Stages parameters", GUILayout.Height(25)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(20); GUILayout.Label("<b>Stages</b>", GUILayout.Width(50)); GUILayout.Space(20); GUILayout.Label("<b>CelestialBody</b>", GUILayout.Width(120)); GUILayout.Space(40); GUILayout.Label("<b>Atmospheric</b>", GUILayout.Width(100)); GUILayout.Space(30); GUILayout.Label("<b>Corrected dV</b>", GUILayout.Width(120)); GUILayout.Space(30); GUILayout.Label("<b>Altitude</b>", GUILayout.Width(150)); GUILayout.Space(20); GUILayout.Label("<b>Mach</b>", GUILayout.Width(150)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Height(200)); List <QStage> _qStages = QStage.QStages; int _stageCount = Math.Min(QStage.stagesCount, _qStages.Count); for (int i = 0; i < _stageCount; i++) { QStage _qStage = _qStages [i]; if ((_qStage.Atmosphere && _qStage.atmStage == null) && (!_qStage.Atmosphere && _qStage.vacStage == null)) { continue; } if (QSettings.Instance.VesselEngineer_hideEmptyStages && (_qStage.deltaV == 0 || _qStage.maxThrustToWeight == 0)) { continue; } GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("<b>Stage {0}:</b>", i), GUILayout.Width(50)); GUILayout.Space(20); if (GUILayout.Button("◄", GUILayout.Width(20))) { int _index = QBody.Bodies.FindIndex(b => b == _qStage.Body) - 1; if (_index < 0) { _index = QBody.Bodies.Count - 1; } _qStage.Body = QBody.Bodies [_index]; } GUILayout.Label(_qStage.Body.bodyName, GUILayout.Width(90), GUILayout.Height(20)); if (GUILayout.Button("►", GUILayout.Width(20))) { int _index = QBody.Bodies.FindIndex(b => b == _qStage.Body) + 1; if (_index >= QBody.Bodies.Count) { _index = 0; } _qStage.Body = QBody.Bodies [_index]; } GUILayout.Space(20); GUI.enabled = _qStage.Body.atmosphere; if (!_qStage.Body.atmosphere) { _qStage.Atmosphere = false; _qStage.atmCorrected = false; _qStage.Altitude = 0f; _qStage.Mach = 0d; } _qStage.Atmosphere = GUILayout.Toggle(_qStage.Atmosphere, "Atmospheric", GUILayout.Width(100)); GUILayout.Space(40); bool _canCorrecteddV = _qStage.Body.atmosphere && QBody.hasAtmValue(_qStage.Body); GUI.enabled = _canCorrecteddV; if (!_canCorrecteddV) { _qStage.atmCorrected = false; } _qStage.atmCorrected = GUILayout.Toggle(_qStage.atmCorrected, "Corrected dV", GUILayout.Width(120)); GUILayout.Space(40); GUI.enabled = _qStage.Body.atmosphere; _qStage.Altitude = GUILayout.HorizontalSlider(_qStage.Altitude, 0f, (float)_qStage.Body.atmosphereDepth, GUILayout.Width(100), GUILayout.Height(30)); GUILayout.Label(string.Format("{0:0.0}km", (_qStage.Altitude / 1000)), GUILayout.Width(50)); GUILayout.Space(20); float _maxMach = _qStage.maxMach; _qStage.Mach = (double)GUILayout.HorizontalSlider(Mathf.Clamp((float)_qStage.Mach, 0f, _maxMach), 0f, _maxMach, GUILayout.Width(100), GUILayout.Height(30)); GUILayout.Label(string.Format("{0:0.00}", _qStage.Mach), GUILayout.Width(40)); GUI.enabled = true; GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); GUILayout.EndHorizontal(); } } GUILayout.BeginHorizontal(); if (GUILayout.Button("Add/Set Atmospheric value for celestial bodies")) { DisplayAtmDeltaV(); } GUILayout.FlexibleSpace(); if (GUILayout.Button("Close")) { HideApp(); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
private List <UIListItemContainer> CreateVesselEngineerBody(bool calculation = false) { List <UIListItemContainer> _items = new List <UIListItemContainer> (); UIListItemContainer _item; if (calculation) { _item = GCascadingList.CreateBody(textColor("Calculation..."), string.Empty); } else { List <QStage> _qStages = null; Stage[] _stages = null; Stage _lastStage = null; int _length; bool _simple = QSettings.Instance.EditorVesselEngineer_Simple; if (_simple) { _stages = QVessel.Stages; _lastStage = QVessel.LastStage; _length = _stages.Length; } else { _qStages = QStage.QStages; _length = QStage.stagesCount; } if ((!_simple || _stages != null) && _length > 0) { for (int i = 0; i < _length; i++) { _item = null; if (_simple) { Stage _stage = _stages [i]; _item = CreateBodyStage(i, _stage); } else { QStage _qStage = _qStages [i]; _item = CreateBodyStage(i, _qStage); } if (_item != null) { _items.Add(_item); } } } if (_items.Count > 0) { _item = GCascadingList.CreateBody("Total deltaV:", (_simple ? textTotalDeltaV(_lastStage) : textTotalDeltaV(QStage.TotalDeltaV))); } else { _item = GCascadingList.CreateBody(textColor("Click here to config"), string.Empty); } } _item.AddInputDelegate(new EZInputDelegate(SetConfig)); _items.Add(_item); Log("VesselEngineer body created", "QEditor"); return(_items); }