public JsonResult addLink(NetworkViewModel model)
        {
            Link newLink = model.NewLink;
            Link newLink2 = model.NewLink;

            Node to = new Node();
            Node from = new Node();

            Node to2 = new Node();
            Node from2 = new Node();
            killOptimization(model.ID);

            using(var c = new DataModelContext())
            {
                foreach(Node n in c.Networks.Find(model.ID).Nodes)
                {

                    if(n.StationCode == model.NewLink.To.StationCode)
                    {

                        to = n;
                    }
                    else if(n.StationCode == model.NewLink.From.StationCode)
                    {
                        from = n;
                    }
                }

                newLink.From = from;
                newLink.To = to;

                try
                {
                    var net = c.Networks.Find(model.ID);
                    net.Links.Add(newLink);
                    net.LastEdit = DateTime.Now;
                }
                catch(Exception e)
                {
                    throw e;
                }
                c.SaveChanges();
            }

            if (!model.IsOneDirectional)
            {
                using (var d = new DataModelContext())
                {

                    foreach (Node n in d.Networks.Find(model.ID).Nodes)
                    {

                        if (n.StationCode == model.NewLink.To.StationCode)
                        {

                            to2 = n;
                        }
                        else if (n.StationCode == model.NewLink.From.StationCode)
                        {
                            from2 = n;
                        }
                    }
                    newLink2.From = to2;
                    newLink2.To = from2;
                    try
                    {
                        var net = d.Networks.Find(model.ID);
                        net.Links.Add(newLink2);
                        net.LastEdit = DateTime.Now;
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                    d.SaveChanges();
                }
            }
            return Json(new { success=true });
        }
Exemple #2
0
        public Network XmlFileToNetwork(XDocument inFile)
        {
            var nodes = new List<Node>();
            var links = new List<Link>();
            var orders = new List<Order>();
            int maxCars = 0;
            double nonFuelCost = 0, fuelCost = 0, carCost = 0;
            var nodeCurAdjMap = new Dictionary<Node, double>();
            int i =0;
            foreach (XElement element in inFile.Root.Elements())
            {
                i++;
                switch (element.Name.ToString())
                {
                    case "Network":
                    foreach (XAttribute a in element.Attributes())
                    {
                        switch (a.Name.ToString())
                        {
                            case "maxCars":
                                maxCars = int.Parse(a.Value);
                                break;
                            case "nonFuelCost":
                                nonFuelCost = Double.Parse(a.Value);
                                break;
                            case "fuelCost":
                                fuelCost = Double.Parse(a.Value);
                                break;
                            case "carCost":
                                carCost = Double.Parse(a.Value);
                                break;
                        }
                    }
                    foreach (XElement el in element.Elements())
                    {
                        switch(el.Name.ToString())
                        {
                            case "Nodes":
                            foreach (XElement e in el.Elements())
                            {
                                string stationId = "", name = "";
                                int carCap = 0; //outCapacity = 0;
                                double latitude = 0, longitude = 0;
                                foreach (XAttribute att in e.Attributes())
                                {
                                    switch (att.Name.ToString())
                                    {
                                        case "id":
                                            stationId = att.Value;
                                            break;
                                        case "cars":
                                            carCap = int.Parse(att.Value);
                                            break;
                                        case "latitude":
                                            latitude = Double.Parse(att.Value);
                                            break;
                                        case "longitude":
                                            longitude = Double.Parse(att.Value);
                                            break;
                                    }
                                }
                                Node temp = new Node()
                                {
                                    Name = name,
                                    StationCode = stationId,
                                    Location = new Point() { Latitude = latitude, Longitude = longitude },
                                    CarCapacity = carCap,
                                    InLinks = new List<Link>(),
                                    OutLinks = new List<Link>(),
                                    InOrders = new List<Order>(),
                                    OutOrders = new List<Order>(),
                                };
                                nodeCurAdjMap[temp] = GeocodingEngine.getInstance()
                                    .LocationConvertToUSD(temp.Location, 1.0);
                                nodes.Add(temp);
                            }
                            break; //end Nodes
                            case "Arcs":
                            foreach (XElement e in el.Elements())
                            {
                                string to ="", from ="";
                                double track_mult = 0, fuel_adj =0;
                                int max_trains = 0;
                                foreach (XAttribute att in e.Attributes())
                                {
                                    switch (att.Name.ToString())
                                    {
                                        case "end":
                                            to = att.Value;
                                            break;

                                        case "start":
                                            from = att.Value;
                                            break;
                                        case "trackMultiplier":
                                            track_mult = Double.Parse(att.Value);
                                            break;
                                        case "maxTrains":
                                            max_trains = Int32.Parse(att.Value);
                                            break;
                                        case "fuelAdj":
                                            fuel_adj = Double.Parse(att.Value);
                                            break;
                                    }
                                }
                                int toIndex = -1;
                                int fromIndex = -1;
                                int k = 0;
                                foreach (Node n in nodes)
                                {
                                    if (toIndex >= 0 && fromIndex >= 0)
                                        break;
                                    if (n.StationCode.Equals(to))
                                        toIndex = k;
                                    if (n.StationCode.Equals(from))
                                        fromIndex = k;
                                    k++;
                                }
                                Link tempLink = new Link
                                {
                                    From = nodes[fromIndex],
                                    To = nodes[toIndex],
                                    MaxTrains = max_trains,
                                    FuelAdjustment = fuel_adj,
                                };
                                tempLink.Distance = GeocodingEngine.getInstance().Distance(
                                    tempLink.From.Location,
                                    tempLink.To.Location
                                ) * track_mult;
                                nodes[fromIndex].OutLinks.Add(tempLink);
                                nodes[toIndex].InLinks.Add(tempLink);
                                links.Add(tempLink);
                            }
                        break; //end arcs
                        }
                    }
                    break; //end network
                    case "Orders":
                    foreach (XElement el in element.Elements())
                    {
                        string id ="", origin ="", dest ="";
                        int cars = 0;
                        double revenue = 0;
                        foreach (XAttribute att in el.Attributes())
                        {
                            switch(att.Name.ToString())
                            {
                                case "cars":
                                    cars = int.Parse(att.Value);
                                    break;
                                case "revenue":
                                    revenue = Double.Parse(att.Value);
                                    break;
                                case "to":
                                    dest = att.Value;
                                    break;
                                case "from":
                                    origin = att.Value;
                                    break;
                            }
                        }
                        int destIndex = -1;
                        int origIndex = -1;
                        int k = 0;
                        foreach (Node n in nodes)
                        {
                            if (destIndex >= 0 && origIndex >= 0)
                                break;
                            if(n.StationCode.Equals(dest))
                                destIndex = k;
                            if(n.StationCode.Equals(origin))
                                origIndex = k;
                            k++;
                        }
                        Order tempOrder = new Order { Cars = cars,
                            Destination = nodes[destIndex], Origin = nodes[origIndex],
                            //XMLOrderID =
                        };
                        tempOrder.Revenue = nodeCurAdjMap[tempOrder.Origin] * revenue;
                        nodes[origIndex].OutOrders.Add(tempOrder);
                        nodes[destIndex].InOrders.Add(tempOrder);
                        orders.Add(tempOrder);

                    }
                    break; //end orders
                }
            }

            var network = new Network{ CarCostPerMile = carCost,
                FuelCostPerMile = fuelCost, NonFuelCostPerMile = nonFuelCost,
                MaxCarsPerTrain = maxCars, Links = links,
                Nodes = nodes, Orders = orders,
                OptimizationResult = null};

            return network;
        }
        public JsonResult addOrder(NetworkViewModel model)
        {
            Order newOrder = model.NewOrder;

            Node to = new Node();
            Node from = new Node();
            killOptimization(model.ID);

            using(var c = new DataModelContext())
            {
                foreach(Node n in c.Networks.Find(model.ID).Nodes)
                {

                    if(n.StationCode == model.NewOrder.Destination.StationCode)
                    {

                        to = n;
                    }
                    else if(n.StationCode == model.NewOrder.Origin.StationCode)
                    {
                        from = n;
                    }
                }
                newOrder.Destination = to;
                newOrder.Origin = from;

                var net = c.Networks.Find(model.ID);
                net.Orders.Add(newOrder);

                net.LastEdit = DateTime.Now;
                c.SaveChanges();
            }
            return Json(new { success=true });
        }