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)); }
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} * * ? *"); }
private static void RecursiveSubElementsList(ScheduleElement e, List <ScheduleElement> list) { list.Add(e); if (e.IsContainter) { foreach (var se in e.SubElements) { RecursiveSubElementsList(se, list); } } }
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; }
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}"); } }
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.") { }
public NotAContainerException(ScheduleElement element) : base($"Schedule element {element.ElementType} with ID {element.ID} is not a container.") { }
public ElementAlreadyExist(ScheduleElement element) : base($"Schedule element {element.ElementType} with ID {element.ID} already exist.") { }
protected override void OnButtonUp() { this.TransportCraftPanel().TripPanel.ScheduleElement = ScheduleElement; this.TransportCraftPanel().State = TransportCraftPanel.MenuState.Trip; }