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