public override ScheduleElement GetValue(DatePartTemplateElement template, string valueString)
        {
            var parts = valueString.Split(Delimiter)
                        .Select(part => ScheduleElement.GetValue(template, part)).ToArray();

            return(new IntListScheduleElement(template, parts));
        }
Example #2
0
        public static string FromSchedule(ScheduleElement config)
        {
            var hours   = GenerateCronValue(config.Hours);
            var minutes = GenerateCronValue(config.Minutes);
            var seconds = GenerateCronValue(config.Seconds);

            return($"{seconds} {minutes} {hours} * * ? *");
        }
Example #3
0
 private static void RecursiveSubElementsList(ScheduleElement e, List <ScheduleElement> list)
 {
     list.Add(e);
     if (e.IsContainter)
     {
         foreach (var se in e.SubElements)
         {
             RecursiveSubElementsList(se, list);
         }
     }
 }
Example #4
0
    public void AddStop(Visitable destination)
    {
        ScheduleElement last_stop = Stops.Last();
        Craft           craft     = this.TransportCraftPanel().Craft;

        craft.Navigation.AddTransfer(new InterplanetaryTransfer(
                                         last_stop.Motion,
                                         destination.GetVisitingMotion(craft),
                                         last_stop.ArrivalDate));

        IsUserChoosingDestination = false;
    }
Example #5
0
    private void Update()
    {
        Navigation navigation = this.TransportCraftPanel().Craft.Navigation;

        if (transfers_used.SequenceEqual(navigation.Transfers) &&
            first_transfer_used == navigation.NextTransfer &&
            Stops.Count() > 0)
        {
            return;
        }

        Clear();

        float y_offset = 0;

        for (int i = 0; i <= navigation.Transfers.Count; i++)
        {
            Navigation.Transfer transfer = null;
            if (i < navigation.Transfers.Count)
            {
                transfer = navigation.Transfers[i];
            }

            if (transfer != null && transfer.ArrivalDate < The.Clock.Now)
            {
                continue;
            }

            ScheduleElement element = GameObject.Instantiate(ScheduleElementPrefab);
            element.transform.SetParent(ElementsContainer, false);
            element.RectTransform.anchoredPosition = new Vector3(0, y_offset, 0);

            element.DepartureTransfer = transfer;

            y_offset -= element.RectTransform.rect.height + Margin;
        }

        transfers_used      = new List <Navigation.Transfer>(navigation.Transfers);
        first_transfer_used = navigation.NextTransfer;

        AddTransferButton.RectTransform.anchoredPosition =
            new Vector3(0, y_offset + 8, 0);
    }
        /// <summary>
        /// Создает экземпляр из строки с представлением расписания.
        /// </summary>
        /// <param name="scheduleString">Строка расписания.
        /// Формат строки:
        ///     yyyy.MM.dd w HH:mm:ss.fff
        ///     yyyy.MM.dd HH:mm:ss.fff
        ///     HH:mm:ss.fff
        ///     yyyy.MM.dd w HH:mm:ss
        ///     yyyy.MM.dd HH:mm:ss
        ///     HH:mm:ss
        /// Где yyyy - год (2000-2100)
        ///     MM - месяц (1-12)
        ///     dd - число месяца (1-31 или 32). 32 означает последнее число месяца
        ///     w - день недели (0-6). 0 - воскресенье, 6 - суббота
        ///     HH - часы (0-23)
        ///     mm - минуты (0-59)
        ///     ss - секунды (0-59)
        ///     fff - миллисекунды (0-999). Если не указаны, то 0
        /// Каждую часть даты/времени можно задавать в виде списков и диапазонов.
        /// Например:
        ///     1,2,3-5,10-20/3
        ///     означает список 1,2,3,4,5,10,13,16,19
        /// Дробью задается шаг в списке.
        /// Звездочка означает любое возможное значение.
        /// Например (для часов):
        ///     */4
        ///     означает 0,4,8,12,16,20
        /// Вместо списка чисел месяца можно указать 32. Это означает последнее
        /// число любого месяца.
        /// Пример:
        ///     *.9.*/2 1-5 10:00:00.000
        ///     означает 10:00 во все дни с пн. по пт. по нечетным числам в сентябре
        ///     *:00:00
        ///     означает начало любого часа
        ///     *.*.01 01:30:00
        ///     означает 01:30 по первым числам каждого месяца
        /// </param>
        public Schedule(string scheduleString)
        {
            scheduleString = scheduleString.Trim();
            try
            {
                var supportFormatList = SupportFormats.Select(format => new ScheduleFormat(format)).ToArray();

                var allSeparators = supportFormatList.SelectMany(el => el.ScheduleItems).OfType <Separator>()
                                    .Select(sep => sep.Value).Distinct().ToArray();
                var allTemplateElements = supportFormatList.SelectMany(el => el.ScheduleItems).OfType <DatePartTemplateElement>().ToArray();

                //Поиск подходящего к scheduleString шаблона
                var usedTemplate = supportFormatList.FirstOrDefault(format => format.IsMatch(scheduleString, allSeparators));

                if (usedTemplate == null)
                {
                    throw new ArgumentException($"Не определен формат");
                }

                var usedTemplateElements = usedTemplate.ScheduleItems.OfType <DatePartTemplateElement>().ToArray();

                _schedule = scheduleString.Split(allSeparators)
                            .Select((te, index) => ScheduleElement.GetValue(usedTemplateElements[index], te)).ToArray()
                            .ToDictionary(se => se.ParentTemplate.DatePart, se => se);

                //Для не определенных в шаблоне элементов добавляем значения по умолчанию
                ((int[])Enum.GetValues(typeof(DateParts)))
                .Where(dp => !_schedule.ContainsKey((DateParts)dp) && allTemplateElements.Any(te => te.DatePart == (DateParts)dp))
                .Select(dp => allTemplateElements.First(te => te.DatePart == (DateParts)dp))
                .ToList()
                .ForEach(te => _schedule.Add(te.DatePart, ScheduleElement.GetDefaultValue(te)));
            }
            catch (ArgumentException ex)
            {
                throw new ArgumentException($"Ошибка создания расписания \"{scheduleString}\". {ex.Message}");
            }
        }
