/// <summary> /// Runs the ExportVehicleRequest. /// This will spawn a export vehicle and will try to make a tasks for robots to move refined crates stored on a export storage nodes to the export vehicle to fill it up so closes as posible to its maximal weight capacity. /// Returns true if succesfully completed. /// </summary> public bool RunTask(Model w) { //Spawn export vehicle: if (exportVehicle == null) { exportVehicle = new ExportVehicle(x, y, z, 0, Math.PI, 0); w.worldObjects.Add(exportVehicle); exportVehicle.Move(exportVehicle.x, exportVehicle.y, exportVehicle.z); } //Make tasks for robots if vehicle has arrived: if (exportVehicle.CheckArrived()) { //Find filled export storage nodes and order them by the weight of the crates in the nodes: List <StorageNode> filledRefinedStorageNodes = new List <StorageNode>(); foreach (Node node in w.nodeGrid.nodes) //WARNING!!! could lead to "change to collections" exeption, but i doubt it. { if (node is StorageNode) { if (!((StorageNode)node).CheckImport() && ((StorageNode)node).GetIsDone()) { filledRefinedStorageNodes.Add((StorageNode)node); } } } if (filledRefinedStorageNodes.Count() == 0) { return(false); } filledRefinedStorageNodes = filledRefinedStorageNodes.OrderBy(node => node.GetCrate().weight).ToList(); //Loop that creates tasks for robots to move crates to the export vehicle with the found filled refined storage nodes: int lastWeight = -1; while (filledRefinedStorageNodes.Count() != 0) { bool lowestvalue = true; for (int i = 0; i < filledRefinedStorageNodes.Count(); i++) { //Export vehicle is almost full, will try fill it as full as possible: if (exportVehicle.assignedWeightLeft <= 10) { bool enoughChoice = filledRefinedStorageNodes.Count() >= 3; int biggestW = 0, biggestP = -1; for (int j = 0; j < filledRefinedStorageNodes.Count(); j++) { int weightOnNode = filledRefinedStorageNodes[j].GetCrate().weight; if (exportVehicle.assignedWeightLeft == weightOnNode) { StorageNode pickUpTarget = filledRefinedStorageNodes[j]; w.tasksForRobot.Add(new TaskForRobot(pickUpTarget.position, new double[] { 1, -25 }, pickUpTarget.GetCrate(), (PickUpTarget)pickUpTarget, (DropOffTarget)exportVehicle)); pickUpTarget.SetIsDone(); exportVehicle.AssignWeight(weightOnNode); return(true); } else if (enoughChoice) { if (weightOnNode > biggestW && weightOnNode < exportVehicle.assignedWeightLeft) { biggestP = j; biggestW = weightOnNode; } } } if (biggestP != -1) { StorageNode pickUpTarget = filledRefinedStorageNodes[biggestP]; w.tasksForRobot.Add(new TaskForRobot(pickUpTarget.position, new double[] { 1, -25 }, pickUpTarget.GetCrate(), (PickUpTarget)pickUpTarget, (DropOffTarget)exportVehicle)); filledRefinedStorageNodes.RemoveAt(biggestP); pickUpTarget.SetIsDone(); exportVehicle.AssignWeight(biggestW); } else { exportVehicle.LoadWeight(exportVehicle.assignedWeightLeft); return(true); } } //Export vehicle has more than enough space, fill the export vehicle with biggest weight to smallest weight, a smaller weight each time. //this until lowest weight has been found, than this will sart over again: else if (filledRefinedStorageNodes[i].GetCrate().weight < lastWeight || lastWeight == -1) { StorageNode pickUpTarget = filledRefinedStorageNodes[i]; w.tasksForRobot.Add(new TaskForRobot(pickUpTarget.position, new double[] { 1, -25 }, pickUpTarget.GetCrate(), (PickUpTarget)pickUpTarget, (DropOffTarget)exportVehicle)); lastWeight = pickUpTarget.GetCrate().weight; pickUpTarget.SetIsDone(); exportVehicle.AssignWeight(lastWeight); filledRefinedStorageNodes.RemoveAt(i); lowestvalue = false; break; } } if (lowestvalue == true) { lastWeight = -1; } } } return(false); }
/// <summary> /// Runs the PickUpUnRefinedCrateRequest. /// This will try to make a task for a robot to move a unrefined crate on a inport storage node to a refinery with space left. /// Returns true if succesfully completed. /// </summary> /// <param name="w"></param> /// <returns></returns> public bool RunTask(Model w) { foreach (Object3D obj in w.worldObjects) { if (obj is Refinery) { if (((Refinery)obj).CheckForSpaceLeft()) { w.tasksForRobot.Add(new TaskForRobot(node.position, new double[] { -25, -1 }, node.GetCrate(), (PickUpTarget)node, (DropOffTarget)obj)); return(true); } } } return(false); }