Пример #1
0
        internal Traffic(STFReader stf)
        {
            stf.MustMatchBlockStart();
            Name = stf.ReadString();
            stf.ParseBlock(new STFReader.TokenProcessor[] {
                new STFReader.TokenProcessor("service_definition", () => { Services.Add(new Services(stf)); }),
            });

            //            TrafficFile = new TrafficFile(FolderStructure.TrafficFile(Name));
            TrafficFile = new TrafficFile(FolderStructure.RouteFromActivity(stf.FileName).TrafficFile(Name));
        }
Пример #2
0
        public Service(Content content)
        {
            Debug.Assert(content.Type == ContentType.Service);
            if (System.IO.Path.GetExtension(content.PathName).Equals(".srv", StringComparison.OrdinalIgnoreCase))
            {
                var file = new ServiceFile(content.PathName);
                Name    = file.Name;
                Consist = file.Train_Config;
                Path    = file.PathID;

                Debug.Assert(content is ContentMSTSService);
                var msts    = content as ContentMSTSService;
                var actFile = new ActivityFile(content.Parent.PathName);
                if (msts.IsPlayer)
                {
                    var activityTraffic = actFile.Tr_Activity.Tr_Activity_File.Player_Service_Definition.Player_Traffic_Definition;

                    ID        = "0";
                    StartTime = MSTSTimeToDateTime(activityTraffic.Time);
                    Stops     = from stop in activityTraffic.Player_Traffic_List
                                select new Stop(stop.PlatformStartID, stop.DistanceDownPath, MSTSTimeToDateTime(stop.ArrivalTime), MSTSTimeToDateTime(stop.DepartTime));
                }
                else
                {
                    var trfFile         = new TrafficFile(msts.TrafficPathName);
                    var activityService = actFile.Tr_Activity.Tr_Activity_File.Traffic_Definition.ServiceDefinitionList[msts.TrafficIndex];
                    var trafficService  = trfFile.TrafficDefinition.TrafficItems[msts.TrafficIndex];

                    ID        = activityService.UiD.ToString();
                    StartTime = MSTSTimeToDateTime(activityService.Time);
                    Stops     = trafficService.TrafficDetails.Zip(activityService.ServiceList, (tt, stop) => new Stop(stop.PlatformStartID, stop.DistanceDownPath, MSTSTimeToDateTime(tt.ArrivalTime), MSTSTimeToDateTime(tt.DepartTime)));
                }
            }
            else if (System.IO.Path.GetExtension(content.PathName).Equals(".timetable_or", StringComparison.OrdinalIgnoreCase))
            {
                // TODO: Make common timetable parser.
                var file = new TimetableReader(content.PathName);
                Name = content.Name;

                var serviceColumn = -1;
                var consistRow    = -1;
                var pathRow       = -1;
                var startRow      = -1;
                for (var row = 0; row < file.Strings.Count; row++)
                {
                    if (file.Strings[row][0] == "#consist" && consistRow == -1)
                    {
                        consistRow = row;
                    }
                    else if (file.Strings[row][0] == "#path" && pathRow == -1)
                    {
                        pathRow = row;
                    }
                    else if (file.Strings[row][0] == "#start" && startRow == -1)
                    {
                        startRow = row;
                    }
                }
                for (var column = 0; column < file.Strings[0].Length; column++)
                {
                    if (file.Strings[0][column] == content.Name && serviceColumn == -1)
                    {
                        serviceColumn = column;
                    }
                }
                ID = serviceColumn.ToString();
                var timeRE         = new Regex(@"^(\d\d):(\d\d)(?:-(\d\d):(\d\d))?");
                var startTimeMatch = timeRE.Match(file.Strings[startRow][serviceColumn]);
                if (startTimeMatch.Success)
                {
                    StartTime = new DateTime(2000, 1, 1, int.Parse(startTimeMatch.Groups[1].Value), int.Parse(startTimeMatch.Groups[2].Value), 0);
                }
                var stops = new List <Stop>();
                for (var row = 0; row < file.Strings.Count; row++)
                {
                    if (row != startRow)
                    {
                        var timeMatch = timeRE.Match(file.Strings[row][serviceColumn]);
                        if (timeMatch.Success)
                        {
                            var arrivalTime   = new DateTime(2000, 1, 1, int.Parse(timeMatch.Groups[1].Value), int.Parse(timeMatch.Groups[2].Value), 0);
                            var departureTime = timeMatch.Groups[3].Success ? new DateTime(2000, 1, 1, int.Parse(timeMatch.Groups[3].Value), int.Parse(timeMatch.Groups[4].Value), 0) : arrivalTime;
                            // If the time is prior to this train's start time, assume it is rolling over in to "tomorrow".
                            if (arrivalTime < StartTime)
                            {
                                arrivalTime   = arrivalTime.AddDays(1);
                                departureTime = departureTime.AddDays(1);
                            }
                            stops.Add(new Stop(file.Strings[row][0].Replace(" $hold", "").Replace(" $forcehold", ""), arrivalTime, departureTime));
                        }
                    }
                }
                Stops    = stops.OrderBy(s => s.ArrivalTime);
                Consist  = file.Strings[consistRow][serviceColumn].Replace(" $reverse", "");
                Reversed = file.Strings[consistRow][serviceColumn].Contains(" $reverse");
                Path     = file.Strings[pathRow][serviceColumn];
            }
        }
Пример #3
0
 /// <summary>
 /// Try to load the file.
 /// Possibly this might raise an exception. That exception is not caught here
 /// </summary>
 /// <param name="file">The file that needs to be loaded</param>
 public override void TryLoading(string file)
 {
     _ = new TrafficFile(file);
 }