using MathNet.Numerics.LinearAlgebra; using NPOI.SS.Formula.Functions; using OpenCvSharp; using Prism.Commands; using Prism.Events; using Prism.Ioc; using Prism.Mvvm; using Prism.Regions; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows; using Team.FFFeederService.Interfaces; using TeamAAS_VP.Events; using TeamAAS_VP.Core; using TeamAAS_VP.Interfaces; using TeamAAS_VP.Models; using static NPOI.POIFS.Crypt.CryptoFunctions; using TeamAAS_VP; using Cognex.VisionPro; using System.Drawing; using Cognex.VisionPro.ToolBlock; using TeamAAS_VP.Resources.Languages; using TeamAAS_VP.Models.Calibration; using TeamAAS_VP.Models.Robot; using TeamAAS_VP.Services; using System.Threading; namespace TeamAAS_VP.ViewModels.Calibration { public class CalibrationAutoViewModel : BindableBase, IConfirmNavigationRequest { IRegionManager _regionManager; IRegionNavigationService _regionNavigationService; IContainerProvider _container; IDialogService _dialogService; IEventAggregator _eventAggregator; IRobotService _robotService; IFeederService _feederService; ICameraService _cameraService; ISystemDatabaseService _systemDatabaseService; ICameraCalibrationService _cameraCalibrationService; private CancellationTokenSource _cts; #region 属性 private ICogImage _Image; public ICogImage Image { get { return _Image; } set { SetProperty(ref _Image, value); } } private Cognex.VisionPro.CogGraphicCollection _Graphic; public Cognex.VisionPro.CogGraphicCollection Graphic { get { return _Graphic; } set { SetProperty(ref _Graphic, value); } } private CalibrationInfo _SelectCalibration; public CalibrationInfo SelectCalibration { get { return _SelectCalibration; } set { SetProperty(ref _SelectCalibration, value); } } public Management management { get; set; } public IRobot Robot { get; set; } public IVoiceCoilMotorFeeder Feeder { get; set; } private bool _IsRunning = true; public bool IsRunning { get { return _IsRunning; } set { SetProperty(ref _IsRunning, value); } } private ICamera _Camera; public ICamera Camera { get { return _Camera; } set { SetProperty(ref _Camera, value); } } #endregion #region 命令 private DelegateCommand _LoadedCommand; public DelegateCommand LoadedCommand => _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand)); private DelegateCommand _NextCommand; public DelegateCommand NextCommand => _NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand).ObservesCanExecute(() => IsRunning)); private DelegateCommand _BackCommand; public DelegateCommand BackCommand => _BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand).ObservesCanExecute(() => IsRunning)); private DelegateCommand _StartCalibCommand; public DelegateCommand StartCalibCommand => _StartCalibCommand ?? (_StartCalibCommand = new DelegateCommand(ExecuteStartCalibCommand).ObservesCanExecute(() => IsRunning)); #endregion #region 事件 #endregion public CalibrationAutoViewModel(IRegionManager regionManager, IEventAggregator ea, IRegionNavigationService regionNavigationService, IContainerProvider container, IDialogService dialogService, IRobotService robotService, IFeederService feederService,ICameraService cameraService,ISystemDatabaseService systemDatabaseService, ICameraCalibrationService cameraCalibrationService) { _regionManager = regionManager; _regionNavigationService = regionNavigationService; _container = container; _dialogService = dialogService; _robotService = robotService; _eventAggregator = ea; _feederService = feederService; _cameraService = cameraService; _systemDatabaseService = systemDatabaseService; _cameraCalibrationService = cameraCalibrationService; } #region 方法 void ExecuteLoadedCommand() { try { if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } } catch (Exception ex) { LogHelper.WriteLogError(Lang.九点校准界面加载时出错, ex); MessageBox.Show(ex.ToString()); } } async void ExecuteStartCalibCommand() { try { if (MessageBox.Show(Lang.是否开始自动校准, $"{Lang.自动校准}", MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK) return; IsRunning = false; _cts=new CancellationTokenSource(); (bool IsSuccess, Matrix AffineTransformationMaterial, RobotPixelPoint[] NinePoint, CalibrationResult Result) = await _cameraCalibrationService.AutoNinePointCalibration(SelectCalibration, Robot, _cts.Token); if (!IsSuccess) { MessageBox.Show(Lang.相机校准失败, $"{Lang.自动校准}", MessageBoxButton.OK, MessageBoxImage.Warning); return; } SelectCalibration.AffineTransformationMaterial = AffineTransformationMaterial.ToArray(); SelectCalibration.CalibPoints = new System.Collections.ObjectModel.ObservableCollection(NinePoint); SelectCalibration.CalibrationResult = Result; DialogParameters parameters = new DialogParameters(); parameters.Add("Result", Result); _dialogService.Show("ShowCalibrationResult", parameters, rst => { //对话框关闭之后的回调函数,可以在这解析结果。 ButtonResult result1 = rst.Result; if (result1 == ButtonResult.OK) { NavigationParameters param = new NavigationParameters(); param.Add("SelectCalibration", SelectCalibration); _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationVerification",param); } }); } catch (Exception ex) { LogHelper.WriteLogError(Lang.九点校准时出错, ex); MessageBox.Show(ex.Message); } finally { try { if (_cts != null && !_cts.IsCancellationRequested) _cts.Cancel(); _cts?.Dispose(); _cts = null; } catch (Exception) { } IsRunning = true; } } /// /// 下一步 /// void ExecuteNextCommand() { NavigationParameters param = new NavigationParameters(); param.Add("SelectCalibration", SelectCalibration); _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationVerification", param); } /// /// 上一步 /// void ExecuteBackCommand() { NavigationParameters param = new NavigationParameters(); param.Add("SelectCalibration", SelectCalibration); if (SelectCalibration.CameraMount == Enums.CameraMount.MobileDown_XYPlatform) { if (SelectCalibration.CalibTechP0Mode == Enums.CalibTechP0Mode.CameraFindP0) { _regionManager.RequestNavigate("CalibrationRegionContext", "FixedUpCameraFindP0", param); return; } else { _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationTeachCenterPoint", param); } } else if (Robot.Brand == Enums.RobotBrand.XYZ_Platform) { _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationTeachCenterPoint", param); } else { _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationSelectTool", param); } } /// /// 相机拍照 /// /// private async Task<(bool IsSuccess, double X, double Y, double U, int ImageWidth, int ImageHeight)> CaptureAndProcess() { if (Feeder != null) { Feeder.OpenLight(); Feeder.SetLightTimeOut((ushort)SelectCalibration.Brightness); } await Task.Delay(200); //采集图像 if (Camera != null) { SelectCalibration.ToolBlock.Inputs["InputImage"].Value = Camera.Grab(); } App.Current.Dispatcher.Invoke(() => { Graphic = null; Image = (ICogImage)SelectCalibration.ToolBlock.Inputs["InputImage"].Value; }); SelectCalibration.ToolBlock.Run(); CogToolBlockTerminalCollection outputCollection = SelectCalibration.ToolBlock.Outputs; App.Current.Dispatcher.Invoke(() => { Graphic = outputCollection["Graphic"].Value as CogGraphicCollection; }); bool Found = (bool)(outputCollection["Found"].Value); if (Found) { var strpoints = outputCollection["Point"].Value.ToString(); string[] items = strpoints.Split(','); double x = double.Parse(items[0]); double y = double.Parse(items[1]); return (true, x, y, 0, Image.Width, Image.Height); } else { return (false, 0, 0, 0, Image.Width, Image.Height); } } #endregion #region 继承 /// /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。 /// /// /// public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { continuationCallback(true); } /// /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。 /// /// /// public async void OnNavigatedTo(NavigationContext navigationContext) { SelectCalibration = navigationContext.Parameters.GetValue("SelectCalibration"); if (SelectCalibration != null) { Robot = _robotService.GetRobot(SelectCalibration.RobotId); if (SelectCalibration.FeederId != Guid.Empty) { Feeder = _feederService.GetFeeder(SelectCalibration.FeederId); } } Camera = _cameraService.GetCamera(SelectCalibration.CameraID); _cameraCalibrationService.CaptureAndProcessCallback = null; _cameraCalibrationService.CaptureAndProcessCallback= CaptureAndProcess; } /// /// 是否允许导航到此视图模型。 /// /// /// public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } /// /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。 /// /// public void OnNavigatedFrom(NavigationContext navigationContext) { _cameraCalibrationService.CaptureAndProcessCallback = null; } #endregion private bool _IsAllowEdit = false; public bool IsAllowEdit { get { return _IsAllowEdit; } set { SetProperty(ref _IsAllowEdit, value); } } private void LoginChange(Models.User user) { if (user.userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } } } }