using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Drawing.Drawing2D;
using SIASUN.Autopilot.View.Helper;
using SIASUN.Autopilot.BLL;
using ProjectBase.Data.BaseDAL;
using SIASUN.Autopilot.Model;
using ProjectBase.Data.Logs;
using DevExpress.Utils;
using System.Data.Common;
using SIASUN.Autopilot.GNSS;
using ProjectBase.Util;
namespace SIASUN.Autopilot.View
{
public partial class FormRoutePlan : DevExpress.XtraEditors.XtraForm
{
#region 私有变量
///
/// 画线类型
///
private DrawType type = DrawType.None; //画线类型
///
/// ///操作模式
///
private Mode mode = Mode.None; //操作模式
///
/// /在界面上画图的图元
///
private DShapeList drawingList = new DShapeList(); //在界面上画图的图元
///
/// /保存标准坐标的图元
///
private DShapeList standardList = new DShapeList(); //保存标准坐标的图元
///
/// Undo保存
///
private DShapeList drawingListUndo = new DShapeList(); //Undo保存
///
/// Undo保存
///
private DShapeList standardListUndo = new DShapeList(); //Undo保存
///
/// 下拉框选择路径的所有点
///
private List locationList = new List(); //下拉框选择路径
///
/// 自定义路径的所有点
///
private BindingList drawLocationList = new BindingList(); //自定义路径的所有点
///
/// 屏幕点
///
private List pointScreen = new List(); //屏幕点
///
/// 标准坐标
///
private List pointStandard = new List(); //标准坐标
///
/// 线的宽度
///
private const int lineWidth = 3; //线的宽度
///
/// 鼠标位置
///
private Point mousePoint = new Point(); //鼠标位置
/////
///// 图片宽度
/////
//private int ImageWidth;
/////
///// 图片高度
/////
//private int ImageHeight;
///
/// 坐标与经纬度转换对象
///
private CoordinateConversion conversion;
///
/// 行驶过程中的经纬度
///
private List pointDriving = new List();
///
/// 行驶过程中航向角度
///
private List angleDriving = new List();
///
/// 行驶过程中速度
///
private List speedDriving = new List();
/////
///// 画线类型
/////
private enum DrawType
{
Bezier,
None
}
///
/// 操作模式
///
private enum Mode
{
Drive,
Draw,
None
}
#endregion
public FormRoutePlan()
{
InitializeComponent();
}
private void FormRouteManagement_Load(object sender, EventArgs e)
{
InitControls();
//ImageWidth = global::SIASUN.Autopilot.View.Properties.Resources.地图1.Width;
//ImageHeight = global::SIASUN.Autopilot.View.Properties.Resources.地图1.Height;
MoLocationMap map = BLLFactory.Instance.FindSingle(string.Format("map_id = '{0}'", System.Configuration.ConfigurationManager.AppSettings["MapId"]));
WGS84Points point0 = new WGS84Points { x = map.LocationLon1, y = map.LocationLat1, z = 0 };
WGS84Points point1 = new WGS84Points { x = map.LocationLon2, y = map.LocationLat2, z = 0 };
PointF imagePoint0 = new PointF { X = map.LocationX1, Y = map.LocationY1 };
PointF imagePoint1 = new PointF { X = map.LocationX2, Y = map.LocationY2 };
conversion = new CoordinateConversion(imagePoint0, imagePoint1, point0, point1);
//BlGNSSPerception.Instance.Init();
BlGNSSPerception.Instance.GNSSHandler += GetDrivingInfo;
}
///
/// 初始化控件
///
private void InitControls()
{
//地图控件
this.picExControl1.SetImage(global::SIASUN.Autopilot.View.Properties.Resources.地图1, true);
this.picExControl1.DrawOriginalPathEvent += new PicExControl.DrawPath(DrawOriginalPath);
this.picExControl1.DrawDrivingPathEvent += new PicExControl.DrawPath(DrawDrivingPath);
this.picExControl1.MouseMoveTooltipEvent += new SIASUN.Autopilot.View.PicExControl.MouseMoveTooltip(picExControl1_MouseMove);
this.btn_SavePath.Enabled = false;
//this.layoutControl_DrawLine.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_DrawBezier.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Udo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Rdo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Cancel.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Ok.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Name.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Stop.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.label_PathName.Text = null;
//下拉框
this.lookUp_Path.Properties.DataSource = BLLFactory.Instance.SqlTable("SELECT rule_name FROM location_rule_info GROUP BY rule_name");
this.lookUp_Path.Properties.ValueMember = "RULE_NAME";
this.lookUp_Path.Properties.DisplayMember = "RULE_NAME";
this.lookUp_Path.Properties.NullText = null;
}
///
/// 自定义路径按钮事件
///
///
///
private void btn_DrawPath_Click(object sender, EventArgs e)
{
this.btn_DrivePath.Enabled = false;
this.btn_SavePath.Enabled = true;
//this.layoutControl_DrawLine.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.layoutControl_DrawBezier.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.layoutControl_Udo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.layoutControl_Rdo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.layoutControl_Cancel.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.layoutControl_Ok.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.layoutControl_Name.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.lookUp_Path.Enabled = false;
this.lookUp_Path.EditValue = null;
this.label_PathName.Text = null;
mode = Mode.Draw;
}
///
/// 保存路径按钮事件
///
///
///
private void btn_SavePath_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.txt_PathName.Text))
{
DevExpress.XtraEditors.XtraMessageBox.Show("请输入路径名称。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (drawLocationList.Count == 0)
{
DevExpress.XtraEditors.XtraMessageBox.Show("请至少绘制一条路径。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
bool bOK = true;
DbTransaction trans = null;
try
{
trans = BLLFactory.Instance.CreateTransaction();
foreach (MoLocationRuleInfo item in drawLocationList)
{
if (bOK)
{
item.RuleName = this.txt_PathName.Text.Trim();
bOK = BLLFactory.Instance.Insert(item,trans);
}
}
bOK = SaveDirective(bOK,drawLocationList,trans);
if (!bOK)
{
trans.Rollback();
DevExpress.XtraEditors.XtraMessageBox.Show("保存路径失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
trans.Commit();
DevExpress.XtraEditors.XtraMessageBox.Show("保存路径成功。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
//this.btn_DrawPath.Enabled = true;
//this.btn_SavePath.Enabled = false;
//this.btn_DrivePath.Enabled = true;
////this.layoutControl_DrawLine.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
//this.layoutControl_DrawBezier.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
//this.layoutControl_Udo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
//this.layoutControl_Rdo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
//this.layoutControl_Cancel.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
//this.layoutControl_Ok.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
//this.layoutControl_Name.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.lookUp_Path.Properties.DataSource = BLLFactory.Instance.SqlTable("SELECT rule_name FROM location_rule_info GROUP BY rule_name");
//this.txt_PathName.Text = null;
//this.lookUp_Path.Enabled = true;
btn_Cancel_Click_1( sender, e);
//mode = Mode.None;
//type = DrawType.None;
//drawingList.Clear();
//standardList.Clear();
//drawingListUndo.Clear();
//standardListUndo.Clear();
//drawLocationList.Clear();
this.picExControl1.Invalidate();
}
}
catch (Exception ex)
{
trans.Rollback();
DevExpress.XtraEditors.XtraMessageBox.Show("保存路径失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
LogHelper.log.Error(string.Format("插入数据库location_rule_info出现错误:{0}", ex));
}
finally
{
trans.Dispose();
}
}
///
/// 保存动作指令集
///
///
///
///
private bool SaveDirective(bool bOk , BindingList list, DbTransaction trans)
{
if (!bOk)
{
return false;
}
MoActionDirective mo = new MoActionDirective();
mo.RuleName = list[0].RuleName;
for (int i = 1; i < list.Count; i++)
{
if (bOk)
{
mo.DirectiveId = i;
if (i == 1)
{
mo.DirectiveInfo = string.Format("动作{0}:起步请加速到{1}KPH", i, list[i].LocationSpeed);
}
else
{
if (list[i].LocationSpeed > list[i-1].LocationSpeed)
{
mo.DirectiveInfo = string.Format("动作{0}:点{1}加速到{2}KPH", i,i, list[i].LocationSpeed);
}
else if (list[i].LocationSpeed < list[i - 1].LocationSpeed)
{
mo.DirectiveInfo = string.Format("动作{0}:点{1}制动至{2}KPH", i, i, list[i].LocationSpeed);
}
else if (list[i].LocationSpeed == list[i - 1].LocationSpeed)
{
mo.DirectiveInfo = string.Format("动作{0}:点{1}保持{2}KPH", i, i, list[i].LocationSpeed);
}
}
mo.DirectiveResult = 2;
bOk = BLLFactory.Instance.Insert(mo, trans);
}
}
return bOk;
}
///
/// 画直线按钮事件
///
///
///
//private void btn_DrawLine_Click(object sender, EventArgs e)
//{
// this.btn_DrawBezier.Enabled = false;
// this.btn_Udo.Enabled = false;
// this.btn_Rdo.Enabled = false;
// this.layoutControl_Draw.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
// this.picExControl1.AllawDraw = true;
// this.label_Message.Text = "请在地图上单击鼠标左键选择两个点";
//}
///
/// 画曲线按钮事件
///
///
///
private void btn_DrawBezier_Click(object sender, EventArgs e)
{
//this.btn_DrawLine.Enabled = false;
if (type == DrawType.Bezier)
{
return;
}
this.btn_Udo.Enabled = false;
this.btn_Rdo.Enabled = false;
this.layoutControl_Draw.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.picExControl1.AllawDraw = true;
this.label_Message.Text = "请在地图上单击鼠标左键选择点";
type = DrawType.Bezier;
}
///
/// 第二行取消按钮事件
///
///
///
private void btn_Cancel_Click(object sender, EventArgs e)
{
//this.btn_DrawLine.Enabled = true;
this.btn_Udo.Enabled = true;
this.btn_Rdo.Enabled = true;
this.btn_DrawBezier.Enabled = true;
this.layoutControl_Draw.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.label_Message.Text = null;
type = DrawType.None;
this.picExControl1.AllawDraw = false;
pointScreen.Clear();
pointStandard.Clear();
this.picExControl1.Invalidate();
}
///
/// 驾驶车画路径按钮事件
///
///
///
private void btn_DrivePath_Click(object sender, EventArgs e)
{
this.btn_DrawPath.Enabled = false;
this.btn_SavePath.Enabled = false;
this.lookUp_Path.Enabled = false;
this.lookUp_Path.EditValue = null;
this.label_PathName.Text = null;
this.btn_SavePath.Enabled = true;
this.layoutControl_Name.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
this.layoutControl_Stop.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
mode = Mode.Drive;
BlGNSSPerception.Instance.Init();
}
///
/// 第一行取消按钮事件
///
///
///
private void btn_Cancel_Click_1(object sender, EventArgs e)
{
if (mode == Mode.Draw) //自定义路径模式
{
this.btn_DrivePath.Enabled = true;
//this.btn_SavePath.Enabled = false;
//this.layoutControl_DrawLine.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_DrawBezier.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Udo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Rdo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Cancel.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Ok.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.layoutControl_Draw.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
//this.layoutControl_Name.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
btn_Cancel_Click(sender, e);
}
else if (mode == Mode.Drive) //驾驶车户路径模式
{
//DevExpress.XtraEditors.XtraMessageBox.Show("正在进行自定义路径操作,请取消后再操作!。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.btn_DrawPath.Enabled = true;
this.layoutControl_Stop.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
pointDriving.Clear();
angleDriving.Clear();
BlGNSSPerception.Instance.Close();
}
this.btn_SavePath.Enabled = false;
this.layoutControl_Name.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.txt_PathName.Text = null;
drawingList.Clear();
standardList.Clear();
drawingListUndo.Clear();
standardListUndo.Clear();
drawLocationList.Clear();
this.lookUp_Path.Enabled = true;
mode = Mode.None;
}
///
/// 确定按钮事件
///
///
///
private void btn_Ok_Click(object sender, EventArgs e)
{
//保存画的线
if (pointStandard.Count < 2)
{
DevExpress.XtraEditors.XtraMessageBox.Show("请最少选择两个点。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
drawingList.Add(new DCurve(pointStandard.ToArray(), Color.Red, lineWidth));
standardList.Add(new DCurve(pointStandard.ToArray(), Color.Red, lineWidth));
//刷新控件状态
//this.btn_DrawLine.Enabled = true;
this.btn_Udo.Enabled = true;
this.btn_Rdo.Enabled = true;
this.btn_DrawBezier.Enabled = true;
this.layoutControl_Draw.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
this.label_Message.Text = null;
type = DrawType.None;
pointScreen.Clear();
pointStandard.Clear();
this.picExControl1.AllawDraw = false;
this.picExControl1.Invalidate();
}
///
/// 画原始路径
///
///
private void DrawOriginalPath(Graphics g)
{
try
{
if (mode == Mode.None) //下拉框选择路径时
{
if (locationList.Count <= 0)
{
return;
}
List list = new List();
double x;
double y;
foreach (MoLocationRuleInfo item in locationList)
{
conversion.GetWGS84ToGauss(item.LocationLon, item.LocationLat,out x, out y);
list.Add(new PointF((float)(x * this.picExControl1.Wrate) + this.picExControl1.StartPoint.X, (float)(y * this.picExControl1.Hrate) + this.picExControl1.StartPoint.Y));
}
g.DrawCurve(new Pen(Color.Red, lineWidth), list.ToArray());
}
else if (mode == Mode.Draw) //自定义路径时
{
if (type == DrawType.Bezier)
{
//在地图上选点时,显示点
foreach (PointF p in pointScreen)
{
Region newRegion = new Region(new RectangleF(p, new Size(2 * 2, 2 * 2)));
g.FillRegion(new SolidBrush(Color.Red), newRegion);
}
}
//绘制自定义路径
for (int i = 0; i < drawingList.Count; i++)
{
for (int j = 0; j < drawingList[i].pointlist.Length; j++)
{
drawingList[i].pointlist[j].X = (standardList[i].pointlist[j].X * this.picExControl1.Wrate) + this.picExControl1.StartPoint.X;
drawingList[i].pointlist[j].Y = (standardList[i].pointlist[j].Y * this.picExControl1.Hrate) + this.picExControl1.StartPoint.Y;
}
drawingList[i].pointchange(drawingList[i].pointlist);
}
drawingList.DrawList(g);
RefreshGrid();
}
}
catch (Exception ex)
{
DevExpress.XtraEditors.XtraMessageBox.Show("绘制路径失败。" + ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
LogHelper.log.Error(string.Format("绘制路径失败:{0}", ex.ToString()));
}
}
///
/// 绘制线后将点显示在表格中
///
private void RefreshGrid()
{
drawLocationList.Clear();
if (mode == Mode.Draw)
{
double lon;
double lat;
for (int i = 0; i < standardList.Count; i++)
{
for (int j = 0; j < standardList[i].pointlist.Length; j++)
{
conversion.GetGaussToWGS84(standardList[i].pointlist[j].X, standardList[i].pointlist[j].Y, out lon, out lat);
MoLocationRuleInfo mo = new MoLocationRuleInfo
{
RuleName = this.txt_PathName.Text,
LocatonId = drawLocationList.Count + 1,
LocationLon = lon,
LocationLat = lat
//LocationHeight = 11,
//LocationSpeed =11
};
drawLocationList.Add(mo);
}
}
}
else if (mode == Mode.Drive)
{
for (int i = 0; i < pointDriving.Count; i++)
{
MoLocationRuleInfo mo = new MoLocationRuleInfo
{
RuleName = this.txt_PathName.Text,
LocatonId = drawLocationList.Count + 1,
LocationLon = pointDriving[i].X,
LocationLat = pointDriving[i].Y,
//LocationHeight = 11,
LocationSpeed = speedDriving[i]
};
drawLocationList.Add(mo);
}
}
this.gridControl_Path.DataSource = drawLocationList;
this.gridControl_Path.RefreshDataSource();
}
///
/// 画行驶路径
///
///
private void DrawDrivingPath(Graphics g)
{
if (mode == Mode.Drive)
{
if (pointDriving.Count < 1 || angleDriving.Count < 1)
{
return;
}
double x;
double y;
if (pointDriving.Count < 2)
{
conversion.GetWGS84ToGauss(pointDriving[0].X, pointDriving[0].Y, out x, out y);
g.TranslateTransform((float)x, (float)y);
g.RotateTransform(angleDriving[0]);
g.DrawImage(global::SIASUN.Autopilot.View.Properties.Resources.汽车2, -7, -15, 14, 30);
}
else
{
List list = new List();
for (int i = 0; i < pointDriving.Count; i++)
{
conversion.GetWGS84ToGauss(pointDriving[i].X, pointDriving[i].Y, out x, out y);
list.Add(new PointF((float)(x * this.picExControl1.Wrate) + this.picExControl1.StartPoint.X, (float)(y * this.picExControl1.Hrate) + this.picExControl1.StartPoint.Y));
}
//foreach (PointF item in pointDriving)
//{
// conversion.GetWGS84ToGauss(item.X, item.Y, out x, out y);
// list.Add(new PointF((float)(x * this.picExControl1.Wrate) + this.picExControl1.StartPoint.X, (float)(y * this.picExControl1.Hrate) + this.picExControl1.StartPoint.Y));
//}
g.DrawCurve(new Pen(Color.Red, lineWidth), list.ToArray());
g.TranslateTransform(list[list.Count-1].X, list[list.Count-1].Y);
g.RotateTransform(angleDriving[angleDriving.Count-1]);
g.DrawImage(global::SIASUN.Autopilot.View.Properties.Resources.汽车2, -7, -15, 14, 30);
}
RefreshGrid();
}
}
///
/// 获取行驶中经纬度和角度值
///
private void GetDrivingInfo(object sender, GNSSInfoEventArgs gnss)
{
pointDriving.Add(new PointF { X= (float)gnss.Nmea.gprmc.Longitude,Y = (float)gnss.Nmea.gprmc.Latitude});
angleDriving.Add((float)gnss.Nmea.gprmc.Deviated);
speedDriving.Add((float)gnss.Nmea.gprmc.Speed);
this.picExControl1.Invalidate();
}
///
/// 下拉框按钮点击事件
///
///
///
private void lookUp_Path_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
{
if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Delete)
{
LookUpEdit lookUp = sender as LookUpEdit;
lookUp.EditValue = null;
}
}
///
/// 下拉框选中项改变事件
///
///
///
private void lookUp_Path_EditValueChanged(object sender, EventArgs e)
{
try
{
if (this.lookUp_Path.EditValue == null)
{
this.label_PathName.Text = null;
locationList = new List();
}
else
{
this.label_PathName.Text = this.lookUp_Path.EditValue.ToString();
SysEnvironment.CurrentRuleName = this.label_PathName.Text.Trim();
string condition = string.Format("rule_name = '{0}'", this.lookUp_Path.EditValue.ToString());
locationList = BLLFactory.Instance.Find(condition);
}
this.gridControl_Path.DataSource = locationList;
this.gridControl_Path.RefreshDataSource();
this.picExControl1.Invalidate();
}
catch (Exception ex)
{
DevExpress.XtraEditors.XtraMessageBox.Show("获取路径失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
LogHelper.log.Error(string.Format("获取路径失败:{0}", ex.ToString()));
}
}
///
/// 地图控件鼠标点击事件
///
///
///
private void picExControl1_MouseClick(object sender, MouseEventArgs e)
{
try
{
if (e.Button == MouseButtons.Left)
{
if (type == DrawType.Bezier)
{
pointScreen.Add(new PointF(e.X, e.Y));
pointStandard.Add(new PointF((e.X - this.picExControl1.StartPoint.X) / this.picExControl1.Wrate,
(e.Y - this.picExControl1.StartPoint.Y) / this.picExControl1.Hrate));
this.label_Message.Text = string.Format("已选择{0}个点", pointScreen.Count);
}
this.picExControl1.Invalidate();
}
}
catch (Exception ex)
{
DevExpress.XtraEditors.XtraMessageBox.Show("在地图上选点失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
LogHelper.log.Error(string.Format("在地图上选点失败:{0}", ex.ToString()));
}
}
///
/// 描点结束按钮事件
///
///
///
private void btn_Draw_Click(object sender, EventArgs e)
{
try
{
using (Graphics g = this.picExControl1.CreateGraphics())
{
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
if (pointScreen.Count < 2)
{
DevExpress.XtraEditors.XtraMessageBox.Show("请最少选择两个点。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
g.DrawCurve(new Pen(Color.Red, lineWidth), pointScreen.ToArray());
}
}
catch (Exception ex)
{
DevExpress.XtraEditors.XtraMessageBox.Show("绘制路线失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
LogHelper.log.Error(string.Format("绘制路线失败:{0}", ex.ToString()));
}
}
///
/// 撤销按钮事件
///
///
///
private void btn_Udo_Click(object sender, EventArgs e)
{
if (standardList.Count == 0)
{
return;
}
drawingListUndo.Add(drawingList[drawingList.Count - 1]);
standardListUndo.Add(standardList[standardList.Count - 1]);
drawingList.RemoveAt(drawingList.Count - 1);
standardList.RemoveAt(standardList.Count - 1);
this.picExControl1.Invalidate();
}
///
/// 重做按钮事件
///
///
///
private void btn_Rdo_Click(object sender, EventArgs e)
{
if (drawingListUndo.Count == 0)
return;
drawingList.Add(drawingListUndo[drawingListUndo.Count - 1]);
standardList.Add(standardListUndo[standardListUndo.Count - 1]);
drawingListUndo.RemoveAt(drawingListUndo.Count - 1);
standardListUndo.RemoveAt(standardListUndo.Count - 1);
this.picExControl1.Invalidate();
}
///
/// /输入自定义名称后触发的事件
///
///
///
private void txt_PathName_TextChanged(object sender, EventArgs e)
{
this.label_PathName.Text = this.txt_PathName.Text;
}
///
/// 鼠标移动显示经纬度
///
///
private void picExControl1_MouseMove(MouseEventArgs e)
{
if (mousePoint.X != e.X || mousePoint.Y != e.Y)
{
ToolTipControllerShowEventArgs args = this.toolTip_Message.CreateShowArgs();
//this.toolTip_Message.SetToolTip(this.picExControl1, string.Format("横坐标:{0}\n纵坐标:{1}", e.X.ToString(), e.Y.ToString()));
//this.toolTip_Message.SetTitle(this.picExControl1,"提示");
//this.toolTip_Message.SetToolTipIconType(this.picExControl1,ToolTipIconType.Exclamation);
double lon;
double lat;
conversion.GetGaussToWGS84((e.X - this.picExControl1.StartPoint.X) / this.picExControl1.Wrate, (e.Y - this.picExControl1.StartPoint.Y) / this.picExControl1.Hrate, out lon, out lat);
args.ToolTip = string.Format("经度:{0}\n纬度:{1}", lon.ToString(), lat.ToString());
args.SelectedControl = this.picExControl1;
//args.Title = "提示";
this.toolTip_Message.ShowHint(args, System.Windows.Forms.Control.MousePosition);
mousePoint.X = e.X;
mousePoint.Y = e.Y;
}
else
{
mousePoint.X = e.X;
mousePoint.Y = e.Y;
}
}
private void picExControl1_MouseLeave(object sender, EventArgs e)
{
this.toolTip_Message.HideHint();
}
///
/// 窗口关闭事件
///
///
///
private void FormRouteManagement_FormClosing(object sender, FormClosingEventArgs e)
{
//BlGNSSPerception.Instance.Close();
}
///
/// 停止按钮事件
///
///
///
private void btn_Stop_Click(object sender, EventArgs e)
{
BlGNSSPerception.Instance.Close();
}
///
/// 放大按钮
///
///
///
private void btn_Big_Click(object sender, EventArgs e)
{
float rate = 1;
if (Math.Max(this.picExControl1.Wrate, this.picExControl1.Hrate) <= 10)
{
rate = 1.15F;
}
Zoom(rate);
}
///
/// 缩小按钮
///
///
///
private void btn_Small_Click(object sender, EventArgs e)
{
float rate = 1;
if (Math.Min(this.picExControl1.Wrate, this.picExControl1.Hrate) > Math.Max(0.75687, 0.75687))
{
rate = 0.85F;
}
Zoom(rate);
}
///
/// 地图缩放
///
///
private void Zoom(float rate)
{
if (rate == 1) return;
float imageX = (356F - this.picExControl1.StartPoint.X) / this.picExControl1.Wrate;
float imageY = (279F - this.picExControl1.StartPoint.Y) / this.picExControl1.Hrate;
this.picExControl1.Hrate *= rate;
this.picExControl1.Wrate *= rate;
this.picExControl1.StartPoint = new PointF(356F - imageX * this.picExControl1.Wrate, 279F - imageY * this.picExControl1.Hrate);
this.picExControl1.Invalidate();
}
}
}