예제 #1
0
 public void SetVersion(TimetableVersion version)
 {
     SetAttribute("version", version.ToNumberString());
     typeCache = null;
 }
예제 #2
0
        public Timetable GetRouteTimetable(TimetableVersion targetVersion)
        {
            var copy = orig.Clone();

            var route = copy.GetRoute(routeIndex);

            for (int si = 0; si < copy.Stations.Count; si++)
            {
                var sta = copy.Stations[si];

                if (!route.Stations.Contains(sta))
                {
                    copy.RemoveStation(sta);
                    si--;
                    continue;
                }
            }

            // XML-Elemente wirklich sortieren. In copy.Stations wird nicht zurückgesynct,
            // daher eine eigene sortierte Liste für später
            var sortedStations = copy.Stations.OrderBy(s => s.Positions.GetPosition(routeIndex)).ToList();

            var stasElm = copy.Children.First(x => x.XName == "stations");

            stasElm.Children = stasElm.Children.OrderBy(c =>
            {
                if (c.XName == "sta")
                {
                    return(copy.Stations.FirstOrDefault(s => s.XMLEntity == c)?.Positions.GetPosition(routeIndex));
                }
                return(null);
            }).ToList();

            int syncId = 0;

            for (int ti = 0; ti < copy.Trains.Count; ti++)
            {
                var tra   = copy.Trains[ti];
                var ardps = tra.GetArrDeps();
                var path  = tra.GetPath();

                var pf      = path.FirstOrDefault();
                var pl      = path.LastOrDefault();
                var isEmpty = pf != null && pl != null && ((ardps[pf].Arrival != default && ardps[pf].Departure == default) || (ardps[pl].Departure != default && ardps[pl].Arrival == default));
                if (ardps.Count == 0 || ardps.All(a => !a.Value.HasMinOneTimeSet) || isEmpty) // Dieser Zug berührt diese Route nicht
                {
                    copy.RemoveTrain(tra);
                    ti--;
                    continue;
                }
                tra.SetAttribute("fpl-sync-id", syncId++.ToString());
                trainMap.Add(tra); // Der Index wird immer um 1 hochegzählt, daher brauchts hier kein Dictionary

                // Fahrtzeiteneinträge setzen
                tra.Children.Clear();
                tra.AddAllArrDeps(sortedStations);
                foreach (var ardp in ardps)
                {
                    if (sortedStations.Contains(ardp.Key))
                    {
                        tra.GetArrDep(ardp.Key).ApplyCopy(ardp.Value);
                    }
                }

                // Lineare Fahrtrichtung bestimmen
                var sta1 = ardps.FirstOrDefault().Key;
                var sta2 = ardps.LastOrDefault().Key;

                var dir = TrainDirection.ti;
                if (sta1 != sta2)
                {
                    if (sortedStations.IndexOf(sta1) > sortedStations.IndexOf(sta2))
                    {
                        dir = TrainDirection.ta;
                    }
                }
                else if (sortedStations.IndexOf(sta1) == sortedStations.Count - 1)
                {
                    dir = TrainDirection.ta;
                }

                tra.XMLEntity.XName = dir.ToString();
            }

            // Am Ende die Kilometer & anderen Attribute auf den linearen Stil setzen
            foreach (var sta in copy.Stations)
            {
                ConvertStationNetToLin(sta, routeIndex, targetVersion);
            }

            copy.SetAttribute("version", targetVersion.ToNumberString()); // Wir gehen aus dem Extended-Modus raus
            ColorTimetableConverter.ConvertAll(copy);                     // Zum Ziel-Farbformat konvertieren

            return(copy);
        }