Example #1
0
 /// <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 { }
 }
Example #2
0
        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
            }
        }