// TODO: add ability to specify location and preferFast flag public List <Ephemerides> GetEphemerides(CelestialObject body, double from, double to, double step, IEnumerable <string> categories, CancellationToken?cancelToken = null, IProgress <double> progress = null) { List <Ephemerides> all = new List <Ephemerides>(); var config = EphemConfigs[body.GetType()]; var itemsToBeCalled = config.Filter(categories); for (double jd = from; jd < to; jd += step) { if (cancelToken != null && cancelToken.Value.IsCancellationRequested) { break; } else { progress?.Report((jd - from) / (to - from) * 100); } var context = new SkyContext(jd, Context.GeoLocation); Ephemerides ephemerides = new Ephemerides(body); foreach (var item in itemsToBeCalled) { ephemerides.Add(new Ephemeris(item.Category, item.Formula.DynamicInvoke(context, body), item.Formatter ?? Formatters.GetDefault(item.Category))); } all.Add(ephemerides); } return(all); }
public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { CelestialObject body = value as CelestialObject; if (body != null) { string key = new[] { body.GetType() } .Concat(body.GetType().GetInterfaces()) .Select(inf => $"Icon{inf.Name}") .FirstOrDefault(k => Application.Current.Resources.Contains(k)); if (key != null) { return(Application.Current.Resources[key]); } } return(null); }
public void SetData(CelestialObject body, double jdFrom, double jdTo, TimeSpan step, List <Ephemerides> ephemerides) { string bodyName = body.Names.First(); string bodyTypeName = body.GetType().Name; double utcOffset = sky.Context.GeoLocation.UtcOffset; Header = Text.Get("EphemeridesWindow.Header", ("objectName", bodyName), ("startDate", Formatters.DateTime.Format(new Date(jdFrom, utcOffset))), ("endDate", Formatters.DateTime.Format(new Date(jdTo, utcOffset))), ("step", Formatters.TimeSpan.Format(step)) ); var table = new DataTable(); var dateColumn = new DataColumn() { Caption = Text.Get("EphemeridesWindow.DateColumn"), ColumnName = "Date", DataType = typeof(Date), ReadOnly = true }; dateColumn.ExtendedProperties["Formatter"] = Formatters.DateTime; table.Columns.Add(dateColumn); table.Columns.AddRange(ephemerides[0].Select(e => { var column = new DataColumn() { Caption = Text.Get($"{bodyTypeName}.{e.Key}"), ColumnName = e.Key, DataType = e.Value.GetType(), ReadOnly = true }; column.ExtendedProperties["Formatter"] = e.Formatter; return(column); }).ToArray()); for (int i = 0; i < ephemerides.Count; i++) { var row = table.NewRow(); row["Date"] = new Date(jdFrom + i * step.TotalDays, utcOffset); foreach (var e in ephemerides[i]) { row[e.Key] = e.Value; } table.Rows.Add(row); } Body = body; Ephemeris = ephemerides; EphemerisTable = table; StartDate = jdFrom; EndDate = jdTo; Step = step; }
public Ephemerides GetEphemerides(CelestialObject body, SkyContext context, IEnumerable <string> categories) { var config = EphemConfigs[body.GetType()]; var itemsToBeCalled = config.Filter(categories); Ephemerides ephemerides = new Ephemerides(body); foreach (var item in itemsToBeCalled) { ephemerides.Add(new Ephemeris(item.Category, item.Formula.DynamicInvoke(context, body), item.Formatter ?? Formatters.GetDefault(item.Category))); } return(ephemerides); }
public ICollection <string> GetEphemerisCategories(CelestialObject body) { var type = body.GetType(); if (EphemConfigs.ContainsKey(type)) { return(EphemConfigs[type].GetCategories(body)); } else { return(new string[0]); } }
public CelestialObjectInfo GetInfo(CelestialObject body) { Type bodyType = body.GetType(); if (InfoProviders.ContainsKey(bodyType)) { var ephem = GetEphemerides(body, Context.JulianDay, Context.JulianDay + 1, 1, GetEphemerisCategories(body)).First(); var infoType = typeof(CelestialObjectInfo <>).MakeGenericType(bodyType); var info = (CelestialObjectInfo)Activator.CreateInstance(infoType, Context, body, ephem); InfoProviders[bodyType].DynamicInvoke(info); return(info); } else { return(null); } }
public void Write(CelestialObject body, double jdFrom, double jdTo, TimeSpan step, List <Ephemerides> ephemerides) { string bodyTypeName = body.GetType().Name; StringBuilder row = new StringBuilder(); using (var writer = File.CreateText(file)) { // header row.Append("\""); row.Append(Text.Get("EphemeridesWindow.DateColumn")); row.Append("\", "); row.Append(string.Join(", ", ephemerides[0].Select(e => $"\"{Text.Get($"{bodyTypeName}.{e.Key}")}\""))); writer.WriteLine(row.ToString()); // content rows for (int i = 0; i < ephemerides.Count; i++) { double jd = jdFrom + i * step.TotalDays; row = new StringBuilder(); row.Append("\""); row.Append(isRawData ? jd.ToString(nf) : Formatters.DateTime.Format(new Date(jd, utcOffset))); row.Append("\","); foreach (var e in ephemerides[i]) { row.Append("\""); row.Append(isRawData ? Convert.ToString(e.Value, nf) : e.Formatter.Format(e.Value)); row.Append("\","); } writer.WriteLine(row.ToString().TrimEnd(',')); } writer.Flush(); writer.Close(); } }
public void SetData(CelestialObject body, double jdFrom, double jdTo, TimeSpan step, List <List <Ephemeris> > ephemeris) { string bodyName = body.Names.First(); string bodyTypeName = body.GetType().Name; double utcOffset = sky.Context.GeoLocation.UtcOffset; string headerTemplate = "Ephemerides of {0}\nStart date: {1}\nEnd date: {2}\nStep: {3}"; Header = string.Format(headerTemplate, bodyName, Formatters.DateTime.Format(new Date(jdFrom, utcOffset)), Formatters.DateTime.Format(new Date(jdTo, utcOffset)), Formatters.TimeSpan.Format(step)); var table = new DataTable(); table.Columns.Add(new DataColumn() { Caption = "Date", ColumnName = "Date" }); table.Columns.AddRange(ephemeris[0].Select(e => new DataColumn() { Caption = Text.Get($"{bodyTypeName}.{e.Key}"), ColumnName = e.Key }).ToArray()); for (int i = 0; i < ephemeris.Count; i++) { var row = table.NewRow(); row["Date"] = Formatters.DateTime.Format(new Date(jdFrom + i * step.TotalDays, utcOffset)); foreach (var e in ephemeris[i]) { row[e.Key] = e.Formatter.Format(e.Value); } table.Rows.Add(row); } EphemerisTable = table; }