private void drawViewScroll_PreviewKeyDown(object sender, KeyEventArgs e) { //V+F【重置视图】 if (MapOperate.Userkey.Key == Key.V && e.Key == Key.F) { RestView(); } else //Delete【删除】 if (e.Key == Key.Delete) { //编辑单个 if (MapOperate.NowMode == MapOperate.EnumMode.EditElement) { //是否有选中的 if (MapOperate.NowSelectIndex != -1) { switch (MapOperate.NowType) { case MapOperate.EnumElementType.None: break; //选中了RFID case MapOperate.EnumElementType.RFID: MapFunction.RemoveRFID(MapElement.MapObject.RFIDS[MapOperate.NowSelectIndex]); MapOperate.NowSelectIndex = -1; //记录当前状态 MapOperate.History.AddRecord("删除了一个RFID"); break; case MapOperate.EnumElementType.RouteLine: MapFunction.RemoveRouteLine(MapElement.MapObject.Lines[MapOperate.NowSelectIndex]); MapOperate.NowSelectIndex = -1; //记录当前状态 MapOperate.History.AddRecord("删除了一条直线"); break; case MapOperate.EnumElementType.RouteForkLine: MapFunction.RemoveForkLine(MapElement.MapObject.ForkLines[MapOperate.NowSelectIndex]); MapOperate.NowSelectIndex = -1; //记录当前状态 MapOperate.History.AddRecord("删除了一条分叉线"); break; default: break; } } } else //编辑多个 if (MapOperate.NowMode == MapOperate.EnumMode.MultiEdit) { //删除已选中所有元素 //RFID foreach (var item in MapOperate.MultiSelected.RFIDS) { MapFunction.RemoveRFID(item); } //Line foreach (var item in MapOperate.MultiSelected.Lines) { MapFunction.RemoveRouteLine(item); } //ForkLine foreach (var item in MapOperate.MultiSelected.ForkLines) { MapFunction.RemoveForkLine(item); } //清除已选中 MapFunction.ClearAllSelect(MapOperate.MultiSelected); //记录当前状态 MapOperate.History.AddRecord("批量删除"); } } else //Ctrl+C【复制】 if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.C) { //编辑单个 if (MapOperate.NowMode == MapOperate.EnumMode.EditElement) { if (MapOperate.NowSelectIndex != -1) { //清空剪切板 MapFunction.ClearClipBoard(); //将元素复制到剪贴板 switch (MapOperate.NowType) { case MapOperate.EnumElementType.None: break; case MapOperate.EnumElementType.RFID: //列化深度复制 MapElement.RFID rfid = MapFunction.IgkClone.RFID(MapElement.MapObject.RFIDS[MapOperate.NowSelectIndex]); //添加到剪切板 MapOperate.Clipboard.RFIDS.Add(rfid); break; case MapOperate.EnumElementType.RouteLine: //列化深度复制 MapElement.RouteLine routeLine = MapFunction.IgkClone.Line(MapElement.MapObject.Lines[MapOperate.NowSelectIndex]); //添加到剪切板 MapOperate.Clipboard.Lines.Add(routeLine); break; case MapOperate.EnumElementType.RouteForkLine: //列化深度复制 MapElement.RouteForkLine routeForkLine = MapFunction.IgkClone.ForkLine(MapElement.MapObject.ForkLines[MapOperate.NowSelectIndex]); //添加到剪切板 MapOperate.Clipboard.ForkLines.Add(routeForkLine); break; default: break; } } } else //编辑多个 if (MapOperate.NowMode == MapOperate.EnumMode.MultiEdit) { //将元素复制到剪贴板 MapFunction.CopyMultiSelectToClipBoard(); } } else //Ctrl+V【粘贴】 if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.V) { //清除之前的所有选中 MapFunction.ClearSelect(); MapOperate.NowSelectIndex = -1; MapFunction.ClearAllSelect(MapOperate.MultiSelected); /*----将剪切板的元素复制到对应的地图列表----------------------------*/ //RFID MapOperate.PastedObject.RFIDS.Clear(); foreach (var item in MapOperate.Clipboard.RFIDS) { //列化深度复制 MapElement.RFID rfid = MapFunction.IgkClone.RFID(item); //修改编号 rfid.Num = MapElement.MapObject.RFIDS.Last().Num + 1; //更新到文本 rfid.textBlock.Text = rfid.Num.ToString(); //添加到列表 MapElement.MapObject.RFIDS.Add(rfid); //显示 MapElement.ShowRFID(rfid); //设置为选中状态 MapFunction.SetRFIDIsSelected(rfid); //添加到粘贴过程对象 MapOperate.PastedObject.RFIDS.Add(rfid); } //Line MapOperate.PastedObject.Lines.Clear(); foreach (var item in MapOperate.Clipboard.Lines) { //列化深度复制 MapElement.RouteLine line = MapFunction.IgkClone.Line(item); //修改编号 line.Num = MapElement.MapObject.Lines.Last().Num + 1; //更新到文本 line.textBlock.Text = line.Num.ToString(); //添加到列表 MapElement.MapObject.Lines.Add(line); //显示 MapElement.ShowLine(line); //设置为选中状态 MapFunction.SetRouteLineIsSelected(line); //添加到粘贴过程对象 MapOperate.PastedObject.Lines.Add(line); } //ForkLine MapOperate.PastedObject.ForkLines.Clear(); foreach (var item in MapOperate.Clipboard.ForkLines) { //列化深度复制 MapElement.RouteForkLine forkLine = MapFunction.IgkClone.ForkLine(item); //修改编号 forkLine.Num = MapElement.MapObject.ForkLines.Last().Num + 1; //更新到文本 forkLine.textBlock.Text = forkLine.Num.ToString(); //添加到列表 MapElement.MapObject.ForkLines.Add(forkLine); //显示 MapElement.ShowForkLine(forkLine); //设置为选中状态 MapFunction.SetForkLineIsSelected(forkLine); //添加到粘贴过程对象 MapOperate.PastedObject.ForkLines.Add(forkLine); } /*----使所有对象处于光标中心【优化效果】---------------------------*/ //计算所有对象的中心 Point center = MapFunction.GetCenterPoint(MapOperate.PastedObject); //将左键的按下值设置为中心值【移动是根据左键按下的位置计算偏差】 MapOperate.mouseLeftBtnDownToMap = center; //计算左键按下移动偏差 MapOperate.mouseLeftBtnDownMoveDiff.X = MapOperate.NowPoint.X - MapOperate.mouseLeftBtnDownToMap.X; MapOperate.mouseLeftBtnDownMoveDiff.Y = MapOperate.NowPoint.Y - MapOperate.mouseLeftBtnDownToMap.Y; //初始移动【增加粘贴动态效果】 MapFunction.MoveMultiSelected(MapOperate.NowPoint, MapOperate.PastedObject); //进入粘贴模式 MapOperate.NowMode = MapOperate.EnumMode.Paste; } else //Esc【取消】 if (e.Key == Key.Escape) { //粘贴模式 if (MapOperate.NowMode == MapOperate.EnumMode.Paste) { MapFunction.CancelPaste(); //恢复默认 MapOperate.NowMode = MapOperate.EnumMode.EditElement; } } else //Ctrl+Shif+Z【重做】 if ((Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.Z) { MapOperate.History.Redo(); } else //Ctrl+Z【撤销】 if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.Z) { MapOperate.History.Undo(); } else //Ctrl+X【剪切】 if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.X) { //编辑单个 if (MapOperate.NowMode == MapOperate.EnumMode.EditElement) { if (MapOperate.NowSelectIndex != -1) { //清空剪切板 MapFunction.ClearClipBoard(); //将元素复制到剪贴板 switch (MapOperate.NowType) { case MapOperate.EnumElementType.None: break; case MapOperate.EnumElementType.RFID: //列化深度复制 MapElement.RFID rfid = MapFunction.IgkClone.RFID(MapElement.MapObject.RFIDS[MapOperate.NowSelectIndex]); //添加到剪切板 MapOperate.Clipboard.RFIDS.Add(rfid); //从地图删除 MapFunction.RemoveRFID(MapElement.MapObject.RFIDS[MapOperate.NowSelectIndex]); MapOperate.NowSelectIndex = -1; //记录当前状态 MapOperate.History.AddRecord("剪切掉了一个RFID"); break; case MapOperate.EnumElementType.RouteLine: //列化深度复制 MapElement.RouteLine routeLine = MapFunction.IgkClone.Line(MapElement.MapObject.Lines[MapOperate.NowSelectIndex]); //添加到剪切板 MapOperate.Clipboard.Lines.Add(routeLine); //从地图删除 MapFunction.RemoveRouteLine(MapElement.MapObject.Lines[MapOperate.NowSelectIndex]); MapOperate.NowSelectIndex = -1; //记录当前状态 MapOperate.History.AddRecord("剪切掉了一条直线"); break; case MapOperate.EnumElementType.RouteForkLine: //列化深度复制 MapElement.RouteForkLine routeForkLine = MapFunction.IgkClone.ForkLine(MapElement.MapObject.ForkLines[MapOperate.NowSelectIndex]); //添加到剪切板 MapOperate.Clipboard.ForkLines.Add(routeForkLine); //从地图删除 MapFunction.RemoveForkLine(MapElement.MapObject.ForkLines[MapOperate.NowSelectIndex]); MapOperate.NowSelectIndex = -1; //记录当前状态 MapOperate.History.AddRecord("剪切掉了一条分叉线"); break; default: break; } } } else //编辑多个 if (MapOperate.NowMode == MapOperate.EnumMode.MultiEdit) { //将元素复制到剪贴板 MapFunction.CopyMultiSelectToClipBoard(); //删除已选中所有元素 int num = 0; //RFID foreach (var item in MapOperate.MultiSelected.RFIDS) { MapFunction.RemoveRFID(item); num++; } //Line foreach (var item in MapOperate.MultiSelected.Lines) { MapFunction.RemoveRouteLine(item); num++; } //ForkLine foreach (var item in MapOperate.MultiSelected.ForkLines) { MapFunction.RemoveForkLine(item); num++; } //清除已选中 MapFunction.ClearAllSelect(MapOperate.MultiSelected); //记录当前状态 MapOperate.History.AddRecord(string.Format("剪切了{0}个元件", num)); } } else //Ctrl+S【保存】 if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.S) { //获取字符串地图 string str = SaveMap.Helper.ObjToJson.MapOject(MapElement.MapObject); //保存 SaveMap.Helper.SaveToFile(str, @"map.json"); } //记录当前按键 MapOperate.Userkey.Key = e.Key; MapOperate.Userkey.KeyState = KeyStates.Down; }
//鼠标移动 private void imageRobot_PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e) { //获取当前坐标 Point nowPoint = e.GetPosition(gridDraw); MapOperate.NowPoint = nowPoint; //显示当前坐标到界面 MapOperate.ViewInfo.View = new Point(Math.Round(nowPoint.X, 0), Math.Round(nowPoint.Y, 0)); //计算左键按下移动偏差 MapOperate.mouseLeftBtnDownMoveDiff.X = nowPoint.X - MapOperate.mouseLeftBtnDownToMap.X; MapOperate.mouseLeftBtnDownMoveDiff.Y = nowPoint.Y - MapOperate.mouseLeftBtnDownToMap.Y; //判断左键按下后是否发生移动 if (e.LeftButton == MouseButtonState.Pressed) { if (MapOperate.mouseLeftBtnDownToMap.X != nowPoint.X || MapOperate.mouseLeftBtnDownToMap.Y != nowPoint.Y) { //标记左键按下移动状态【是否按住左键移动过】 MapOperate.MovedAfterLeftBtn = true; } } //移动视图【如果右键按下】 if (e.RightButton == MouseButtonState.Pressed) { System.Windows.Point position = e.GetPosition(cvMap); System.Windows.Point position1 = e.GetPosition(drawViewScroll); tlt.X += (position.X - MapOperate.mouseRightBtnDownPoint.X) * MapOperate.ViewInfo.Scale; tlt.Y += (position.Y - MapOperate.mouseRightBtnDownPoint.Y) * MapOperate.ViewInfo.Scale; //更新圆点坐标,保留两位小数 MapOperate.ViewInfo.Origin = new Point(Math.Round(tlt.X, 0), Math.Round(tlt.Y, 0)); } //编辑单个元素 if (MapOperate.NowMode == MapOperate.EnumMode.EditElement) { //左键按住移动位置【调整元素位置】 if (e.LeftButton == MouseButtonState.Pressed) { //左键按下后,鼠标不移动也会进入移动事件, //导致如果点击的位置不是中心,标签会动一下, //很不美好,所以加坐标比较,没有变化就不进行移动 if (MapOperate.MovedAfterLeftBtn == false) { return; } if (MapOperate.NowSelectIndex != -1) { //移动标签 if (MapOperate.NowType == MapOperate.EnumElementType.RFID) { MapFunction.MoveRFIDTo(MapOperate.NowSelectIndex, nowPoint); } else //移动直线 if (MapOperate.NowType == MapOperate.EnumElementType.RouteLine) { switch (MapOperate.ElementEditMode) { case MapOperate.EnumElementEditMode.Start: MapFunction.MoveRouteLineStart(MapOperate.NowSelectIndex, nowPoint); break; case MapOperate.EnumElementEditMode.End: MapFunction.MoveRouteLineEnd(MapOperate.NowSelectIndex, nowPoint); break; case MapOperate.EnumElementEditMode.All: MapFunction.MoveRouteLineAll(MapOperate.NowSelectIndex, nowPoint); break; default: break; } } else //移动分叉【圆弧】 if (MapOperate.NowType == MapOperate.EnumElementType.RouteForkLine) { switch (MapOperate.ElementEditMode) { case MapOperate.EnumElementEditMode.Start: MapFunction.MoveForkLineStartForAdd(MapOperate.NowSelectIndex, nowPoint); break; case MapOperate.EnumElementEditMode.End: MapFunction.MoveForkLineEnd(MapOperate.NowSelectIndex, nowPoint); break; case MapOperate.EnumElementEditMode.All: MapFunction.MoveForkLineAll(MapOperate.NowSelectIndex, nowPoint); break; default: break; } } } } } else //多选模式 if (MapOperate.NowMode == MapOperate.EnumMode.MultiSelect) { //绘制选择框 MapOperate.DrawMultiSelectRect(nowPoint); } else //多编辑模式 if (MapOperate.NowMode == MapOperate.EnumMode.MultiEdit) { //如果按住左键,则移动对象 if (e.LeftButton == MouseButtonState.Pressed) { //移动所以选中的元素 MapFunction.MoveMultiSelected(nowPoint, MapOperate.MultiSelected); } } else //粘贴模式 if (MapOperate.NowMode == MapOperate.EnumMode.Paste) { //移动所以选中的元素 MapFunction.MoveMultiSelected(nowPoint, MapOperate.PastedObject); } else //添加新元素 if (MapOperate.NowMode == MapOperate.EnumMode.AddElement) { if (MapOperate.NowType == MapOperate.EnumElementType.RFID) { MapFunction.MoveRFIDTo(MapOperate.NowSelectIndex, nowPoint); } else if (MapOperate.NowType == MapOperate.EnumElementType.RouteLine) { if (MapOperate.AddStep == 1) { MapFunction.MoveRouteLineStartForAdd(MapOperate.NowSelectIndex, nowPoint); } else { MapFunction.MoveRouteLineEnd(MapOperate.NowSelectIndex, nowPoint); } } else if (MapOperate.NowType == MapOperate.EnumElementType.RouteForkLine) { if (MapOperate.AddStep == 1) { MapFunction.MoveForkLineStartForAdd(MapOperate.NowSelectIndex, nowPoint); } else { MapFunction.MoveForkLineEnd(MapOperate.NowSelectIndex, nowPoint); } } } }