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

761 lines
27 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.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
{
/// <summary>
/// Curve_of_equipment_gauge.xaml 的交互逻辑
/// </summary>
public partial class WpfCurEqui
{
DgViewModel<CurEquiModel> vm;
CurEquiModel curequi;
private bool isCollasped;
private bool IsCal=false;
public WpfCurEqui()
{
curequi = new CurEquiModel();
vm = new DgViewModel<CurEquiModel>();
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<XElement> 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<string> CommentList = new List<string>();
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<CurEquiModel> othCoordPoints = new ObservableCollection<CurEquiModel>();
ObservableCollection<CurEquiModel> pgCoordPoints = new ObservableCollection<CurEquiModel>();
ObservableCollection<CurEquiModel> 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<CurEquiModel> othCoordPoints = new ObservableCollection<CurEquiModel>();
ObservableCollection<CurEquiModel> pgCoordPoints = new ObservableCollection<CurEquiModel>();
ObservableCollection<CurEquiModel> 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<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<CurEquiModel>> listli = new List<ObservableCollection<CurEquiModel>>();
for (int i = 0; i < groups.Count; i++)
{
List<CurEquiModel> list = new List<CurEquiModel>();
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<CurEquiModel>(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<CurEquiModel> 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);
//}
//}
}
}