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

1128 lines
41 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 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 "";
}
}
}