1320 lines
47 KiB
C#
1320 lines
47 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|
||
}
|