using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using ColorFont;
using AGV_WPF.TrafficDefine;
namespace AGV_WPF
{
///
/// TrafficManage.xaml 的交互逻辑
///
public partial class TrafficManage : Page
{
public DAL.ZSql sql1 = new DAL.ZSql();
public SolidColorBrush IsVirtualMark = Brushes.Gray;
public SolidColorBrush NotVirtualMark = Brushes.Yellow;
public SolidColorBrush TrafficColor = Brushes.Red;
public SolidColorBrush KeyMarkColor = Brushes.Green;//关键点颜色
public List pointList = new List();
public List pointLableList = new List();
public int trafficnum = -1;
public int id = -1;
public double MarkDiameter = 2;
public bool IsIDModel = true;
public bool IsIDModel_Key = true;
//可以在此类中设置限制管制区和管制区地标数
public int TRAFFIC_CONAREA_MAX = Convert.ToInt32(ConfigurationManager.AppSettings["TRAFFIC_CONAREA_MAX"]);//可以设置的最大管制区数量
public byte TRAFFIC_CONAREA_MARKNUM_MAX = Convert.ToByte(ConfigurationManager.AppSettings["TRAFFIC_CONAREA_MARKNUM_MAX"]);//管制区最大地标数量
public TrafficManage()
{
InitializeComponent();
}
///
/// 页面加载
///
///
///
private void Page_Loaded(object sender, RoutedEventArgs e)
{
IsVirtualMark = new SolidColorBrush(Properties.Settings.Default.MarkVirtualColor);
NotVirtualMark = new SolidColorBrush(Properties.Settings.Default.MarkNotColor);
TrafficColor = new SolidColorBrush(Properties.Settings.Default.TrafficColor);
KeyMarkColor = new SolidColorBrush(Properties.Settings.Default.TrafficKeyMarkColor);
MarkDiameter = Properties.Settings.Default.MarkDiameter;
MapInit(@"Image\background.png");
EVirtualMark.Fill = IsVirtualMark;
ENotVirtualMark.Fill = NotVirtualMark;
ETrafficMark.Fill = TrafficColor;
this.dataGrid1.LoadingRow += new EventHandler(this.DataGridSoftware_LoadingRow);
BindLineCombox();
BindWorkLineCombox();
LoadAllMark();
}
///
/// 加载电子地图背景图片
///
/// 电子地图图片位置
public void MapInit(string struri)
{
ImageBrush imageBrush = new ImageBrush();
imageBrush.ImageSource = new BitmapImage(new Uri(struri, UriKind.RelativeOrAbsolute));
imageBrush.Stretch = Stretch.Uniform;
imageBrush.AlignmentX = AlignmentX.Left;
canvas.Background = imageBrush;
}
///
/// 为表格加入行号
///
///
///
private void DataGridSoftware_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = e.Row.GetIndex() + 1;
}
///
/// 加载地标
///
private void LoadAllMark()
{
DAL.ZSql sql1 = new DAL.ZSql();
sql1.Open("select * from T_Mark Order by WorkLine,Mark");
//加载地图中地标
canvas.Children.Clear();
pointLableList.Clear();
pointList.Clear();
double x = 0, y = 0;
for (int i = 0; i < sql1.Rows.Count; i++)
{
x = Convert.ToDouble(sql1.Rows[i]["XPos"]);
y = Convert.ToDouble(sql1.Rows[i]["YPos"]);
Ellipse markellipse = new Ellipse();
markellipse.Height = MarkDiameter;
markellipse.Width = MarkDiameter;
markellipse.Tag = new MarkInfo() { m_id = Convert.ToInt32(sql1.Rows[i]["ID"]), m_workline = Convert.ToInt32(sql1.Rows[i]["WorkLine"]), m_mark = Convert.ToInt32(sql1.Rows[i]["Mark"]), m_x = x, m_y = y, m_isVirtual = Convert.ToBoolean(sql1.Rows[i]["VirtualMark"]) };
markellipse.ToolTip = sql1.Rows[i]["ID"].ToString() + "\r\nWorkLine:" + sql1.Rows[i]["WorkLine"].ToString() + " Mark:" + sql1.Rows[i]["Mark"];
Canvas.SetLeft(markellipse, x - MarkDiameter/2);
Canvas.SetTop(markellipse, y - MarkDiameter/2);
//设置虚拟点颜色
if (Convert.ToBoolean(sql1.Rows[i]["VirtualMark"]))
{
markellipse.Fill = IsVirtualMark;
}
else
{
markellipse.Fill = NotVirtualMark;
Label marklable = new Label();
marklable.FontSize = 7;
marklable.Foreground = Brushes.Black;
//marklable.Content = sql1.Rows[i]["ID"].ToString();//地标ID
marklable.Content = sql1.Rows[i]["Mark"].ToString(); //地标编号
marklable.Tag = new MarkInfo() { m_id = Convert.ToInt32(sql1.Rows[i]["ID"]), m_workline = Convert.ToInt32(sql1.Rows[i]["WorkLine"]), m_mark = Convert.ToInt32(sql1.Rows[i]["Mark"]), m_x = x, m_y = y, m_isVirtual = Convert.ToBoolean(sql1.Rows[i]["VirtualMark"]) };
Canvas.SetLeft(marklable, x-10);
Canvas.SetTop(marklable, y-15);
canvas.Children.Add(marklable);
pointLableList.Add(marklable);
}
canvas.Children.Add(markellipse);
pointList.Add(markellipse);
}
sql1.Close();
}
///
/// 交通管制区号绑定
///
private void BindLineCombox()
{
DAL.ZSql sql1 = new DAL.ZSql();
sql1.Open("select DISTINCT TrafficNum from T_Traffic order by TrafficNum");
cbTraffic.ItemsSource = sql1.m_table.DefaultView;
cbTraffic.DisplayMemberPath = "TrafficNum";
cbTraffic.SelectedValuePath = "TrafficNum";
sql1.Close();
}
//修改日期:2013-12-1
///
/// 生产区下拉框绑定
///
private void BindWorkLineCombox()
{
DAL.ZSql sql1 = new DAL.ZSql();
sql1.Open("Select DISTINCT WorkLine from T_Mark");
cbWorkLine.ItemsSource = sql1.m_table.DefaultView;
cbWorkLine.DisplayMemberPath = "WorkLine";
cbWorkLine.SelectedValuePath = "WorkLine";
//添加0号路线,表示所有路线都关联
DAL.ZSql sql2 = new DAL.ZSql();
sql2.Open("Select 0 as LineNum union Select DISTINCT LineNum from T_Line");
cbLineNum.ItemsSource = sql2.m_table.DefaultView;
cbLineNum.DisplayMemberPath = "LineNum";
cbLineNum.SelectedValuePath = "LineNum";
sql2.Close();
}
///
/// 表格选择不同行消息触发
///
///
///
private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataRowView selectItem = dataGrid1.SelectedItem as DataRowView;
if (selectItem != null)
{
id =Convert.ToInt16(selectItem["ID"].ToString().Trim());
cbWorkLine.Text = string.IsNullOrEmpty(selectItem["WorkLine"].ToString().Trim()) ? "0" : selectItem["WorkLine"].ToString().Trim();
cbLineNum.Text = string.IsNullOrEmpty(selectItem["LineNum"].ToString().Trim()) ? "0" : selectItem["LineNum"].ToString().Trim();
txtMark.Text = string.IsNullOrEmpty(selectItem["Mark"].ToString().Trim()) ? "0" : selectItem["Mark"].ToString().Trim();
}
else
{
cbWorkLine.Text = "";
cbLineNum.Text = "";
txtMark.Text = "";
}
}
///
/// 删除交通管制区
///
///
///
private void btnDeleteTraffic_Click(object sender, RoutedEventArgs e)
{
string trafficnum = cbTraffic.Text.ToString().Trim();
if (string.IsNullOrEmpty(trafficnum))
{
MessageBox.Show("请输要删除的交通管制区号!");
cbTraffic.Focus();
return;
}
sql1.Open("select * from T_Traffic where TrafficNum=" + trafficnum);
if (sql1.Rows.Count <= 0)
{
MessageBox.Show("不存在此交通管制区号!");
return;
}
if (MessageBox.Show("确认要删除此管制区?","警告",MessageBoxButton.YesNo,MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
sql1.Open("delete T_Traffic where TrafficNum=" + trafficnum);
int num = Convert.ToInt16(trafficnum);
DeleteTraffic(num);
MessageBox.Show("删除交通管制区号成功!");
BindLineCombox();
}
sql1.Close();
}
///
/// 删除交通管制区(新管制表)
///
///
///
private void DeleteTraffic(int trafficnum)
{
if (trafficnum<=0)
{
MessageBox.Show("请输要删除的交通管制区号!");
cbTraffic.Focus();
return;
}
sql1.Open("select * from BAS_TRAFFIC where TrafficNum=" + trafficnum);
if (sql1.Rows.Count <= 0)
{
MessageBox.Show("不存在此交通管制区号!");
return;
}
if (MessageBox.Show("确认要删除此管制区?", "警告", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
sql1.Open("delete BAS_TRAFFIC where TrafficNum=" + trafficnum);
}
sql1.Close();
}
///
/// 添加交通管制区
///
///
///
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
//获取界面数据
string strtraffic = cbTraffic.Text.ToString().Trim();
string strmark = txtMark.Text.ToString().Trim();
string strworkline = cbWorkLine.Text.ToString().Trim();
string strlinenum = cbLineNum.Text.ToString().Trim();
#region 检查验证数据的正确完整性
//验证数据是否填写完整
if (string.IsNullOrEmpty(strmark) || string.IsNullOrEmpty(strworkline) || string.IsNullOrEmpty(strtraffic) || string.IsNullOrEmpty(strlinenum))
{
MessageBox.Show("交通管制区、生产区、路线、地标都不能为空!");
return;
}
//地标卡号验证
sql1.Open("select ID from T_Mark where WorkLine=" + strworkline + " and Mark=" + strmark);
if (sql1.rowcount < 1)
{
MessageBox.Show("输入的地标不存在!");
return;
}
string strmarkid = sql1.Rows[0]["ID"].ToString();
//检查数据是否重复添加
sql1.Open("select * from T_Traffic where MarkID=@markid and TrafficNum=@trafficnum and LineNum=@linenum",
new SqlParameter[]{
new SqlParameter("markid",strmarkid),
new SqlParameter("linenum",strlinenum),
new SqlParameter("trafficnum",strtraffic)
});
if (sql1.Rows.Count > 0)
{
MessageBox.Show("对不起,已存在相同记录!");
return;
}
#endregion
#region 插入管制区与地标卡和路线之间的关系表
sql1.Open("insert into T_Traffic (TrafficNum,MarkID,LineNum) Values (@trafficnum,@markid,@linenum)",
new SqlParameter[]{
new SqlParameter("trafficnum",strtraffic),
new SqlParameter("markid",strmarkid),
new SqlParameter("linenum",strlinenum)
});
sql1.Close();
#endregion
#region 插入新管制表
DAL.ZSql sql2 = new DAL.ZSql();
sql2.Open("select * from BAS_TRAFFIC where TrafficNum="+strtraffic);
if (sql2.Rows.Count > 0)
{
;
}
else
{
try
{
string sqlstr = string.Format("insert into BAS_TRAFFIC(TrafficNum,TrafficName,MainAgv,EnterTime,IsTraffic) Values ({0},{1},{2},'{3}',{4})", strtraffic, strtraffic, 0, DateTime.Now.ToString("yyyy-MM-dd"), 0);
sql2.Open(sqlstr);
sql2.Close();
}
catch(Exception ex)
{
throw ex;
}
}
#endregion
trafficnum = Convert.ToInt32(strtraffic);
LoadDataGrid(trafficnum.ToString());
BindLineCombox();
MessageBox.Show("添加成功!");
cbTraffic.SelectedValue = strtraffic;
}
///
/// 修改交通管制区
///
///
///
private void btnModify_Click(object sender, RoutedEventArgs e)
{
if (id <= 0)
{
MessageBox.Show("请在表格中选择要修改的行!");
return;
}
string strtraffic = cbTraffic.Text.ToString().Trim();
string strlinenum = cbLineNum.Text.ToString().Trim();
string strmark = txtMark.Text.ToString().Trim();
string strworkline = cbWorkLine.Text.ToString().Trim();
#region 检查验证数据的正确完整性
//验证数据是否填写完整
if (string.IsNullOrEmpty(strmark) || string.IsNullOrEmpty(strworkline) || string.IsNullOrEmpty(strtraffic) || string.IsNullOrEmpty(strlinenum))
{
MessageBox.Show("交通管制区、生产区、路线、地标都不能为空!");
return;
}
//地标卡号验证
sql1.Open("select ID from T_Mark where WorkLine=" + strworkline + " and Mark=" + strmark);
if (sql1.rowcount < 1)
{
MessageBox.Show("输入的地标不存在!");
return;
}
string strmarkid = sql1.Rows[0]["ID"].ToString();
//检查数据是否重复添加
sql1.Open("select * from T_Traffic where MarkID=@markid and TrafficNum=@trafficnum and LineNum=@linenum",
new SqlParameter[]{
new SqlParameter("markid",strmarkid),
new SqlParameter("linenum",strlinenum),
new SqlParameter("trafficnum",strtraffic)
});
if (sql1.Rows.Count > 0)
{
MessageBox.Show("对不起,已存在相同记录!");
return;
}
#endregion
#region 更新管制区数据关联表
sql1.Open("update T_Traffic set MarkID=@markid,linenum=@linenum,Mark=@mark where ID=@id",
new SqlParameter[]{
new SqlParameter("markid",strmarkid),
new SqlParameter("linenum",strlinenum),
new SqlParameter("mark",strmark),
new SqlParameter("id",id)
});
sql1.Close();
#endregion
LoadDataGrid(trafficnum.ToString());
MessageBox.Show("修改成功!");
}
///
/// 删除管制区中点
///
///
///
private void btnDelete_Click(object sender, RoutedEventArgs e)
{
string strtraffic = cbTraffic.Text.ToString().Trim();
string strmark = txtMark.Text.ToString().Trim();
string strworkline = cbWorkLine.Text.ToString().Trim();
string strlinenum = cbLineNum.Text.ToString();
#region 检查验证数据的正确完整性
//验证数据是否填写完整
if (string.IsNullOrEmpty(strmark) || string.IsNullOrEmpty(strworkline) || string.IsNullOrEmpty(strtraffic) || string.IsNullOrEmpty(strlinenum))
{
MessageBox.Show("交通管制区、生产区、路线、地标都不能为空!");
return;
}
//地标卡号验证
sql1.Open("select ID from T_Mark where WorkLine=" + strworkline + " and Mark=" + strmark);
if (sql1.rowcount < 1)
{
MessageBox.Show("输入的地标不存在!");
return;
}
#endregion
string strmarkid = sql1.Rows[0]["ID"].ToString();
sql1.Open("delete from T_Traffic where TrafficNum=@trafficnum and MarkID=@markid and linenum=@linenum",
new SqlParameter[]{
new SqlParameter("trafficnum",strtraffic),
new SqlParameter("markid",strmarkid),
new SqlParameter("linenum",strlinenum)
});
LoadDataGrid(strtraffic);
sql1.Close();
MessageBox.Show("删除成功!");
}
///
/// 交通管制区号下拉框选择消息响应
///
///
///
private void cbTraffic_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (cbTraffic.SelectedValue != null)
{
trafficnum = Convert.ToUInt16(cbTraffic.SelectedValue.ToString().Trim());
LoadDataGrid(trafficnum.ToString());
}
}
void UpdateMark()
{
for (int i = 0; i < pointList.Count;i++ )
{
MarkInfo info = pointList[i].Tag as MarkInfo;
if (info != null)
{
pointList[i].Height = MarkDiameter;
pointList[i].Width = MarkDiameter;
Canvas.SetLeft(pointList[i], info.m_x - MarkDiameter/2);
Canvas.SetTop(pointList[i], info.m_y - MarkDiameter/2);
if (info.m_isVirtual)//虚拟点
{
pointList[i].Fill = IsVirtualMark;
}
else
{
pointList[i].Fill = NotVirtualMark;
}
}
}
for (int i = 0; i < pointLableList.Count;i++ )
{
MarkInfo info = pointLableList[i].Tag as MarkInfo;
if (info != null)
{
pointLableList[i].Foreground = Brushes.Black;
Canvas.SetLeft(pointLableList[i], info.m_x - 4);
Canvas.SetTop(pointLableList[i], info.m_y - 7);
}
}
}
///
/// 加载数据表格
///
/// 交通管制编号
private void LoadDataGrid(string paratrafficnum)
{
DAL.ZSql sql2 = new DAL.ZSql();
sql2.Open(string.Format("select A.ID,A.TrafficNum,A.MarkID,B.Mark,B.WorkLine,B.XPos,B.YPos,A.LineNum from T_Traffic A right join T_Mark B on B.ID=A.MarkID where TrafficNum={0}", paratrafficnum));
LoadAllMark();
UpdateMark();
double x, y;
for (int i = 0; i < sql2.Rows.Count; i++)
{
if (!string.IsNullOrEmpty(sql2.Rows[i]["MarkID"].ToString()) && !string.IsNullOrEmpty(sql2.Rows[i]["XPos"].ToString()) && !string.IsNullOrEmpty(sql2.Rows[i]["YPos"].ToString()))
{
x = Convert.ToDouble(sql2.Rows[i]["XPos"]);
y = Convert.ToDouble(sql2.Rows[i]["YPos"]);
int index = pointList.FindIndex(c => ((MarkInfo)c.Tag).m_id.ToString() == sql2.Rows[i]["MarkID"].ToString());
if(index != -1)
{
Ellipse markellipse = pointList[index];
markellipse.Height = MarkDiameter ;
markellipse.Width = MarkDiameter;
markellipse.Fill = TrafficColor;
markellipse.ToolTip = "MarkID:" + sql2.Rows[i]["MarkID"].ToString() + "\r\nWorkLine:" + sql2.Rows[i]["WorkLine"].ToString() + " Mark:" + sql2.Rows[i]["Mark"];
Canvas.SetLeft(markellipse, x - MarkDiameter/2);
Canvas.SetTop(markellipse, y - MarkDiameter/2);
}
int index2 = pointLableList.FindIndex(c => ((MarkInfo)c.Tag).m_id.ToString() == sql2.Rows[i]["MarkID"].ToString());
if(index2 != -1)
{
Label marklable = pointLableList[index2];
marklable.FontSize = 10;
marklable.Foreground = TrafficColor;
//marklable.Content = sql2.Rows[i]["MarkID"].ToString();//地标ID
marklable.Content = sql2.Rows[i]["Mark"].ToString(); //地标编号
Canvas.SetLeft(marklable, x - 14);
Canvas.SetTop(marklable, y -20);
}
}
}
dataGrid1.ItemsSource = sql2.m_table.DefaultView;
sql2.Close();
}
bool MapZoomInOut = false;
Point lastpoint = new Point(0, 0);
Point OffsetPoint = new Point(0, 0);
///
/// 画布中鼠标左键消息
///
///
///
private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
MapZoomInOut = true;
lastpoint.X = e.GetPosition(null).X + OffsetPoint.X;
lastpoint.Y = e.GetPosition(null).Y + OffsetPoint.Y;
this.Cursor = Cursors.Hand;
}
///
/// 鼠标移出画布消息
///
///
///
private void canvas_MouseLeave(object sender, MouseEventArgs e)
{
MapZoomInOut = false;
}
///
/// 鼠标左键弹起消息
///
///
///
private void canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (MapZoomInOut)
{
MapZoomInOut = false;
OffsetPoint = canvas.Offset;
}
}
///
/// 鼠标滚轮消息
///
///
///
private void canvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
canvas.Scale += e.Delta / 1000.0;
//最大放大十倍
if (canvas.Scale > 10)
{
canvas.Scale = 10;
}
//缩小可以小到3倍
if (canvas.Scale < 0.3)
{
canvas.Scale = 0.3;
}
}
///
/// 画布中鼠标移动消息
///
///
///
private void canvas_MouseMove(object sender, MouseEventArgs e)
{
if (MapZoomInOut)
{
Point newpoint = e.GetPosition(null);
canvas.Offset = new Point(lastpoint.X - newpoint.X, lastpoint.Y - newpoint.Y);
}
}
private void ENotVirtualMark_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ColorFont.ColorDialog fntDialog = new ColorFont.ColorDialog(NotVirtualMark, MarkDiameter);
if (fntDialog.ShowDialog() == true)
{
NotVirtualMark = fntDialog.selectedColor;
MarkDiameter = fntDialog.selectedSize;
ENotVirtualMark.Fill = fntDialog.selectedColor;
LoadAllMark();
}
}
///
/// 虚拟点颜色设置
///
///
///
private void EVirtualMark_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ColorFont.ColorDialog fntDialog = new ColorFont.ColorDialog(IsVirtualMark, MarkDiameter);
if (fntDialog.ShowDialog() == true)
{
IsVirtualMark = fntDialog.selectedColor;
MarkDiameter = fntDialog.selectedSize;
EVirtualMark.Fill = fntDialog.selectedColor;
LoadAllMark();
}
}
///
/// 非虚拟点颜色设置
///
///
///
private void ETrafficMark_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ColorFont.ColorDialog fntDialog = new ColorFont.ColorDialog(TrafficColor, MarkDiameter);
if (fntDialog.ShowDialog() == true)
{
TrafficColor = fntDialog.selectedColor;
ETrafficMark.Fill = fntDialog.selectedColor;
MarkDiameter = fntDialog.selectedSize;
if (cbTraffic.SelectedValue != null)
{
trafficnum = Convert.ToUInt16(cbTraffic.SelectedValue.ToString().Trim());
LoadDataGrid(trafficnum.ToString());
}
}
}
///
/// 页面卸载消息
///
///
///
private void Page_Unloaded(object sender, RoutedEventArgs e)
{
Properties.Settings.Default.MarkVirtualColor = IsVirtualMark.Color;
Properties.Settings.Default.MarkNotColor = NotVirtualMark.Color;
Properties.Settings.Default.MarkDiameter = MarkDiameter;
Properties.Settings.Default.TrafficColor = TrafficColor.Color;
Properties.Settings.Default.TrafficKeyMarkColor = KeyMarkColor.Color;
Properties.Settings.Default.Save();
if (MessageBox.Show("是否更新管制区数据?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Information) == MessageBoxResult.Yes)
TrafficManager.Traffic.InitTrafficAreas();
}
}
}