/// <summary> /// /// </summary> /// <param name="item"></param> /// <param name="signal"></param> public AESignalItem(SignalItem item, SignalObject signal, TDBFile TDB) { typeWidget = (int)TypeWidget.SIGNAL_WIDGET; Item = item; Signal = signal; sigFonction = new List <SignalHead.MstsSignalFunction>(); foreach (var sig in Signal.SignalHeads) { sigFonction.Add(sig.sigFunction); if (sig.sigFunction == SignalHead.MstsSignalFunction.SPEED) { File.AppendAllText(@"C:\temp\AE.txt", "SPEED\n"); } } foreach (var fn in sigFonction) { File.AppendAllText(@"C:\temp\AE.txt", "FN " + fn + "\n"); } hasDir = false; Location.X = item.TileX * 2048 + item.X; Location.Y = item.TileZ * 2048 + item.Z; try { var node = TDB.TrackDB.TrackNodes[signal.trackNode]; Vector2 v2; if (node.TrVectorNode != null) { var ts = node.TrVectorNode.TrVectorSections[0]; v2 = new Vector2(ts.TileX * 2048 + ts.X, ts.TileZ * 2048 + ts.Z); } else if (node.TrJunctionNode != null) { var ts = node.UiD; v2 = new Vector2(ts.TileX * 2048 + ts.X, ts.TileZ * 2048 + ts.Z); } else { throw new Exception(); } var v1 = new Vector2(Location.X, Location.Y); var v3 = v1 - v2; v3.Normalize(); //v2 = v1 - Vector2.Multiply(v3, signal.direction == 0 ? 12f : -12f); v2 = v1 - Vector2.Multiply(v3, 12f); Dir.X = (float)v2.X; Dir.Y = (float)v2.Y; //v2 = v1 - Vector2.Multiply(v3, signal.direction == 0 ? 1.5f : -1.5f);//shift signal along the dir for 2m, so signals will not be overlapped v2 = v1 - Vector2.Multiply(v3, 1.5f); Location.X = (float)v2.X; Location.Y = (float)v2.Y; hasDir = true; } catch { } }
public AIPath(TDBFile TDB, TSectionDatFile tsectiondat, string filePath) #endif { PathFile patFile = new PathFile(filePath); pathName = patFile.Name; TrackDB = TDB.TrackDB; TSectionDat = tsectiondat; #if ACTIVITY_EDITOR orRouteConfig = orRouteConf; #endif bool fatalerror = false; if (patFile.TrPathNodes.Count <= 0) { fatalerror = true; Nodes = null; return; } foreach (TrPathNode tpn in patFile.TrPathNodes) { Nodes.Add(new AIPathNode(tpn, patFile.TrackPDPs[(int)tpn.fromPDP], TrackDB, isTimetableMode)); } FirstNode = Nodes[0]; //LastVisitedNode = FirstNode; // Connect the various nodes to each other for (int i = 0; i < Nodes.Count; i++) { AIPathNode node = Nodes[i]; node.Index = i; TrPathNode tpn = patFile.TrPathNodes[i]; // find TVNindex to next main node. if (tpn.HasNextMainNode) { node.NextMainNode = Nodes[(int)tpn.nextMainNode]; node.NextMainTVNIndex = node.FindTVNIndex(node.NextMainNode, TDB, tsectiondat); if (node.JunctionIndex >= 0) { node.IsFacingPoint = TestFacingPoint(node.JunctionIndex, node.NextMainTVNIndex); } if (node.NextMainTVNIndex < 0) { node.NextMainNode = null; Trace.TraceWarning("Cannot find main track for node {1} in path {0}", filePath, i); fatalerror = true; } } // find TVNindex to next siding node if (tpn.HasNextSidingNode) { node.NextSidingNode = Nodes[(int)tpn.nextSidingNode]; node.NextSidingTVNIndex = node.FindTVNIndex(node.NextSidingNode, TDB, tsectiondat); if (node.JunctionIndex >= 0) { node.IsFacingPoint = TestFacingPoint(node.JunctionIndex, node.NextSidingTVNIndex); } if (node.NextSidingTVNIndex < 0) { node.NextSidingNode = null; Trace.TraceWarning("Cannot find siding track for node {1} in path {0}", filePath, i); fatalerror = true; } } if (node.NextMainNode != null && node.NextSidingNode != null) { node.Type = AIPathNodeType.SidingStart; } } FindSidingEnds(); if (fatalerror) { Nodes = null; // invalid path - do not return any nodes } }