From f25f89101a98ad815c0ae2d25e1a8dc35d53a5dd Mon Sep 17 00:00:00 2001
From: asmrobot <asmrobot@hotmail.com>
Date: Tue, 29 Oct 2019 13:55:37 +0000
Subject: [PATCH] format state machine
---
src/RichCreator.Editor/Tools/MapEditor.xaml.cs | 444 +++++++++++++++++++++++++++++++++++++------------------
1 files changed, 299 insertions(+), 145 deletions(-)
diff --git a/src/RichCreator.Editor/Tools/MapEditor.xaml.cs b/src/RichCreator.Editor/Tools/MapEditor.xaml.cs
index 71374fd..8277eb4 100644
--- a/src/RichCreator.Editor/Tools/MapEditor.xaml.cs
+++ b/src/RichCreator.Editor/Tools/MapEditor.xaml.cs
@@ -29,15 +29,16 @@
InitializeComponent();
}
- // 寻路信息
- private HousePathInfo housePathInfo = null;
+ private bool isinit = false;//是否加载图片
+
+ private HousePathInfo housePathInfo = null;//房间信息
private bool moveable = false;//可移动的
- private Line tempLine = null;
- private Polyline tempPolyline = null;
+ private Line tempLine = null;//临时线
+ private Polyline tempPolyline = null;//临时障碍物
+ private System.Drawing.Image image = null;// 当前图像
+ private List<ZTPoint> startEndFindPathPoint = new List<ZTPoint>();//测试寻路起点和终点
- // 当前图像
- private System.Drawing.Image image;
-
+ #region 事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
@@ -68,7 +69,7 @@
this.image = source.Bitmap;
SetImage();
}
-
+
/// <summary>
/// 复制JSON
/// </summary>
@@ -76,8 +77,13 @@
/// <param name="e"></param>
private void CopyJSON_Click(object sender, RoutedEventArgs e)
{
+ if (!isinit)
+ {
+ return;
+ }
string json = this.housePathInfo.ToJsonString();
Clipboard.SetDataObject(json, true);
+ MessageBox.Show("copy success");
}
/// <summary>
@@ -87,43 +93,63 @@
/// <param name="e"></param>
private void CreateFromJSON_Click(object sender, RoutedEventArgs e)
{
- //SerializeInput input = new SerializeInput();
- //if (input.ShowDialog() != true)
- //{
- // return;
- //}
+ if (!isinit)
+ {
+ MessageBox.Show("请先加载图片");
+ return;
+ }
- //FindPathInfo pi = FindPathInfo.FromJsonString(input.ColorString);
+ SerializeInput input = new SerializeInput();
+ if (input.ShowDialog() != true)
+ {
+ return;
+ }
+
+ var info = ZTImage.Json.JsonParser.ToObject<HousePathInfo>(input.ColorString);
+ if (info == null)
+ {
+ return;
+ }
+
+ //依次加载,障碍物,定位点,寻路点,巡逻线,寻路线
+ //加载障碍物
+ for (int i = 0; i < info.Obstacles.Count; i++)
+ {
+ Polygon polygon=CreateObstacleUI(info.Obstacles[i]);
+ this.HouseInfoLayer.Children.Add(polygon);
+ }
+
+ //加载定位点
+ for (int i = 0; i < info.LocationPoints.Count; i++)
+ {
+ Canvas lp = CreateLocationPointUI(info.LocationPoints[i]);
+ this.HouseInfoLayer.Children.Add(lp);
+ }
+ //加载寻路点
+ for (int i = 0; i < info.FindPathPoints.Count; i++)
+ {
+ Canvas fp = CreateFindPathPointUI(info.FindPathPoints[i]);
+ this.HouseInfoLayer.Children.Add(fp);
+ }
- ////生成网格
- //this.rectWidth.Text = pi.Width.ToString();
- //this.rectHeight.Text = pi.Height.ToString();
- //GenericRect(pi.Width, pi.Height, pi.RowCount, pi.ColCount);
+ //加载巡逻线
+ 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);
+ }
+
- ////生成顶点
- //for (int i = 0; i < pi.Vertexs.Count; i++)
- //{
- // SetVertexUI(pi.Vertexs[i]);
- //}
-
- ////生成连线
- //for (int i = 0; i < pi.Edges.Count; i++)
- //{
- // GenericEdge(pi.Edges[i].StartIndex);
- // SetEdge(pi.Edges[i].EndIndex);
- //}
-
-
- //this.PositionOverflowLayer.Children.Clear();
-
- ////生成定位点
- //for (int i = 0; i < pi.Positions.Count; i++)
- //{
- // AddLocationPoint(pi.Positions[i].X, pi.Positions[i].Y, pi.Positions[i].Parameter);
- //}
+ this.housePathInfo = info;
}
/// <summary>
@@ -133,8 +159,48 @@
/// <param name="e"></param>
private void ClearPosition_Click(object sender, RoutedEventArgs e)
{
+ if (!isinit)
+ {
+ return;
+ }
this.LocationPointLayer.Children.Clear();
this.housePathInfo.ClearLocationPosiltion();
+ }
+
+
+
+ /// <summary>
+ /// 清空寻路测试点的起点和终点
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ private void ClearStartEndPoint_Click(object sender, RoutedEventArgs e)
+ {
+ if (!isinit)
+ {
+ return;
+ }
+ this.StartEndPointLayer.Children.Clear();
+ this.startEndFindPathPoint.Clear();
+ }
+
+
+ /// <summary>
+ /// 测试寻路
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ private void TestFindPath_Click(object sender, RoutedEventArgs e)
+ {
+ if (this.startEndFindPathPoint.Count < 2)
+ {
+ MessageBox.Show("请选择测试的起点和终点");
+ }
+ ZTPoint start = this.startEndFindPathPoint[0];
+ ZTPoint end = this.startEndFindPathPoint[1];
+
+ List<ZTPoint> path=this.housePathInfo.FindPath(start, end);
+ //todo:绘制路径
}
@@ -145,6 +211,10 @@
/// <param name="e"></param>
private void SourceImage_MouseDown(object sender, MouseButtonEventArgs e)
{
+ if (!isinit)
+ {
+ return;
+ }
//是否添加障碍物
OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
Int32 number = TypeConverter.StringToInt(this.tagNumber.Text, 0);
@@ -184,28 +254,33 @@
else if (op == OperateActionD.LoopLine)
{
//循环线
- ZTPoint llPoint = GetFindPathPoint(new ZTPoint((Int32)point.X,(Int32)point.Y));
- if (llPoint != ZTPoint.Empty)
+ 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)
{
//寻路线
ZTPoint fpPoint = GetFindPathPoint(new ZTPoint((Int32)point.X, (Int32)point.Y));
- if (fpPoint != ZTPoint.Empty)
+ if (!fpPoint.Equals(ZTPoint.Empty))
{
tempLine = CreateTempFindPathLineUI(fpPoint);
this.HouseInfoLayer.Children.Add(tempLine);
moveable = true;
}
}
-
-
-
+ else if (op == OperateActionD.StartEndPoint)
+ {
+ //画寻路起始和终点
+ ZTPoint sepoint = new ZTPoint((Int32)point.X, (Int32)point.Y);
+ Canvas lseControl = CreateStartEndPointUI(sepoint);
+ this.StartEndPointLayer.Children.Add(lseControl);
+ this.startEndFindPathPoint.Add(sepoint);
+ }
}
/// <summary>
@@ -215,6 +290,10 @@
/// <param name="e"></param>
private void SourceImage_MouseMove(object sender, MouseEventArgs e)
{
+ if (!isinit)
+ {
+ return;
+ }
OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
Point point = GetPosition(e);
if (op == OperateActionD.LoopLine)
@@ -248,7 +327,7 @@
tempLine.Y2 = point.Y;
}
}
-
+
/// <summary>
/// 鼠标提起
/// </summary>
@@ -256,6 +335,10 @@
/// <param name="e"></param>
private void SourceImage_MouseUp(object sender, MouseButtonEventArgs e)
{
+ if (!isinit)
+ {
+ return;
+ }
OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
Point point = GetPosition(e);
@@ -273,7 +356,7 @@
}
ZTPoint startPoint = (ZTPoint)tempLine.Tag;
ZTPoint centerPoint = GetFindPathPoint(new ZTPoint((Int32)point.X, (Int32)point.Y));
- if (centerPoint != ZTPoint.Empty)
+ if (!centerPoint.Equals(ZTPoint.Empty))
{
ZTLinePoint ll = new ZTLinePoint(startPoint, centerPoint);
if (this.housePathInfo.AddLoopLine(ll))
@@ -300,7 +383,7 @@
}
ZTPoint startPoint = (ZTPoint)tempLine.Tag;
ZTPoint centerPoint = GetFindPathPoint(new ZTPoint((Int32)point.X, (Int32)point.Y));
- if (centerPoint != ZTPoint.Empty)
+ if (!centerPoint.Equals(ZTPoint.Empty))
{
ZTLinePoint fp = new ZTLinePoint(startPoint, centerPoint);
if (this.housePathInfo.AddFindPathLine(fp))
@@ -321,7 +404,7 @@
{
//首次画
this.points.Add(point);
- this.tempPolyline=CreateTempObstacleUI(point);
+ this.tempPolyline = CreateTempObstacleUI(point);
this.tempLine = CreateObstacleLineUI(new ZTPoint((Int32)point.X, (Int32)point.Y));
moveable = true;
@@ -333,22 +416,24 @@
if (IsLastPoint(point))
{
//判断是否跟最后一个点重合,如果重合则不处理
+ //判断是否只有两个点,如果是则不处理
return;
}
- if (IsFirstPoint(point))
+ if (IsFirstPoint(point) && this.points.Count > 2)
{
- //到起点,完成,画折线,向houseinfo里添加障碍物
- Polygon polygon = CreateObstacleUI();
- this.HouseInfoLayer.Children.Add(polygon);
-
+ //到起点,完成,向houseinfo里添加障碍物 ,画折线,
ZTPoint[] obstaclePoints = 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);
}
- this.housePathInfo.AddObstacle(new ZTPolygon(obstaclePoints));
+ ZTPolygon ztpolygon = new ZTPolygon(obstaclePoints);
+ this.housePathInfo.AddObstacle(ztpolygon);
+
+ Polygon polygon = CreateObstacleUI(ztpolygon);
+ this.HouseInfoLayer.Children.Add(polygon);
this.HouseInfoLayer.Children.Remove(tempPolyline);
tempPolyline = null;
@@ -373,72 +458,7 @@
}
}
-
-
- /// <summary>
- /// 计算当前鼠标位置和颜色
- /// </summary>
- /// <param name="e"></param>
- /// <param name="point"></param>
- /// <param name="color"></param>
- /// <returns></returns>
- private Point GetPosition(MouseEventArgs e)
- {
- Point point = e.GetPosition(this.scrollViewer);
-
- Int32 x = (Int32)Math.Round(this.scrollViewer.HorizontalOffset + point.X);
- Int32 y = (Int32)Math.Round(this.scrollViewer.VerticalOffset + point.Y);
-
- return new Point(x, y);
- }
-
-
- private List<Point> points = new List<Point>();
- /// <summary>
- /// 是否第一个点
- /// </summary>
- /// <param name="point"></param>
- /// <returns></returns>
- private bool IsFirstPoint(Point point)
- {
- Point temp =this.points[0];
- if (Math.Abs(temp.X - point.X) <= 10 && Math.Abs(temp.Y - point.Y) <= 10)
- {
- return true;
- }
-
- return false;
- }
-
- /// <summary>
- /// 是否最后一个点
- /// </summary>
- /// <param name="point"></param>
- /// <returns></returns>
- private bool IsLastPoint(Point point)
- {
- Point temp = this.points[this.points.Count-1];
- if (Math.Abs(temp.X - point.X) <= 10 && Math.Abs(temp.Y - point.Y) <= 10)
- {
- return true;
- }
-
- return false;
- }
-
-
- /// <summary>
- /// 操作类型
- /// </summary>
- public enum OperateActionD
- {
- Obstacle = 0,//障碍物
- LocationPoint,//定位点
- FindPathPoint,//寻路点
- LoopLine,//循环线
- FindPathLine,//寻路线
- }
-
+ #endregion
#region createUI
@@ -453,7 +473,12 @@
this.SourceImage.Source = t;
mainContainer.Width = image.Width;
mainContainer.Height = image.Height;
- this.housePathInfo = new HousePathInfo();
+ this.housePathInfo = new HousePathInfo(image.Width, image.Height);
+ System.Threading.ThreadPool.QueueUserWorkItem((obj) =>
+ {
+ System.Threading.Thread.Sleep(1000);
+ isinit = true;
+ });
}
@@ -470,9 +495,9 @@
Canvas main = new Canvas();
main.Tag = point;
- Canvas.SetLeft(main,point.Point.X);
+ Canvas.SetLeft(main, point.Point.X);
Canvas.SetTop(main, point.Point.Y);
-
+
Rectangle rect = new Rectangle();
Canvas.SetLeft(rect, -10);
Canvas.SetTop(rect, -10);
@@ -483,7 +508,7 @@
rect.Fill = new SolidColorBrush(Colors.Red);
rect.Opacity = 0.5f;
main.Children.Add(rect);
-
+
Ellipse elli = new Ellipse();
Canvas.SetLeft(elli, -2);
Canvas.SetTop(elli, -2);
@@ -493,7 +518,7 @@
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;
@@ -502,7 +527,7 @@
return main;
}
-
+
/// <summary>
/// 创建寻路点UI
/// </summary>
@@ -545,7 +570,7 @@
return main;
}
-
+
/// <summary>
/// 寻路点右击
/// </summary>
@@ -572,9 +597,9 @@
{
this.HouseInfoLayer.Children.Remove(c);
}
-
+
}
-
+
/// <summary>
/// 创建巡逻线UI
/// </summary>
@@ -596,7 +621,7 @@
edgeLine.StrokeEndLineCap = PenLineCap.Square;
edgeLine.StrokeStartLineCap = PenLineCap.Round;
-
+
return edgeLine;
}
@@ -650,7 +675,7 @@
edgeLine.StrokeDashCap = PenLineCap.Triangle;
edgeLine.StrokeEndLineCap = PenLineCap.Square;
edgeLine.StrokeStartLineCap = PenLineCap.Round;
-
+
return edgeLine;
}
@@ -670,8 +695,8 @@
edgeLine.X2 = linePoint.X2;
edgeLine.Y2 = linePoint.Y2;
-
-
+
+
return edgeLine;
}
@@ -720,8 +745,8 @@
edgeLine.X2 = point.X;
edgeLine.Y2 = point.Y;
-
-
+
+
return edgeLine;
}
@@ -747,22 +772,52 @@
/// 创建障碍物UI
/// </summary>
/// <returns></returns>
- private Polygon CreateObstacleUI()
+ private Polygon CreateObstacleUI(ZTPolygon ztpolygon)
{
//<!--<Polygon StrokeThickness="1" Stroke="Black" Opacity="0.5">
// <Polygon.Points>10,50 180,50 180,150 </Polygon.Points>
// </Polygon>-->
Polygon polygon = new Polygon();
+ polygon.Tag = ztpolygon;
+ polygon.MouseRightButtonUp += Polygon_MouseRightButtonUp;
polygon.StrokeThickness = 1;
polygon.Stroke = new SolidColorBrush(Colors.Black);
- polygon.Fill= new SolidColorBrush(Colors.Black);
+ polygon.Fill = new SolidColorBrush(Colors.Black);
polygon.Opacity = 0.7f;
for (int i = 0; i < this.points.Count; i++)
{
polygon.Points.Add(this.points[i]);
}
-
+
return polygon;
+ }
+
+ /// <summary>
+ /// 障碍物右键删除
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ private void Polygon_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ Polygon c = sender as Polygon;
+ if (c == null)
+ {
+ return;
+ }
+
+ ZTPolygon ztp = default(ZTPolygon);
+ try
+ {
+ ztp = (ZTPolygon)c.Tag;
+ }
+ catch
+ {
+ return;
+ }
+ if (this.housePathInfo.RemoveObstacle(ztp))
+ {
+ this.HouseInfoLayer.Children.Remove(c);
+ }
}
@@ -803,15 +858,114 @@
return temp;
}
}
- return default(ZTPoint);
+ return ZTPoint.Empty;
+ }
+
+
+ /// <summary>
+ /// 创建起始和终止寻路点
+ /// </summary>
+ /// <param name="point"></param>
+ /// <returns></returns>
+ private Canvas CreateStartEndPointUI(ZTPoint point)
+ {
+ Canvas main = new Canvas();
+ main.Tag = point;
+ 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.Green);
+ rect.StrokeThickness = 1;
+ rect.Fill = new SolidColorBrush(Colors.Green);
+ 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;
}
#endregion
-
-
-
#region Tools
- //private bool PointInRang(Point)
+
+ /// <summary>
+ /// 计算当前鼠标位置和颜色
+ /// </summary>
+ /// <param name="e"></param>
+ /// <param name="point"></param>
+ /// <param name="color"></param>
+ /// <returns></returns>
+ private Point GetPosition(MouseEventArgs e)
+ {
+ Point point = e.GetPosition(this.scrollViewer);
+
+ Int32 x = (Int32)Math.Round(this.scrollViewer.HorizontalOffset + point.X);
+ Int32 y = (Int32)Math.Round(this.scrollViewer.VerticalOffset + point.Y);
+
+ return new Point(x, y);
+ }
+
+
+ private List<Point> points = new List<Point>();
+ /// <summary>
+ /// 是否第一个点
+ /// </summary>
+ /// <param name="point"></param>
+ /// <returns></returns>
+ private bool IsFirstPoint(Point point)
+ {
+ Point temp = this.points[0];
+ if (Math.Abs(temp.X - point.X) <= 10 && Math.Abs(temp.Y - point.Y) <= 10)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// 是否最后一个点
+ /// </summary>
+ /// <param name="point"></param>
+ /// <returns></returns>
+ private bool IsLastPoint(Point point)
+ {
+ Point temp = this.points[this.points.Count - 1];
+ if (Math.Abs(temp.X - point.X) <= 10 && Math.Abs(temp.Y - point.Y) <= 10)
+ {
+ return true;
+ }
+
+ return false;
+ }
#endregion
+
+ /// <summary>
+ /// 操作类型
+ /// </summary>
+ public enum OperateActionD
+ {
+ Obstacle = 0,//障碍物
+ LocationPoint,//定位点
+ FindPathPoint,//寻路点
+ LoopLine,//循环线
+ FindPathLine,//寻路线
+ StartEndPoint,//测试起终点
+ }
+
}
}
--
Gitblit v1.9.3