using MaterialDesignThemes.Wpf;
using MetroGauges.General;
using MetroGauges.Model;
using MetroGauges.ViewModel;
using Microsoft.Win32;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Xml.Linq;
namespace MetroGauges
{
///
/// Curve_of_equipment_gauge.xaml 的交互逻辑
///
public partial class WpfCurEqui
{
DgViewModel vm;
CurEquiModel curequi;
private bool isCollasped;
private bool IsCal=false;
public WpfCurEqui()
{
curequi = new CurEquiModel();
vm = new DgViewModel();
InitializeComponent();
L.Text = "22.1";
a.Text = "15.7";
v.Text = "65";
hac.Text = "100";
}
#region 窗体
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//dataGrid.ItemsSource = vm.Item;
dataGrid.DataContext = vm;
}
private void WindowMinimize_Click(object sender, RoutedEventArgs e)
{
this.WindowState = WindowState.Minimized;
}
private void WindowClose_Click(object sender, RoutedEventArgs e)
{
Hide();
}
private void Zone_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
DragMove();
}
private void BtnPalette_Click(object sender, RoutedEventArgs e)
{
WpfPalette colorset = new WpfPalette();
colorset.ShowDialog();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
dataGrid.Width = this.ActualWidth - 20;
if (isCollasped)
{
dataGrid.Height = this.ActualHeight - 129;
}
else
{
dataGrid.Height = this.ActualHeight - 253;
}
}
#endregion
#region 参数设置
private void CbbCx_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (CbbCx.SelectedIndex)
{
case 0:
CurEquiModel.nMetro = NMetro.A;
break;
case 1:
CurEquiModel.nMetro = NMetro.B;
break;
default:
break;
}
IsCal = false;
}
private void CbbDc_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (CbbCx.SelectedIndex)
{
case 0:
CurEquiModel.c_Bal = Ballast.Monolithic;
break;
case 1:
CurEquiModel.c_Bal = Ballast.Gravel;
break;
default:
break;
}
IsCal = false;
}
private void CbbFx_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (CbbFx.SelectedIndex)
{
case 0:
CurEquiModel.dir = HorizonDirection.Left;
break;
case 1:
CurEquiModel.dir = HorizonDirection.Right;
break;
default:
break;
}
IsCal = false;
}
private void CbbVc_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (CbbVc.SelectedIndex)
{
case 0:
CurEquiModel.vc = Vertical.Convex;
break;
case 1:
CurEquiModel.vc = Vertical.Concave;
break;
default:
break;
}
IsCal = false;
}
//private void RbCx_Checked(object sender, RoutedEventArgs e)
//{
// RadioButton rb = sender as RadioButton;
// if (rb == null)
// {
// return;
// }
// CurEquiModel.nMetro = rb == rbA ? NMetro.A : NMetro.B;
//}
//private void RbDc_Checked(object sender, RoutedEventArgs e)
//{
// if (!(sender is RadioButton rb))
// {
// return;
// }
// CurEquiModel.c_bal = rb == rbZt ? Ballast.Monolithic : Ballast.Gravel;
//}
//private void RbFx_Checked(object sender, RoutedEventArgs e)
//{
// if (!(sender is RadioButton rb))
// {
// return;
// }
// CurEquiModel.dir = rb == rbZz ? HorizonDirection.Left : HorizonDirection.Right;
//}
#endregion
#region 表格操作
private void BtnDeleteRow_Click(object sender, RoutedEventArgs e)
{
if (dataGrid.SelectedItem != null)
{
vm.Items.RemoveAt(dataGrid.SelectedIndex);
}
IsCal = false;
}
private void BtnForwardRow_Click(object sender, RoutedEventArgs e)
{
CurEquiModel selecteditem = (CurEquiModel)dataGrid.SelectedItem;
var index = dataGrid.SelectedIndex;
if (index > 0)
{
vm.Items.RemoveAt(index);
vm.Items.Insert(index - 1, selecteditem);
dataGrid.SelectedIndex = index - 1;
}
IsCal = false;
}
private void BtnBackwardRow_Click(object sender, RoutedEventArgs e)
{
CurEquiModel selecteditem = (CurEquiModel)dataGrid.SelectedItem;
var index = dataGrid.SelectedIndex;
if (index < vm.Items.Count - 1 && index != -1)
{
vm.Items.RemoveAt(index);
vm.Items.Insert(index + 1, selecteditem);
dataGrid.SelectedIndex = index + 1;
}
IsCal = false;
}
private void BtnAddRowAfter_Click(object sender, RoutedEventArgs e)
{
if (dataGrid.SelectedItem != null)
{
vm.Items.Insert(dataGrid.SelectedIndex + 1, new CurEquiModel());
}
IsCal = false;
}
private void BtnAddRowBefore_Click(object sender, RoutedEventArgs e)
{
if (dataGrid.SelectedItem != null)
{
vm.Items.Insert(dataGrid.SelectedIndex, new CurEquiModel());
}
IsCal = false;
}
private void BtnAddRowLast_Click(object sender, RoutedEventArgs e)
{
vm.Items.Add(new CurEquiModel()); IsCal = false;
}
#endregion
#region 工具栏
private void BtnOpen_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog
{
Filter = "XML文件(*.xml)|*.xml",
Title = "打开文件",
RestoreDirectory = true
};
if (ofd.ShowDialog() == true && ofd.CheckFileExists == true)
{
//完整路径
string file = ofd.FileName;
vm.Items.Clear();
XDocument document = XDocument.Load(file);
XElement root = document.Root;
if (root.FirstAttribute.Value == "直线设备限界点")
{
//获取根元素下的所有子元素
IEnumerable enumerable = root.Elements();
foreach (var xe in enumerable)
{
CurEquiModel data = new CurEquiModel();
data.StrPosition = xe.Name.LocalName;
data.Name = (string)xe.Attribute("点号");
data.X = (double)xe.Attribute("X");
data.Y = (double)xe.Attribute("Y");
vm.Items.Add(data);
}
}
}
}
private void RbHeightValve_Checked(object sender, RoutedEventArgs e)
{
}
private void BtnCheck_Click(object sender, RoutedEventArgs e)
{
}
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "文本文件(*.xml)|*.xml";
sfd.FileName = "直线设备限界数据(已定义点位)";
sfd.DefaultExt = "xml";
sfd.AddExtension = true;
if (sfd.ShowDialog() == true)
{
XDocument document = new XDocument();
XElement root = new XElement("控制点坐标");
root.SetAttributeValue("车型", CurEquiModel.nMetro.GetDescription());
root.SetAttributeValue("控制点类型", "直线设备限界点");
for (int i = 0; i < vm.Items.Count; i++)
{
var dm = vm.Items[i];
XElement childXml = new XElement(dm.Position.GetDescription());
childXml.SetAttributeValue("点号", dm.Name);
childXml.SetAttributeValue("X", dm.X);
childXml.SetAttributeValue("Y", dm.Y);
root.Add(childXml);
}
root.Save(sfd.FileName);
}
}
private void BtnSaveGauges_Click(object sender, RoutedEventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "文本文件(*.xml)|*.xml";
sfd.FileName = "曲线设备限界数据";
sfd.DefaultExt = "xml";
sfd.AddExtension = true;
if (sfd.ShowDialog() == true)
{
XDocument document = new XDocument();
XElement root = new XElement("控制点坐标");
root.SetAttributeValue("车型", CurEquiModel.nMetro.GetDescription());
root.SetAttributeValue("控制点类型", "曲线设备限界点");
for (int i = 0; i < vm.Items.Count; i++)
{
var dm = vm.Items[i];
XElement childXml = new XElement(dm.Position.GetDescription());
childXml.SetAttributeValue("点号", dm.Name);
childXml.SetAttributeValue("X", dm.Xr);
childXml.SetAttributeValue("Y", dm.Yr);
root.Add(childXml);
}
root.Save(sfd.FileName);
}
}
private void BtnExcel_Click(object sender, RoutedEventArgs e)
{
if (vm.Items != null)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Excel 工作簿(*.xlsx)|*.xlsx|Excel 97-2003 工作簿(*.xls)|*.xls";
sfd.FileName = "曲线段设备限界";
//默认保存格式
sfd.DefaultExt = "xml";
//自动添加扩展名
sfd.AddExtension = true;
if (sfd.ShowDialog() == true)
{
IWorkbook workbook;
string fileExt = System.IO.Path.GetExtension(sfd.FileName).ToLower();
if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; }
if (workbook == null) { return; }
//ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("车辆限界计算表") : workbook.CreateSheet(dt.TableName);
ISheet sheet = workbook.CreateSheet("曲线段设备限界数据表");
List CommentList = new List();
CommentList.Add("控制点所在位置");
CommentList.Add("点号");
CommentList.Add("横坐标");
CommentList.Add("纵坐标");
CommentList.Add("直线设备限界横坐标");
CommentList.Add("直线设备限界纵坐标");
CommentList.Add("总横向偏移量");
CommentList.Add("总竖向偏移量");
ICellStyle style = workbook.CreateCellStyle();
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
//表头
IRow r0 = sheet.CreateRow(0);
IDrawing draw = sheet.CreateDrawingPatriarch();
ICreationHelper help = workbook.GetCreationHelper();
for (int i = 0; i < dataGrid.Columns.Count; i++)
{
IComment com = draw.CreateCellComment(draw.CreateAnchor(0, 0, 0, 0, 0, 3, 3, 4));
//IRichTextString str;
com.String = help.CreateRichTextString(CommentList[i]);
ICell cell = r0.CreateCell(i);
cell.SetCellValue(dataGrid.Columns[i].Header.ToString());
cell.CellComment = com;
cell.CellStyle = style;
}
for (int i = 0; i < vm.Items.Count; i++)
{
dataGrid.ScrollIntoView(dataGrid.Items[i]);
dataGrid.UpdateLayout();
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < dataGrid.Columns.Count; j++)
{
ICell cell = row.CreateCell(j);
FrameworkElement cellvalue = dataGrid.Columns[j].GetCellContent(dataGrid.Items[i]);
if (j == 0)
{
cell.SetCellValue((cellvalue as ComboBox).Text);
}
else
{
cell.SetCellValue((cellvalue as TextBlock).Text);
}
cell.CellStyle = style;
sheet.AutoSizeColumn(j);
}
}
dataGrid.ScrollIntoView(dataGrid.Items[0]);
dataGrid.UpdateLayout();
//转为字节数组
MemoryStream stream = new MemoryStream();
workbook.Write(stream);
var buf = stream.ToArray();
//保存为Excel文件
using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create, FileAccess.Write))
{
fs.Write(buf, 0, buf.Length);
fs.Flush();
}
}
}
}
private void BtnPreview_Click(object sender, RoutedEventArgs e)
{
if (!IsCal)
{
MessageBox.Show("请先进行限界计算", "提示");
return;
}
WpfPreview pre = new WpfPreview(vm);
pre.ShowDialog();
}
private void BtnFCAD_Click(object sender, RoutedEventArgs e)
{
if (!IsCal)
{
MessageBox.Show("请先进行限界计算", "提示" );
return;
}
ObservableCollection othCoordPoints = new ObservableCollection();
ObservableCollection pgCoordPoints = new ObservableCollection();
ObservableCollection dm = vm.Items;
for (int i = 0; i < dm.Count; i++)
{
if (dm[i].Position == PositionI.Pantograph)
{
pgCoordPoints.Add(dm[i]);
}
else
{
othCoordPoints.Add(dm[i]);
}
}
if (pgCoordPoints.Count == 0 || othCoordPoints.Count == 0)
{
ParaSetBar.MessageQueue.Enqueue("数据不全");
return;
}
CadHelper cadHelper = new CadHelper();
cadHelper.AddLayer("曲线设备限界", CadHelper.CYAN);
DrawInitCAD(cadHelper, true, pgCoordPoints);
DrawInitCAD(cadHelper, false, pgCoordPoints);
DrawInitCAD(cadHelper, true, othCoordPoints);
DrawInitCAD(cadHelper, false, othCoordPoints);
cadHelper.ZoomAll();
}
private void BtnBCAD_Click(object sender, RoutedEventArgs e)
{
//for (int i = 0; i < dtAll.Rows.Count; i++)
//{
// double x = (double)dtAll.Rows[i][1];
// double y = (double)dtAll.Rows[i][2];
// DataRow dr;
// dr = dtTransR.NewRow();
// dr[0] = dtAll.Rows[i][0];
// dr[1] = Math.Round(x * Math.Cos(CG.α()) - y * Math.Sin(CG.α()), 1, MidpointRounding.AwayFromZero);
// dr[2] = Math.Round(y * Math.Cos(CG.α()) + x * Math.Sin(CG.α()), 1, MidpointRounding.AwayFromZero);
// dtTransR.Rows.Add(dr);
// //dataGrid1.DataContext = dtTransR;
//}
//for (int i = 0; i < dtAll.Rows.Count; i++)
//{
// double x = (double)dtAll.Rows[i][1];
// double y = (double)dtAll.Rows[i][2];
// DataRow dr;
// dr = dtTransL.NewRow();
// dr[0] = dtAll.Rows[i][0];
// dr[1] = Math.Round(-x * Math.Cos(CG.α()) - y * Math.Sin(CG.α()), 1, MidpointRounding.AwayFromZero);
// dr[2] = Math.Round(y * Math.Cos(CG.α()) - x * Math.Sin(CG.α()), 1, MidpointRounding.AwayFromZero);
// dtTransL.Rows.Add(dr);
//}
if (!IsCal)
{
MessageBox.Show("请先进行限界计算", "提示");
return;
}
ObservableCollection othCoordPoints = new ObservableCollection();
ObservableCollection pgCoordPoints = new ObservableCollection();
ObservableCollection dm = vm.Items;
for (int i = 0; i < dm.Count; i++)
{
if (dm[i].Position == PositionI.Pantograph)
{
pgCoordPoints.Add(dm[i]);
}
else
{
othCoordPoints.Add(dm[i]);
}
}
if (pgCoordPoints.Count == 0 || othCoordPoints.Count == 0)
{
ParaSetBar.MessageQueue.Enqueue("数据不全");
return;
}
CadHelper cadHelper = new CadHelper();
cadHelper.AddLayer("曲线设备限界", CadHelper.CYAN);
List groups = new List();
foreach (var item in pgCoordPoints)
{
var lastchar = item.Name.Substring(item.Name.Length - 1, 1);
if (!groups.Contains(lastchar))
{
groups.Add(lastchar);
}
}
List> listli = new List>();
for (int i = 0; i < groups.Count; i++)
{
List list = new List();
for (int j = 0; j < pgCoordPoints.Count; j++)
{
if (pgCoordPoints[j].Name.EndsWith(groups[i]))
{
list.Add(pgCoordPoints[j]);
}
}
var ordered = list.OrderBy(k => k.Name).ToList();
listli.Add(new ObservableCollection(ordered));
}
foreach (var item in listli)
{
DrawInitCAD(cadHelper, true, item);
DrawInitCAD(cadHelper, false, item);
}
DrawInitCAD(cadHelper, true, othCoordPoints);
DrawInitCAD(cadHelper, false, othCoordPoints);
cadHelper.ZoomAll();
}
private void BtnTrans_Click(object sender, RoutedEventArgs e)
{
}
private void DrawInitCAD(CadHelper cadHelper, bool isRight, ObservableCollection models)
{
double[] PtSt = new double[2];
double[] PtEn = new double[2];
string Corder = models[0].Name;
PtSt[0] = -models[0].Xr; PtSt[1] = models[0].Yr;
if (isRight)
{
PtSt[0] = models[0].Xr;
}
for (int i = 1; i < models.Count; i++)
{
PtEn[0] = -models[i].Xr; PtEn[1] = models[i].Yr;
if (isRight)
{
PtEn[0] = models[i].Xr;
cadHelper.DrawText(Corder + "(" + PtSt[0] + "," + PtSt[1] + ")", PtSt);
}
cadHelper.DrawLine(PtSt, PtEn);
PtSt[0] = PtEn[0]; PtSt[1] = PtEn[1];
Corder = models[i].Name;
if (models.Count - 1 == i && isRight)
{
cadHelper.DrawText(Corder + "(" + PtSt[0] + "," + PtSt[1] + ")", PtEn);
}
}
}
private void TbPara_Click(object sender, RoutedEventArgs e)
{
if (TbPara.IsChecked == false)
{
isCollasped = true;
StackPara.Visibility = Visibility.Collapsed;
dataGrid.Height = this.ActualHeight - 129;
}
else
{
isCollasped = false;
StackPara.Visibility = Visibility.Visible;
dataGrid.Height = this.ActualHeight - 253;
}
}
#endregion
private void Btnclear_Click(object sender, RoutedEventArgs e)
{
vm.Items.Clear();
IsCal=false;
}
private void AddPoints(DataTable dt, XElement root, string child)
{
XElement childXml = new XElement(child);
for (int i = 0; i < dt.Rows.Count; i++)
{
XElement point = new XElement("坐标点");
//设置点节点的属性
point.SetAttributeValue("点号", dt.Rows[i][0].ToString());
point.SetAttributeValue("X", dt.Rows[i][1].ToString());
point.SetAttributeValue("Y", dt.Rows[i][2].ToString());
//将点的节点添加到上级节点中
childXml.Add(point);
}
//将位置的节点添加到根节点
root.Add(childXml);
}
//车体偏移量
private void Add2CarDtPyl(double x, double y, DataRow dr1)
{
//dr1[0] = kineModel.T_a;
//dr1[1] = kineModel.T_i;
//dr1[2] = Cal.ΔX_Qa(y);
//dr1[3] = Cal.ΔX_Qi(y);
//dr1[4] = Cal.ΔY_Qa(x);
//dr1[5] = Cal.ΔY_Qi(x);
//dr1[6] = Cal.ΔX_ca();
//dr1[7] = Cal.ΔX_ci();
//dr1[8] = Cal.ΔX(y);
//dr1[9] = Cal.ΔY(x);
//dtPyl.Rows.Add(dr1);
}
//转向架偏移量
private void Add2BogieDtPyl(double x, double y, DataRow dr1)
{
//dr1[0] = kineModel.T_ba;
//dr1[1] = kineModel.T_bi;
//dr1[2] = Cal.ΔX_Qa(y);
//dr1[3] = Cal.ΔX_Qi(y);
//dr1[4] = Cal.ΔY_Qa(x);
//dr1[5] = Cal.ΔY_Qi(x);
//dr1[6] = Cal.ΔX_cat();
//dr1[7] = Cal.ΔX_cit();
//dr1[8] = Cal.ΔX1(y);
//dr1[9] = Cal.ΔY(x);
//dtPyl.Rows.Add(dr1);
}
private void BtnCalc_Click(object sender, RoutedEventArgs e)
{
//if (L.Text == "" || a.Text == "" || R.Text == ""|| v.Text == "" || hac.Text == "")
//{
// //ParaSetBar.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Center;
// ParaSetBar.MessageQueue.Enqueue("请先设置参数");
// return;
//}
//for (int i = 0; i < vm.Items.Count; i++)
//{
// CurEquiModel model = vm.Items[i];
// switch (model.Position)
// {
// case PositionI.Pantograph:
// break;
// case PositionI.Body:
// break;
// case PositionI.BogieFrame:
// break;
// case PositionI.Unsprung:
// break;
// case PositionI.Tread:
// break;
// case PositionI.Rim:
// break;
// case PositionI.Collector:
// break;
// default:
// break;
// }
//}
IsCal = true;
foreach (ColorZone cz in CbbWrap.Children)
{
if (cz == null)
{
return;
}
ComboBox c = (ComboBox)cz.Content;
if (c != null)
{
if (c.SelectedIndex == -1)
{
ParaSetBar.MessageQueue.Enqueue("请先选择参数");
return;
}
}
}
foreach (ColorZone cz in TbWrap.Children)
{
StackPanel s = (StackPanel)cz.Content;
foreach (var c in s.Children)
{
if (c is TextBox)
{
TextBox t = (TextBox)c;
if (t.Text == "")
{
ParaSetBar.MessageQueue.Enqueue("请先输入参数");
t.Focus();
}
}
}
}
for (int i = 0; i < vm.Items.Count; i++)
{
CurEquiModel model = vm.Items[i];
switch (model.Position)
{
case PositionI.Body:
model.ΔXr = model.ΔX;
model.ΔYr = model.ΔY_jg;
break;
case PositionI.BogieFrame:
model.ΔXr = model.ΔX_t;
model.ΔYr = 0;
break;
case PositionI.INVAIL:
break;
}
}
dataGrid.CommitEdit();
dataGrid.Items.Refresh();
}
//private async void DialogsBeforeExit(string filename)
//{
//MessageDialogResult result = await this.ShowMessageAsync(this.Title, "是否打开文件", MessageDialogStyle.AffirmativeAndNegative);
//if (result == MessageDialogResult.Negative)
//{
// return;
//}
//else
//{
// Process.Start(filename);
//}
//}
}
}