asmrobot
2019-11-13 576b92fd82f568572bc4beb125fa0ba0191a602f
src/RichCreator.Editor/Tools/MapEditor.xaml.cs
@@ -1,5 +1,6 @@
using Emgu.CV;
using RichCreator.Utility;
using RichCreator.Utility.Maps;
using RichCreator.Utility.PathFinding;
using RichCreator.Utility.PathFindings;
using RichCreator.Utility.Structs;
@@ -116,7 +117,7 @@
            //加载障碍物
            for (int i = 0; i < info.Obstacles.Count; i++)
            {
                Polygon polygon=CreateObstacleUI(info.Obstacles[i]);
                Polygon polygon = CreateObstacleUI(info.Obstacles[i]);
                this.HouseInfoLayer.Children.Add(polygon);
            }
@@ -135,23 +136,210 @@
                this.HouseInfoLayer.Children.Add(fp);
            }
            //加载巡逻线
            for (int i = 0; i < info.LoopLines.Count; i++)
            {
                Line llline = CreateLoopLineUI(info.LoopLines[i]);
                this.HouseInfoLayer.Children.Add(llline);
            }
            //加载寻路线
            for (int i = 0; i < info.FindPathLines.Count; i++)
            {
                Line fpline = CreateFindPathLineUI(info.FindPathLines[i]);
                this.HouseInfoLayer.Children.Add(fpline);
            }
            //加载巡逻点
            if (!info.LoopPoint.Equals(ZTPoint.Empty))
            {
                Canvas llline = CreateLoopPointUI(info.LoopPoint);
                this.HouseInfoLayer.Children.Add(llline);
            }
            //进门点
            for (int i = 0; i < info.NextGates.Count; i++)
            {
                Canvas ng = CreateNextGateUI(info.NextGates[i]);
                this.HouseInfoLayer.Children.Add(ng);
            }
            //加载导引区域
            for (int i = 0; i < info.PathGuides.Count; i++)
            {
                Polygon pg = CreatePathGuideUI(info.PathGuides[i]);
                this.PathGuideShapeLayer.Children.Add(pg);
            }
            this.housePathInfo = info;
        }
        /// <summary>
        /// 生成定位图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CreateLocationPicture(object sender, RoutedEventArgs e)
        {
            string dir = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "numbers");
            if (!System.IO.Directory.Exists(dir))
            {
                System.IO.Directory.CreateDirectory(dir);
            }
            for (Int32 i = 0; i <= 255; i++)
            {
                byte number = (byte)i;
                System.Drawing.Bitmap image = new System.Drawing.Bitmap(12, 10);
                //1
                SetImagePixel(0, 0, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(2, 0, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(5, 0, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(7, 0, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 0, 2, 2, image, System.Drawing.Color.White);
                //2
                SetImagePixel(0, 2, 2, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 2, 2, 2, image, System.Drawing.Color.Black);
                //3
                SetImagePixel(0, 4, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(2, 4, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(5, 4, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(7, 4, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 4, 2, 2, image, System.Drawing.Color.White);
                //4
                SetImagePixel(0, 6, 2, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 6, 2, 2, image, System.Drawing.Color.Black);
                //5
                SetImagePixel(0, 8, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(2, 8, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(5, 8, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(7, 8, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 8, 2, 2, image, System.Drawing.Color.White);
                Int32 x = 0, y = 0;
                for (int bit = 0; bit <= 7; bit++)
                {
                    GetBitCoordinate(out x, out y, bit);
                    if (HasValueInBit(number, bit))
                    {
                        SetImagePixel(x, y, 2, 2, image, System.Drawing.Color.White);
                    }
                    else
                    {
                        SetImagePixel(x, y, 2, 2, image, System.Drawing.Color.Black);
                    }
                }
                string saveDir = System.IO.Path.Combine(dir, number.ToString() + ".png");
                image.Save(saveDir, System.Drawing.Imaging.ImageFormat.Png);
            }
            MessageBox.Show("数字文件生成成功,生成至程序目录:numbers目录下");
        }
        /// <summary>
        /// 设置像素
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="image"></param>
        /// <param name="color"></param>
        private void SetImagePixel(Int32 x, Int32 y, Int32 width, Int32 height, System.Drawing.Bitmap image, System.Drawing.Color color)
        {
            for (int w = 0; w < width; w++)
            {
                for (Int32 h = 0; h < height; h++)
                {
                    image.SetPixel(x + w, y + h, color);
                }
            }
        }
        /// <summary>
        /// 得到指定位坐标
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="bitIndex"></param>
        private void GetBitCoordinate(out Int32 x, out Int32 y, Int32 bitIndex)
        {
            x = 0;
            y = 0;
            switch (bitIndex)
            {
                case 0:
                    x = 8;
                    y = 6;
                    break;
                case 1:
                    x = 6;
                    y = 6;
                    break;
                case 2:
                    x = 4;
                    y = 6;
                    break;
                case 3:
                    x = 2;
                    y = 6;
                    break;
                case 4:
                    x = 8;
                    y = 2;
                    break;
                case 5:
                    x = 6;
                    y = 2;
                    break;
                case 6:
                    x = 4;
                    y = 2;
                    break;
                case 7:
                    x = 2;
                    y = 2;
                    break;
            }
        }
        /// <summary>
        /// 得到数字指定位是否有值
        /// </summary>
        /// <param name="number"></param>
        /// <param name="bit"></param>
        /// <returns></returns>
        private bool HasValueInBit(byte number, Int32 bit)
        {
            switch (bit)
            {
                case 0:
                    return (number & 0b00000001) != 0;
                case 1:
                    return (number & 0b00000010) != 0;
                case 2:
                    return (number & 0b00000100) != 0;
                case 3:
                    return (number & 0b00001000) != 0;
                case 4:
                    return (number & 0b00010000) != 0;
                case 5:
                    return (number & 0b00100000) != 0;
                case 6:
                    return (number & 0b01000000) != 0;
                case 7:
                    return (number & 0b10000000) != 0;
            }
            return true;
        }
        /// <summary>
        /// 清理定位点
@@ -200,12 +388,10 @@
            ZTPoint start = this.startEndFindPathPoint[0];
            ZTPoint end = this.startEndFindPathPoint[1];
            DNFPathFinding finder = new DNFPathFinding(this.housePathInfo);
            HouseInfo house = new HouseInfo(this.housePathInfo);
            List<ZTPoint> path = house.FindPath(ref start, ref end);
            List<ZTPoint> path=finder.FindPath(ref start, ref end);
            if (path==null||path.Count <= 0)
            if (path == null || path.Count <= 0)
            {
                MessageBox.Show("不用寻路");
                return;
@@ -217,7 +403,7 @@
                for (int i = 0; i < path.Count; i++)
                {
                    Line line=GetPathLineUI(lastPoint, path[i]);
                    Line line = GetPathLineUI(lastPoint, path[i]);
                    this.StartEndPointLayer.Children.Add(line);
                    lastPoint = path[i];
                }
@@ -238,7 +424,8 @@
            }
            //是否添加障碍物
            OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
            Int32 number = TypeConverter.StringToInt(this.tagNumber.Text, 0);
            Int32 numParameter = TypeConverter.StringToInt(this.tagParameter.Text, 0);
            string strParameter = this.tagParameter.Text;
            if (e.LeftButton == MouseButtonState.Released)
            {
@@ -247,15 +434,10 @@
            Point point = GetPosition(e);
            if (op == OperateActionD.Obstacle)
            {
                //障碍物
            }
            else if (op == OperateActionD.LocationPoint)
            if (op == OperateActionD.LocationPoint)
            {
                //定位点
                ParametersPoint lp = new ParametersPoint(new ZTPoint((Int32)point.X, (Int32)point.Y), number);
                ParametersPoint lp = new ParametersPoint(new ZTPoint((Int32)point.X, (Int32)point.Y), numParameter);
                if (this.housePathInfo.AddLocationPosition(lp))
                {
                    Canvas lpControl = CreateLocationPointUI(lp);
@@ -272,17 +454,6 @@
                    this.HouseInfoLayer.Children.Add(fpControl);
                }
            }
            else if (op == OperateActionD.LoopLine)
            {
                //循环线
                ZTPoint llPoint = GetFindPathPoint(new ZTPoint((Int32)point.X, (Int32)point.Y));
                if (!llPoint.Equals(ZTPoint.Empty))
                {
                    tempLine = CreateTempLoopLineUI(llPoint);
                    this.HouseInfoLayer.Children.Add(tempLine);
                    moveable = true;
                }
            }
            else if (op == OperateActionD.FindPathLine)
            {
                //寻路线
@@ -294,6 +465,19 @@
                    moveable = true;
                }
            }
            else if (op == OperateActionD.LoopPoint)
            {
                //循环点
                if (!this.housePathInfo.LoopPoint.Equals(ZTPoint.Empty))
                {
                    //删除原来的巡逻点
                }
                ZTPoint sepoint = new ZTPoint((Int32)point.X, (Int32)point.Y);
                this.housePathInfo.LoopPoint = sepoint;
                Canvas lp = CreateLoopPointUI(sepoint);
                this.HouseInfoLayer.Children.Add(lp);
            }
            else if (op == OperateActionD.StartEndPoint)
            {
                //画寻路起始和终点
@@ -302,6 +486,28 @@
                this.StartEndPointLayer.Children.Add(lseControl);
                this.startEndFindPathPoint.Add(sepoint);
            }
            else if (op == OperateActionD.ReadCoordinate)
            {
                //读取坐标
                ZTPoint sepoint = new ZTPoint((Int32)point.X, (Int32)point.Y);
                this.tagParameter.Text = sepoint.X.ToString() + "," + sepoint.Y.ToString();
            }
            else if (op == OperateActionD.NextGate)
            {
                //下一关的门
                if (numParameter < 0 || numParameter > 3)
                {
                    MessageBox.Show("参数必须是:0:上1:右2:下3:左");
                    return;
                }
                ParametersPoint ng = new ParametersPoint(new ZTPoint((Int32)point.X, (Int32)point.Y), numParameter);
                if (this.housePathInfo.AddNextGate(ng))
                {
                    Canvas ngControl = CreateNextGateUI(ng);
                    this.HouseInfoLayer.Children.Add(ngControl);
                }
            }
        }
        /// <summary>
@@ -317,17 +523,7 @@
            }
            OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
            Point point = GetPosition(e);
            if (op == OperateActionD.LoopLine)
            {
                //巡逻线
                if (!moveable)
                {
                    return;
                }
                tempLine.X2 = point.X;
                tempLine.Y2 = point.Y;
            }
            else if (op == OperateActionD.FindPathLine)
            if (op == OperateActionD.FindPathLine)
            {
                //寻路线
                if (!moveable)
@@ -337,7 +533,7 @@
                tempLine.X2 = point.X;
                tempLine.Y2 = point.Y;
            }
            else if (op == OperateActionD.Obstacle)
            else if (op == OperateActionD.Obstacle||op==OperateActionD.PathGuide)
            {
                //障碍物线
                if (!moveable)
@@ -363,34 +559,7 @@
            OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
            Point point = GetPosition(e);
            if (op == OperateActionD.LoopLine)
            {
                //巡逻线
                if (!moveable)
                {
                    return;
                }
                moveable = false;
                if (tempLine == null)
                {
                    return;
                }
                ZTPoint startPoint = (ZTPoint)tempLine.Tag;
                ZTPoint centerPoint = GetFindPathPoint(new ZTPoint((Int32)point.X, (Int32)point.Y));
                if (!centerPoint.Equals(ZTPoint.Empty))
                {
                    ZTLinePoint ll = new ZTLinePoint(startPoint, centerPoint);
                    if (this.housePathInfo.AddLoopLine(ll))
                    {
                        Line llline = CreateLoopLineUI(ll);
                        this.HouseInfoLayer.Children.Add(llline);
                    }
                }
                this.HouseInfoLayer.Children.Remove(tempLine);
                tempLine = null;
            }
            else if (op == OperateActionD.FindPathLine)
            if (op == OperateActionD.FindPathLine)
            {
                //寻路线
                if (!moveable)
@@ -417,9 +586,9 @@
                this.HouseInfoLayer.Children.Remove(tempLine);
                tempLine = null;
            }
            else if (op == OperateActionD.Obstacle)
            else if (op == OperateActionD.Obstacle|| op == OperateActionD.PathGuide)
            {
                //绘制障碍物
                //绘制障碍物或路径指导
                //判断是否起点
                if (tempPolyline == null)
                {
@@ -441,21 +610,39 @@
                        return;
                    }
                    if (IsFirstPoint(point) && this.points.Count > 2)
                    if (IsComplete(point) && this.points.Count > 2)
                    {
                        //到起点,完成,向houseinfo里添加障碍物 ,画折线,
                        ZTPoint[] obstaclePoints = new ZTPoint[this.points.Count];
                        ZTPoint[] points = new ZTPoint[this.points.Count];
                        for (int i = 0; i < this.points.Count; i++)
                        {
                            obstaclePoints[i] = new ZTPoint((Int32)this.points[i].X, (Int32)this.points[i].Y);
                            points[i] = new ZTPoint((Int32)this.points[i].X, (Int32)this.points[i].Y);
                        }
                        ZTPolygon ztpolygon = new ZTPolygon(obstaclePoints);
                        this.housePathInfo.AddObstacle(ztpolygon);
                        ZTPolygon ztpolygon = new ZTPolygon(points);
                        if (op == OperateActionD.Obstacle)
                        {
                            //障碍物
                            this.housePathInfo.AddObstacle(ztpolygon);
                            Polygon obstacle = CreateObstacleUI(ztpolygon);
                            this.HouseInfoLayer.Children.Add(obstacle);
                        }
                        else if (op == OperateActionD.PathGuide)
                        {
                            //路径导引
                            string strParameter = this.tagParameter.Text;
                            string[] sp = strParameter.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                            if (sp.Length == 2)
                            {
                                ZTPoint targetPoint = new ZTPoint(TypeConverter.StringToInt(sp[0],0), TypeConverter.StringToInt(sp[1], 0));
                                ZTTargetPolygon targetPolygon = new ZTTargetPolygon(ztpolygon, targetPoint);
                        Polygon polygon = CreateObstacleUI(ztpolygon);
                        this.HouseInfoLayer.Children.Add(polygon);
                                this.housePathInfo.AddPathGuide(targetPolygon);
                                var pathGuide = CreatePathGuideUI(targetPolygon);
                                this.PathGuideShapeLayer.Children.Add(pathGuide);
                            }
                        }
                        this.HouseInfoLayer.Children.Remove(tempPolyline);
                        tempPolyline = null;
                        this.HouseInfoLayer.Children.Remove(tempLine);
@@ -620,60 +807,8 @@
            }
        }
        /// <summary>
        /// 创建巡逻线UI
        /// </summary>
        private Line CreateLoopLineUI(ZTLinePoint linePoint)
        {
            Line edgeLine = new Line();
            edgeLine.Tag = linePoint;
            edgeLine.MouseRightButtonUp += LoopLine_MouseRightButtonUp;
            edgeLine.Stroke = new SolidColorBrush(Colors.Red);
            edgeLine.StrokeThickness = 6;
            edgeLine.X1 = linePoint.X1;
            edgeLine.Y1 = linePoint.Y1;
            edgeLine.X2 = linePoint.X2;
            edgeLine.Y2 = linePoint.Y2;
            edgeLine.StrokeDashArray = new DoubleCollection() { 2, 3 };
            edgeLine.StrokeDashCap = PenLineCap.Triangle;
            edgeLine.StrokeEndLineCap = PenLineCap.Square;
            edgeLine.StrokeStartLineCap = PenLineCap.Round;
            return edgeLine;
        }
        /// <summary>
        /// 巡逻线右击
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LoopLine_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Line c = sender as Line;
            if (c == null)
            {
                return;
            }
            ZTLinePoint fp = default(ZTLinePoint);
            try
            {
                fp = (ZTLinePoint)c.Tag;
            }
            catch
            {
                return;
            }
            if (this.housePathInfo.RemoveLoopLine(fp))
            {
                this.HouseInfoLayer.Children.Remove(c);
            }
        }
        /// <summary>
        /// 创建临时巡逻线UI
@@ -807,7 +942,7 @@
            polygon.Opacity = 0.7f;
            for (int i = 0; i < ztpolygon.Points.Length; i++)
            {
                polygon.Points.Add(new Point(ztpolygon.Points[i].X,ztpolygon.Points[i].Y));
                polygon.Points.Add(new Point(ztpolygon.Points[i].X, ztpolygon.Points[i].Y));
            }
            return polygon;
@@ -841,6 +976,127 @@
            }
        }
        /// <summary>
        /// 创建障碍物UI
        /// </summary>
        /// <returns></returns>
        private Polygon CreatePathGuideUI(ZTTargetPolygon ztpolygon)
        {
            Polygon polygon = new Polygon();
            polygon.Tag = ztpolygon;
            polygon.MouseRightButtonUp += PathGuide_MouseRightButtonUp;
            polygon.MouseEnter += PathGuide_MouseEnter;
            polygon.MouseLeave += PathGuide_MouseLeave;
            polygon.StrokeThickness = 1;
            polygon.Stroke = new SolidColorBrush(Colors.Yellow);
            polygon.Fill = new SolidColorBrush(Colors.Yellow);
            polygon.Opacity = 0.7f;
            for (int i = 0; i < ztpolygon.Polygon.Points.Length; i++)
            {
                polygon.Points.Add(new Point(ztpolygon.Polygon.Points[i].X, ztpolygon.Polygon.Points[i].Y));
            }
            return polygon;
        }
        /// <summary>
        /// 移出路径指导区域
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PathGuide_MouseLeave(object sender, MouseEventArgs e)
        {
            this.PathGuideLayer.Children.Clear();
        }
        /// <summary>
        /// 移入路径指导区域
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PathGuide_MouseEnter(object sender, MouseEventArgs e)
        {
            Polygon c = sender as Polygon;
            if (c == null)
            {
                return;
            }
            ZTTargetPolygon ztp = default(ZTTargetPolygon);
            try
            {
                ztp = (ZTTargetPolygon)c.Tag;
            }
            catch
            {
                return;
            }
            this.PathGuideLayer.Children.Clear();
            Canvas main = new Canvas();
            main.MouseRightButtonUp += NextGate_MouseRightButtonUp;
            Canvas.SetLeft(main, ztp.Target.X);
            Canvas.SetTop(main, ztp.Target.Y);
            Rectangle rect = new Rectangle();
            Canvas.SetLeft(rect, -10);
            Canvas.SetTop(rect, -10);
            rect.Width = 20;
            rect.Height = 20;
            rect.Stroke = new SolidColorBrush(Colors.Blue);
            rect.StrokeThickness = 1;
            rect.Fill = new SolidColorBrush(Colors.Blue);
            rect.Opacity = 0.5f;
            main.Children.Add(rect);
            Ellipse elli = new Ellipse();
            Canvas.SetLeft(elli, -2);
            Canvas.SetTop(elli, -2);
            elli.Width = 4;
            elli.Height = 4;
            elli.Stroke = new SolidColorBrush(Colors.Black);
            elli.StrokeThickness = 1;
            elli.Fill = new SolidColorBrush(Colors.Black);
            main.Children.Add(elli);
            TextBlock tb = new TextBlock();
            tb.Text = ztp.Target.ToString();
            tb.FontSize = 9;
            main.Children.Add(tb);
            this.PathGuideLayer.Children.Add(main);
        }
        /// <summary>
        /// 障碍物右键删除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PathGuide_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Polygon c = sender as Polygon;
            if (c == null)
            {
                return;
            }
            ZTTargetPolygon ztp = default(ZTTargetPolygon);
            try
            {
                ztp = (ZTTargetPolygon)c.Tag;
            }
            catch
            {
                return;
            }
            if (this.housePathInfo.RemovePathGuide(ztp))
            {
                this.PathGuideShapeLayer.Children.Remove(c);
            }
        }
        /// <summary>
        /// 创建临时障碍物线UI
@@ -915,7 +1171,7 @@
            elli.StrokeThickness = 1;
            elli.Fill = new SolidColorBrush(Colors.Black);
            main.Children.Add(elli);
            return main;
        }
@@ -939,6 +1195,132 @@
            return edgeLine;
        }
        /// <summary>
        /// 创建进入下一关的门UI
        /// 外方内圆
        /// </summary>
        private Canvas CreateNextGateUI(ParametersPoint point)
        {
            Canvas main = new Canvas();
            main.Tag = point;
            main.MouseRightButtonUp += NextGate_MouseRightButtonUp;
            Canvas.SetLeft(main, point.Point.X);
            Canvas.SetTop(main, point.Point.Y);
            Rectangle rect = new Rectangle();
            Canvas.SetLeft(rect, -10);
            Canvas.SetTop(rect, -10);
            rect.Width = 20;
            rect.Height = 20;
            rect.Stroke = new SolidColorBrush(Colors.GreenYellow);
            rect.StrokeThickness = 1;
            rect.Fill = new SolidColorBrush(Colors.GreenYellow);
            rect.Opacity = 0.5f;
            main.Children.Add(rect);
            Ellipse elli = new Ellipse();
            Canvas.SetLeft(elli, -2);
            Canvas.SetTop(elli, -2);
            elli.Width = 4;
            elli.Height = 4;
            elli.Stroke = new SolidColorBrush(Colors.Black);
            elli.StrokeThickness = 1;
            elli.Fill = new SolidColorBrush(Colors.Black);
            main.Children.Add(elli);
            TextBlock tb = new TextBlock();
            tb.Text = point.Parameter.ToString();
            tb.FontSize = 9;
            main.Children.Add(tb);
            return main;
        }
        private void NextGate_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Canvas c = sender as Canvas;
            if (c == null)
            {
                return;
            }
            ParametersPoint fp = default(ParametersPoint);
            try
            {
                fp = (ParametersPoint)c.Tag;
            }
            catch
            {
                return;
            }
            if (this.housePathInfo.RemoveNextGate(fp))
            {
                this.HouseInfoLayer.Children.Remove(c);
            }
        }
        /// <summary>
        /// 创建循环点界面
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        private Canvas CreateLoopPointUI(ZTPoint point)
        {
            Canvas main = new Canvas();
            main.Tag = point;
            main.MouseRightButtonUp += LoopPoint_MouseRightButtonUp;
            Canvas.SetLeft(main, point.X);
            Canvas.SetTop(main, point.Y);
            Rectangle rect = new Rectangle();
            Canvas.SetLeft(rect, -10);
            Canvas.SetTop(rect, -10);
            rect.Width = 20;
            rect.Height = 20;
            rect.Stroke = new SolidColorBrush(Colors.OrangeRed);
            rect.StrokeThickness = 1;
            rect.Fill = new SolidColorBrush(Colors.OrangeRed);
            rect.Opacity = 0.5f;
            main.Children.Add(rect);
            Ellipse elli = new Ellipse();
            Canvas.SetLeft(elli, -2);
            Canvas.SetTop(elli, -2);
            elli.Width = 4;
            elli.Height = 4;
            elli.Stroke = new SolidColorBrush(Colors.Black);
            elli.StrokeThickness = 1;
            elli.Fill = new SolidColorBrush(Colors.Black);
            main.Children.Add(elli);
            return main;
        }
        private void LoopPoint_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Canvas c = sender as Canvas;
            if (c == null)
            {
                return;
            }
            ZTPoint fp = default(ZTPoint);
            try
            {
                fp = (ZTPoint)c.Tag;
            }
            catch
            {
                return;
            }
            this.housePathInfo.LoopPoint = ZTPoint.Empty;
            this.HouseInfoLayer.Children.Remove(c);
        }
        #endregion
@@ -968,7 +1350,7 @@
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        private bool IsFirstPoint(Point point)
        private bool IsComplete(Point point)
        {
            Point temp = this.points[0];
            if (Math.Abs(temp.X - point.X) <= 10 && Math.Abs(temp.Y - point.Y) <= 10)
@@ -1004,10 +1386,14 @@
            Obstacle = 0,//障碍物
            LocationPoint,//定位点
            FindPathPoint,//寻路点
            LoopLine,//循环线
            FindPathLine,//寻路线
            LoopPoint,//循环点
            NextGate,//入门点
            PathGuide,//路径引导
            ReadCoordinate,//读取坐标
            StartEndPoint,//测试起终点
        }
    }
}