예제 #1
0
파일: Network.cs 프로젝트: Cocotus/XTMF
        /// <summary>
        /// Load the network from a 211 file
        /// </summary>
        /// <param name="fileName211"></param>
        public void LoadNetwork(string fileName211)
        {
            Dictionary<int, Node> nodes = new Dictionary<int, Node>();
            Dictionary<Pair<int, int>, Link> links = new Dictionary<Pair<int, int>, Link>();
            using ( StreamReader reader = new StreamReader( fileName211 ) )
            {
                string line = null;

                // run until we get to the link information
                while ( ( line = reader.ReadLine() ) != null )
                {
                    string[] parts = line.Split( SplitCharacters, StringSplitOptions.RemoveEmptyEntries );
                    try
                    {
                        var numberOfParts = parts.Length;
                        if ( numberOfParts >= 3 && parts[0].Length > 0 )
                        {
                            int offset = -1;
                            if ( parts[0][0] == 'a' )
                            {
                                offset = 0;
                            }
                            else if ( parts[0][0] == 'c' )
                            {
                                continue;
                            }
                            Node node = new Node();
                            if ( offset == -1 )
                            {
                                node.IsCentroid = false;
                            }
                            else
                            {
                                node.IsCentroid = ( parts[0].Length >= 2 && parts[0] == "a*" );
                            }
                            node.Number = int.Parse( parts[1 + offset] );
                            node.X = float.Parse( parts[2 + offset] );
                            node.Y = float.Parse( parts[3 + offset] );
                            if ( numberOfParts > 4 + offset )
                            {
                                node.USER1 = int.Parse( parts[4 + offset] );
                                if ( numberOfParts > 5 + offset )
                                {
                                    node.USER2 = int.Parse( parts[5 + offset] );
                                    if ( numberOfParts > 6 + offset )
                                    {
                                        node.NodeType = int.Parse( parts[6 + offset] );
                                        node.Modified = false;
                                        if ( parts.Length > 7 + offset )
                                        {
                                            node.NodeLabel = parts[7 + offset];
                                        }
                                        else
                                        {
                                            node.NodeLabel = node.Number.ToString();
                                        }
                                    }
                                }
                            }
                            nodes.Add( node.Number, node );
                        }
                    }
                    catch { }
                    if ( line != null && line.StartsWith( "t links" ) )
                    {
                        break;
                    }
                }

                while ( ( line = reader.ReadLine() ) != null )
                {
                    try
                    {
                        string[] parts = line.Split( SplitCharacters, StringSplitOptions.RemoveEmptyEntries );
                        if ( parts.Length > 7 )
                        {
                            Link link;
                            link.I = int.Parse( parts[1] );
                            link.J = int.Parse( parts[2] );
                            link.Length = float.Parse( parts[3] );
                            link.Modes = parts[4].ToLower().ToCharArray();
                            link.LinkType = int.Parse( parts[5] );
                            link.Lanes = float.Parse( parts[6] );
                            link.VDF = float.Parse( parts[7] );
                            // We don't load [8]
                            link.Speed = float.Parse( parts[9] );
                            link.Capacity = float.Parse( parts[10] );
                            link.Modified = false;
                            links.Add( new Pair<int, int>( link.I, link.J ), link );
                        }
                    }
                    catch { }
                }
            }

            // Now that we have loaded the data it is time to create the sparse structures
            var numberOfLinks = links.Count;
            var first = new int[numberOfLinks];
            var second = new int[numberOfLinks];
            var data = new Link[numberOfLinks];
            int i = 0;
            foreach ( var l in links.Values )
            {
                first[i] = l.I;
                second[i] = l.J;
                data[i] = l;
                i++;
            }
            if ( nodes.Values.Count == 0 )
            {
                this.Nodes = null;
            }
            else
            {
                this.Nodes = SparseArray<Node>.CreateSparseArray( ( n => n.Number ), nodes.Values.ToArray() );
            }
            if ( numberOfLinks == 0 )
            {
                this.Links = null;
            }
            else
            {
                this.Links = SparseTwinIndex<Link>.CreateTwinIndex( first, second, data );
            }
        }
예제 #2
0
파일: Network.cs 프로젝트: Cocotus/XTMF
 private void WriteNode(StreamWriter writer, Node node)
 {
 }