コード例 #1
0
ファイル: Sky.cs プロジェクト: Astrarium/Astrarium
        // 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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: EphemerisVM.cs プロジェクト: silas1037/Astrarium
        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;
        }
コード例 #4
0
ファイル: Sky.cs プロジェクト: Astrarium/Astrarium
        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);
        }
コード例 #5
0
ファイル: Sky.cs プロジェクト: Astrarium/Astrarium
        public ICollection <string> GetEphemerisCategories(CelestialObject body)
        {
            var type = body.GetType();

            if (EphemConfigs.ContainsKey(type))
            {
                return(EphemConfigs[type].GetCategories(body));
            }
            else
            {
                return(new string[0]);
            }
        }
コード例 #6
0
ファイル: Sky.cs プロジェクト: Astrarium/Astrarium
        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);
            }
        }
コード例 #7
0
ファイル: EphemerisVM.cs プロジェクト: Astrarium/Astrarium
        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();
            }
        }
コード例 #8
0
        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;
        }