Files
MetroGauges-Old/MetroGauges/WpfKine.xaml.cs
2026-02-23 17:02:55 +08:00

1320 lines
47 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// KinematicGauge.xaml 的交互逻辑
/// </summary>
public partial class WpfKine
{
public DgViewModel<KineModel> vm;
public static Snackbar Snackbar;
WpfPalette colorset;
bool isCollasped;
private bool IsCal=false;
public Window ParentWindow { get; set; }
public WpfKine()
{
vm = new DgViewModel<KineModel>();
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<PositionI> PositionToList()
{
List<PositionI> list = new List<PositionI>();
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<XElement> enumerable = root.Elements();
foreach (var xe in enumerable)
{
//IEnumerable<XElement> 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<T>(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<T>(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<string> CommentList = new List<string>();
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<KineModel> othCoordPoints = new ObservableCollection<KineModel>();
ObservableCollection<KineModel> pgCoordPoints = new ObservableCollection<KineModel>();
ObservableCollection<KineModel> 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<string> groups = new List<string>();
foreach (var item in pgCoordPoints)
{
var lastchar = item.Name.Substring(item.Name.Length - 1, 1);
if (!groups.Contains(lastchar))
{
groups.Add(lastchar);
}
}
List<ObservableCollection<KineModel>> listli = new List<ObservableCollection<KineModel>>();
for (int i = 0; i < groups.Count; i++)
{
List<KineModel> list = new List<KineModel>();
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<KineModel>(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<KineModel> othCoordPoints = new ObservableCollection<KineModel>();
ObservableCollection<KineModel> pgCoordPoints = new ObservableCollection<KineModel>();
ObservableCollection<KineModel> 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<string> groups = new List<string>();
foreach (var item in pgCoordPoints)
{
var lastchar = item.Name.Substring(item.Name.Length - 1, 1);
if (!groups.Contains(lastchar))
{
groups.Add(lastchar);
}
}
List<ObservableCollection<KineModel>> listli = new List<ObservableCollection<KineModel>>();
for (int i = 0; i < groups.Count; i++)
{
List<KineModel> list = new List<KineModel>();
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<KineModel>(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<KineModel> 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<KineModel> 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);
}
}
}
}