// make all neceseary changes after pick command public void Pick(UInt32 material, string source) { try { LPosition pos = LPosition.FromString(source); if (pos.IsWarehouse()) { Warehouse.DBService.MaterialMove((int)material, source, Name); Warehouse.OnMaterialMove?.Invoke(new Place { Material = (int)material, Place1 = Name }, EnumMovementTask.Move); Place = Warehouse.DBService.FindPlace(Name); } else { IConveyorIO cIO = FindInConveyor(source); Move(material, cIO as ConveyorBasic, this); } } catch (Exception ex) { Warehouse.AddEvent(Event.EnumSeverity.Error, Event.EnumType.Exception, ex.Message); throw new CraneException(String.Format("{0} Crane.Pick failed ({1},{2})", Name, material, source)); } }
public void Initialize(StrategyDoubleForkCrane c) { ConveyorCrane1 = c.Strategy1.Crane.InConveyor.FirstOrDefault(prop => prop.Name == ConveyorCrane1Name); ConveyorCrane2 = c.Strategy2.Crane.InConveyor.FirstOrDefault(prop => prop.Name == ConveyorCrane2Name); }
public SimpleCraneCommand FindBestInput(bool automatic, IConveyorIO forcedInput) { try { CommandMaterial cmd = null; List <BestInput> res = new List <BestInput>(); foreach (ConveyorJunction c in InConveyor) { if (c.Place != null) { cmd = Warehouse.DBService.FindFirstCommand(c.Place.Material, automatic); if (cmd != null) { bool check = (c.ActiveRoute != null) && (c.ActiveRoute.Items[0].Final is Crane) && (c.ActiveRoute.Items[0].Final.Name == Name) && (c.ActiveMaterial == cmd.Material); check = check && !Warehouse.DBService.CheckIfSimpleCraneCommandToPlaceMaterialExist(c.Place, automatic); if (check) { Warehouse.AddEvent(Event.EnumSeverity.Event, Event.EnumType.Program, $"{Name}.FindBestInput({automatic},{forcedInput?.ToString()}"); foreach (var route in OutRouteDef.FinalRouteCost) { if (route.Items.Last().Final.Compatible(cmd.Target)) // && route.Items[0].Final.Place == null) { if ((Warehouse.FreePlaces(route.Items[0].Final) > Warehouse.DBService.CountSimpleCraneCommandForTarget(route.Items[0].Final.Name, true)) || route.Items[0].Final is Crane) { int a = Warehouse.FreePlaces(route.Items[0].Final); int b = Warehouse.DBService.CountSimpleCraneCommandForTarget(route.Items[0].Final.Name, true); Warehouse.AddEvent(Event.EnumSeverity.Event, Event.EnumType.Program, String.Format("FindBestInput On {0} Free places {1} Incoming commands {2}", route.Items[0].Final.Name, a, b)); res.Add(new BestInput { ID = cmd.ID, Place = c.Name, Material = cmd.Material }); if ((forcedInput != null && forcedInput == c)) { res.Clear(); res.Add(new BestInput { ID = cmd.ID, Place = c.Name, Material = cmd.Material }); break; } } } } /* var routes = from route in OutRouteDef.FinalRouteCost * where route.Items.Last().Final.Compatible(cmd.Target) && route.Items[0].Next.Place == null && * (route.Items[0].Final is Crane || route.Items[0].Final.Place == null) * group route by new { Route = route.Items[0] } into Group * select new * { * Node1 = Group.Key.Route, * RouteCost = Group.Min((x) => x.Cost) * }; */ } } } } if (res.Count() > 0) { var c = res.ElementAt(Random.Next(res.Count())); // -1 return(new SimpleCraneCommand { Command_ID = c.ID, Material = c.Material, Source = c.Place, Unit = Name, Task = SimpleCommand.EnumTask.Pick, Status = SimpleCommand.EnumStatus.NotInDB, Time = DateTime.Now }); } return(null); } catch (Exception ex) { Warehouse.AddEvent(Event.EnumSeverity.Error, Event.EnumType.Exception, ex.Message); throw new CraneException(String.Format("{0} Crane.FindBestInput failed ({1})", Name, automatic)); } }