using MaterialDesignThemes.Wpf; using MetroGauges.General; using MetroGauges.Model; using MetroGauges.ViewModel; using Microsoft.Win32; using NPOI.HSSF.UserModel; using NPOI.SS.Formula.Eval; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Xml.Linq; using System.Linq; using NPOI.SS.Formula.Functions; namespace MetroGauges { /// /// KinematicGauge.xaml 的交互逻辑 /// public partial class WpfKine { public DgViewModel vm; public static Snackbar Snackbar; WpfPalette colorset; bool isCollasped; private bool IsCal=false; public Window ParentWindow { get; set; } public WpfKine() { vm = new DgViewModel(); InitializeComponent(); this.Closed += WpfKine_Closed; } private void WpfKine_Closed(object sender, EventArgs e) { if (ParentWindow != null) { ParentWindow.Show(); } } #region 窗体 private void Window_Loaded(object sender, RoutedEventArgs e) { isCollasped = false; dataGrid.DataContext = vm; } private void WindowMinimize_Click(object sender, RoutedEventArgs e) { this.WindowState = WindowState.Minimized; } private void WindowMaximize_Click(object sender, RoutedEventArgs e) { if (WindowState == WindowState.Normal) { this.WindowState = WindowState.Maximized; } else { this.WindowState = WindowState.Normal; } } private void WindowClose_Click(object sender, RoutedEventArgs e) { //Hide(); this.Close(); } private void HeaderZone_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { DragMove(); } private void BtnPalette_Click(object sender, RoutedEventArgs e) { if (colorset == null) { colorset = new WpfPalette(); } try { colorset.ShowDialog(); } catch (Exception) { colorset = null; 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: KineModel.nMetro = NMetro.A; break; case 1: KineModel.nMetro = NMetro.B; break; default: break; } IsCal = false; } private void CbbDc_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbCx.SelectedIndex) { case 0: KineModel.m_Bal = Ballast.Monolithic; break; case 1: KineModel.m_Bal = Ballast.Gravel; break; default: break; } IsCal = false; } private void CbbCl_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbCl.SelectedIndex) { case 0: KineModel.Wheel = Physics.Inflexibility; break; case 1: KineModel.Wheel = Physics.Flexibility; break; default: break; } IsCal = false; } private void CbbGk_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbGk.SelectedIndex) { case 0: KineModel.Condition = WorkCondition.AW0; break; case 1: KineModel.Condition = WorkCondition.AW3; break; default: break; } IsCal = false; } private void CbbJcw_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbJcw.SelectedIndex) { case 0: KineModel.Catenary = Physics.Inflexibility; break; case 1: KineModel.Catenary = Physics.Flexibility; break; default: break; } IsCal = false; } private void CbbHj_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbHj.SelectedIndex) { case 0: KineModel.Env = General.Environment.Tunnel; break; case 1: KineModel.Env = General.Environment.Elevated; break; default: break; } IsCal = false; } private void CbbXx_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbXx.SelectedIndex) { case 0: KineModel.CurType = CurveType.Straight; break; case 1: KineModel.CurType = CurveType.Curve; break; default: break; } IsCal = false; } private void CbbGdf_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbGdf.SelectedIndex) { case 0: KineModel.heightValve = HeightValve.Two; break; case 1: KineModel.heightValve = HeightValve.Three; break; case 2: KineModel.heightValve = HeightValve.Four; break; default: break; } IsCal = false; } private void CbbPin_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbPin.SelectedIndex) { case 0: KineModel.pin = Pin.Inside; break; case 1: KineModel.pin = Pin.Outside; break; default: break; } IsCal = false; } private void CbbLocation_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (CbbLocation.SelectedIndex) { case 0: KineModel.location = Location.Platform; break; case 1: KineModel.location = Location.Region; break; default: break; } IsCal = false; } //private void RbCx_Checked(object sender, RoutedEventArgs e) //{ // RadioButton rb = sender as RadioButton; // if (rb == null) // { // return; // } // KineModel.nMetro = rb == rbA ? NMetro.A : NMetro.B; //} //private void RbDc_Checked(object sender, RoutedEventArgs e) //{ // if (!(sender is RadioButton rb)) // { // return; // } // KineModel.m_bal = rb == rbZt ? Ballast.Monolithic : Ballast.Gravel; //} //private void RbJcw_Checked(object sender, RoutedEventArgs e) //{ // if (!(sender is RadioButton rb)) // { // return; // } // KineModel.Catenary = rb == rbGx ? Physics.Inflexibility : Physics.Flexibility; //} //private void RbGk_Checked(object sender, RoutedEventArgs e) //{ // if (!(sender is RadioButton rb)) // { // return; // } // KineModel.Condition = rb == rbAW0 ? WorkCondition.AW0 : WorkCondition.AW3; //} //private void RbEnv_Checked(object sender, RoutedEventArgs e) //{ // if (!(sender is RadioButton rb)) // { // return; // } // KineModel.Env = rb == rbSd ? General.Environment.Tunnel : General.Environment.Elevated; //} //private void RbCurveType_Checked(object sender, RoutedEventArgs e) //{ // if (!(sender is RadioButton rb)) // { // return; // } // KineModel.CurType = rb == rbLin ? CurveType.Straight : CurveType.Curve; //} //private void RbHeightValve_Checked(object sender, RoutedEventArgs e) //{ // if (!(sender is RadioButton rb)) // { // return; // } // if (rb == rbTwo) // { // KineModel.hv = HeightValve.Two; // } // else if (rb == rbThree) // { // KineModel.hv = HeightValve.Three; // } // else // { // KineModel.hv = HeightValve.Four; // } //} //private void RbCl_Checked(object sender, RoutedEventArgs e) //{ // if (!(sender is RadioButton rb)) // { // return; // } // KineModel.Wheel = rb == rbTxl ? Physics.Flexibility : Physics.Inflexibility; //} #endregion #region 表格操作 private void BtnDeleteRow_Click(object sender, RoutedEventArgs e) { if (dataGrid.SelectedItem != null) { vm.Items.RemoveAt(dataGrid.SelectedIndex); } IsCal = false; } private void BtnMoveUpRow_Click(object sender, RoutedEventArgs e) { KineModel selecteditem = (KineModel)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 BtnMoveDownRow_Click(object sender, RoutedEventArgs e) { KineModel selecteditem = (KineModel)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) { KineModel kine = (KineModel)dataGrid.SelectedItem; vm.Items.Insert(dataGrid.SelectedIndex + 1, KineModel.Copy(kine)); } IsCal = false; } private void BtnAddRowBefore_Click(object sender, RoutedEventArgs e) { if (dataGrid.SelectedItem != null) { KineModel kine = (KineModel)dataGrid.SelectedItem; vm.Items.Insert(dataGrid.SelectedIndex, KineModel.Copy(kine)); } IsCal = false; } private void BtnAddRowLast_Click(object sender, RoutedEventArgs e) { vm.Items.Add(new KineModel()); IsCal = false; } #endregion #region 工具栏按钮 private List PositionToList() { List list = new List(); foreach (int value in Enum.GetValues(typeof(PositionI))) { //Enum.GetValues(Position); list.Add((PositionI)value); } return list; } //导入输入数据 private void BtnOpen_Click(object sender, RoutedEventArgs e) { IsCal=false; OpenFileDialog ofd = new OpenFileDialog { //文件过滤 Filter = "XML文件(*.xml)|*.xml", //对话框标题 Title = "打开文件", //存储上一次打开的目录 RestoreDirectory = true }; if (ofd.ShowDialog() == true && ofd.CheckFileExists == true) { //完整路径 string file = ofd.FileName; //Loader load = new Loader(); //XmlDataModel result = load.Load(file); //循环所有的XML中的位置节点 //DataRow dr = dtSdg.NewRow(); //foreach (var part in result.parts) //{ //} //if (doc != null) //{ // foreach (var al in result.Alignments.AlignmentList) // { // DGHorizon.DataContext = CoordGeomData(al); // pointsdt = points(CoordGeomData(al)); // formName = al.Name; // } //} //FileName:所选文件的全路径 SafeFileName:所选的文件名 //txtPath.Text = "FileName:" + ofd.FileName + "\r\n" + "SafeFileName:" + ofd.SafeFileName; vm.Items.Clear(); XDocument document = XDocument.Load(file); //获取到XML的根元素进行操作 XElement root = document.Root; if (root.FirstAttribute.Value == "车辆轮廓点") { //获取根元素下的所有子元素 IEnumerable enumerable = root.Elements(); foreach (var xe in enumerable) { //IEnumerable pts = xe.Elements(); KineModel data = new KineModel(); 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 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("车型", KineModel.nMetro.GetDescription()); root.SetAttributeValue("控制点类型", "车辆轮廓点"); //循环所有list中的DataTable for (int i = 0; i < vm.Items.Count; i++) { var dm = vm.Items[i]; XElement childXml = new XElement(dm.Position.GetDescription()); //XElement point = new XElement(dm.StrPosition); //设置点节点的属性 childXml.SetAttributeValue("点号", dm.Name); childXml.SetAttributeValue("X", dm.X); childXml.SetAttributeValue("Y", dm.Y); //将点的节点添加到上级节点中 //childXml.Add(point); //将位置的节点添加到根节点 root.Add(childXml); } root.Save(sfd.FileName); //Console.ReadKey(); //txtPath.Text = "FileName:" + sfd.FileName + "\r\n"; //using (StreamWriter sw = new StreamWriter(sfd.FileName)) //{ // sw.WriteLineAsync("今天是个好天气"); //} } } //清空所有数据 private void Btnclear_Click(object sender, RoutedEventArgs e) { vm.Items.Clear(); IsCal = false; } //限界计算 private void BtnCalc_Click(object sender, RoutedEventArgs e) { 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(); } } } } dataGrid.CommitEdit(); //for (int i = 0; i < vm.Items.Count; i++) //{ // bool isSorted = true; // for (int j = 0; j < vm.Items.Count - 1 - i; j++) // { // if (vm.Items[j+1].Y < vm.Items[j].Y) // { // isSorted = false; // var temp = vm.Items[j + 1]; // vm.Items[j + 1] = vm.Items[j]; // vm.Items[j] = temp; // } // } // if (isSorted) // break; //} KineModel maxX = new KineModel("临时点", "-1", 0, 0);//找到x最大的值,作为分界点 double temp = 0.0; for (int i = 0; i < vm.Items.Count; i++) { if (vm.Items[i].X > temp) { maxX = vm.Items[i]; temp = vm.Items[i].X; } } foreach (var item in dataGrid.Items) { var k = (KineModel)item; #region 车体 switch (k.Position) { case PositionI.Pantograph: k.ΔXr = k.ΔY_gu; k.ΔYr = k.ΔX_gu; break; case PositionI.Body: if (Math.Abs(k.ΔX_BP) > Math.Abs(k._ΔX_BP)) { k.ΔXr = k.ΔX_BP; } else { k.ΔXr = k._ΔX_BP; } if (k.Y < maxX.Y) { if (Math.Abs(k._ΔY_BPd) > Math.Abs(k.ΔY_BPd)) { k.ΔYr = -Math.Abs(k._ΔY_BPd); } else { k.ΔYr = -Math.Abs(k.ΔY_BPd); } } else { if (Math.Abs(k._ΔY_BPu) > Math.Abs(k.ΔY_BPu)) { k.ΔYr = k._ΔY_BPu; } else { k.ΔYr = k.ΔY_BPu; } } break; case PositionI.BogieFrame: if (Math.Abs(k.ΔX_t) > Math.Abs(k._ΔX_t)) { k.ΔXr = k.ΔX_t; } else { k.ΔXr = k._ΔX_t; } //if (Math.Abs(k._ΔY_td) > Math.Abs(k.ΔY_td)) //{ // k.ΔYr = -Math.Abs(k._ΔY_td); //} //else //{ // k.ΔYr = -Math.Abs(k.ΔY_td); //} if (k.Y < maxX.Y) { if (Math.Abs(k._ΔY_td) > Math.Abs(k.ΔY_td)) { k.ΔYr = -Math.Abs(k._ΔY_td); } else { k.ΔYr = -Math.Abs(k.ΔY_td); } } else { if (Math.Abs(k._ΔY_tu) > Math.Abs(k.ΔY_tu)) { k.ΔYr = k._ΔY_tu; } else { k.ΔYr = k.ΔY_tu; } } break; case PositionI.Unsprung: k.ΔXr = k.ΔX_w; k.ΔYr = -k.ΔY_wd; break; case PositionI.Tread: k.ΔXr = 0; k.ΔYr = -Math.Abs(k.ΔY_m); break; case PositionI.Rim: k.ΔXr = 0; k.ΔYr = -k.ΔY_f; break; case PositionI.Collector: //k.ΔXr = k.ΔY_gu; //k.ΔYr = k.ΔX_gu; break; default: break; } #endregion } dataGrid.Items.Refresh(); #region Comment //dataGrid.DataContext = null; //dataGrid.DataContext = vm; //var x = vm.Items; //Task.Factory.StartNew(() => //{ // Thread.Sleep(3500); // //ParaSetBar.MessageQueue.Enqueue("请先设置参数"); //}).ContinueWith(t => //{ // //note you can use the message queue from any thread, but just for the demo here we // //need to get the message queue from the snackbar, so need to be on the dispatcher // //MenuToggleButton.IsChecked = true; // return; //}, TaskScheduler.FromCurrentSynchronizationContext()); //for (int i = 0; i < vm.Items.Count; i++) //{ // KineModel model = vm.Items[i]; // switch (model.Position) // { // case Position.Pantograph: // //model.ΔX_gu = KineModel.ΔX_gu; // //model.ΔY_gu = KineModel.ΔY_gu; // model.ΔXr = model.ΔX_gu; // model.ΔYr = model.ΔX_gu; // break; // case Position.Body: // //model.ΔX_BP = KineModel.ΔX_BP(model.Y, model.N); // //model.ΔY_BPu = KineModel.ΔY_BPu(model.X, model.N); // //model.ΔY_BPd = KineModel.ΔY_BPd(model.X, model.N); // //model._ΔX_BP = KineModel._ΔX_BP(model.Y, model.N); // //model._ΔY_BPu = KineModel._ΔY_BPu(model.X, model.N); // //model._ΔY_BPd = KineModel._ΔY_BPd(model.X, model.N); // break; // case Position.BogieFrame: // //model.ΔX_t = KineModel.ΔX_t(model.Y, model.N); // //model.ΔY_tu = KineModel.ΔY_tu(model.X, model.N); // //model.ΔY_td = KineModel.ΔY_td(model.X, model.N); // //model._ΔX_t = KineModel._ΔX_t(model.Y, model.N); // //model._ΔY_tu = KineModel._ΔY_tu(model.X, model.N); // //model._ΔY_td = KineModel._ΔY_td(model.X, model.N); // break; // case Position.Unsprung: // //model.ΔX_w = KineModel.ΔX_t(model.Y, model.N); // //model.ΔY_wd = KineModel.ΔY_tu(model.X, model.N); // //model.ΔXr = model.ΔX_w; // //model.ΔYr = model.ΔY_wd; // break; // case Position.Tread: // //model.ΔX_t = KineModel.ΔX_t(model.Y, model.N); // //model._ΔX_t = KineModel._ΔX_t(model.Y, model.N); // //model.ΔY_f = KineModel.ΔY_f(); // break; // case Position.Rim: // //model.ΔX_t = KineModel.ΔX_t(model.Y, model.N); // //model._ΔX_t = KineModel._ΔX_t(model.Y, model.N); // //model.ΔY_m = KineModel.ΔY_m(); // break; // case Position.Collector: // //model.ΔX_sd = KineModel.ΔX_sd(model.Y, model.N); // break; // default: // break; // } //} #endregion } public T GetChildObject(DependencyObject obj, string name) where T : FrameworkElement { DependencyObject child = null; T grandChild = null; for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++) { child = VisualTreeHelper.GetChild(obj, i); if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name))) { return (T)child; } else { grandChild = GetChildObject(child, name); if (grandChild != null) return grandChild; } } return null; } //导出表格 private void BtnExcel_Click(object sender, RoutedEventArgs e) { if (!IsCal) { MessageBox.Show("请先进行限界计算", "提示"); return; } if (vm.Items != null) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Excel 工作簿(*.xlsx)|*.xlsx|Excel 97-2003 工作簿(*.xls)|*.xls"; sfd.FileName = "车辆限界"; //默认保存格式 sfd.DefaultExt = "xlsx"; //自动添加扩展名 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("车体横向平移和倾角产生横向偏移方向相同时,车体横向偏移量"); CommentList.Add("车体横向平移和倾角产生横向偏移方向相同时,车体竖向向上偏移量"); CommentList.Add("车体横向平移和倾角产生横向偏移方向相同时,车体竖向向下偏移量"); CommentList.Add("车体横向平移和倾角产生横向偏移方向相反时,车体横向偏移量"); CommentList.Add("车体横向平移和倾角产生横向偏移方向相反时,车体竖向向上偏移量"); CommentList.Add("车体横向平移和倾角产生横向偏移方向相反时,车体竖向向下偏移量"); CommentList.Add("构架横向平移和倾角产生横向偏移方向相同时,构架横向偏移量"); CommentList.Add("构架横向平移和倾角产生横向偏移方向相同时,构架竖向向上偏移量"); CommentList.Add("构架横向平移和倾角产生横向偏移方向相同时,构架竖向向下偏移量"); CommentList.Add("构架横向平移和倾角产生横向偏移方向相反时,构架横向偏移量"); 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, 8, 4)); 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 async void DialogsBeforeExit(string filename) //{ //MessageDialogResult result = await this.ShowMessageAsync(this.Title, "是否打开文件", MessageDialogStyle.AffirmativeAndNegative); //if (result == MessageDialogResult.Negative) //{ // return; //} //else //{ // Process.Start(filename); //} //} //导出轮廓 private void BtnCCAD_Click(object sender, RoutedEventArgs e) { if (!IsCal) { MessageBox.Show("请先进行限界计算", "提示"); return; } try { 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; } //去除autocad绑定 CadHelper cadHelper = new CadHelper(); System.Threading.Thread.Sleep(1000); cadHelper.AddLayer("车辆轮廓线", CadHelper.RED); 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) { DrawResultCAD(cadHelper, true, item); DrawResultCAD(cadHelper, false, item); } DrawInitCAD(cadHelper, true, othCoordPoints); DrawInitCAD(cadHelper, false, othCoordPoints); cadHelper.ZoomAll(); } catch (Exception ex) { MessageBox.Show("系统异常:" + ex.Message); } } //导出限界 private void BtnVCAD_Click(object sender, RoutedEventArgs e) { 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; } //去除autocad绑定 //this.Cursor = System.Windows.Input.Cursors.Wait; string layerName; CadHelper cadHelper = new CadHelper(); System.Threading.Thread.Sleep(1000); try { if (Color.SelectedIndex == 0) { layerName = "轮廓线-端部"; cadHelper.AddLayer(layerName, CadHelper.RED); } else if (Color.SelectedIndex == 1) { layerName = "轮廓线-中心销"; cadHelper.AddLayer("轮廓线-中心销", CadHelper.GREEN); } else if (Color.SelectedIndex == 2) { layerName = "轮廓线-车辆中心"; cadHelper.AddLayer("轮廓线-车辆中心", CadHelper.BLUE); } else { layerName = "默认"; 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) { DrawResultCAD(cadHelper, true, item); DrawResultCAD(cadHelper, false, item); } DrawResultCAD(cadHelper, true, othCoordPoints); DrawResultCAD(cadHelper, false, othCoordPoints); cadHelper.ZoomAll(); //CadHelper.CadTool.Show(); //this.WindowState = WindowState.Minimized; //this.Cursor = System.Windows.Input.Cursors.Arrow; } catch (Exception ex) { //this.Cursor = System.Windows.Input.Cursors.Arrow; MessageBox.Show("系统异常:" + ex.Message); } } //去除autocad绑定 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].X; PtSt[1] = models[0].Y; if (isRight) { PtSt[0] = models[0].X; } for (int i = 1; i < models.Count; i++) { PtEn[0] = -models[i].X; PtEn[1] = models[i].Y; if (isRight) //右边的点才画出点号和坐标 { PtEn[0] = models[i].X; 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); } } } //去除autocad绑定 private void DrawResultCAD(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 BtnPreview_Click(object sender, RoutedEventArgs e) { //WpfPreview pre = new WpfPreview(vm); //pre.ShowDialog(); vm.LayerName = "轮廓线-车辆中心"; if (Color.SelectedIndex == 0) { vm.LayerName = "轮廓线-端部"; vm.Color = netDxf.AciColor.Red; } else if (Color.SelectedIndex == 1) { vm.LayerName = "轮廓线-中心销"; vm.Color = netDxf.AciColor.Green; } else if (Color.SelectedIndex == 2) { vm.LayerName = "轮廓线-车辆中心"; vm.Color = netDxf.AciColor.Blue; } wpfCadView frm = new wpfCadView(vm); frm.designControl.Root.Background = new SolidColorBrush(Colors.Black); frm.ParentWindow = this; frm.Show(); this.Hide(); } #endregion //车辆轮廓 选择框 private void CbbCarType_SelectionChanged(object sender, SelectionChangedEventArgs e) { vm.Items.Clear(); dataGrid.DataContext = null; VehicleContourPt vcp = new VehicleContourPt(); switch (CbbCarType.SelectedIndex) { case 0: vm.Items = vcp.A2DataModels(); break; case 1: vm.Items = vcp.A1DataModels_200(); break; case 2: vm.Items = vcp.B2DataModels(); break; case 3: vm.Items = vcp.B1DataModels_140(); break; case 4: vm.Items = vcp.B1DataModels_160(); break; case 5: vm.Items = vcp.B1DataModels_200(); break; default: break; } dataGrid.DataContext = vm; } 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; } } private void BtnSaveGauges_Click(object sender, RoutedEventArgs e) { if (!IsCal) { MessageBox.Show("请先进行限界计算", "提示"); return; } 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("车型", KineModel.nMetro.GetDescription()); root.SetAttributeValue("控制点类型", "车辆限界点"); //循环所有list中的DataTable for (int i = 0; i < vm.Items.Count; i++) { var dm = vm.Items[i]; XElement childXml = new XElement(dm.Position.GetDescription()); //XElement point = new XElement(dm.StrPosition); //设置点节点的属性 childXml.SetAttributeValue("点号", dm.Name); childXml.SetAttributeValue("X", dm.Xr); childXml.SetAttributeValue("Y", dm.Yr); //将点的节点添加到上级节点中 //childXml.Add(point); //将位置的节点添加到根节点 root.Add(childXml); } root.Save(sfd.FileName); } } } }