Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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;
                }
            }
        }
Exemplo n.º 3
0
        /// <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);
                }
            }
        }
Exemplo n.º 4
0
        /// <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);
        }