/// <summary> /// 根据转向获取当前朝向 /// </summary> /// <param name="fromWay"></param> /// <param name="turnWay"></param> /// <returns></returns> public DirectionWay getDirection(DirectionWay fromWay, TurnWay turnWay) { if (turnWay == TurnWay.Next) { return(fromWay); } if (fromWay == DirectionWay.Easet) { switch (turnWay) { case TurnWay.Left: return(DirectionWay.North); case TurnWay.Right: return(DirectionWay.South); case TurnWay.Back: return(DirectionWay.West); } } else if (fromWay == DirectionWay.South) { switch (turnWay) { case TurnWay.Left: return(DirectionWay.Easet); case TurnWay.Right: return(DirectionWay.West); case TurnWay.Back: return(DirectionWay.North); } } else if (fromWay == DirectionWay.West) { switch (turnWay) { case TurnWay.Left: return(DirectionWay.South); case TurnWay.Right: return(DirectionWay.North); case TurnWay.Back: return(DirectionWay.Easet); } } else if (fromWay == DirectionWay.North) { switch (turnWay) { case TurnWay.Left: return(DirectionWay.West); case TurnWay.Right: return(DirectionWay.Easet); case TurnWay.Back: return(DirectionWay.South); } } return(DirectionWay.None); }
/// <summary> /// 计算仓位的转向逻辑 /// </summary> /// <param name="insInfo"></param> /// <param name="nextPathArray"></param> /// <param name="lastPath"></param> /// <param name="item"></param> /// <param name="rackItem"></param> private void setRouteByRack(InstructionInfo insInfo, string nextPathArray, string lastPath, RouteInfo item, RackInfo rackItem) { string[] path2Arr = nextPathArray.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); string next = path2Arr[0]; var nextItem = routelist.Where(a => a.Routecode == next).FirstOrDefault(); int xsub = item.X - nextItem.X; int ysub = item.Y - nextItem.Y; int xrack = 0; int yrack = 0; if (rackItem != null) { xrack = item.X - rackItem.X; yrack = item.Y - rackItem.Y; } if (xsub == 0) { if (ysub > 0) //向南 { if (lastPath == inpackroute || lastPath == outpackroute) { if (direction == DirectionWay.South) { if (xrack > 0) //右手 { insInfo.AddItem(lastPath, TurnWay.Left); insInfo.AddItem(lastPath, TurnWay.Right); } else { insInfo.AddItem(lastPath, TurnWay.Right); insInfo.AddItem(lastPath, TurnWay.Left); } } else if (direction == DirectionWay.North) { if (xrack > 0) //左手 { insInfo.AddItem(lastPath, TurnWay.Right); insInfo.AddItem(lastPath, TurnWay.Right); } else { insInfo.AddItem(lastPath, TurnWay.Left); insInfo.AddItem(lastPath, TurnWay.Left); } } else if (direction == DirectionWay.West) { insInfo.AddItem(lastPath, TurnWay.Left); //insInfo.AddItem(lastPath, TurnWay.Next); } else { insInfo.AddItem(lastPath, TurnWay.Right); //insInfo.AddItem(lastPath, TurnWay.Next); } } direction = DirectionWay.South; } else //向北 { if (lastPath == inpackroute || lastPath == outpackroute) { if (direction == DirectionWay.South) { if (xrack > 0) //右手 { insInfo.AddItem(lastPath, TurnWay.Left); insInfo.AddItem(lastPath, TurnWay.Left); } else { insInfo.AddItem(lastPath, TurnWay.Right); insInfo.AddItem(lastPath, TurnWay.Right); } } else if (direction == DirectionWay.North) { if (xrack > 0) //左手 { insInfo.AddItem(lastPath, TurnWay.Right); insInfo.AddItem(lastPath, TurnWay.Left); } else { insInfo.AddItem(lastPath, TurnWay.Left); insInfo.AddItem(lastPath, TurnWay.Right); } } else if (direction == DirectionWay.Easet) { insInfo.AddItem(lastPath, TurnWay.Left); //insInfo.AddItem(lastPath, TurnWay.Next); } else { insInfo.AddItem(lastPath, TurnWay.Right); //insInfo.AddItem(lastPath, TurnWay.Next); } } direction = DirectionWay.North; } } else if (ysub == 0) { if (xsub > 0) //向西 { if (lastPath == inpackroute || lastPath == outpackroute) { if (direction == DirectionWay.South) { insInfo.AddItem(lastPath, TurnWay.Right); //insInfo.AddItem(lastPath, TurnWay.Back); //insInfo.AddItem(lastPath, TurnWay.Left); } else if (direction == DirectionWay.Easet) { if (yrack > 0) //右手 { insInfo.AddItem(lastPath, TurnWay.Left); insInfo.AddItem(lastPath, TurnWay.Left); } else { insInfo.AddItem(lastPath, TurnWay.Right); insInfo.AddItem(lastPath, TurnWay.Right); } } else if (direction == DirectionWay.West) { if (yrack > 0) //左手 { insInfo.AddItem(lastPath, TurnWay.Right); insInfo.AddItem(lastPath, TurnWay.Left); } else { insInfo.AddItem(lastPath, TurnWay.Left); insInfo.AddItem(lastPath, TurnWay.Right); } } else { insInfo.AddItem(lastPath, TurnWay.Left); //insInfo.AddItem(lastPath, TurnWay.Back); //insInfo.AddItem(lastPath, TurnWay.Right); } } direction = DirectionWay.West; } else //向东 { if (lastPath == inpackroute || lastPath == outpackroute) { if (direction == DirectionWay.South) { insInfo.AddItem(lastPath, TurnWay.Left); //insInfo.AddItem(lastPath, TurnWay.Back); //insInfo.AddItem(lastPath, TurnWay.Right); } else if (direction == DirectionWay.Easet) { if (yrack > 0) //右手 { insInfo.AddItem(lastPath, TurnWay.Left); insInfo.AddItem(lastPath, TurnWay.Right); } else { insInfo.AddItem(lastPath, TurnWay.Right); insInfo.AddItem(lastPath, TurnWay.Left); } } else if (direction == DirectionWay.West) { if (yrack > 0) //左手 { insInfo.AddItem(lastPath, TurnWay.Right); insInfo.AddItem(lastPath, TurnWay.Right); } else { insInfo.AddItem(lastPath, TurnWay.Left); insInfo.AddItem(lastPath, TurnWay.Left); } } else { insInfo.AddItem(lastPath, TurnWay.Right); //insInfo.AddItem(lastPath, TurnWay.Back); //insInfo.AddItem(lastPath, TurnWay.Left); } } direction = DirectionWay.Easet; } } }
/// <summary> /// 计算路径以及转向逻辑 /// </summary> /// <param name="insInfo"></param> /// <param name="path1"></param> /// <param name="path2"></param> /// <param name="rackItem"></param> private void ComputePath(InstructionInfo insInfo, string path1, string path2 = null, RackInfo rackItem = null) { string[] path1Arr = path1.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); int path1Length = path1Arr.Length; for (int i = 0; i < path1Length; i++) { string path = path1Arr[i]; if (i == 0 && !string.IsNullOrEmpty(lastRoute)) //如果取/卸货仓位是紧邻的仓位,则指令需要跳过下一位置 { var rackInfo = rackList.Where(a => a.RouteCode == path).FirstOrDefault(); if (rackInfo != null) { var lastInfo = rackList.Where(a => a.RouteCode == lastRoute).FirstOrDefault(); if (lastInfo != null) { continue; } } } lastRoute = path; var item = routelist.Where(a => a.Routecode == path1Arr[i]).FirstOrDefault(); if (i + 1 < path1Length) //还有下一节点 { string next = path1Arr[i + 1]; var nextItem = routelist.Where(a => a.Routecode == next).FirstOrDefault(); int xsub = item.X - nextItem.X; int ysub = item.Y - nextItem.Y; if (xsub == 0) { if (ysub > 0) //向南 { insInfo.AddItem(path, insInfo.getWay(direction, DirectionWay.South)); direction = DirectionWay.South; } else //向北 { insInfo.AddItem(path, insInfo.getWay(direction, DirectionWay.North)); direction = DirectionWay.North; } } else if (ysub == 0) { if (xsub > 0) //向西 { insInfo.AddItem(path, insInfo.getWay(direction, DirectionWay.West)); direction = DirectionWay.West; } else //向东 { insInfo.AddItem(path, insInfo.getWay(direction, DirectionWay.Easet)); direction = DirectionWay.Easet; } } } else if (!string.IsNullOrEmpty(path2)) //一期默认货架在右侧,即X正,Y负 { setRouteByRack(insInfo, path2, path, item, rackItem); } } }
/// <summary> /// 根据方向获取转向 /// </summary> /// <param name="fromWay"></param> /// <param name="toWay"></param> /// <returns></returns> public TurnWay getWay(DirectionWay fromWay, DirectionWay toWay) { if (fromWay == DirectionWay.None) { return(TurnWay.Next); } if (fromWay == DirectionWay.Easet) { switch (toWay) { case DirectionWay.Easet: return(TurnWay.Next); case DirectionWay.North: return(TurnWay.Left); case DirectionWay.South: return(TurnWay.Right); case DirectionWay.West: return(TurnWay.Back); } } else if (fromWay == DirectionWay.South) { switch (toWay) { case DirectionWay.Easet: return(TurnWay.Left); case DirectionWay.North: return(TurnWay.Back); case DirectionWay.South: return(TurnWay.Next); case DirectionWay.West: return(TurnWay.Right); } } else if (fromWay == DirectionWay.North) { switch (toWay) { case DirectionWay.Easet: return(TurnWay.Right); case DirectionWay.North: return(TurnWay.Next); case DirectionWay.South: return(TurnWay.Back); case DirectionWay.West: return(TurnWay.Left); } } else if (fromWay == DirectionWay.West) { switch (toWay) { case DirectionWay.Easet: return(TurnWay.Back); case DirectionWay.North: return(TurnWay.Right); case DirectionWay.South: return(TurnWay.Left); case DirectionWay.West: return(TurnWay.Next); } } return(TurnWay.Stop); }