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

170 lines
5.6 KiB
C#

using netDxf;
using System;
using System.Collections.Generic;
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.Navigation;
using System.Windows.Shapes;
namespace MetroGauges.Controls
{
/// <summary>
/// GeoWidget.xaml 的交互逻辑
/// </summary>
public partial class GeoWidget : UserControl
{
private string m_BlockPath;
private DesignControl m_designCtrl;
public DesignControl DesignCtrl {
get
{
return m_designCtrl;
}
}
public string BlockName { get; set; }
public GeoWidget()
{
InitializeComponent();
this.MouseLeftButtonUp += GeoWidget_MouseLeftButtonUp; //拦截,不拦截会影响到画布拖动。
this.Loaded += GeoWidget_Loaded;
m_BlockPath = AppDomain.CurrentDomain.BaseDirectory + "Blocks\\";
}
private void GeoWidget_Loaded(object sender, RoutedEventArgs e)
{
m_designCtrl = this.geoThumb.Template.FindName("designCtrl", this.geoThumb) as DesignControl;
m_designCtrl.CancelMove = true;
m_designCtrl.ScaleVisble = false;
//LoadBlockData();
}
private void GeoWidget_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}
public void LoadBlockData()
{
DxfDocument dxf = DxfDocument.Load(m_BlockPath + BlockName+".dxf");
if (dxf.Blocks.Count > 0 && dxf.Blocks.Contains(BlockName))
{
netDxf.Blocks.Block block = dxf.Blocks[BlockName];
foreach (netDxf.Entities.EntityObject item in block.Entities)
{
switch (item.Type.ToString())
{
case "Line":
AddLine(item);
break;
case "Polyline":
case "LightWeightPolyline":
AddPolyline(item);
break;
}
}
}
else
{
MessageBox.Show("找不到块数据", "错误");
}
}
public void AddLine(netDxf.Entities.EntityObject line)
{
double xyRate = this.m_designCtrl.ScaleRale;
Line drawline = new Line();
netDxf.Entities.Line dataLine = line as netDxf.Entities.Line;
drawline.X1 = dataLine.StartPoint.X / xyRate;
drawline.Y1 = -dataLine.StartPoint.Y / xyRate;
drawline.X2 = dataLine.EndPoint.X / xyRate;
drawline.Y2 = -dataLine.EndPoint.Y / xyRate;
drawline.Stroke = Brushes.White;
drawline.StrokeThickness = 1;
m_designCtrl.canvasDesign.Children.Add(drawline);
}
public void AddPolyline(netDxf.Entities.EntityObject line)
{
double xyRate = this.m_designCtrl.ScaleRale;
PointCollection ptcol = new PointCollection();
switch (line.Type.ToString())
{
case "Polyline":
netDxf.Entities.Polyline polyline = line as netDxf.Entities.Polyline;
foreach (netDxf.Entities.PolylineVertex item in polyline.Vertexes)
{
ptcol.Add(new Point() { X = item.Location.X / xyRate, Y = -item.Location.Y / xyRate });
}
break;
case "LightWeightPolyline":
netDxf.Entities.LwPolyline lwline = line as netDxf.Entities.LwPolyline;
foreach (var item in lwline.Vertexes)
{
ptcol.Add(new Point() { X = item.Location.X / xyRate, Y = -item.Location.Y / xyRate });
}
if (lwline.IsClosed)
{
Vector2 last = lwline.Vertexes[0].Location;
ptcol.Add(new Point() { X = last.X / xyRate, Y = -last.Y / xyRate });
}
break;
}
Polyline pl = new Polyline
{
Stroke = Brushes.White,
StrokeThickness = 1,
Points = ptcol,
};
this.m_designCtrl.canvasDesign.Children.Add(pl);
}
public void AddCircle(Ellipse circle)
{
m_designCtrl.canvasDesign.Children.Add(circle);
}
public void AddRectangle(Rectangle rectangle)
{
m_designCtrl.canvasDesign.Children.Add(rectangle);
}
public void AddText1(String text)
{
TextBlock textBlock = new TextBlock();
textBlock.Text = text;
textBlock.Foreground = Brushes.White;
m_designCtrl.canvasDesign.Children.Add(textBlock);
}
/// <summary>
/// 移动控件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void geoThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
double X = Canvas.GetLeft(this);
double Y = Canvas.GetTop(this);
Canvas.SetLeft(this, X + e.HorizontalChange);
Canvas.SetTop(this, Y + e.VerticalChange);
//isMoved = true;
}
}
}