public override void OnDecodeFromConfigNode() { Notes = KACUtils.DecodeVarStrings(NotesStorage); AlarmTime = new KSPDateTime(AlarmTimeStorage); if (RepeatAlarmPeriodStorage != 0) { RepeatAlarmPeriod = new KSPTimeSpan(RepeatAlarmPeriodStorage); } //dont try and create a GUID from null or empty :) if (ContractGUIDStorage != null && ContractGUIDStorage != "") { ContractGUID = new Guid(ContractGUIDStorage); } _TargetObject = TargetDeserialize(TargetObjectStorage); ManNodes = ManNodeDeserializeList(ManNodesStorage); }
public void BuildFromUT(Double UT) { KSPTimeSpan timeTemp = new KSPTimeSpan(UT); if (TimeEntryPrecision >= TimeEntryPrecisionEnum.Years) { Years = timeTemp.Years.ToString(); } else { Years = "0"; } if (TimeEntryPrecision > TimeEntryPrecisionEnum.Days) { Days = timeTemp.Days.ToString(); } else if (TimeEntryPrecision == TimeEntryPrecisionEnum.Days) { Days = ((timeTemp.Years * KSPDateStructure.DaysPerYear) + timeTemp.Days).ToString(); } else { Days = "0"; } if (TimeEntryPrecision > TimeEntryPrecisionEnum.Hours) { Hours = timeTemp.Hours.ToString(); } else if (TimeEntryPrecision == TimeEntryPrecisionEnum.Hours) { Hours = ((timeTemp.Years * KSPDateStructure.HoursPerYear) + (timeTemp.Days * KSPDateStructure.HoursPerDay) + timeTemp.Hours).ToString(); } else { Hours = "0"; } Minutes = timeTemp.Minutes.ToString(); Seconds = timeTemp.Seconds.ToString(); }
private void SetWorkerVariables() { DepartureMin = dateMinDeparture.UT; // new KSPDateTime(strDepartureMinYear, strDepartureMinDay).UT; // new KSPDateTime(strDepartureMinYear, strDepartureMinDay, "0", "0", "0").UT - KSPDateStructure.SecondsPerYear - KSPDateStructure.SecondsPerDay; DepartureMax = dateMaxDeparture.UT; // new KSPDateTime(strDepartureMaxYear, strDepartureMaxDay).UT; // new KSPDateTime(strDepartureMaxYear, strDepartureMaxDay, "0", "0", "0").UT - KSPDateStructure.SecondsPerYear - KSPDateStructure.SecondsPerDay; DepartureRange = DepartureMax - DepartureMin; DepartureSelected = -1; TravelMin = new KSPTimeSpan(strTravelMinDays, "0", "0", "0").UT; TravelMax = new KSPTimeSpan(strTravelMaxDays, "0", "0", "0").UT; TravelRange = TravelMax - TravelMin; TravelSelected = -1; InitialOrbitAltitude = Convert.ToDouble(strDepartureAltitude) * 1000; if (blnFlyby) { FinalOrbitAltitude = 0; } else { FinalOrbitAltitude = Convert.ToDouble(strArrivalAltitude) * 1000; } //Store the transfer Specs for display purposes TransferSpecs = new TransferWorkerDetails(); TransferSpecs.DepartureMin = DepartureMin; TransferSpecs.DepartureMax = DepartureMax; TransferSpecs.DepartureRange = DepartureRange; TransferSpecs.TravelMin = TravelMin; TransferSpecs.TravelMax = TravelMax; TransferSpecs.TravelRange = TravelRange; TransferSpecs.InitialOrbitAltitude = InitialOrbitAltitude; TransferSpecs.FinalOrbitAltitude = FinalOrbitAltitude; TransferSpecs.OriginName = cbOrigin.bodyName; TransferSpecs.DestinationName = cbDestination.bodyName; // minus 1 so when we loop from for PlotX pixels the last pixel is the actual last value xResolution = DepartureRange / (PlotWidth - 1); yResolution = TravelRange / (PlotHeight - 1); DeltaVs = new Double[PlotWidth * PlotHeight]; DeltaVsColorIndex = new Int32[PlotWidth * PlotHeight]; }
private void SetWindowStrings() { //KSPDateTime kTime = new KSPDateTime(DepartureMin); //strDepartureMinYear = (kTime.Year ).ToString(); //strDepartureMinDay = (kTime.Day).ToString(); //kTime.UT = DepartureMax; //strDepartureMaxYear = (kTime.Year).ToString(); //strDepartureMaxDay = (kTime.Day).ToString(); dateMinDeparture = new KSPDateTime(DepartureMin); dateMaxDeparture = new KSPDateTime(DepartureMax); KSPTimeSpan kSpan = new KSPTimeSpan(0); kSpan.UT = TravelMin; strTravelMinDays = ((Int32)kSpan.TotalDays).ToString(); kSpan.UT = TravelMax; strTravelMaxDays = ((Int32)kSpan.TotalDays).ToString(); strArrivalAltitude = (InitialOrbitAltitude / 1000).ToString(); strDepartureAltitude = (FinalOrbitAltitude / 1000).ToString(); }
internal void FillEarthAlarmWindow(int WindowID) { GUILayout.BeginVertical(); intHeight_AddWindowCommon = 64; WindowLayout_CommonFields2(ref strAlarmName, ref blnAlarmAttachToVessel, ref AddAction, ref timeMargin, AddType, intHeight_AddWindowCommon); GUILayout.Label("Enter Time for reminder...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Time for Alarm (24 hour):",KACResources.styleAddHeading); GUILayout.FlexibleSpace(); if (DrawTimeField(ref strAlarmEarthHour, "", 40, 0)) { if (strAlarmEarthHour.Length > 2) strAlarmEarthHour = strAlarmEarthHour.Substring(strAlarmEarthHour.Length - 2, 2); } GUILayout.Label(":", KACResources.styleAlarmMessageTime, GUILayout.Width(3)); //strAlarmEarthMin = GUILayout.TextField(strAlarmEarthMin, KACResources.styleAddField, GUILayout.Width(40)); if (DrawTimeField(ref strAlarmEarthMin, "", 40, 0)) { if (strAlarmEarthMin.Length > 2) strAlarmEarthMin = strAlarmEarthMin.Substring(strAlarmEarthMin.Length-2, 2); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); try { DateTime dteWorking; dteWorking=DateTime.ParseExact(strAlarmEarthHour + ":" + strAlarmEarthMin,"H:m",null); TimeSpan tmAlarm = (dteWorking.TimeOfDay - DateTime.Now.TimeOfDay); if (tmAlarm.TotalSeconds < 0) tmAlarm=tmAlarm.Add(new TimeSpan(24, 0, 0)); KSPTimeSpan TimeToAlarm = new KSPTimeSpan(tmAlarm.TotalSeconds); //Bit at the bottom to add an alarm int intLineHeight = 18; GUILayout.BeginHorizontal(KACResources.styleAddAlarmArea); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Date:", KACResources.styleAddHeading, GUILayout.Height(intLineHeight), GUILayout.Width(40), GUILayout.MaxWidth(40)); GUILayout.Label(dteWorking.ToLongTimeString(), KACResources.styleContentEarth, GUILayout.Height(intLineHeight)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Time to Alarm:", KACResources.styleAddHeading, GUILayout.Height(intLineHeight), GUILayout.Width(100), GUILayout.MaxWidth(100)); GUILayout.Label(TimeToAlarm.ToStringStandard(TimeSpanStringFormatsEnum.DateTimeFormatLong), KACResources.styleContentEarth, GUILayout.Height(intLineHeight)); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.Space(10); int intButtonHeight = 36; if (GUILayout.Button("Add Alarm", KACResources.styleButton, GUILayout.Width(90), GUILayout.Height(intButtonHeight))) { alarms.Add( new KACAlarm(null,strAlarmName,strAlarmNotes, EarthTimeEncode(DateTime.Now + tmAlarm), 0, KACAlarm.AlarmTypeEnum.EarthTime, AddAction) ); //settings.SaveAlarms(); _ShowEarthAlarm = false; } GUILayout.EndHorizontal(); } catch (Exception) { GUILayout.Label("Unable to determine Earth Time", GUILayout.ExpandWidth(true)); } GUILayout.EndVertical(); SetTooltipText(); }
private void WindowLayout_AddPane_ClosestApproach() { GUILayout.BeginVertical(); GUILayout.Label(strAlarmEventName + " Details...", KACResources.styleAddSectionHeading); if (KACWorkerGameState.CurrentVessel == null) { GUILayout.Label("No Active Vessel"); } else { if (!(KACWorkerGameState.CurrentVesselTarget is Vessel) && !(KACWorkerGameState.CurrentVesselTarget is ModuleDockingNode)) { GUILayout.Label("No valid Vessel Target Selected", GUILayout.ExpandWidth(true)); } else { //GUILayout.Label("Adjust Lookahead amounts...", KACResources.styleAddSectionHeading); GUILayout.BeginVertical(KACResources.styleAddFieldAreas); GUILayout.BeginHorizontal(); GUILayout.Label("Orbits to Search:", KACResources.styleAddHeading, GUILayout.Width(110)); GUILayout.Label(((int)Math.Round((Decimal)fltOrbits, 0)).ToString(), KACResources.styleAddXferName, GUILayout.Width(25)); fltOrbits = GUILayout.HorizontalSlider(fltOrbits, 1, 20); fltOrbits = (float)Math.Floor((Decimal)fltOrbits); GUILayout.EndHorizontal(); intOrbits = (int)fltOrbits; int intClosestOrbitPass = 0; double dblClosestDistance = Double.MaxValue; double dblClosestUT = 0; double dblOrbitTestClosest = Double.MaxValue; double dblOrbitTestClosestUT = 0; if (KACWorkerGameState.CurrentVessel.orbit.eccentricity > 1) { intOrbits = 1; } for (int intOrbitToTest = 1; intOrbitToTest <= intOrbits; intOrbitToTest++) { dblOrbitTestClosestUT = KACUtils.timeOfClosestApproach(KACWorkerGameState.CurrentVessel.orbit, KACWorkerGameState.CurrentVesselTarget.GetOrbit(), KACWorkerGameState.CurrentTime.UT, intOrbitToTest, out dblOrbitTestClosest ); if (dblOrbitTestClosest < dblClosestDistance) { dblClosestDistance = dblOrbitTestClosest; dblClosestUT = dblOrbitTestClosestUT; intClosestOrbitPass = intOrbitToTest; } } GUILayout.BeginHorizontal(); GUILayout.Label("Distance:", KACResources.styleAddHeading, GUILayout.Width(70)); String strDistance = string.Format("{0:#}m", dblClosestDistance); if (dblClosestDistance > 999) { strDistance = string.Format("{0:#.0}km", dblClosestDistance / 1000); } GUILayout.Label(strDistance, KACResources.styleAddXferName, GUILayout.Width(90)); GUILayout.Label("On Orbit:", KACResources.styleAddHeading); GUILayout.Label(intClosestOrbitPass.ToString(), KACResources.styleAddXferName); GUILayout.EndHorizontal(); GUILayout.EndVertical(); String strMarginConversion = ""; KSPDateTime eventTime = new KSPDateTime(dblClosestUT); KSPTimeSpan eventInterval = new KSPTimeSpan(dblClosestUT - KACWorkerGameState.CurrentTime.UT); KSPDateTime eventAlarm; KSPTimeSpan eventAlarmInterval; try { eventAlarm = new KSPDateTime(eventTime.UT - timeMargin.UT); eventAlarmInterval = new KSPTimeSpan(eventTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT); } catch (Exception) { eventAlarm = null; eventAlarmInterval = null; strMarginConversion = "Unable to Add the Margin Minutes"; } if ((eventTime.UT > KACWorkerGameState.CurrentTime.UT) && strMarginConversion == "") { if (DrawAddAlarm(eventTime, eventInterval, eventAlarmInterval)) { KACAlarm newAlarm = new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strAlarmName, strAlarmNotes, eventAlarm.UT, timeMargin.UT, AddType, AddActions); newAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; newAlarm.ManNodes = KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes; alarms.Add(newAlarm); //settings.Save(); _ShowAddPane = false; } } else { strMarginConversion = "No Future Closest Approach found"; } if (strMarginConversion != "") { GUILayout.Label(strMarginConversion, GUILayout.ExpandWidth(true)); } } } GUILayout.EndVertical(); }
private void WindowLayout_AddPane_TargetDistance() { intAddDistanceHeight = 262;// 272; GUILayout.BeginVertical(); GUILayout.Label(strAlarmEventName + " Details...", KACResources.styleAddSectionHeading); //What are the possible targets?? List <ITargetable> iTargets = new List <ITargetable>(); if (!(KACWorkerGameState.CurrentVesselTarget == null)) { iTargets.Add(KACWorkerGameState.CurrentVesselTarget); //VesselTarget } iTargets.Add(KACWorkerGameState.CurrentVessel.mainBody); //Body we are orbiting if (KACWorkerGameState.SOIPointExists) { iTargets.Add(KACWorkerGameState.CurrentVessel.orbit.nextPatch.referenceBody); //Body we will orbit next } if (intSelectediTarget > iTargets.Count - 1) { intSelectediTarget = 0; } intAddDistanceHeight += (iTargets.Count * 30); //Now give the user the choice GUILayout.BeginHorizontal(); GUILayout.Label("Select Target:", KACResources.styleAddXferName); if (DrawRadioListVertical(ref intSelectediTarget, iTargets.Select(x => x.GetName()).ToArray())) { Log.info("Distance Target is:{0}", iTargets[intSelectediTarget].GetName()); } GUILayout.EndHorizontal(); //Set the tgt Object tgtSelectedDistance = iTargets[intSelectediTarget]; string strDistanceName = "Distance"; if (tgtSelectedDistance is CelestialBody) { strDistanceName = "Altitude"; } //Ask for the target distance/altitude GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("Target {0} (m):", strDistanceName), KACResources.styleAddXferName); dblTargetDistance = Convert.ToDouble(GUILayout.TextField(dblTargetDistance.ToString(), KACResources.styleAddField)); GUILayout.EndHorizontal(); //If the body has an atmosphere then add an option to set the Altitude straight to that if (tgtSelectedDistance is CelestialBody) { if ((tgtSelectedDistance as CelestialBody).atmosphere) { GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("Atmosphere: {0}", (tgtSelectedDistance as CelestialBody).atmosphereDepth)); if (GUILayout.Button("Set to Edge")) { dblTargetDistance = (tgtSelectedDistance as CelestialBody).atmosphereDepth; } GUILayout.EndHorizontal(); intAddDistanceHeight += 26; } } //For a vessel give some options for orbits to look forwards GUILayout.BeginVertical(KACResources.styleAddFieldAreas); if (!(tgtSelectedDistance is CelestialBody)) { GUILayout.BeginHorizontal(); GUILayout.Label("Orbits to Search:", KACResources.styleAddHeading, GUILayout.Width(110)); GUILayout.Label(((int)Math.Round((Decimal)fltOrbits_Distance, 0)).ToString(), KACResources.styleAddXferName, GUILayout.Width(25)); fltOrbits_Distance = GUILayout.HorizontalSlider(fltOrbits_Distance, 1, 20); fltOrbits_Distance = (float)Math.Floor((Decimal)fltOrbits_Distance); GUILayout.EndHorizontal(); intAddDistanceHeight += 18; } //What VesselOrbit do we care about Orbit VesselOrbitToCompare = KACWorkerGameState.CurrentVessel.GetOrbit(); if ((KACWorkerGameState.SOIPointExists) && ((tgtSelectedDistance as CelestialBody) == KACWorkerGameState.CurrentVessel.orbit.nextPatch.referenceBody)) { VesselOrbitToCompare = KACWorkerGameState.CurrentVessel.orbit.nextPatch; } //Get the startUT of the orbit Double VesselOrbitStartUT = KACWorkerGameState.CurrentVessel.GetOrbit().StartUT; //Set up some variables intOrbits_Distance = (int)fltOrbits_Distance; int intDistanceOrbitPass = 0; double dblClosestDistance = Double.MaxValue; double dblDistanceUT = 0; double dblOrbitTestDistance = Double.MaxValue; double dblOrbitTestDistanceUT = 0; //If its an Altitude alarm then do this if (tgtSelectedDistance is CelestialBody) { dblOrbitTestDistanceUT = KACUtils.timeOfTargetAltitude(VesselOrbitToCompare, VesselOrbitStartUT, out dblOrbitTestDistance, dblTargetDistance ); dblClosestDistance = dblOrbitTestDistance; dblDistanceUT = dblOrbitTestDistanceUT; } else { //Else Iterate through the orbits to find the target separation for (int intOrbitToTest = 1; intOrbitToTest <= intOrbits_Distance; intOrbitToTest++) { dblOrbitTestDistanceUT = KACUtils.timeOfTargetDistance(VesselOrbitToCompare, tgtSelectedDistance.GetOrbit(), KACWorkerGameState.CurrentTime.UT, intOrbitToTest, out dblOrbitTestDistance, dblTargetDistance ); if (dblOrbitTestDistance < dblClosestDistance) { dblClosestDistance = dblOrbitTestDistance; dblDistanceUT = dblOrbitTestDistanceUT; intDistanceOrbitPass = intOrbitToTest; } } } //Now display what we got GUILayout.BeginHorizontal(); GUILayout.Label(String.Format("{0}:", strDistanceName), KACResources.styleAddHeading, GUILayout.Width(70)); String strDistance = string.Format("{0:#}m", dblClosestDistance); if (dblClosestDistance > 999) { strDistance = string.Format("{0:#.0}km", dblClosestDistance / 1000); } GUILayout.Label(strDistance, KACResources.styleAddXferName, GUILayout.Width(90)); if (!(tgtSelectedDistance is CelestialBody)) { GUILayout.Label("On Orbit:", KACResources.styleAddHeading); GUILayout.Label(intDistanceOrbitPass.ToString(), KACResources.styleAddXferName); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); //Now do the stuff to draw the alarm button String strMarginConversion = ""; KSPDateTime eventTime = new KSPDateTime(dblDistanceUT); KSPTimeSpan eventInterval = new KSPTimeSpan(dblDistanceUT - KACWorkerGameState.CurrentTime.UT); KSPDateTime eventAlarm; KSPTimeSpan eventAlarmInterval; try { eventAlarm = new KSPDateTime(eventTime.UT - timeMargin.UT); eventAlarmInterval = new KSPTimeSpan(eventTime.UT - KACWorkerGameState.CurrentTime.UT - timeMargin.UT); } catch (Exception) { eventAlarm = null; eventAlarmInterval = null; strMarginConversion = "Unable to Add the Margin Minutes"; } if ((eventTime.UT > KACWorkerGameState.CurrentTime.UT) && strMarginConversion == "") { if (DrawAddAlarm(eventTime, eventInterval, eventAlarmInterval)) { KACAlarm newAlarm = new KACAlarm(KACWorkerGameState.CurrentVessel.id.ToString(), strAlarmName, strAlarmNotes, eventAlarm.UT, timeMargin.UT, AddType, AddActions); newAlarm.TargetObject = KACWorkerGameState.CurrentVesselTarget; newAlarm.ManNodes = KACWorkerGameState.CurrentVessel.patchedConicSolver.maneuverNodes; alarms.Add(newAlarm); //settings.Save(); _ShowAddPane = false; } } else { strMarginConversion = "No Target Distance Approach found"; } if (strMarginConversion != "") { GUILayout.Label(strMarginConversion, GUILayout.ExpandWidth(true)); } GUILayout.EndVertical(); }