Example #7
0
        ScheduleElement[] ScanForSchedule(DataTable srcDt)
        {
            var table = new WorkRecordTable(srcDt);

            var scheduleRows = table.Rows.Where(row =>

                                                row[WorkRecordTable.ColumnParams["Date"].Index]?.GetType() == typeof(DateTime) &&
                                                row[WorkRecordTable.ColumnParams["PlanAM"].Index] != null &&
                                                row[WorkRecordTable.ColumnParams["PlanPM"].Index] != null);

            var list = new List <ScheduleElement>();

            foreach (var row in scheduleRows)
            {
                var item = new ScheduleElement
                {
                    Date   = (DateTime)row[WorkRecordTable.ColumnParams["Date"].Index],
                    PlanAM = (string)row[WorkRecordTable.ColumnParams["PlanAM"].Index],
                    PlanPM = (string)row[WorkRecordTable.ColumnParams["PlanAM"].Index],
                };
                list.Add(item);
            }
            return(list.ToArray());
        }
 public NotSupportedNestingException(ScheduleElement container, ScheduleElement element)
     : base($"Container of type {container.ElementType} can't hold element of type {element.ElementType} directly.")
 {
 }
Example #9
0
 public NotAContainerException(ScheduleElement element)
     : base($"Schedule element {element.ElementType} with ID {element.ID} is not a container.")
 {
 }
Example #10
0
 public ElementAlreadyExist(ScheduleElement element)
     : base($"Schedule element {element.ElementType} with ID {element.ID} already exist.")
 {
 }
Example #11
0
    protected override void OnButtonUp()
    {
        this.TransportCraftPanel().TripPanel.ScheduleElement = ScheduleElement;

        this.TransportCraftPanel().State = TransportCraftPanel.MenuState.Trip;
    }