1
z8018
昨天 6e7f192546903b04d2d37e852dd9b248e938c790
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/PlaceBlockService.cs
@@ -29,6 +29,8 @@
    /// </remarks>
    public class PlaceBlockService
    {
        //613 526
        /// <summary>
        /// èŽ·å–é…ç½®æ–‡ä»¶ä¸­"Spacing"键对应的整数值,表示间距值
        /// </summary>
@@ -38,6 +40,16 @@
        /// èŽ·å–æˆ–è®¾ç½®æœ€å¤§æ—‹è½¬é•¿åº¦é…ç½®å€¼
        /// </summary>
        public static int MaxRotateLength = AppSettings.GetValue("MaxRotateLength").ObjToInt();
        /// <summary>
        /// æœ€å°å®½åº¦X偏移量(毫米)
        /// </summary>
        public static int MinWidthOffset = AppSettings.GetValue("MinWidthOffset").ObjToInt();
        /// <summary>
        /// æœ€å¤§å®½åº¦X偏移量(毫米)
        /// </summary>
        public static int MaxWidthOffset = AppSettings.GetValue("MaxWidthOffset").ObjToInt();
        /// <summary>
        /// æœ€å¤§Y坐标限制(毫米)
@@ -330,12 +342,14 @@
                            var candidate = new Point3D(x, y, baseZ);
                            if (IsPositionValid(candidate, l, w, h))
                            {
                                TaskPosition taskPosition = GetTaskPosition(candidate, l, w, h, edge);
                                if (IsPositionValid(taskPosition))
                                TaskPosition? taskPosition = GetTaskPosition(candidate, l, w, h, edge);
                                if (taskPosition != null)
                                {
                                    return taskPosition;
                                    if (IsPositionValid(taskPosition))
                                    {
                                        return taskPosition;
                                    }
                                }
                            }
                        }
                    }
@@ -447,6 +461,10 @@
        /// <returns>如果Y轴坐标在有效范围内返回true,否则返回false</returns>
        private bool IsPositionValid(TaskPosition pos)
        {
            if (pos.Edge == 1 && pos.PutPositionX > 70 || pos.Edge == 2 && pos.PutPositionX < 0)
            {
                return false;
            }
            return pos.PutPositionY <= MaxY && pos.PutPositionY >= 0 && pos.TakePositionY >= 0;
        }
@@ -464,7 +482,7 @@
        /// å¹¶è®¡ç®—吸盘中心点位置,同时处理边界条件限制。
        /// æ¨ªå‘放置时最小Y坐标为155,纵向时为350,最大Y坐标为700。
        /// </remarks>
        public TaskPosition GetTaskPosition(Point3D point3D, int length, int width, int height, int edge)
        public TaskPosition? GetTaskPosition(Point3D point3D, int length, int width, int height, int edge)
        {
            //放货位置板材中心点
            Point3D putCenter = new Point3D(point3D.X + length / 2, point3D.Y + width / 2, point3D.Z + height / 2);
@@ -481,6 +499,13 @@
            int putPositionX = 0;
            int putPositionY = 0;
            int putPositionZ = 0;
            int takeCenterX = 0;
            int takeCenterY = 0;
            int takeCenterZ = 0;
            int putCenterX = 0;
            int putCenterY = 0;
            int putCenterZ = 0;
            //1.如果长度大于920,宽度大于等于300,则可以使用双吸盘横向吸取
            if (length > 920) //横向双吸
@@ -511,6 +536,13 @@
                putPositionY = (putCenter.X - deviceCenter.Y);
                putPositionZ = point3D.Z;
            }
            takeCenterX = takePositionX;
            takeCenterY = takePositionY;
            takeCenterZ = takePositionZ;
            putCenterX = putPositionX;
            putCenterY = putPositionY;
            putCenterZ = putPositionZ;
            if (takePositionY <= MinY)
            {
@@ -549,35 +581,43 @@
                }
            }
            if (positionR == 2 && edge == 0)
            if (width > MinWidthOffset && width < MaxWidthOffset)
            {
                takePositionX = width - 530;
                putPositionX = point3D.Y;
                takePositionX = takeCenterX;
                putPositionX = putCenterX;
            }
            else if (positionR == 2 && edge == 1)
            else
            {
                takePositionX = 0;
                putPositionX = point3D.Y + width - 530;
            }
            else if (positionR == 1 && edge == 1)
            {
                if(width > ContainerSize.Width)
                {
                    takePositionX = 0;
                    putPositionX = point3D.Y;
                }
                else
                if (positionR == 2 && edge == 0)
                {
                    takePositionX = width - 530;
                    putPositionX = point3D.Y + (width - 530);
                    putPositionX = point3D.Y;
                }
            }
            else if (positionR == 1 && edge == 0)
            {
                if (putPositionX < 0)
                else if (positionR == 2 && edge == 1)
                {
                    takePositionX = 0;
                    putPositionX = point3D.Y;
                    putPositionX = point3D.Y + width - 530;
                }
                else if (positionR == 1 && edge == 1)
                {
                    if (width > ContainerSize.Width)
                    {
                        takePositionX = 0;
                        putPositionX = point3D.Y;
                    }
                    else
                    {
                        takePositionX = width - 530;
                        putPositionX = point3D.Y + (width - 530);
                    }
                }
                else if (positionR == 1 && edge == 0)
                {
                    if (putPositionX < 0)
                    {
                        takePositionX = 0;
                        putPositionX = point3D.Y;
                    }
                }
            }
@@ -595,17 +635,24 @@
                PutPositionX = putPositionX,
                PutPositionY = putPositionY,
                PutPositionZ = putPositionZ,
                TakeCenterPositionX = takeCenter.X,
                TakeCenterPositionY = takeCenter.Y,
                TakeCenterPositionZ = takeCenter.Z,
                PutCenterPositionX = putCenter.X,
                PutCenterPositionY = putCenter.Y,
                PutCenterPositionZ = putCenter.Z,
                TakeCenterPositionX = takeCenterX,
                TakeCenterPositionY = takeCenterY,
                TakeCenterPositionZ = takeCenterZ,
                PutCenterPositionX = putCenterX,
                PutCenterPositionY = putCenterY,
                PutCenterPositionZ = putCenterZ,
                PositionX = point3D.X,
                PositionY = point3D.Y,
                PositionZ = point3D.Z
                PositionZ = point3D.Z,
                Edge = edge,
            };
            if (!IsPositionValid(taskPosition))
            {
                return null;
            }
            return taskPosition;
        }
    }