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); //} //} } }