Files
test_demo/MX-PD-盘古 - new/PanGu.DieBonderApp/MainShell/PageCalib/AlgorithmCalib/ViewModel/CameraFusionCalibViewModel.cs

410 lines
13 KiB
C#
Raw Normal View History

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;
}
}
}