1128 lines
41 KiB
C#
1128 lines
41 KiB
C#
using MetroGauges.Controls;
|
||
using MetroGauges.Controls.BlockShaps;
|
||
using MetroGauges.Controls.DrawTools;
|
||
using MetroGauges.Database;
|
||
using MetroGauges.Database.Enitys;
|
||
using MetroGauges.Database.Forms;
|
||
using MetroGauges.Model;
|
||
using MetroGauges.ViewModel;
|
||
using Microsoft.Win32;
|
||
using netDxf;
|
||
using netDxf.Tables;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Collections.ObjectModel;
|
||
using System.Configuration;
|
||
using System.Globalization;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows;
|
||
using System.Windows.Controls;
|
||
using System.Windows.Data;
|
||
using System.Windows.Documents;
|
||
using System.Windows.Input;
|
||
using System.Windows.Media;
|
||
using System.Windows.Media.Imaging;
|
||
using System.Windows.Shapes;
|
||
|
||
namespace MetroGauges
|
||
{
|
||
/// <summary>
|
||
/// wpfCadView.xaml 的交互逻辑
|
||
/// </summary>
|
||
public partial class wpfCadView : Window
|
||
{
|
||
private PointCollection othCdPts;
|
||
private PointCollection pgCdPts;
|
||
private PointCollection revOthCdPts;
|
||
private PointCollection revPgCdPts;
|
||
|
||
private DgViewModel<DataModel> exPortdatas; // 界限数据
|
||
ObservableCollection<BlockGroup> blockGroups;
|
||
BlockOpr blockOpr = new BlockOpr();
|
||
|
||
TransformGroup viewTransformGroup = new TransformGroup();
|
||
ScaleTransform viewScaleTransform = new ScaleTransform();
|
||
|
||
|
||
public Window ParentWindow { get; set; }
|
||
|
||
#region "构造函数"
|
||
public wpfCadView()
|
||
{
|
||
InitializeComponent();
|
||
this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
|
||
this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
|
||
}
|
||
/// <summary>
|
||
/// 车辆界限
|
||
/// </summary>
|
||
/// <param name="k"></param>
|
||
public wpfCadView(DgViewModel<KineModel> k)
|
||
{
|
||
InitializeComponent();
|
||
this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
|
||
this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
|
||
this.Loaded += WpfCadView_Loaded;
|
||
|
||
exPortdatas = new DgViewModel<DataModel>() { DataType = DataTypes.KineModel, LayerName = k.LayerName, Color = k.Color };
|
||
foreach (var item in k.Items)
|
||
{
|
||
exPortdatas.Items.Add(item);
|
||
}
|
||
DrawKinePoint(exPortdatas);
|
||
DrawCurve(exPortdatas);
|
||
|
||
}
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="l"></param>
|
||
public wpfCadView(DgViewModel<LiEquiModel> l)
|
||
{
|
||
InitializeComponent();
|
||
this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
|
||
this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
|
||
this.Loaded += WpfCadView_Loaded;
|
||
|
||
exPortdatas = new DgViewModel<DataModel>() { DataType = DataTypes.LiEquiModel, LayerName = l.LayerName, Color = l.Color };
|
||
foreach (var item in l.Items)
|
||
{
|
||
exPortdatas.Items.Add(item);
|
||
}
|
||
DrawKinePoint(exPortdatas);
|
||
DrawCurve(exPortdatas);
|
||
|
||
}
|
||
public wpfCadView(DgViewModel<CurEquiModel> c)
|
||
{
|
||
InitializeComponent();
|
||
this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
|
||
this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth;
|
||
this.Loaded += WpfCadView_Loaded;
|
||
|
||
exPortdatas = new DgViewModel<DataModel>() { DataType = DataTypes.CurEquiModel, LayerName = c.LayerName, Color = c.Color };
|
||
foreach (var item in c.Items)
|
||
{
|
||
exPortdatas.Items.Add(item);
|
||
}
|
||
DrawKinePoint(exPortdatas);
|
||
DrawCurve(exPortdatas);
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
|
||
|
||
private void WpfCadView_Loaded(object sender, RoutedEventArgs e)
|
||
{
|
||
this.designControl.LayoutRoot.Focus();
|
||
this.designControl.HighlighEvent += DesignControl_HighlighEvent;
|
||
|
||
this.designControl.MouseRightButtonDown += DesignControl_MouseRightButtonDown;
|
||
this.designControl.MouseMove += DesignControl_MouseMove;
|
||
this.Closed += WpfCadView_Closed;
|
||
|
||
|
||
|
||
this.smalldesign.ScaleVisble = false;
|
||
this.smalldesign.CanWheel = false;
|
||
this.smalldesign.BlockManage.IsView = true;
|
||
|
||
|
||
//Controls.GeoWidget w1 = new Controls.GeoWidget
|
||
//{
|
||
// Width = 500,
|
||
// Height = 550,
|
||
// BlockName = "块1"
|
||
//};
|
||
|
||
//this.designControl.canvasDesign.Children.Add(w1);
|
||
//Canvas.SetTop(w1, -100);
|
||
//Canvas.SetLeft(w1, 100);
|
||
|
||
//this.designControl.BlockManage.AddBlock("块1");
|
||
//this.designControl.BlockManage.AddBlock("三轨");
|
||
//this.designControl.BlockManage.AddBlock("消火栓");
|
||
|
||
|
||
|
||
//tvBlocks.ItemsSource = this.designControl.BlockManage.BlockNames();
|
||
|
||
this.PreviewKeyUp += WpfCadView_KeyDown;
|
||
|
||
BindBlockData();
|
||
|
||
}
|
||
|
||
private void WpfCadView_Closed(object sender, EventArgs e)
|
||
{
|
||
if (ParentWindow != null)
|
||
{
|
||
ParentWindow.Show();
|
||
}
|
||
}
|
||
|
||
private void BindBlockData()
|
||
{
|
||
try
|
||
{
|
||
blockGroups = BlockDAL.GetBlockGroups();
|
||
tvBlocks.ItemsSource = blockGroups;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogManager.WriteLog("error", "BindBlockData:" + ex.Message);
|
||
//throw;
|
||
}
|
||
|
||
}
|
||
|
||
private void WpfCadView_KeyDown(object sender, KeyEventArgs e)
|
||
{
|
||
if (e.Key == Key.Delete || e.Key == Key.Decimal)
|
||
{
|
||
removBlock_Click(sender, e);
|
||
}
|
||
else
|
||
{
|
||
//this.designControl.Root.Focus();
|
||
|
||
|
||
if (Keyboard.IsKeyDown(Key.LeftCtrl))
|
||
{
|
||
if (e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up || e.Key == Key.Down)
|
||
{
|
||
if (this.designControl.BlockManage.SelectedBlock == null) return;
|
||
|
||
Point point = new Point();
|
||
Point point1 = new Point();
|
||
blockOpr.ScaleRale = this.designControl.ScaleRale;
|
||
blockOpr.GetBlockPoints(this.designControl.BlockManage.SelectedBlock.Block, out point, out point1);
|
||
this.designControl.BlockManage.DragPoint = point;
|
||
this.designControl.BlockManage.CopyBlock(this.designControl.BlockManage.SelectedBlock.BlockName);
|
||
switch (e.Key)
|
||
{
|
||
case Key.Left:
|
||
this.designControl.BlockManage.MoveBlock(this.designControl.BlockManage.SelectedBlock.BlockName, new Point() { X = point.X - 1, Y = point.Y });
|
||
break;
|
||
case Key.Right:
|
||
this.designControl.BlockManage.MoveBlock(this.designControl.BlockManage.SelectedBlock.BlockName, new Point() { X = point.X + 1, Y = point.Y });
|
||
break;
|
||
case Key.Up:
|
||
this.designControl.BlockManage.MoveBlock(this.designControl.BlockManage.SelectedBlock.BlockName, new Point() { X = point.X, Y = point.Y - 1 });
|
||
break;
|
||
case Key.Down:
|
||
this.designControl.BlockManage.MoveBlock(this.designControl.BlockManage.SelectedBlock.BlockName, new Point() { X = point.X, Y = point.Y + 1 });
|
||
break;
|
||
}
|
||
|
||
SetLocation(this.designControl.BlockManage.SelectedBlock, point);
|
||
if (this.designControl.BlockManage.SelectedBlock.BlockEnity != null)
|
||
{
|
||
//更新最后调整位置:矩形外框右下角位置
|
||
BlockDAL.UpdateBlockLocation(this.designControl.BlockManage.SelectedBlock.BlockEnity.Id, point.X, point.Y);
|
||
this.designControl.BlockManage.SelectedBlock.BlockEnity.Locationx = point.X;
|
||
this.designControl.BlockManage.SelectedBlock.BlockEnity.Locationy = point.Y;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
private void DesignControl_HighlighEvent(object sender, HighlighEvent e)
|
||
{
|
||
|
||
if (sender is BlockManage)
|
||
{
|
||
if (e.Block.BlockEnity.Istemplate == 0)
|
||
{
|
||
SetLocation(e.Block, e.Location);
|
||
tvBlocks.Focusable = false;
|
||
this.designControl.txtXY.Focus();
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
private void SetLocation(BlockData blockData,Point location)
|
||
{
|
||
designControl.RemovePropertyValueChanged();
|
||
FieldInfo fieldInfox = blockData.BlockEnity.FieldData.FirstOrDefault(p => p.Id == 9999);
|
||
if (fieldInfox != null)
|
||
{
|
||
fieldInfox.Fieldvalue = (location.X * designControl.ScaleRale).ToString("0.00");
|
||
designControl.UpdatePropertyGriFiledValue("X坐标", fieldInfox.Fieldvalue);
|
||
}
|
||
FieldInfo fieldInfoy = blockData.BlockEnity.FieldData.FirstOrDefault(p => p.Id == 9998);
|
||
if (fieldInfoy != null)
|
||
{
|
||
fieldInfoy.Fieldvalue = (-location.Y * designControl.ScaleRale).ToString("0.00");
|
||
designControl.UpdatePropertyGriFiledValue("Y坐标", fieldInfoy.Fieldvalue);
|
||
}
|
||
designControl.AddPropertyValueChanged();
|
||
}
|
||
|
||
#region 数据绘制相关
|
||
/// <summary>
|
||
/// 控制点表格
|
||
/// </summary>
|
||
/// <param name="vm"></param>
|
||
private void DrawKineTable(DgViewModel<DataModel> vm)
|
||
{
|
||
|
||
ObservableCollection<DataModel> dm = vm.Items;
|
||
if (dm.Count == 0) return;
|
||
|
||
Point startPoint = new Point() { X = 500, Y = -850 };
|
||
|
||
this.designControl.DrawText("车辆轮廓线坐标表(单位:mm)", new Point() { X = startPoint.X, Y = startPoint.Y - 20 });
|
||
double count = Math.Ceiling(dm.Count / 10.0); //dm.Count / 10;
|
||
|
||
|
||
int index = 0;
|
||
for (int k = 1; k <= count; k++)
|
||
{
|
||
int col = 10;
|
||
if (k * 10 > dm.Count)
|
||
{
|
||
col = dm.Count - ((k - 1) * 10);
|
||
}
|
||
|
||
OutTable outTable = new OutTable(this.designControl.canvasDesign) { Cols = col + 1 };
|
||
outTable.StartPoint = new Point() { X = startPoint.X, Y = startPoint.Y + (k - 1) * 120 };
|
||
for (int i = 0; i < 3; i++)
|
||
{
|
||
Row row = outTable.NewRow();
|
||
}
|
||
outTable.DrawShaps = this.designControl.DrawShaps;
|
||
|
||
outTable.Rows[0].Cells[0].Text = "控制点";
|
||
outTable.Rows[1].Cells[0].Text = "X";
|
||
outTable.Rows[2].Cells[0].Text = "Y";
|
||
for (int i = 1; i <= col; i++)
|
||
{
|
||
int cellindex = index * 10 + (i - 1);
|
||
outTable.Rows[0].Cells[i].Text = dm[cellindex].Name;
|
||
}
|
||
//X
|
||
for (int i = 1; i <= col; i++)
|
||
{
|
||
int cellindex = index * 10 + (i - 1);
|
||
outTable.Rows[1].Cells[i].Text = dm[cellindex].X.ToString();
|
||
}
|
||
//Y
|
||
for (int i = 1; i <= col; i++)
|
||
{
|
||
int cellindex = index * 10 + (i - 1);
|
||
outTable.Rows[2].Cells[i].Text = dm[cellindex].Y.ToString();
|
||
}
|
||
outTable.DrawTable();
|
||
|
||
index++;
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
/// <summary>
|
||
/// 绘控制点
|
||
/// </summary>
|
||
/// <param name="vm"></param>
|
||
private void DrawKinePoint(DgViewModel<DataModel> vm)
|
||
{
|
||
double xyRate = this.designControl.ScaleRale;
|
||
ObservableCollection<DataModel> dm = vm.Items;
|
||
for (int i = 0; i < dm.Count; i++)
|
||
{
|
||
Ellipse dataEllipse = new Ellipse
|
||
{
|
||
Fill = new SolidColorBrush(Color.FromRgb(28, 120, 135)),
|
||
Width = 8,
|
||
Height = 8,
|
||
ToolTip = dm[i].Name + "(" + dm[i].X + "," + dm[i].Y + ")",
|
||
//ToolTip = String.Format("{0}{1}{2}{3}{4}{5}", dm[i].Name, "(", dm[i].X, ",", dm[i].Y, ")")
|
||
};
|
||
Canvas.SetLeft(dataEllipse, dm[i].X / xyRate - 4);//-4是为了补偿圆点的大小,到精确的位置
|
||
Canvas.SetTop(dataEllipse, -dm[i].Y / xyRate - 4);
|
||
|
||
this.designControl.canvasDesign.Children.Add(dataEllipse);
|
||
}
|
||
|
||
DrawKineTable(vm);
|
||
}
|
||
|
||
private void DrawPolyline(PointCollection ptcol, Brush brush)
|
||
{
|
||
Polyline pl = new Polyline
|
||
{
|
||
Stroke = brush,
|
||
StrokeThickness = 1,
|
||
Points = ptcol,
|
||
};
|
||
this.designControl.canvasDesign.Children.Add(pl);
|
||
}
|
||
/// <summary>
|
||
/// 绘制轮阔曲线
|
||
/// </summary>
|
||
private void DrawCurve(DgViewModel<DataModel> vm)
|
||
{
|
||
double xyRate = this.designControl.ScaleRale;
|
||
|
||
ObservableCollection<DataModel> dm = vm.Items;
|
||
|
||
othCdPts = new PointCollection();
|
||
pgCdPts = new PointCollection();
|
||
revOthCdPts = new PointCollection();
|
||
revPgCdPts = new PointCollection();
|
||
if (vm.DataType == DataTypes.LiEquiModel)
|
||
{
|
||
for (int i = 0; i < dm.Count; i++)
|
||
{
|
||
if (dm[i].Position2 == MetroGauges.General.PositionII.Pantograph)
|
||
{
|
||
pgCdPts.Add(new System.Windows.Point(dm[i].X / xyRate, -dm[i].Y / xyRate));
|
||
revPgCdPts.Add(new System.Windows.Point(-dm[i].X / xyRate, -dm[i].Y / xyRate));
|
||
}
|
||
else
|
||
{
|
||
othCdPts.Add(new System.Windows.Point(dm[i].X / xyRate, -dm[i].Y / xyRate));
|
||
revOthCdPts.Add(new System.Windows.Point(-dm[i].X / xyRate, -dm[i].Y / xyRate));
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (int i = 0; i < dm.Count; i++)
|
||
{
|
||
if (dm[i].Position == MetroGauges.General.PositionI.Pantograph)
|
||
{
|
||
pgCdPts.Add(new System.Windows.Point(dm[i].X / xyRate, -dm[i].Y / xyRate));
|
||
revPgCdPts.Add(new System.Windows.Point(-dm[i].X / xyRate, -dm[i].Y / xyRate));
|
||
}
|
||
else
|
||
{
|
||
othCdPts.Add(new System.Windows.Point(dm[i].X / xyRate, -dm[i].Y / xyRate));
|
||
revOthCdPts.Add(new System.Windows.Point(-dm[i].X / xyRate, -dm[i].Y / xyRate));
|
||
}
|
||
}
|
||
}
|
||
|
||
Brush color = new SolidColorBrush(Color.FromRgb(vm.Color.R, vm.Color.G, vm.Color.B));
|
||
|
||
DrawPolyline(pgCdPts, color);
|
||
DrawPolyline(othCdPts, color);
|
||
DrawPolyline(revPgCdPts, color);
|
||
DrawPolyline(revOthCdPts, color);
|
||
}
|
||
|
||
#endregion
|
||
|
||
|
||
#region 窗体操作
|
||
private void HeaderZone_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
|
||
{
|
||
DragMove();
|
||
}
|
||
private void WindowClose_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
this.Close();
|
||
}
|
||
private void WindowMinimize_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
this.WindowState = WindowState.Minimized;
|
||
}
|
||
private void WindowMaximize_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
if(this.WindowState == WindowState.Maximized)
|
||
this.WindowState = WindowState.Normal;
|
||
else
|
||
this.WindowState = WindowState.Maximized;
|
||
}
|
||
#endregion
|
||
|
||
|
||
|
||
#region dxf 导出
|
||
|
||
|
||
/// <summary>
|
||
/// 导出车辆界限
|
||
/// </summary>
|
||
private void ExportKineData(string fileName)
|
||
{
|
||
ObservableCollection<DataModel> othCoordPoints = new ObservableCollection<DataModel>();
|
||
ObservableCollection<DataModel> pgCoordPoints = new ObservableCollection<DataModel>();
|
||
ObservableCollection<DataModel> dm = exPortdatas.Items;
|
||
for (int i = 0; i < dm.Count; i++)
|
||
{
|
||
if (dm[i].Position == General.PositionI.Pantograph)
|
||
{
|
||
pgCoordPoints.Add(dm[i]); //受电弓
|
||
}
|
||
else
|
||
{
|
||
othCoordPoints.Add(dm[i]);
|
||
}
|
||
}
|
||
if (pgCoordPoints.Count == 0 || othCoordPoints.Count == 0)
|
||
{
|
||
MessageBox.Show("数据不全", "错误");
|
||
return;
|
||
}
|
||
|
||
DxfDocument dxf = new DxfDocument();
|
||
Layer lyr = new Layer(exPortdatas.LayerName);
|
||
lyr.Color = exPortdatas.Color;
|
||
|
||
DrawDxfData(dxf, lyr, pgCoordPoints);
|
||
DrawDxfData(dxf, lyr, othCoordPoints);
|
||
|
||
designControl.BlockManage.DrawDxfBlocks(dxf,lyr);
|
||
designControl.DrawDxfShap(dxf, lyr);
|
||
|
||
dxf.DrawingVariables.AcadVer = netDxf.Header.DxfVersion.AutoCad2010;
|
||
dxf.Save(fileName);
|
||
//dxf.DrawingVariables.
|
||
|
||
|
||
|
||
MessageBox.Show("导出成功", "错误");
|
||
}
|
||
|
||
|
||
|
||
private void DrawDxfData(DxfDocument dxf , Layer layer, ObservableCollection<DataModel> 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;
|
||
|
||
for (int i = 1; i < models.Count; i++)
|
||
{
|
||
PtEn[0] = models[i].X;
|
||
PtEn[1] = models[i].Y;
|
||
//右边的点才画出点号和坐标
|
||
//PtEn[0] = models[i].X;
|
||
//cadHelper.DrawText(Corder + "(" + PtSt[0] + "," + PtSt[1] + ")", PtSt);
|
||
string strCoder = Corder + "(" + PtSt[0] + "," + PtSt[1] + ")";
|
||
netDxf.Entities.Line line = new netDxf.Entities.Line(new Vector2(PtSt[0], PtSt[1]), new Vector2(PtEn[0], PtEn[1]));
|
||
line.Layer = layer;
|
||
dxf.AddEntity(line);
|
||
|
||
TextStyle style = new TextStyle("myStye", "宋体");
|
||
netDxf.Entities.Text text = new netDxf.Entities.Text(strCoder, new Vector2(PtSt[0], PtSt[1]), 12.0f, style);
|
||
text.Layer = layer;
|
||
text.Alignment = netDxf.Entities.TextAlignment.BottomLeft;
|
||
dxf.AddEntity(text);
|
||
// 画左边的对称线
|
||
netDxf.Entities.Line line2 = new netDxf.Entities.Line(new Vector2(-PtSt[0], PtSt[1]), new Vector2(-PtEn[0], PtEn[1]));
|
||
line2.Layer = layer;
|
||
dxf.AddEntity(line2);
|
||
|
||
PtSt[0] = PtEn[0];
|
||
PtSt[1] = PtEn[1];
|
||
|
||
Corder = models[i].Name;
|
||
if (models.Count - 1 == i) //最后一个点 右边
|
||
{
|
||
netDxf.Entities.Text text1 = new netDxf.Entities.Text(strCoder, new Vector2(PtEn[0], PtEn[1]), 12.0f, style);
|
||
text1.Layer = layer;
|
||
text1.Alignment = netDxf.Entities.TextAlignment.BottomLeft;
|
||
dxf.AddEntity(text);
|
||
//cadHelper.DrawText(Corder + "(" + PtSt[0] + "," + PtSt[1] + ")", PtEn);
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
private void ScalVisible_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
designControl.ScaleVisble = this.scalVisbleChk.IsChecked.Value;
|
||
}
|
||
|
||
|
||
|
||
private void txtScale_PreviewKeyDown(object sender, KeyEventArgs e)
|
||
{
|
||
Utily.isInputNumber(e);
|
||
}
|
||
|
||
private void txtScale_LostFocus(object sender, RoutedEventArgs e)
|
||
{
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 图形偏移
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void txtXY_TextChanged(object sender, TextChangedEventArgs e)
|
||
{
|
||
if (designControl == null) return;
|
||
|
||
if (!string.IsNullOrWhiteSpace((sender as TextBox).Text) && (sender as TextBox).Text!="-")
|
||
{
|
||
string name = (sender as TextBox).Name;
|
||
switch (name)
|
||
{
|
||
case "txtleftmove":
|
||
//designControl.MoveSelectedShapbyX(-double.Parse(txtleftmove.Text));
|
||
break;
|
||
case "txtrightmove":
|
||
//designControl.MoveSelectedShapbyX(double.Parse(txtrightmove.Text));
|
||
break;
|
||
case "txtupmove":
|
||
//designControl.MoveSelectedShapbyY(double.Parse(txtupmove.Text));
|
||
break;
|
||
case "txtdownmove":
|
||
//designControl.MoveSelectedShapbyY(-double.Parse(txtdownmove.Text));
|
||
break;
|
||
}
|
||
//更新位置信息
|
||
designControl.BlockManage.SendHighlighEvent(true);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 删除选中的块或其它相关图形
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void removBlock_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
if (designControl.BlockManage.SelectedBlock != null)
|
||
{
|
||
foreach (var item in designControl.BlockManage.SelectedBlock.Block)
|
||
{
|
||
designControl.canvasDesign.Children.Remove(item);
|
||
}
|
||
designControl.BlockManage.Blocks.Remove(designControl.BlockManage.SelectedBlock.BlockName);
|
||
designControl.BlockManage.SelectedBlock = null;
|
||
}
|
||
else if(designControl.CrrentDrawTool != null && designControl.CrrentDrawTool.SelectedShape !=null)
|
||
{
|
||
designControl.DrawShaps.Remove(designControl.CrrentDrawTool.SelectedShape);
|
||
designControl.canvasDesign.Children.Remove(designControl.CrrentDrawTool.SelectedShape);
|
||
designControl.CrrentDrawTool.SelectedShape = null;
|
||
}
|
||
}
|
||
|
||
#region 工具条按钮
|
||
/// <summary>
|
||
/// 导出Dxf 文档
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void btExport_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
SaveFileDialog sfd = new SaveFileDialog();
|
||
sfd.Filter = "Cad dxf文件(*.dxf)|*.dxf";
|
||
//默认保存格式
|
||
sfd.DefaultExt = "dxf";
|
||
//自动添加扩展名
|
||
sfd.AddExtension = true;
|
||
if (sfd.ShowDialog() == true)
|
||
{
|
||
ExportKineData(sfd.FileName);
|
||
}
|
||
|
||
|
||
}
|
||
/// <summary>
|
||
/// 反转
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void ReverseBlock_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
designControl.BlockManage.ReverseBlock();
|
||
}
|
||
|
||
private void btPolyline_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
this.designControl.CreateTool(DrawActionType.Polyline);
|
||
}
|
||
|
||
private void btText_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
this.designControl.CreateTool(DrawActionType.Text);
|
||
}
|
||
|
||
private void btRect_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
this.designControl.CreateTool(DrawActionType.Rectangle);
|
||
}
|
||
|
||
private void btCircle_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
this.designControl.CreateTool(DrawActionType.Circle);
|
||
}
|
||
|
||
private void btnormal_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
this.designControl.Fit();
|
||
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 缩放块
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void txtScale_TextChanged(object sender, TextChangedEventArgs e)
|
||
{
|
||
if (designControl == null) return;
|
||
double vlaue;
|
||
try
|
||
{
|
||
vlaue = double.Parse(txtScale.Text);
|
||
}
|
||
catch
|
||
{
|
||
return;
|
||
}
|
||
designControl.BlockManage.ScaleBlock(vlaue);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 分组块操作
|
||
|
||
private bool isAddBlock = false;
|
||
private BlockData blockData;
|
||
private void DesignControl_MouseMove(object sender, MouseEventArgs e)
|
||
{
|
||
if (isAddBlock && blockData != null)
|
||
{
|
||
if(!blockData.Visblie)
|
||
{
|
||
blockData.Visblie = true;
|
||
}
|
||
|
||
System.Windows.Point currentPoint = e.GetPosition(this.designControl.canvasDesign);
|
||
|
||
this.designControl.BlockManage.MoveBlock(blockData.BlockName, currentPoint);
|
||
}
|
||
}
|
||
private void DesignControl_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
|
||
{
|
||
//isAddBlock = false;
|
||
//blockData = null;
|
||
}
|
||
|
||
//添加块
|
||
private void addBlock_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
string name = (sender as TextBlock).Tag.ToString().Replace(".dxf", "");
|
||
//isAddBlock = true;
|
||
Shape drapShape = this.designControl.BlockManage.AddBlock(name);
|
||
blockData = this.designControl.BlockManage.Blocks[drapShape.Name];
|
||
TreeViewItem treeViewItem = Utily.GetNearestContainer(sender as TextBlock);
|
||
blockData.BlockEnity = treeViewItem.DataContext as BlockInfo;
|
||
|
||
|
||
//添加的是块信息
|
||
if (blockData.BlockEnity.Istemplate == 0)
|
||
{
|
||
if (drapShape != null)
|
||
{
|
||
Point currentPoint = new Point();
|
||
Point point = new Point();
|
||
if (blockData.BlockEnity.Locationx == 0 && blockData.BlockEnity.Locationy == 0)
|
||
{
|
||
currentPoint = new Point() { X = 100, Y = -100 };
|
||
point = new Point();
|
||
if (drapShape is Line)
|
||
{
|
||
point.X = (drapShape as Line).X1;
|
||
point.Y = (drapShape as Line).Y1;
|
||
}
|
||
}
|
||
else //默认位置
|
||
{
|
||
Point point1 = new Point();
|
||
blockOpr.ScaleRale = this.designControl.ScaleRale;
|
||
blockOpr.GetBlockPoints(blockData.Block, out point, out point1);
|
||
//用户调整的最后位置
|
||
currentPoint = new Point() { X = blockData.BlockEnity.Locationx, Y = blockData.BlockEnity.Locationy };
|
||
}
|
||
this.designControl.BlockManage.DragPoint = point;
|
||
this.designControl.BlockManage.CopyBlock(drapShape.Name);
|
||
this.designControl.BlockManage.MoveBlock(drapShape.Name, currentPoint);
|
||
}
|
||
}
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogManager.WriteLog("error",ex.Message);
|
||
MessageBox.Show("程序异常");
|
||
}
|
||
|
||
|
||
|
||
}
|
||
/// <summary>
|
||
/// 添加分组
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void addGroup_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||
{
|
||
frmAddGroup frm = new frmAddGroup();
|
||
frm.WindowStartupLocation = WindowStartupLocation.CenterScreen;
|
||
frm.ShowDialog();
|
||
|
||
bool reulst = frm.DialogResult.Value;
|
||
|
||
try
|
||
{
|
||
if (reulst)
|
||
{
|
||
BlockDAL.CreateGroup(frm.txtGroup.Text);
|
||
this.BindBlockData();
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
LogManager.WriteLog("error", "addGroup:" + ex.Message);
|
||
}
|
||
|
||
|
||
|
||
}
|
||
/// <summary>
|
||
/// 导入块
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void import_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||
{
|
||
OpenFileDialog dialog = new OpenFileDialog();
|
||
dialog.Multiselect = true;//该值确定是否可以选择多个文件
|
||
dialog.Title = "请选要导入的dxf块文件";
|
||
dialog.Filter = "块文件(*.dxf)|*.dxf";
|
||
if (dialog.ShowDialog().Value)
|
||
{
|
||
string[] file = dialog.FileNames;
|
||
int groupid =int.Parse((sender as TextBlock).Tag.ToString());
|
||
string m_BlockPath = AppDomain.CurrentDomain.BaseDirectory + "Blocks\\";
|
||
|
||
if (!Directory.Exists(m_BlockPath))
|
||
{
|
||
Directory.CreateDirectory(m_BlockPath);
|
||
}
|
||
|
||
foreach (var item in file)
|
||
{
|
||
string name = System.IO.Path.GetFileNameWithoutExtension(item);
|
||
|
||
int id = BlockDAL.CheckBlock(name);
|
||
if (id >0)
|
||
{
|
||
if (MessageBox.Show($"已存在块:{name},确定覆盖吗?", "提示", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
|
||
{
|
||
BlockDAL.DeleteBlock(id);
|
||
}
|
||
else
|
||
{
|
||
continue;
|
||
}
|
||
}
|
||
|
||
BlockInfo blockInfo = new BlockInfo();
|
||
blockInfo.Filepath = System.IO.Path.GetFileName(item);
|
||
blockInfo.Name = name;
|
||
blockInfo.Groupid = groupid;
|
||
if (groupid == 4)
|
||
{
|
||
blockInfo.Istemplate = 1;
|
||
}
|
||
bool result= BlockDAL.CreateBlock(blockInfo);
|
||
if (result)
|
||
{
|
||
System.IO.File.Copy(item, m_BlockPath + blockInfo.Filepath,true);
|
||
}
|
||
}
|
||
|
||
this.BindBlockData();
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 删除组
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void delGroup_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||
{
|
||
if (MessageBox.Show("确定要删除该分类分类下的块数据吗?", "提示", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
|
||
{
|
||
int id =int.Parse((sender as TextBlock).Tag.ToString());
|
||
BlockDAL.delGroup(id);
|
||
this.BindBlockData();
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 更新块名称
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void TreeNodeEdit_NodeUpdated(object sender, NodeCheckInputArgs e)
|
||
{
|
||
try
|
||
{
|
||
BlockInfo blockInfo = (sender as TreeNodeEdit).DataContext as BlockInfo;
|
||
if (blockInfo != null)
|
||
{
|
||
BlockDAL.UpdateBlockName(blockInfo.Id, blockInfo.Name);
|
||
blockInfo.ToolTip = blockInfo.Name;
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show(ex.Message);
|
||
}
|
||
|
||
}
|
||
|
||
private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
|
||
{
|
||
BlockInfo blockInfo = tvBlocks.SelectedItem as BlockInfo;
|
||
if (blockInfo !=null)
|
||
{
|
||
//移除之前block
|
||
if (this.smalldesign.BlockManage.Blocks.Count > 0)
|
||
{
|
||
this.smalldesign.BlockManage.RemoveBlock(this.smalldesign.BlockManage.Blocks.FirstOrDefault().Value);
|
||
}
|
||
|
||
if (blockInfo.Istemplate == 0) //选中构件
|
||
{
|
||
|
||
viewTransformGroup.Children.Clear();
|
||
TranslateTransform moveCanvas = new TranslateTransform() { X = 100, Y = 200 }; //右移
|
||
viewTransformGroup.Children.Add(moveCanvas);
|
||
this.smalldesign.canvasDesign.RenderTransform = viewTransformGroup;
|
||
|
||
|
||
Shape drapShape = this.smalldesign.BlockManage.AddBlock(blockInfo.Filepath);
|
||
BlockData block = this.smalldesign.BlockManage.Blocks[drapShape.Name];
|
||
block.BlockEnity = blockInfo;
|
||
|
||
Point point = new Point();
|
||
Point point1 = new Point();
|
||
blockOpr.ScaleRale = this.smalldesign.ScaleRale;
|
||
blockOpr.GetBlockPoints(block.Block, out point, out point1);
|
||
|
||
this.smalldesign.BlockManage.DragPoint = point;
|
||
this.smalldesign.BlockManage.CopyBlock(drapShape.Name);
|
||
this.smalldesign.BlockManage.MoveBlock(drapShape.Name, new Point() { X = 0, Y = 0 });
|
||
}
|
||
else //选中模板 预览
|
||
{
|
||
//缩放预览
|
||
viewTransformGroup.Children.Clear();
|
||
viewScaleTransform.ScaleX = 0.4;
|
||
viewScaleTransform.ScaleY = 0.4;
|
||
viewTransformGroup.Children.Add(viewScaleTransform);
|
||
TranslateTransform moveCanvas = new TranslateTransform() { X = 115, Y = 200 }; //右移
|
||
viewTransformGroup.Children.Add(moveCanvas);
|
||
this.smalldesign.canvasDesign.RenderTransform = viewTransformGroup;
|
||
|
||
|
||
this.smalldesign.BlockManage.AddBlock(blockInfo.Filepath);
|
||
}
|
||
|
||
designControl.ShowEditPanel(blockInfo);
|
||
}
|
||
}
|
||
|
||
private void TreeViewItem_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
|
||
{
|
||
TreeViewItem item = Utily.VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
|
||
tvBlocks.ContextMenu = null;
|
||
if (item != null)
|
||
{
|
||
|
||
item.IsSelected = true;
|
||
item.ContextMenu = null;
|
||
BlockInfo entity = tvBlocks.SelectedItem as BlockInfo;
|
||
if (entity != null)
|
||
item.ContextMenu = GetDBRightContextMenu(entity, item);
|
||
|
||
|
||
}
|
||
|
||
e.Handled = true;
|
||
}
|
||
|
||
// 获得右键菜单
|
||
public ContextMenu GetDBRightContextMenu(BlockInfo entity, TreeViewItem item)
|
||
{
|
||
|
||
ContextMenu menu = new ContextMenu();
|
||
|
||
MenuItem menuItem = new MenuItem() { Header = "删除", Tag = entity };
|
||
menuItem.Icon = new Image { Source = new System.Windows.Media.Imaging.BitmapImage(new Uri("./Resources/Icon/DeleteRed16.png", UriKind.Relative)) };
|
||
menuItem.Click += new RoutedEventHandler(delMenu_Click);
|
||
|
||
MenuItem ProMuItem = new MenuItem() { Header = "设置属性", Tag = entity };
|
||
ProMuItem.Icon = new Image { Source = new System.Windows.Media.Imaging.BitmapImage(new Uri("./Resources/Icon/table.png", UriKind.Relative)) };
|
||
ProMuItem.Click += ProMuItem_Click;
|
||
|
||
MenuItem reNameItem = new MenuItem() { Header = "重命名", Tag = item, DataContext= entity };
|
||
//ProMuItem.Icon = new Image { Source = new System.Windows.Media.Imaging.BitmapImage(new Uri("./Resources/Icon/table.png", UriKind.Relative)) };
|
||
reNameItem.Click += ReNameItem_Click; ;
|
||
|
||
menu.Items.Add(ProMuItem);
|
||
menu.Items.Add(menuItem);
|
||
menu.Items.Add(reNameItem);
|
||
|
||
return menu;
|
||
}
|
||
|
||
private void ReNameItem_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
TreeNodeEdit edit = Utily.SearchVisualTree<TreeNodeEdit>((sender as MenuItem).Tag as DependencyObject) as TreeNodeEdit;
|
||
if (edit != null)
|
||
edit.IsInEditMode = true;
|
||
}
|
||
|
||
private void ProMuItem_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
BlockInfo entity = (sender as MenuItem).Tag as BlockInfo;
|
||
ProSetting proSetting = new ProSetting();
|
||
proSetting.BindData(entity);
|
||
proSetting.ShowDialog();
|
||
}
|
||
|
||
private void delMenu_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
BlockInfo entity = (sender as MenuItem).Tag as BlockInfo;
|
||
|
||
BlockDAL.DeleteBlock(entity.Id);
|
||
|
||
BlockGroup blockGroup= blockGroups.Where(p => p.Id == entity.Groupid).FirstOrDefault();
|
||
blockGroup.Blocks.Remove(entity);
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show(ex.Message);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加矩形隧道截面
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void btsuidaoRect_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
string[] xy = ConfigurationManager.AppSettings["recLocation"].Split(',');
|
||
Shape drapShape = this.designControl.BlockManage.AddBlock("矩形轨道");
|
||
blockData = this.designControl.BlockManage.Blocks[drapShape.Name];
|
||
|
||
Point point = new Point();
|
||
Point point1 = new Point();
|
||
blockOpr.GetBlockPoints(blockData.Block, out point, out point1);
|
||
this.designControl.BlockManage.DragPoint = point;
|
||
this.designControl.BlockManage.CopyBlock(drapShape.Name);
|
||
this.designControl.BlockManage.MoveBlock(drapShape.Name, new Point() { X = double.Parse(xy[0]), Y = double.Parse(xy[1]) });
|
||
|
||
}
|
||
/// <summary>
|
||
/// 添加圆形隧道截面
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void btsuidaoCircle_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
string[] xy = ConfigurationManager.AppSettings["cirLocation"].Split(',');
|
||
|
||
Shape drapShape = this.designControl.BlockManage.AddBlock("圆形隧道");
|
||
blockData = this.designControl.BlockManage.Blocks[drapShape.Name];
|
||
|
||
Point point = new Point();
|
||
Point point1 = new Point();
|
||
blockOpr.ScaleRale = this.designControl.ScaleRale;
|
||
blockOpr.GetBlockPoints(blockData.Block, out point, out point1);
|
||
|
||
this.designControl.BlockManage.DragPoint = point;
|
||
this.designControl.BlockManage.CopyBlock(drapShape.Name);
|
||
this.designControl.BlockManage.MoveBlock(drapShape.Name, new Point() { X = double.Parse(xy[0]), Y = double.Parse(xy[1]) });
|
||
|
||
}
|
||
/// <summary>
|
||
/// 添加马啼形隧道截面
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void btsuidaomadixin_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
string[] xy = ConfigurationManager.AppSettings["madiLocation"].Split(',');
|
||
|
||
Shape drapShape = this.designControl.BlockManage.AddBlock("马蹄形隧道");
|
||
blockData = this.designControl.BlockManage.Blocks[drapShape.Name];
|
||
|
||
Point point = new Point();
|
||
Point point1 = new Point();
|
||
blockOpr.ScaleRale = this.designControl.ScaleRale;
|
||
blockOpr.GetBlockPoints(blockData.Block, out point, out point1);
|
||
|
||
this.designControl.BlockManage.DragPoint = point;
|
||
this.designControl.BlockManage.CopyBlock(drapShape.Name);
|
||
this.designControl.BlockManage.MoveBlock(drapShape.Name, new Point() { X= double.Parse(xy[0]), Y = double.Parse(xy[1]) });
|
||
}
|
||
#endregion
|
||
|
||
|
||
}
|
||
|
||
public class GroupDelConvert : IValueConverter
|
||
{
|
||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||
{
|
||
if (value.ToString() == "隧道模板")
|
||
{
|
||
return "Collapsed";
|
||
}
|
||
else
|
||
{
|
||
return "Visible";
|
||
}
|
||
|
||
}
|
||
|
||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||
{
|
||
return "";
|
||
}
|
||
}
|
||
}
|