using SA_LTT.Info.RecipeInfo;
|
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 SA_LTT_UI.Screen
|
{
|
/// <summary>
|
/// Interaction logic for WaferProcessPointView.xaml
|
/// </summary>
|
public partial class WaferProcessPointView : UserControl
|
{
|
public delegate void PointClickedEvent(Point clickedPoint, double width, double height);
|
|
public List<Polygon> ProcessAreas= new List<Polygon>();
|
Point Center = new Point(200, 200);
|
|
private double _radius;
|
private double _primaryFlat;
|
public event PointClickedEvent PointClicked;
|
|
private Rectangle _clickedLocation = new Rectangle();
|
public double PrimaryFlat
|
{
|
get
|
{
|
return _primaryFlat;
|
}
|
|
set
|
{
|
_primaryFlat = value;
|
RectPrimaryFlat.Height = (Radius - _primaryFlat) * _sizeRatio;
|
RectPrimaryFlat.Margin = new Thickness(0, -RectPrimaryFlat.Height, 0, 0);
|
}
|
}
|
|
public double Radius
|
{
|
get
|
{
|
return _radius;
|
}
|
|
set
|
{
|
_sizeRatio = 200 / value;
|
_radius = value;
|
}
|
}
|
|
private double _sizeRatio;
|
|
public WaferProcessPointView(double radius = 75, double primaryFlat = 70)
|
{
|
InitializeComponent();
|
Radius = radius;
|
PrimaryFlat = primaryFlat;
|
|
_clickedLocation.Fill = new SolidColorBrush(Colors.Lime);
|
_clickedLocation.Opacity = 0.7;
|
_clickedLocation.Height = 1;
|
_clickedLocation.Width = 1;
|
}
|
|
public void AddProcessArea(double processStartY, double processEndY, Coord[] processPoint)
|
{
|
Polygon polygon = new Polygon();
|
polygon.Fill = new SolidColorBrush(Colors.Red);
|
polygon.Opacity = 0.3;
|
|
processStartY = double.Parse($"{processStartY:F4}");
|
processEndY = double.Parse($"{processEndY:F4}");
|
List<Point> topPoint = new List<Point>();
|
List<Point> bottomPoint = new List<Point>();
|
Point point;
|
double middlePoint = (processStartY + processEndY) / 2;
|
middlePoint = double.Parse($"{middlePoint:F4}");
|
foreach (Coord coord in processPoint)
|
{
|
double pointX = double.Parse($"{Center.X + coord.X * _sizeRatio:F4}");
|
double pointY = double.Parse($"{Center.Y - coord.Y * _sizeRatio:F4}");
|
point = new Point(pointX, pointY);
|
|
if(processStartY >= 0 && processEndY >= 0) //가공위치가 y축 중심 보다 위에 있을 때
|
{
|
if (coord.Y > processEndY)
|
{
|
topPoint.Add(point);
|
}
|
else
|
{
|
bottomPoint.Add(point);
|
}
|
}
|
else if(processStartY < 0 && processEndY < 0) //가공위치가 y축 중심 보다 밑에 있을 때
|
{
|
if (coord.Y < processStartY)
|
{
|
bottomPoint.Add(point);
|
}
|
else
|
{
|
topPoint.Add(point);
|
}
|
}
|
else //가공위치가 y축 중심을 지나갈 때
|
{
|
if (coord.Y >= middlePoint)
|
{
|
topPoint.Add(point);
|
}
|
else
|
{
|
bottomPoint.Add(point);
|
}
|
}
|
}
|
|
bottomPoint.Reverse();
|
|
foreach(Point coord in topPoint)
|
{
|
polygon.Points.Add(coord);
|
}
|
|
foreach (Point coord in bottomPoint)
|
{
|
polygon.Points.Add(coord);
|
}
|
ProcessAreas.Add(polygon);
|
MainScreen.Children.Add(polygon);
|
}
|
|
public void HighlightClear()
|
{
|
foreach (Polygon poly in ProcessAreas)
|
{
|
poly.Fill = new SolidColorBrush(Colors.Red);
|
}
|
}
|
|
public void HighlightProcessAreas(int index)
|
{
|
if (ProcessAreas.Count < index + 1) return;
|
|
ProcessAreas[index].Fill = new SolidColorBrush(Colors.Blue);
|
}
|
|
public void DeleteProcessArea(Polygon processArea)
|
{
|
MainScreen.Children.Remove(processArea);
|
|
ProcessAreas.Remove(processArea);
|
}
|
|
public void ClearProcessArea()
|
{
|
foreach(Polygon processArea in ProcessAreas)
|
{
|
MainScreen.Children.Remove(processArea);
|
}
|
MainScreen.Children.Remove(_clickedLocation);
|
|
ProcessAreas.Clear();
|
}
|
|
private void UserControl_MouseDown(object sender, MouseButtonEventArgs e)
|
{
|
Point clickPoint = e.GetPosition((IInputElement)sender);
|
|
double startX = (clickPoint.X - Center.X) / _sizeRatio;
|
double startY = (Center.Y - clickPoint.Y) / _sizeRatio;
|
|
startX = double.Parse($"{startX:F4}");
|
startY = double.Parse($"{startY:F4}");
|
|
SetClickedLocationPosition(startX, startY, _clickedLocation.Width / _sizeRatio, _clickedLocation.Height / _sizeRatio);
|
|
Point point = new Point(startX, startY);
|
|
PointClicked?.Invoke(point , 0, 0);
|
}
|
|
public void SetClickedLocationPosition(double startX, double startY, double width = 3, double height = 3)
|
{
|
double pointX = double.Parse($"{Center.X + startX * _sizeRatio:F4}");
|
double pointY = double.Parse($"{Center.Y - startY * _sizeRatio:F4}");
|
|
_clickedLocation.Width = width * _sizeRatio;
|
_clickedLocation.Height = height * _sizeRatio;
|
|
_clickedLocation.Margin = new Thickness(pointX, pointY, 0, 0);
|
|
if (MainScreen.Children.Contains(_clickedLocation) == false)
|
{
|
MainScreen.Children.Add(_clickedLocation);
|
}
|
}
|
|
private void UserControl_MouseMove(object sender, MouseEventArgs e)
|
{
|
if(e.LeftButton == MouseButtonState.Pressed)
|
{
|
Point clickPoint = e.GetPosition((IInputElement)sender);
|
|
double startX = (_clickedLocation.Margin.Left - Center.X) / _sizeRatio;
|
double startY = (Center.Y - _clickedLocation.Margin.Top) / _sizeRatio;
|
|
double endX = (clickPoint.X - Center.X) / _sizeRatio;
|
double endY = (Center.Y - clickPoint.Y) / _sizeRatio;
|
|
double width = endX - startX;
|
double height = startY - endY;
|
|
if (width < 0)
|
{
|
width = 0;
|
}
|
|
if (height < 0)
|
{
|
height = 0;
|
}
|
|
PointClicked?.Invoke(new Point(startX, startY), width, height);
|
SetClickedLocationPosition(startX, startY, width, height);
|
}
|
}
|
}
|
}
|