示例#1
0
 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);
 }
示例#2
0
 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;
 }
示例#3
0
        public static double GetMach(int stageIndex)
        {
            QStage _qStage = QStages[stageIndex];

            if (_qStage == null)
            {
                return(-1f);
            }
            return(_qStage.Mach);
        }
示例#4
0
        public static bool GetatmCorrected(int stageIndex)
        {
            QStage _qStage = QStages[stageIndex];

            if (_qStage == null)
            {
                return(false);
            }
            return(_qStage.atmCorrected);
        }
示例#5
0
        public static double GetAltitude(int stageIndex)
        {
            QStage _qStage = QStages[stageIndex];

            if (_qStage == null)
            {
                return(-1f);
            }
            return(_qStage.Altitude);
        }
示例#6
0
        public static bool GetAtmosphere(int stageIndex)
        {
            QStage _qStage = QStages[stageIndex];

            if (_qStage == null)
            {
                return(false);
            }
            return(_qStage.Atmosphere);
        }
示例#7
0
        public static CelestialBody GetBody(int stageIndex)
        {
            QStage _qStage = QStages[stageIndex];

            if (_qStage == null)
            {
                return(null);
            }
            return(_qStage.Body);
        }
示例#8
0
        public static Stage GetvacStage(int stageIndex)
        {
            QStage _qStage = QStages[stageIndex];

            if (_qStage == null)
            {
                return(null);
            }
            return(_qStage.vacStage);
        }
示例#9
0
        public double totalDeltaV(int index)
        {
            double _totalDeltaV = 0;

            for (int i = index; i > 0; i--)
            {
                QStage _qStage = QStages [i];
                _totalDeltaV += _qStage.deltaV;
            }
            return(_totalDeltaV);
        }
示例#10
0
        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");
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
 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");
 }
示例#15
0
 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");
 }
示例#16
0
        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");
        }
示例#17
0
 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();
             }
         }
     }
 }
示例#18
0
        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");
        }
示例#19
0
 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));
 }
示例#20
0
 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();
 }
示例#21
0
        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);
        }