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 CyberX8_Themes.UserControls { /// /// Axes2D.xaml 的交互逻辑 /// public partial class Axes2D : UserControl { bool flag = false; public Axes2D() { InitializeComponent(); } private void axes_Loaded(object sender, RoutedEventArgs e) { //仅触发一次绘制 不允许重复绘制 if (!flag) { DrawAxisAndText(); flag = true; } //DrawPoint(); } //晶圆实际半径 public double WaferRadius { get { return (double)GetValue(WaferRadiusProperty); } set { SetValue(WaferRadiusProperty, value); } } //传送安全半径阈值 public double SafeRadius { get { return (double)GetValue(SafeRadiusProperty); } set { SetValue(SafeRadiusProperty, value); } } public double AxesWidth { get { return (double)GetValue(AxesWidthProperty); } set { SetValue(AxesWidthProperty, value); } } public double AxesHeight { get { return (double)GetValue(AxesHeightProperty); } set { SetValue(AxesHeightProperty, value); } } /// /// 存储x,y,点位信息的List /// public List<(double x, double y, int arm, string info)> PositionAndKey { get { return (List<(double x, double y, int arm, string info)>)GetValue(PositionAndKeyProperty); } set { SetValue(PositionAndKeyProperty, value); //在更新的同时 对点位数据进行重新绘制 if (value != null) DrawPoint(); } } private void DrawPoint() { List needdelete = new List(); foreach (UIElement child in CanvasInPath.Children) { if (child.GetType() == typeof(Ellipse)) needdelete.Add(child); } foreach (UIElement i in needdelete) CanvasInPath.Children.Remove(i); float rc = 5; foreach ((double x, double y, int arm, string info) point in PositionAndKey) { Ellipse ellipse = new Ellipse() { Width = rc, Height = rc, ToolTip = point.info, Fill = point.arm == 1 ? new SolidColorBrush(Colors.Blue) : new SolidColorBrush(Colors.Yellow), }; Canvas.SetZIndex(ellipse, 10);//显示层级 double bottom = (point.y / 10000 + 5) * (CanvasInPath.Height) / 10 - rc / 2 - .8; double left = (point.x / 10000 + 5) * (CanvasInPath.Width) / 10 - rc / 2 + .4; Canvas.SetLeft(ellipse, left);//x位置 Canvas.SetBottom(ellipse, bottom);//y位置 CanvasInPath.Children.Add(ellipse); } //晶圆半径示意图 if (WaferRadius > 0) { double radius = (WaferRadius / 100) * (CanvasInPath.Width) / 10 * 2; Ellipse wafer = new Ellipse() { Width = radius, Height = radius, Stroke = new SolidColorBrush(Colors.Blue), StrokeThickness = 1 }; Canvas.SetLeft(wafer, (WaferRadius / 100 + 5) * (CanvasInPath.Width) / 10 - radius); Canvas.SetTop(wafer, (WaferRadius / 100 + 5) * (CanvasInPath.Height) / 10 - radius); Canvas.SetZIndex(wafer, 1); CanvasInPath.Children.Add(wafer); } if (SafeRadius > 0) { double radius = SafeRadius / 100 * (CanvasInPath.Width) / 10 * 2; Ellipse safer = new Ellipse() { Width = radius, Height = radius, Stroke = new SolidColorBrush(Colors.Yellow), StrokeThickness = 1 }; Canvas.SetLeft(safer, (SafeRadius / 100 + 5) * (CanvasInPath.Width) / 10 - radius); Canvas.SetTop(safer, (SafeRadius / 100 + 5) * (CanvasInPath.Height) / 10 - radius); Canvas.SetZIndex(safer, 1); CanvasInPath.Children.Add(safer); } } public static readonly DependencyProperty AxesWidthProperty = DependencyProperty.Register( "AxesWidth", typeof(double), typeof(Axes2D)); public static readonly DependencyProperty AxesHeightProperty = DependencyProperty.Register( "AxesHeight", typeof(double), typeof(Axes2D)); public static readonly DependencyProperty WaferRadiusProperty = DependencyProperty.Register( "WaferRadius", typeof(double), typeof(Axes2D)); public static readonly DependencyProperty SafeRadiusProperty = DependencyProperty.Register( "SafeRadius", typeof(double), typeof(Axes2D)); public static readonly DependencyProperty PositionAndKeyProperty = DependencyProperty.Register( "PositionAndKey", typeof(List<(double, double, int, string)>), typeof(Axes2D), new PropertyMetadata(null, OnDataPropertyChanged)); private static void OnDataPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is Axes2D axes2) { if (e.NewValue is List<(double x, double y, int arm, string info)> postiondata) { axes2.PositionAndKey = postiondata; } } } private void DrawAxisAndText() { CanvasInPath.Width = AxesWidth; CanvasInPath.Height = AxesHeight; //笛卡尔坐标系 for (int i = 0; i < 11; ++i) { //坐标线 Line lineX = new Line() { X1 = (double)((decimal)CanvasInPath.Width / 10) * i, X2 = (double)((decimal)CanvasInPath.Width / 10) * i, Y1 = 0, Y2 = CanvasInPath.Height, Stroke = new SolidColorBrush(Colors.DarkGray), StrokeThickness = 1, }; Line lineY = new Line() { X1 = 0, X2 = CanvasInPath.Width, Y1 = (double)((decimal)CanvasInPath.Height / 10) * i, Y2 = (double)((decimal)CanvasInPath.Height / 10) * i, Stroke = new SolidColorBrush(Colors.DarkGray), StrokeThickness = 1, }; //中心和边缘线换色加重 if (i == 0 || i == 10 || i == 5) { lineX.Stroke = new SolidColorBrush(Colors.Black); lineY.Stroke = new SolidColorBrush(Colors.Black); lineX.StrokeThickness = 1; lineY.StrokeThickness = 1; } else { lineX.StrokeDashArray = new DoubleCollection() { 2, 2 }; lineY.StrokeDashArray = new DoubleCollection() { 2, 2 }; } Canvas.SetZIndex(lineX, 0); Canvas.SetZIndex(lineY, 0); CanvasInPath.Children.Add(lineX); CanvasInPath.Children.Add(lineY); //刻度 if (i < 11) { TextBlock xblock = new TextBlock(); xblock.Foreground = new SolidColorBrush(Colors.Black); xblock.FontSize = 10; TranslateTransform translateTransform = new TranslateTransform(0, xblock.ActualHeight); ScaleTransform scaleTransform = new ScaleTransform(); scaleTransform.ScaleY = -1; xblock.Text = (i - 5) + ""; Canvas.SetLeft(xblock, TransFromX((i) * 10)); Canvas.SetTop(xblock, CanvasInPath.Width + 12); CanvasInPath.Children.Add(xblock); Canvas.SetZIndex(xblock, 1); TextBlock yblock = new TextBlock(); yblock.Foreground = new SolidColorBrush(Colors.Black); yblock.FontSize = 10; translateTransform = new TranslateTransform(0, yblock.ActualHeight); scaleTransform = new ScaleTransform(); scaleTransform.ScaleY = -1; yblock.Text = -(i - 5) + ""; Canvas.SetLeft(yblock, -12); Canvas.SetTop(yblock, TransFromY((i) * 10)); CanvasInPath.Children.Add(yblock); Canvas.SetZIndex(yblock, 1); } } } private double TransFromX(double value) { return (double)(((decimal)value / 10) * (decimal)(CanvasInPath.Width) / 10 - (decimal)5); } private double TransFromY(double value) { return (double)(((decimal)value / 10) * (decimal)(CanvasInPath.Height) / 10 - (decimal)3); } protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); } } }