410 lines
13 KiB
C#
410 lines
13 KiB
C#
using MainShell.AlgorithmCalib.Model;
|
||
using MainShell.AlgorithmCalib.Service;
|
||
using MainShell.Common;
|
||
using MainShell.Common.Display.ViewModel;
|
||
using MainShell.Filewritable;
|
||
using MainShell.Hardware;
|
||
using MainShell.Motion;
|
||
using Maxwell.SemiFramework.DefaultConfig.Vision;
|
||
using Maxwell.SemiFramework.WaferCalibration.View;
|
||
using Maxwell.SemiFramework.WaferCalibration.ViewModel;
|
||
using MaxwellControl.Tools;
|
||
using MaxwellFramework.Core.Interfaces;
|
||
using MwFramework.Controls.ControlCanvas.DrawingControl;
|
||
using MwFramework.Controls.ControlCanvas.Model;
|
||
using MwFramework.Device;
|
||
using MwFramework.ManagerService;
|
||
using SemiconductorVisionAlgorithm.SemiParams;
|
||
using SemiconductorVisionAlgorithm.SemiWaferRecip;
|
||
using Stylet;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows;
|
||
using System.Windows.Threading;
|
||
using CameraAxisViewModel = MainShell.Common.Display.ViewModel.CameraAxisViewModel;
|
||
using Point = SemiconductorVisionAlgorithm.SemiParams.Point;
|
||
|
||
namespace MainShell.AlgorithmCalib.ViewModel
|
||
{
|
||
public class CameraFusionCalibViewModel:Screen,IPage
|
||
{
|
||
private bool _stopMotion = false;
|
||
public string Name { get; set; } = "CameraFusionCalib";
|
||
public string CalibName { get; set; }
|
||
|
||
public string CameraName { get; set; }
|
||
|
||
private readonly FusionCalibMotionService _fusionCalibMotionService;
|
||
|
||
private HardwareManager _hardware;
|
||
|
||
private DelegateBase _motion = new DelegateBase();
|
||
public DelegateBase Motion
|
||
{
|
||
get
|
||
{
|
||
return _motion;
|
||
}
|
||
set
|
||
{
|
||
_motion = value;
|
||
OnPropertyChanged(nameof(Motion));
|
||
}
|
||
}
|
||
|
||
private CameraAxisViewModel _cameraAxisViewModelSevice = new CameraAxisViewModel();
|
||
public CameraAxisViewModel CameraAxisViewModelSevice
|
||
{
|
||
get { return _cameraAxisViewModelSevice; }
|
||
set
|
||
{
|
||
_cameraAxisViewModelSevice = value;
|
||
OnPropertyChanged(nameof(CameraAxisViewModelSevice));
|
||
}
|
||
}
|
||
|
||
private FusionCalibParItem _wsFusionCalibParItem = new FusionCalibParItem();
|
||
public FusionCalibParItem WsFusionCalibParItem
|
||
{
|
||
get { return _wsFusionCalibParItem; }
|
||
set
|
||
{
|
||
_wsFusionCalibParItem = value;
|
||
OnPropertyChanged(nameof(WsFusionCalibParItem));
|
||
}
|
||
}
|
||
|
||
private CameraFusionCalibViewModel _service;
|
||
public CameraFusionCalibViewModel Service
|
||
{
|
||
get { return _service; }
|
||
set
|
||
{
|
||
_service = value;
|
||
NotifyOfPropertyChange();
|
||
}
|
||
}
|
||
|
||
public CameraFusionCalibViewModel()
|
||
{
|
||
|
||
}
|
||
|
||
private bool _isInitialized = false;
|
||
|
||
public void viewLoad()
|
||
{
|
||
base.OnViewLoaded();
|
||
|
||
if (_isInitialized)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (_hardware != null)
|
||
{
|
||
_cameraAxisViewModelSevice = new CameraAxisViewModel();
|
||
_cameraAxisViewModelSevice.CameraAxisDevices.HardwareDeviceList = _hardware.CameraAxisManager.TopPositionCameraAxisDevices;
|
||
NotifyOfPropertyChange(nameof(CameraAxisViewModelSevice));
|
||
}
|
||
|
||
//RebuildModuleViewModels();
|
||
_isInitialized = true;
|
||
}
|
||
|
||
public void viewUnLoad()
|
||
{
|
||
|
||
}
|
||
|
||
public CameraFusionCalibViewModel(HardwareManager hardware, FusionCalibMotionService fusionCalibMotionService)
|
||
{
|
||
_hardware = hardware;
|
||
_fusionCalibMotionService = fusionCalibMotionService ?? throw new ArgumentNullException(nameof(fusionCalibMotionService));
|
||
|
||
}
|
||
|
||
public static CameraFusionCalibViewModel Create(string name,string cameraName, List<HardwareDevice> device, HardwareManager hardware, FusionCalibMotionService motion)
|
||
{
|
||
var vm = new CameraFusionCalibViewModel(hardware,motion);
|
||
vm.Initialize(name, device);
|
||
return vm;
|
||
}
|
||
|
||
private void Initialize(string cameraName, List<HardwareDevice> device)
|
||
{
|
||
CameraName = cameraName;
|
||
Name = cameraName;
|
||
//Hardware = device;
|
||
//FileSaveDir = Path.Combine(Paths.CalibSettingPath, "bottomCamera");
|
||
var paramList = IoC.Get<IParameterManager>() as IParamList;
|
||
|
||
Service = new CameraFusionCalibViewModel();
|
||
//Service.IsShowSolidLine = true;
|
||
//Service.ShapeThickness = 1;
|
||
//Service.DrawInConcurrency = false;
|
||
//Service.IsAxisControlLDBVisible = Visibility.Visible;
|
||
}
|
||
|
||
|
||
public void btnMoveWSCalibPosPosition()
|
||
{
|
||
System.Threading.Tasks.Task.Factory.StartNew(() =>
|
||
{
|
||
try
|
||
{
|
||
_fusionCalibMotionService.SafeMove(_hardware.Axis_X1, WsFusionCalibParItem.MoveAxisPos);
|
||
_fusionCalibMotionService.MoveWsAvoidance(WsFusionCalibParItem.ApproachXPos, WsFusionCalibParItem.ApproachYPos);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
});
|
||
}
|
||
|
||
public void btnApproachWSCalibPosition()
|
||
{
|
||
System.Threading.Tasks.Task.Factory.StartNew(() =>
|
||
{
|
||
try
|
||
{
|
||
|
||
//if (FindPointWSCircle())
|
||
{
|
||
WsFusionCalibParItem.ApproachXPos = _hardware.Axis_X2.State.ActualPos;
|
||
WsFusionCalibParItem.ApproachYPos = _hardware.Axis_Y1.State.ActualPos;
|
||
MessageBox.Show($"对齐值,X2:{WsFusionCalibParItem.ApproachXPos},Y1:{WsFusionCalibParItem.ApproachYPos}");
|
||
}
|
||
//else
|
||
//{
|
||
// MessageBox.Show("对齐失败!");
|
||
//}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
});
|
||
}
|
||
|
||
public void btnCalculateCameraPosition()
|
||
{
|
||
try
|
||
{
|
||
//起点覆盖标定范围,起点往负方向6mm
|
||
int offset = -10;
|
||
double X2MinPos = 0;
|
||
_hardware.Axis_X2.GetSoftMel(ref X2MinPos);
|
||
var delx = WsFusionCalibParItem.ApproachXPos - X2MinPos + offset;
|
||
WsFusionCalibParItem.CameraAxisPos = WsFusionCalibParItem.MoveAxisPos - delx;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
}
|
||
|
||
public void btnSetCameraPosition()
|
||
{
|
||
|
||
var result = MwMessageBox.Show("是否使用当前位置?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Information);
|
||
if (result == MessageBoxResult.Yes)
|
||
{
|
||
try
|
||
{
|
||
WsFusionCalibParItem.CameraAxisPos = _hardware.Axis_X1.State.ActualPos;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
public void btnMoveCameraPosition()
|
||
{
|
||
var result = MwMessageBox.Show("是否移动到该点?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Information);
|
||
if (result == MessageBoxResult.Yes)
|
||
{
|
||
System.Threading.Tasks.Task.Factory.StartNew(() =>
|
||
{
|
||
try
|
||
{
|
||
_fusionCalibMotionService.SafeMove(_hardware.Axis_X1, WsFusionCalibParItem.CameraAxisPos);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
});
|
||
|
||
}
|
||
}
|
||
|
||
public void btnCalculateWSPosition()
|
||
{
|
||
try
|
||
{
|
||
//起点覆盖标定范围,起点往负方向6mm
|
||
int offset = -10;
|
||
double X2MinPos = 0;
|
||
_hardware.Axis_X2.GetSoftMel(ref X2MinPos);
|
||
|
||
var delx = WsFusionCalibParItem.ApproachXPos - X2MinPos + offset;
|
||
WsFusionCalibParItem.CameraAxisPos = WsFusionCalibParItem.MoveAxisPos - delx;
|
||
|
||
double x11Offset = WsFusionCalibParItem.CameraAxisPos - WsFusionCalibParItem.MoveAxisPos;
|
||
WsFusionCalibParItem.StartX = WsFusionCalibParItem.ApproachXPos + x11Offset;
|
||
WsFusionCalibParItem.StartY = WsFusionCalibParItem.ApproachYPos;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
}
|
||
|
||
public void btnSetWaferStartPosition()
|
||
{
|
||
var result = MwMessageBox.Show("是否使用当前位置?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Information);
|
||
if (result == MessageBoxResult.Yes)
|
||
{
|
||
System.Threading.Tasks.Task.Factory.StartNew(() =>
|
||
{
|
||
try
|
||
{
|
||
WsFusionCalibParItem.StartX = _hardware.Axis_X2.State.ActualPos;
|
||
WsFusionCalibParItem.StartY = _hardware.Axis_Y1.State.ActualPos;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
});
|
||
|
||
}
|
||
}
|
||
|
||
public void btnMoveWaferStartPosition()
|
||
{
|
||
var result = MwMessageBox.Show("是否移动到该点?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Information);
|
||
if (result == MessageBoxResult.Yes)
|
||
{
|
||
try
|
||
{
|
||
_fusionCalibMotionService.MoveWsAvoidance(WsFusionCalibParItem.StartX, WsFusionCalibParItem.StartY);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
public void btnMoveToCenter()
|
||
{
|
||
System.Threading.Tasks.Task.Factory.StartNew(() =>
|
||
{
|
||
try
|
||
{
|
||
//if (ApproachPointWS(1))
|
||
//{
|
||
// CameraWaferFusionCalibrationItem.WaferStartVerifyX = _gs.Axis_X21.State.ActualPos;
|
||
// CameraWaferFusionCalibrationItem.WaferStartVerifyY = _gs.Axis_Y21.State.ActualPos;
|
||
// MwMessageBox.Show("中心对齐完成");
|
||
//}
|
||
//else
|
||
//{
|
||
// MwMessageBox.Show("逼近失败!");
|
||
//}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
});
|
||
}
|
||
|
||
public void btnStart()
|
||
{
|
||
try
|
||
{
|
||
var result = MwMessageBox.Show("是否开始?", "确认开始", MessageBoxButton.YesNo, MessageBoxImage.Information);
|
||
if (result == MessageBoxResult.Yes)
|
||
{
|
||
//CameraWaferFusionCalibrationItem.AxisAndPixelPointItemList.Clear();
|
||
FusionCalib(false);
|
||
}
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
}
|
||
|
||
public void btnStop()
|
||
{
|
||
try
|
||
{
|
||
var result = MwMessageBox.Show("是否开始?", "确认开始", MessageBoxButton.YesNo, MessageBoxImage.Information);
|
||
if (result == MessageBoxResult.Yes)
|
||
{
|
||
Motion.Cancel();
|
||
_stopMotion = true;
|
||
}
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
|
||
}
|
||
}
|
||
|
||
private void FusionCalib(bool isRecheck, bool isAsyn = true)
|
||
{
|
||
Motion = (DelegateBase)TaskManager.Instance.GetIntance(typeof(FusionCalibTask));
|
||
FusionCalibTask cameraFusionCalibration = Motion as FusionCalibTask;
|
||
if (cameraFusionCalibration != null)
|
||
{
|
||
cameraFusionCalibration.Rectangle = GetRectangle();
|
||
}
|
||
TaskManager.Instance.AsyncStart(Motion, new object[] { });
|
||
}
|
||
|
||
private Rectangle1 GetRectangle()
|
||
{
|
||
var region = CameraAxisViewModelSevice.Regions;
|
||
Rectangle rectangle = null;
|
||
Rectangle1 r = null;
|
||
if (region != null && region.Count > 0)
|
||
{
|
||
RectRegion rect = region[0].Region as RectRegion;
|
||
double start_x = rect.CenterPoint.X - rect.Width / 2;
|
||
double start_y = rect.CenterPoint.Y - rect.Height / 2;
|
||
double end_x = rect.CenterPoint.X + rect.Width / 2;
|
||
double end_y = rect.CenterPoint.Y + rect.Height / 2;
|
||
rectangle = new Rectangle(new System.Windows.Point(start_y, start_x), new System.Windows.Point(end_y, end_x));
|
||
r = new Rectangle1();
|
||
r.Start_X = rectangle.StartPoint.X;
|
||
r.Start_Y = rectangle.StartPoint.Y;
|
||
r.End_X = rectangle.EndPoint.X;
|
||
r.End_Y = rectangle.EndPoint.Y;
|
||
}
|
||
else
|
||
{
|
||
throw new Exception("请添加矩形!");
|
||
}
|
||
|
||
return r;
|
||
}
|
||
}
|
||
|
||
}
|
||
|