using Cognex.VisionPro; using MaterialDesignThemes.Wpf; using MathNet.Numerics.LinearAlgebra; 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.Collections.ObjectModel; using System.Drawing; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows; using TeamAAS_VP.Controls; using TeamAAS_VP.Core; using TeamAAS_VP.Core.PLCs; using TeamAAS_VP.DxfModule; using TeamAAS_VP.Enums; using TeamAAS_VP.Events; using TeamAAS_VP.Interfaces; using TeamAAS_VP.Models; using TeamAAS_VP.Models.PLC; using TeamAAS_VP.Models.Robot; using TeamAAS_VP.Resources.Languages; using TeamAAS_VP.Services; using TeamAAS_VP.Views.Product; using static TeamAAS_VP.ViewModels.Product.AutoCorrectLockPointViewModel; namespace TeamAAS_VP.ViewModels.Product { public class PlcPointParamsViewModel : BindableBase, IConfirmNavigationRequest { IRegionManager _regionManager; IEventAggregator _eventAggregator; IContainerProvider _container; IDialogService _dialogService; IConfigService _configService; IRobotService _robotService; ISystemDatabaseService _systemDatabaseService; IRemoteCommandService _remoteCommandService; ICalibrationService _calibrationService; ICameraService _cameraService; CoordinateTransformer local = null; #region 属性 private ProductModel _SelectProduct; /// /// 选中的产品 /// public ProductModel SelectProduct { get { return _SelectProduct; } set { SetProperty(ref _SelectProduct, value); } } private PlcPoint _SelectedPoint; public PlcPoint SelectedPoint { get { return _SelectedPoint; } set { SetProperty(ref _SelectedPoint, value); } } private PlcPoint _selectedPointInDataGrid; public PlcPoint SelectedPointInDataGrid { get { return _selectedPointInDataGrid; } set { if (SetProperty(ref _selectedPointInDataGrid, value)) { SelectedPointInComboBox = value; // update command availability _MovePointUpCommand?.RaiseCanExecuteChanged(); _MovePointDownCommand?.RaiseCanExecuteChanged(); // 更新依赖可执行状态的命令 _TechPointCommand?.RaiseCanExecuteChanged(); _TechPointFinishCommand?.RaiseCanExecuteChanged(); _ExecuteMotion?.RaiseCanExecuteChanged(); _ExecuteMotionStop?.RaiseCanExecuteChanged(); } // 可以同步到 SelectPoint 属性 SelectedPoint = value; } } private PlcPoint _selectedPointInComboBox; public PlcPoint SelectedPointInComboBox { get { return _selectedPointInComboBox; } set { if (SetProperty(ref _selectedPointInComboBox, value)) { SelectedPointInDataGrid = value; } // 可以同步到 SelectPoint 属性 SelectedPoint = value; } } private ObservableCollection _Points = new ObservableCollection(); /// /// 点位集合 /// public ObservableCollection Points { get { return _Points; } set { SetProperty(ref _Points, value); } } private MotionCommand _SelectMotionCommand; /// /// 选中的运动指令 /// public MotionCommand SelectMotionCommand { get { return _SelectMotionCommand; } set { SetProperty(ref _SelectMotionCommand, value); } } public Management management { get; set; } private IRobot _Robot; public IRobot Robot { get { return _Robot; } set { SetProperty(ref _Robot, value); } } private int _SelectedIndex; public int SelectedIndex { get { return _SelectedIndex; } set { SetProperty(ref _SelectedIndex, value); } } private double _Distance = 1; public double Distance { get { return _Distance; } set { SetProperty(ref _Distance, value); try { if (Robot == null) { return; } _configService.UpdateRobotStepDistance(Robot.Id, value); } catch (Exception) { } } } private ObservableCollection _ProcedureModels; /// /// 流程集合 /// public ObservableCollection ProcedureModels { get { return _ProcedureModels; } set { SetProperty(ref _ProcedureModels, value); } } private ProcedureModel _SelectProcedure; /// /// 选中的流程 /// public ProcedureModel SelectProcedure { get { return _SelectProcedure; } set { SetProperty(ref _SelectProcedure, value); } } private float _LockPointStartZ; /// /// 批量设置锁付点的起始Z坐标 /// public float LockPointStartZ { get { return _LockPointStartZ; } set { SetProperty(ref _LockPointStartZ, value); } } private float _LockZDepth; /// /// 批量设置锁付点Z深度 /// public float LockZDepth { get { return _LockZDepth; } set { SetProperty(ref _LockZDepth, value); } } private float _LockXSpeed; /// /// 批量设置锁付点X轴速度 /// public float LockXSpeed { get { return _LockXSpeed; } set { SetProperty(ref _LockXSpeed, value); } } private float _LockYSpeed; /// /// 批量设置锁付点Y轴速度 /// public float LockYSpeed { get { return _LockYSpeed; } set { SetProperty(ref _LockYSpeed, value); } } private float _LockZSpeed; /// /// 批量设置锁付点Z轴速度 /// public float LockZSpeed { get { return _LockZSpeed; } set { SetProperty(ref _LockZSpeed, value); } } private float _LockUSpeed; /// /// 批量设置锁付点U轴速度 /// public float LockUSpeed { get { return _LockUSpeed; } set { SetProperty(ref _LockUSpeed, value); } } private float _LockVSpeed; /// /// 批量设置锁付点V轴速度 /// public float LockVSpeed { get { return _LockVSpeed; } set { SetProperty(ref _LockVSpeed, value); } } private float _LockWSpeed; /// /// 批量设置锁付点W轴速度 /// public float LockWSpeed { get { return _LockWSpeed; } set { SetProperty(ref _LockWSpeed, value); } } private float _LockZDescendSpeed; /// /// 批量设置锁付点Z轴下降速度 /// public float LockZDescendSpeed { get { return _LockZDescendSpeed; } set { SetProperty(ref _LockZDescendSpeed, value); } } private Int16 _LockFeederNumber; /// /// 批量设置锁付点供料器编号 /// public Int16 LockFeederNumber { get { return _LockFeederNumber; } set { SetProperty(ref _LockFeederNumber, value); } } private Int16 _LockScrewProgramNumber; /// /// 批量设置锁付点螺丝程序编号 /// public Int16 LockScrewProgramNumber { get { return _LockScrewProgramNumber; } set { SetProperty(ref _LockScrewProgramNumber, value); } } private bool _IsGrap; public bool IsGrap { get { return _IsGrap; } set { SetProperty(ref _IsGrap, value); } } private ObservableCollection _CameraList; public ObservableCollection CameraList { get { return _CameraList; } set { SetProperty(ref _CameraList, value); } } private CameraInfo _SelectedCamera; public CameraInfo SelectedCamera { get { return _SelectedCamera; } set { SetProperty(ref _SelectedCamera, value); if (value != null) { if (Camera != null) { if (Camera.IsGrabbing) { Camera.StopGrabbing(); } Camera.ImageCallbackEvent -= Camera_ImageCallbackEvent; } Camera = _cameraService.GetCamera(value.Id); Camera.ImageCallbackEvent += Camera_ImageCallbackEvent; } } } private ICamera _Camera; public ICamera Camera { get { return _Camera; } set { SetProperty(ref _Camera, value); } } private ICogImage _Image; public ICogImage Image { get { return _Image; } set { SetProperty(ref _Image, value); } } private string _Message; public string Message { get { return _Message; } set { SetProperty(ref _Message, value); } } private bool _IsLeftDrawerOpen; public bool IsLeftDrawerOpen { get { return _IsLeftDrawerOpen; } set { SetProperty(ref _IsLeftDrawerOpen, value); if (!value) { if (IsGrap) { ExecuteStopGrabbingCommand(); } } } } private string _IsCamera1Use = "Hidden"; public string IsCamera1Use { get { return _IsCamera1Use; } set { SetProperty(ref _IsCamera1Use, value); } } private string _IsCamera2Use = "Hidden"; public string IsCamera2Use { get { return _IsCamera2Use; } set { SetProperty(ref _IsCamera2Use, value); } } private string _IsCamera3Use = "Hidden"; public string IsCamera3Use { get { return _IsCamera3Use; } set { SetProperty(ref _IsCamera3Use, value); } } private string _IsCamera4Use = "Hidden"; public string IsCamera4Use { get { return _IsCamera4Use; } set { SetProperty(ref _IsCamera4Use, value); } } private string _IsCamera5Use = "Hidden"; public string IsCamera5Use { get { return _IsCamera5Use; } set { SetProperty(ref _IsCamera5Use, value); } } private string _IsCamera6Use = "Hidden"; public string IsCamera6Use { get { return _IsCamera6Use; } set { SetProperty(ref _IsCamera6Use, value); } } private string _IsCamera7Use = "Hidden"; public string IsCamera7Use { get { return _IsCamera7Use; } set { SetProperty(ref _IsCamera7Use, value); } } private string _IsCamera8Use = "Hidden"; public string IsCamera8Use { get { return _IsCamera8Use; } set { SetProperty(ref _IsCamera8Use, value); } } private string _IsCameraData1Use = "Hidden"; public string IsCameraData1Use { get { return _IsCameraData1Use; } set { SetProperty(ref _IsCameraData1Use, value); } } private string _IsCameraData2Use = "Hidden"; public string IsCameraData2Use { get { return _IsCameraData2Use; } set { SetProperty(ref _IsCameraData2Use, value); } } private string _IsCameraData3Use = "Hidden"; public string IsCameraData3Use { get { return _IsCameraData3Use; } set { SetProperty(ref _IsCameraData3Use, value); } } private string _IsCameraData4Use = "Hidden"; public string IsCameraData4Use { get { return _IsCameraData4Use; } set { SetProperty(ref _IsCameraData4Use, value); } } private string _IsCameraProduct1Use = "Hidden"; public string IsCameraProduct1Use { get { return _IsCameraProduct1Use; } set { SetProperty(ref _IsCameraProduct1Use, value); } } private string _IsCameraProduct2Use = "Hidden"; public string IsCameraProduct2Use { get { return _IsCameraProduct2Use; } set { SetProperty(ref _IsCameraProduct2Use, value); } } private string _IsCameraProduct3Use = "Hidden"; public string IsCameraProduct3Use { get { return _IsCameraProduct3Use; } set { SetProperty(ref _IsCameraProduct3Use, value); } } private string _IsCameraProduct4Use = "Hidden"; public string IsCameraProduct4Use { get { return _IsCameraProduct4Use; } set { SetProperty(ref _IsCameraProduct4Use, value); } } #endregion #region 命令 private DelegateCommand _NextCommand; public DelegateCommand NextCommand => _NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand)); private DelegateCommand _BackCommand; public DelegateCommand BackCommand => _BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand)); private DelegateCommand _LoadedCommand; public DelegateCommand LoadedCommand => _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand)); private DelegateCommand _ExecuteMotion; public DelegateCommand ExecuteMotion => _ExecuteMotion ?? (_ExecuteMotion = new DelegateCommand(ExecuteExecuteMotion).ObservesCanExecute(() => CanExecutePointCommand).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute).ObservesProperty(() => SelectedPointInDataGrid)); private DelegateCommand _ExecuteMotionStop; public DelegateCommand ExecuteMotionStop => _ExecuteMotionStop ?? (_ExecuteMotionStop = new DelegateCommand(ExecuteExecuteMotionStop).ObservesCanExecute(() => CanExecutePointCommand).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute).ObservesProperty(() => SelectedPointInDataGrid)); private DelegateCommand _JogCommand; public DelegateCommand JogCommand => _JogCommand ?? (_JogCommand = new DelegateCommand(ExecuteJogCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute)); private DelegateCommand _TechPointCommand; public DelegateCommand TechPointCommand => _TechPointCommand ?? (_TechPointCommand = new DelegateCommand(ExecuteTechPointCommand).ObservesCanExecute(() => CanExecutePointCommand).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute).ObservesProperty(() => SelectedPointInDataGrid)); private DelegateCommand _TechPointFinishCommand; public DelegateCommand TechPointFinishCommand => _TechPointFinishCommand ?? (_TechPointFinishCommand = new DelegateCommand(ExecuteTechPointFinishCommand).ObservesCanExecute(() => CanExecutePointCommand).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute).ObservesProperty(() => SelectedPointInDataGrid)); private DelegateCommand _MotorCommand; public DelegateCommand MotorCommand => _MotorCommand ?? (_MotorCommand = new DelegateCommand(ExecuteMotorCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute)); private DelegateCommand _ResetCommand; public DelegateCommand ResetCommand => _ResetCommand ?? (_ResetCommand = new DelegateCommand(ExecuteResetCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute)); private DelegateCommand _sFreeCommand; public DelegateCommand sFreeCommand => _sFreeCommand ?? (_sFreeCommand = new DelegateCommand(ExecutesFreeCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute)); private DelegateCommand _SLockCommand; public DelegateCommand SLockCommand => _SLockCommand ?? (_SLockCommand = new DelegateCommand(ExecuteSLockCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute)); private DelegateCommand _SelectionChangedCommand; public DelegateCommand SelectionChangedCommand => _SelectionChangedCommand ?? (_SelectionChangedCommand = new DelegateCommand(ExecuteSelectionChangedCommand)); private DelegateCommand _AddPointCommand; public DelegateCommand AddPointCommand => _AddPointCommand ?? (_AddPointCommand = new DelegateCommand(ExecuteAddPointCommand)); private DelegateCommand _DeletePointCommand; public DelegateCommand DeletePointCommand => _DeletePointCommand ?? (_DeletePointCommand = new DelegateCommand(ExecuteDeletePointCommand, CanExecuteDeletePointCommand).ObservesProperty(()=>SelectedPointInDataGrid)); private DelegateCommand _MovePointUpCommand; public DelegateCommand MovePointUpCommand => _MovePointUpCommand ?? (_MovePointUpCommand = new DelegateCommand(ExecuteMovePointUpCommand, CanMovePointUp)); private DelegateCommand _MovePointDownCommand; public DelegateCommand MovePointDownCommand => _MovePointDownCommand ?? (_MovePointDownCommand = new DelegateCommand(ExecuteMovePointDownCommand, CanMovePointDown)); private DelegateCommand _ImportCadPointCommand; public DelegateCommand ImportCadPointCommand => _ImportCadPointCommand ?? (_ImportCadPointCommand = new DelegateCommand(ExecuteImportCadPointCommand)); private DelegateCommand _ImportCadLockCameraPointCommand; public DelegateCommand ImportCadLockCameraPointCommand => _ImportCadLockCameraPointCommand ?? (_ImportCadLockCameraPointCommand = new DelegateCommand(ExecuteImportCadLockCameraPointCommand)); private DelegateCommand _ApplyLockPointStartZCommand; public DelegateCommand ApplyLockPointStartZCommand => _ApplyLockPointStartZCommand ?? (_ApplyLockPointStartZCommand = new DelegateCommand(ExecuteApplyLockPointStartZCommand)); private DelegateCommand _ApplyLockPointDepthCommand; public DelegateCommand ApplyLockPointDepthCommand => _ApplyLockPointDepthCommand ?? (_ApplyLockPointDepthCommand = new DelegateCommand(ExecuteApplyLockPointDepthCommand)); private DelegateCommand _ApplyLockPointSpeedCommand; public DelegateCommand ApplyLockPointSpeedCommand => _ApplyLockPointSpeedCommand ?? (_ApplyLockPointSpeedCommand = new DelegateCommand(ExecuteApplyLockPointSpeedCommand)); private DelegateCommand _ApplyLockPointFeederAndScrewProgramCommand; public DelegateCommand ApplyLockPointFeederAndScrewProgramCommand => _ApplyLockPointFeederAndScrewProgramCommand ?? (_ApplyLockPointFeederAndScrewProgramCommand = new DelegateCommand(ExecuteApplyLockPointFeederAndScrewProgramCommand)); private DelegateCommand _AutoCorrectLockPointCommand; public DelegateCommand AutoCorrectLockPointCommand => _AutoCorrectLockPointCommand ?? (_AutoCorrectLockPointCommand = new DelegateCommand(ExecuteAutoCorrectLockPoint)); private DelegateCommand _StartGrabbingCommand; public DelegateCommand StartGrabbingCommand => _StartGrabbingCommand ?? (_StartGrabbingCommand = new DelegateCommand(ExecuteStartGrabbingCommand, CanExecuteStartGrabbingCommand).ObservesProperty(() => IsGrap).ObservesProperty(() => SelectedCamera)); private DelegateCommand _StopGrabbingCommand; public DelegateCommand StopGrabbingCommand => _StopGrabbingCommand ?? (_StopGrabbingCommand = new DelegateCommand(ExecuteStopGrabbingCommand, CanExecuteStopGrabbingCommand).ObservesProperty(() => IsGrap).ObservesProperty(() => SelectedCamera)); private DelegateCommand _DynamicTestAnalyzerCommand; public DelegateCommand DynamicTestAnalyzerCommand => _DynamicTestAnalyzerCommand ?? (_DynamicTestAnalyzerCommand = new DelegateCommand(ExecuteDynamicTestAnalyzerCommand)); #endregion #region 事件 #endregion public PlcPointParamsViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService, IConfigService configService, IRobotService robotService, ISystemDatabaseService systemDatabaseService, IRemoteCommandService remoteCommandService, ICalibrationService calibrationService, ICameraService cameraService) { _regionManager = regionManager; _eventAggregator = ea; _container = container; _dialogService = dialogService; _configService = configService; _systemDatabaseService = systemDatabaseService; //订阅权限登录事件 _eventAggregator.GetEvent().Subscribe(LoginChange); management = _container.Resolve(); _robotService = robotService; _remoteCommandService = remoteCommandService; _calibrationService = calibrationService; _cameraService = cameraService; } #region 方法 /// /// 下一步 /// void ExecuteNextCommand() { NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); _regionManager.RequestNavigate("ProductRegionContext", "ProductParams", param); } /// /// 上一步 /// void ExecuteBackCommand() { NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); param.Add("SelectedProcedure", null); _regionManager.RequestNavigate("ProductRegionContext", "ProcessBasics", param); } /// /// 点动 /// /// private async void ExecuteJogCommand(object obj) { if (Robot == null || !Robot.IsConnected) return; try { Robot.Timeout = 6000000; var items = ((string)obj).Split(':'); switch (items[0]) { case "X+": await Robot.JogAsync("X", double.Parse(items[1])); break; case "X-": await Robot.JogAsync("X", -double.Parse(items[1])); break; case "Y+": await Robot.JogAsync("Y", double.Parse(items[1])); break; case "Y-": await Robot.JogAsync("Y", -double.Parse(items[1])); break; case "Z+": await Robot.JogAsync("Z", double.Parse(items[1])); break; case "Z-": await Robot.JogAsync("Z", -double.Parse(items[1])); break; case "U+": await Robot.JogAsync("U", double.Parse(items[1])); break; case "U-": await Robot.JogAsync("U", -double.Parse(items[1])); break; case "V+": await Robot.JogAsync("V", double.Parse(items[1])); break; case "V-": await Robot.JogAsync("V", -double.Parse(items[1])); break; case "W+": await Robot.JogAsync("W", double.Parse(items[1])); break; case "W-": await Robot.JogAsync("W", -double.Parse(items[1])); break; default: break; } Robot.Timeout = 5000; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-机器人点动时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 执行起始点运动 /// /// async void ExecuteExecuteMotion(object parameter) { if (parameter == null) { return; } if (SelectedPoint==null) { return; } var sysConfig = _configService.GetSystemConfiguration(); if(sysConfig.AxisPassUse==true) { float Judge_X = 0; var view = new ShowMessage(Lang.运行过度点, $"{Lang.是否运行过度点}?"); //show the dialog var result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null && result is true) { try { var values1 = (object[])parameter; var curpos = await Robot.GetRobotPosAsync(); Judge_X = curpos.X; var point1 = new RPoint() { X = Judge_X, Y = float.Parse("1"), Z = float.Parse("0"), U = float.Parse("0"), V = float.Parse("0"), W = float.Parse("0"), }; MotionCommand motionCmd1 = (MotionCommand)values1[1]; if (Robot == null || !Robot.IsConnected) return; try { Robot.Timeout = 6000000; switch (motionCmd1) { case MotionCommand.Go: await Robot.GoAsync(point1); break; case MotionCommand.Jump: await Robot.JumpAsync(point1, 0); break; case MotionCommand.Move: await Robot.MoveAsync(point1); break; } Robot.Timeout = 5000; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); view = new ShowMessage(Lang.运行过度点, $"{Lang.是否运行到过度点位}?"); //show the dialog result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result == null || result is false) { return; } view = new ShowMessage(Lang.过度点旋转, $"{Lang.是否运行过度点旋转}?"); //show the dialog result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null && result is true) { try { var values2 = (object[])parameter; if (curpos.X < 10) { Judge_X = float.Parse("87.88"); } else { Judge_X = float.Parse("-2.15"); } var point2 = new RPoint() { X = Judge_X, Y = float.Parse("1"), Z = float.Parse("0"), U = float.Parse("0"), V = float.Parse("0"), W = float.Parse("0"), }; MotionCommand motionCmd2 = (MotionCommand)values2[1]; if (Robot == null || !Robot.IsConnected) return; try { Robot.Timeout = 6000000; switch (motionCmd2) { case MotionCommand.Go: await Robot.GoAsync(point2); break; case MotionCommand.Jump: await Robot.JumpAsync(point2, 0); break; case MotionCommand.Move: await Robot.MoveAsync(point2); break; } Robot.Timeout = 5000; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); view = new ShowMessage(Lang.过度点旋转, $"{Lang.是否运行到过度点旋转位}?"); //show the dialog result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result == null || result is false) { return; } } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-执行点位时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } catch (Exception ex) { LogHelper.WriteLogError("机器人过度点时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-执行点位时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } catch (Exception ex) { LogHelper.WriteLogError("机器人过度点时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } } var values = (object[])parameter; var point = new RPoint() { X= SelectedPoint.X_Position_Start, Y= SelectedPoint.Y_Position_Start, Z= SelectedPoint.Z_Position_Start, U=SelectedPoint.U_Position_Start, V= SelectedPoint.V_Position_Start, W = SelectedPoint.W_Position_Start, }; MotionCommand motionCmd = (MotionCommand)values[1]; if (Robot == null || !Robot.IsConnected) return; try { Robot.Timeout = 6000000; switch (motionCmd) { case MotionCommand.Go: await Robot.GoAsync(point); break; case MotionCommand.Jump: await Robot.JumpAsync(point, 0); break; case MotionCommand.Move: await Robot.MoveAsync(point); break; } Robot.Timeout = 5000; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-执行点位时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 执行终点运动 /// /// async void ExecuteExecuteMotionStop(object parameter) { if (parameter == null) { return; } if (SelectedPoint == null) { return; } var sysConfig = _configService.GetSystemConfiguration(); if (sysConfig.AxisPassUse == true) { float Judge_X = 0; var view = new ShowMessage(Lang.运行过度点, $"{Lang.是否运行过度点}?"); //show the dialog var result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null && result is true) { try { var values1 = (object[])parameter; var curpos = await Robot.GetRobotPosAsync(); Judge_X = curpos.X; var point1 = new RPoint() { X = Judge_X, Y = float.Parse("1"), Z = float.Parse("0"), U = float.Parse("0"), V = float.Parse("0"), W = float.Parse("0"), }; MotionCommand motionCmd1 = (MotionCommand)values1[1]; if (Robot == null || !Robot.IsConnected) return; try { Robot.Timeout = 6000000; switch (motionCmd1) { case MotionCommand.Go: await Robot.GoAsync(point1); break; case MotionCommand.Jump: await Robot.JumpAsync(point1, 0); break; case MotionCommand.Move: await Robot.MoveAsync(point1); break; } Robot.Timeout = 5000; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); view = new ShowMessage(Lang.运行过度点, $"{Lang.是否运行到过度点位}?"); //show the dialog result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result == null || result is false) { return; } view = new ShowMessage(Lang.过度点旋转, $"{Lang.是否运行过度点旋转}?"); //show the dialog result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null && result is true) { try { var values2 = (object[])parameter; if (curpos.X < 10) { Judge_X = float.Parse("87.88"); } else { Judge_X = float.Parse("-2.15"); } var point2 = new RPoint() { X = Judge_X, Y = float.Parse("1"), Z = float.Parse("0"), U = float.Parse("0"), V = float.Parse("0"), W = float.Parse("0"), }; MotionCommand motionCmd2 = (MotionCommand)values2[1]; if (Robot == null || !Robot.IsConnected) return; try { Robot.Timeout = 6000000; switch (motionCmd2) { case MotionCommand.Go: await Robot.GoAsync(point2); break; case MotionCommand.Jump: await Robot.JumpAsync(point2, 0); break; case MotionCommand.Move: await Robot.MoveAsync(point2); break; } Robot.Timeout = 5000; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); view = new ShowMessage(Lang.过度点旋转, $"{Lang.是否运行到过度点旋转位}?"); //show the dialog result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result == null || result is false) { return; } } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-执行点位时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } catch (Exception ex) { LogHelper.WriteLogError("机器人过度点时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-执行点位时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } catch (Exception ex) { LogHelper.WriteLogError("机器人过度点时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } } var values = (object[])parameter; var point = new RPoint() { X = SelectedPoint.X_Position_Stop, Y = SelectedPoint.Y_Position_Stop, Z = SelectedPoint.Z_Position_Stop, U = SelectedPoint.U_Position_Stop, V = SelectedPoint.V_Position_Stop, W = SelectedPoint.W_Position_Stop, }; MotionCommand motionCmd = (MotionCommand)values[1]; if (Robot == null || !Robot.IsConnected) return; try { Robot.Timeout = 6000000; switch (motionCmd) { case MotionCommand.Go: await Robot.GoAsync(point); break; case MotionCommand.Jump: await Robot.JumpAsync(point, 0); break; case MotionCommand.Move: await Robot.MoveAsync(point); break; } Robot.Timeout = 5000; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-执行点位时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 示教点位 /// /// async void ExecuteTechPointCommand() { if (Robot == null || !Robot.IsConnected) return; if (SelectedPoint == null) return; var view = new ShowMessage(Lang.示教起始點, $"{Lang.是否示教起始點}?"); //show the dialog var result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null && result is true) { try { var curpos = await Robot.GetRobotPosAsync(); SelectedPoint.X_Position_Start = curpos.X; SelectedPoint.Y_Position_Start = curpos.Y; SelectedPoint.Z_Position_Start = curpos.Z; SelectedPoint.U_Position_Start = curpos.U; SelectedPoint.V_Position_Start = curpos.V; SelectedPoint.W_Position_Start = curpos.W; //SelectedPoint.R_Position = curpos.V; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-示教点位时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } } /// /// 示教终点位 /// /// async void ExecuteTechPointFinishCommand() { if (Robot == null || !Robot.IsConnected) return; if (SelectedPoint == null) return; var view = new ShowMessage(Lang.示教终點, $"{Lang.是否示教终點}?"); //show the dialog var result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null && result is true) { try { var curpos = await Robot.GetRobotPosAsync(); SelectedPoint.X_Position_Stop = curpos.X; SelectedPoint.Y_Position_Stop = curpos.Y; SelectedPoint.Z_Position_Stop = curpos.Z; SelectedPoint.U_Position_Stop = curpos.U; SelectedPoint.V_Position_Stop = curpos.V; SelectedPoint.W_Position_Stop = curpos.W; //SelectedPoint.R_Position = curpos.V; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("机器人点位-示教点位时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } } void ExecuteLoadedCommand() { if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } var sysConfig = _configService.GetSystemConfiguration(); if (sysConfig.Camera1Use == true) { IsCamera1Use = "Visible"; } else { IsCamera1Use = "Hidden"; } if (sysConfig.Camera2Use == true) { IsCamera2Use = "Visible"; } else { IsCamera2Use = "Hidden"; } if (sysConfig.Camera3Use == true) { IsCamera3Use = "Visible"; } else { IsCamera3Use = "Hidden"; } if (sysConfig.Camera4Use == true) { IsCamera4Use = "Visible"; } else { IsCamera4Use = "Hidden"; } if (sysConfig.Camera5Use == true) { IsCamera5Use = "Visible"; } else { IsCamera5Use = "Hidden"; } if (sysConfig.Camera6Use == true) { IsCamera6Use = "Visible"; } else { IsCamera6Use = "Hidden"; } if (sysConfig.Camera6Use == true) { IsCamera6Use = "Visible"; } else { IsCamera6Use = "Hidden"; } if (sysConfig.Camera7Use == true) { IsCamera7Use = "Visible"; } else { IsCamera7Use = "Hidden"; } if (sysConfig.Camera8Use == true) { IsCamera8Use = "Visible"; } else { IsCamera8Use = "Hidden"; } if (sysConfig.CameraData1Use == true) { IsCameraData1Use = "Visible"; } else { IsCameraData1Use = "Hidden"; } if (sysConfig.CameraData2Use == true) { IsCameraData2Use = "Visible"; } else { IsCameraData2Use = "Hidden"; } if (sysConfig.CameraData3Use == true) { IsCameraData3Use = "Visible"; } else { IsCameraData3Use = "Hidden"; } if (sysConfig.CameraData4Use == true) { IsCameraData4Use = "Visible"; } else { IsCameraData4Use = "Hidden"; } if (sysConfig.CameraProduct1Use == true) { IsCameraProduct1Use = "Visible"; } else { IsCameraProduct1Use = "Hidden"; } if (sysConfig.CameraProduct2Use == true) { IsCameraProduct2Use = "Visible"; } else { IsCameraProduct2Use = "Hidden"; } if (sysConfig.CameraProduct3Use == true) { IsCameraProduct3Use = "Visible"; } else { IsCameraProduct3Use = "Hidden"; } if (sysConfig.CameraProduct4Use == true) { IsCameraProduct4Use = "Visible"; } else { IsCameraProduct4Use = "Hidden"; } } /// /// 电机 /// /// private async void ExecuteMotorCommand(string obj) { if (Robot == null || !Robot.IsConnected) return; try { await Robot.MotorAsync(Convert.ToBoolean(obj)); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("机器人点击操作时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 重置 /// private async void ExecuteResetCommand() { if (Robot == null || !Robot.IsConnected) return; try { await Robot.ResetAsync(); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("重置机器人时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 锁定刹车 /// private async void ExecuteSLockCommand() { if (Robot == null || !Robot.IsConnected) return; try { await Robot.SLockAsync(); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("机器人锁定刹车时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 释放刹车 /// private async void ExecutesFreeCommand() { if (Robot == null || !Robot.IsConnected) return; try { await Robot.SFreeAsync(); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("机器人释放刹车时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } private bool CanExecute { get { // 命令可执行仅当机器人可执行且已选择点位 if (Robot != null && Robot.IsConnected && Robot.CanExecute) { return true; } return false; } } //是否可以示教或者执行点位 private bool CanExecutePointCommand { get { if (Robot != null && Robot.IsConnected && Robot.CanExecute) { return SelectedPointInDataGrid != null; } return false; } } /// /// 点位表切换时 /// void ExecuteSelectionChangedCommand() { switch (SelectedIndex) { case 0: Points = SelectProduct.PickCameraPoints; PickPoints= SelectProduct.PickPoints; break; case 1: Points = SelectProduct.PickPoints; break; case 2: Points = SelectProduct.SecPosCameraPoints; break; case 3: Points = SelectProduct.ScrewCameraPoints; break; case 4: Points = SelectProduct.ScrewPoints; break; case 5: Points = SelectProduct.CheckCameraPoints; break; case 6: Points = SelectProduct.AoiPoints; break; default: break; } } /// /// 增加点位 /// void ExecuteAddPointCommand() { //添加点位 Points.Add(new PlcPoint() { Number = Points.Count + 1, X_Velocity_Start = 100, X_Velocity_Stop = 100, Y_Velocity_Start = 100, Y_Velocity_Stop = 100, Z_Velocity_Start = 100, Z_Velocity_Stop = 100, U_Velocity_Start = 100, U_Velocity_Stop = 100, V_Velocity_Start = 100, V_Velocity_Stop = 100, W_Velocity_Start = 100, W_Velocity_Stop = 100, }); // update commands _MovePointUpCommand?.RaiseCanExecuteChanged(); _MovePointDownCommand?.RaiseCanExecuteChanged(); } /// /// 移除点位 /// void ExecuteDeletePointCommand() { if (SelectedPoint == null) { return; } // 确认删除 if (MessageBox.Show("确认要删除选中的点位吗?", "删除点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return; } int removedIndex = Points.IndexOf(SelectedPoint); Points.Remove(SelectedPoint); //重新编号 for (int i = 0; i < Points.Count; i++) { Points[i].Number = i + 1; } // adjust selection if (Points.Count > 0) { int newIndex = Math.Min(removedIndex, Points.Count - 1); SelectedPointInDataGrid = Points[newIndex]; } else { SelectedPointInDataGrid = null; } // update commands _MovePointUpCommand?.RaiseCanExecuteChanged(); _MovePointDownCommand?.RaiseCanExecuteChanged(); } bool CanExecuteDeletePointCommand() { return SelectedPointInDataGrid != null; } private bool CanMovePointUp() { return SelectedPointInDataGrid != null && Points.IndexOf(SelectedPointInDataGrid) > 0; } private bool CanMovePointDown() { return SelectedPointInDataGrid != null && Points.IndexOf(SelectedPointInDataGrid) >= 0 && Points.IndexOf(SelectedPointInDataGrid) < Points.Count - 1; } /// /// 向上移动点位 /// void ExecuteMovePointUpCommand() { if (SelectedPointInDataGrid == null) return; // 确认移动 if (MessageBox.Show("确认将选中点位上移一位吗?", "移动点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return; } int idx = Points.IndexOf(SelectedPointInDataGrid); if (idx <= 0) return; var item = SelectedPointInDataGrid; Points.Move(idx, idx - 1); // renumber for (int i = 0; i < Points.Count; i++) Points[i].Number = i + 1; SelectedPointInDataGrid = item; _MovePointUpCommand?.RaiseCanExecuteChanged(); _MovePointDownCommand?.RaiseCanExecuteChanged(); } /// /// 向下移动点位 /// void ExecuteMovePointDownCommand() { if (SelectedPointInDataGrid == null) return; // 确认移动 if (MessageBox.Show("确认将选中点位下移一位吗?", "移动点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return; } int idx = Points.IndexOf(SelectedPointInDataGrid); if (idx < 0 || idx >= Points.Count - 1) return; var item = SelectedPointInDataGrid; Points.Move(idx, idx + 1); // renumber for (int i = 0; i < Points.Count; i++) Points[i].Number = i + 1; SelectedPointInDataGrid = item; _MovePointUpCommand?.RaiseCanExecuteChanged(); _MovePointDownCommand?.RaiseCanExecuteChanged(); } /// /// CAD导入点位 /// async void ExecuteImportCadPointCommand() { try { var view = new DxfView(); //show the dialog var result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null) { var cadPoints = view.Points; if (cadPoints != null && cadPoints.Count > 0) { //要导入的开始点编号 int startNumber = view.StartIndex; //弹窗提示用户是否确认要导入从该编号开始的点位,点位数量为cadPoints.Count if (MessageBox.Show($"确认要从点位编号 {startNumber} 开始导入 {cadPoints.Count} 个点位吗?", "导入点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return; } //导入点位 for (int i = 0; i < cadPoints.Count; i++) { //如果点位编号已存在,则更新该点位,否则新增点位,只更新XY坐标 var point = cadPoints[i]; var existingPoint = Points.FirstOrDefault(p => p.Number == startNumber + i); if (existingPoint != null) { existingPoint.X_Position_Start = point.X; existingPoint.Y_Position_Start = point.Y; } else { Points.Add(new PlcPoint() { Number = startNumber + i, X_Position_Start = point.X, Y_Position_Start = point.Y, X_Velocity_Start=100, Y_Velocity_Start=100, Z_Velocity_Start=100, Z_Velocity_Stop=100, U_Velocity_Start=100, R_Velocity=100, }); } } //对所有的点位重新编号,确保编号连续 var sortedPoints = Points.OrderBy(p => p.Number).ToList(); Points.Clear(); for (int i = 0; i < sortedPoints.Count; i++) { sortedPoints[i].Number = i + 1; Points.Add(sortedPoints[i]); } _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } } } catch (Exception ex) { LogHelper.WriteLogError("导入CAD点位时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 导入锁付拍照引导的产品坐标系中的点位 /// async void ExecuteImportCadLockCameraPointCommand() { try { var view = new DxfView(); //show the dialog var result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null) { var cadPoints = view.Points; if (cadPoints != null && cadPoints.Count == 2) { //弹窗提示用户是否确认要导入锁付拍照引导的起始点和结束点 if (MessageBox.Show($"确认要导入锁付拍照引导的起始点和结束点吗?", "导入点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return; } //导入点位 //起始点 var startPoint = cadPoints[0]; SelectProduct.ScrewCameraLocalPos1.X_Position_Start = startPoint.X; SelectProduct.ScrewCameraLocalPos1.Y_Position_Start = startPoint.Y; //结束点 var endPoint = cadPoints[1]; SelectProduct.ScrewCameraLocalPos2.X_Position_Start = endPoint.X; SelectProduct.ScrewCameraLocalPos2.Y_Position_Start = endPoint.Y; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 }); } else { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "请导入两个点,分别为锁付拍照引导的起始点和结束点!", Duration = 1 }); } } } catch (Exception ex) { LogHelper.WriteLogError("导入CAD点位时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 批量设置锁付点的供料器编号和螺丝程序编号 /// void ExecuteApplyLockPointFeederAndScrewProgramCommand() { //检查供料器编号和螺丝程序编号是否大于0,如果小于等于0,则提示用户编号是否正确,是否继续写入 if (LockFeederNumber <= 0 || LockScrewProgramNumber <= 0) { var result = MessageBox.Show("供料器编号或螺丝程序编号小于等于0,是否继续写入?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { return; } } //遍历所有点位,设置供料器编号和螺丝程序编号 foreach (var point in Points) { point.Feeder = LockFeederNumber; point.ScrewProNum = LockScrewProgramNumber; } } /// /// 批量设置锁付点的速度 /// void ExecuteApplyLockPointSpeedCommand() { //检查速度是否大于0,如果小于等于0,则提示用户速度是否正确,是否继续写入 if (LockXSpeed <= 0 || LockYSpeed <= 0 || LockZSpeed <= 0 || LockUSpeed <= 0) { var result = MessageBox.Show("速度小于等于0,是否继续写入?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { return; } } //遍历所有点位,设置速度 foreach (var point in Points) { point.X_Velocity_Start = LockXSpeed; point.Y_Velocity_Start = LockYSpeed; point.Z_Velocity_Start = LockZSpeed; point.U_Velocity_Start = LockUSpeed; point.V_Velocity_Start = LockVSpeed; point.W_Velocity_Start = LockWSpeed; point.X_Velocity_Stop = LockXSpeed; point.Y_Velocity_Stop = LockYSpeed; point.Z_Velocity_Stop = LockZSpeed; point.U_Velocity_Stop = LockUSpeed; point.V_Velocity_Stop = LockVSpeed; point.W_Velocity_Stop = LockWSpeed; } } /// /// 批量设置锁付点的Z深度 /// void ExecuteApplyLockPointDepthCommand() { //检查深度是否大于0,如果小于等于0,则提示用户深度是否正确,是否继续写入 if (LockZDepth <= 0) { var result = MessageBox.Show("深度小于等于0,是否继续写入?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { return; } } //遍历所有点位,设置Z深度 foreach (var point in Points) { point.Z_Position_Stop = point.Z_Position_Start - LockZDepth; } } /// /// 批量设置锁付点的起始Z坐标 /// void ExecuteApplyLockPointStartZCommand() { //检查起始Z坐标是否小于0,如果大于等于0,则提示用户坐标是否正确,是否继续写入 if (LockPointStartZ >= 0) { var result = MessageBox.Show("起始Z坐标大于等于0,是否继续写入?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { return; } } //遍历所有点位,设置起始Z坐标 foreach (var point in Points) { point.Z_Position_Start = LockPointStartZ; } //检查终点坐标是否小于等于起始坐标,如果不是,则提示用户终点坐标大于等于起始坐标,用户需要去调整终点坐标 foreach (var point in Points) { if (point.Z_Position_Stop >= point.Z_Position_Start) { MessageBox.Show($"点位编号 {point.Number} 的终点坐标大于等于起始坐标,请调整终点坐标!", "警告", MessageBoxButton.OK, MessageBoxImage.Warning); } } } /// /// 通过相机自动矫正锁附点位 /// async void ExecuteAutoCorrectLockPoint() { try { //弹窗提示用户是否确认要通过相机自动矫正锁附点位 var resultConfirm = MessageBox.Show("确认要通过相机自动矫正锁附点位吗?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (resultConfirm != MessageBoxResult.Yes) { return; } //获取螺丝相机拍照点位 var screwCameraPoint = SelectProduct.ScrewCameraPoints; //获取相机拍照点对应的LocalPos var screwCameraLocalPos1 = SelectProduct.ScrewCameraLocalPos1; var screwCameraLocalPos2 = SelectProduct.ScrewCameraLocalPos2; //获取螺丝锁付点位 var screwLockPoints = SelectProduct.ScrewPoints; //检查screwLockPoints中是否有和screwCameraLocalPos1的XY坐标相同的点位 var matchingPoint = screwLockPoints.FirstOrDefault(p => p.X_Position_Start == screwCameraLocalPos1.X_Position_Start && p.Y_Position_Start == screwCameraLocalPos1.Y_Position_Start); if (matchingPoint != null) { //检查两个点位的Z是否一致?如果不一致,则提示用户锁付点位中有和锁付拍照引导起始点Local坐标相同的点位,且Z坐标不一致,是否将锁付拍照引导起始点Local坐标的Z轴坐标更新为锁付点位的Z坐标 if (matchingPoint.Z_Position_Start != screwCameraLocalPos1.Z_Position_Start) { var resultUpdateZ = MessageBox.Show("锁付点位中有和锁付拍照引导起始点Local坐标相同的点位,且Z坐标不一致,是否将锁付拍照引导起始点Local坐标的Z轴坐标更新为锁付点位的Z坐标?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (resultUpdateZ == MessageBoxResult.Yes) { screwCameraLocalPos1.Z_Position_Start = matchingPoint.Z_Position_Start; } } } //检查screwLockPoints中是否有和screwCameraLocalPos2的XY坐标相同的点位 matchingPoint = screwLockPoints.FirstOrDefault(p => p.X_Position_Start == screwCameraLocalPos2.X_Position_Start && p.Y_Position_Start == screwCameraLocalPos2.Y_Position_Start); if (matchingPoint != null) { //检查两个点位的Z是否一致?如果不一致,则提示用户锁付点位中有和锁付拍照引导结束点Local坐标相同的点位,且Z坐标不一致,是否将锁付拍照引导结束点Local坐标的Z轴坐标更新为锁付点位的Z坐标 if (matchingPoint.Z_Position_Start != screwCameraLocalPos2.Z_Position_Start) { var resultUpdateZ = MessageBox.Show("锁付点位中有和锁付拍照引导结束点Local坐标相同的点位,且Z坐标不一致,是否将锁付拍照引导结束点Local坐标的Z轴坐标更新为锁付点位的Z坐标?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (resultUpdateZ == MessageBoxResult.Yes) { screwCameraLocalPos2.Z_Position_Start = matchingPoint.Z_Position_Start; } } } IDialogParameters parameters = new DialogParameters(); parameters.Add("Robot", Robot); parameters.Add("Points", new List(SelectProduct.ScrewPoints.ToArray())); _dialogService.Show("AutoCorrectLockPoint", parameters, rst => { //对话框关闭之后的回调函数,可以在这解析结果。 ButtonResult result1 = rst.Result; if (result1 == ButtonResult.OK) { var param = rst.Parameters.GetValue>("CorrectPoints"); for (int i = 0; i < SelectProduct.ScrewPoints.Count; i++) { SelectProduct.ScrewPoints[i].X_Position_Start = param[i].PostX; SelectProduct.ScrewPoints[i].Y_Position_Start = param[i].PostY; } _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "完成!", Duration = 1 }); } }); } catch (Exception ex) { LogHelper.WriteLogError("通过相机自动矫正锁附点位时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } /// /// 通过相机先定位产品再执行锁付点位 /// /// private async Task ExecuteAutoCorrectLockPointAndExecuteCommand(PlcPoint point) { var waiting = new WaitingControl(); Task task; try { if (Robot == null || !Robot.IsConnected) return; //弹窗提示用户是否确认要通过相机自动矫正锁附点位并执行该点位 var resultConfirm = MessageBox.Show($"确认要通过相机自动矫正锁附点位并执行点位 {point.Number} 吗?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (resultConfirm != MessageBoxResult.Yes) { return; } if (Robot == null || !Robot.IsConnected) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "机器人未连接,无法执行取料拍照点位矫正!", Duration = 1 }); return; } //获取当前产品 var product = SelectProduct; if (product == null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "未选择产品,无法执行取料拍照点位矫正!", Duration = 1 }); return; } //如果当前Local为空,则自动进行锁付点位的Local计算 if (local == null) { //show the dialog task = DialogHost.Show(waiting, "RootDialog", null, null, null); var isCalibSucceed = await AutoCalibLockPointLocal(product); if (!isCalibSucceed) { return; } } else { //提示用户,当前系统检测到进入此界面后已经进行过相机产品定位并计算过Local,是否继续使用该Local进行锁付点位的转换计算 var resultUseExistingLocal = MessageBox.Show("系统检测到进入此界面后已经进行过相机产品定位并计算过Local,是否继续使用该Local进行锁付点位的转换计算?点击“是”继续使用,点击“否”则重新进行锁付点位的Local计算。", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (resultUseExistingLocal == MessageBoxResult.No) { //show the dialog task = DialogHost.Show(waiting, "RootDialog", null, null, null); var isCalibSucceed = await AutoCalibLockPointLocal(product); if (!isCalibSucceed) { return; } } else { //show the dialog task = DialogHost.Show(waiting, "RootDialog", null, null, null); } } //将锁付点位转换到世界坐标系 var localPoint = new PointF(point.X_Position_Start, point.Y_Position_Start); var worldPoint = local.ToOldCoord(localPoint.X, localPoint.Y); var point1 = point.Clone(); point1.X_Position_Start = (float)worldPoint[0]; point1.Y_Position_Start = (float)worldPoint[1]; //执行该点位 //移动机器人至拍照点位,拍照 var rpoint = new RPoint() { X = point.X_Position_Start, Y = point.Y_Position_Start, Z = point.Z_Position_Start, }; await Robot.CalibMotionAsync(rpoint, 0); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "完成!", Duration = 1 }); } catch (Exception ex) { LogHelper.WriteLogError("通过相机自动矫正锁附点位并执行时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } finally { try { if (DialogHost.IsDialogOpen("RootDialog")) { DialogHost.Close("RootDialog"); } } catch (Exception) { } } } /// /// 移动相机拍产品两个Msrk点计算Local /// /// /// private async Task AutoCalibLockPointLocal(ProductModel product) { try { //获取锁付相机拍照点位 var screwCameraPoint = product.ScrewCameraPoints; if (screwCameraPoint == null || screwCameraPoint.Count < 2) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照点位,无法执行取料拍照点位矫正!", Duration = 1 }); return false; } //获取相机拍照点位对应的锁付点 var screwCameraLocalPoint1 = product.ScrewCameraLocalPos1; if (screwCameraLocalPoint1 == null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照点位对应的锁付点,无法执行取料拍照点位矫正!", Duration = 1 }); return false; } var screwCameraLocalPoint2 = product.ScrewCameraLocalPos2; if (screwCameraLocalPoint2 == null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照点位对应的锁付点,无法执行取料拍照点位矫正!", Duration = 1 }); return false; } var ProcedureModels = new ObservableCollection(); foreach (var item in product.CameraProcedures) { foreach (var item1 in item.ProcedureModels) { ProcedureModels.Add(item1); } } //获取拍照流程 if (product.MoveDownCameraLockPhotoProcedureId == Guid.Empty) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照流程,无法执行取料拍照点位矫正!", Duration = 1 }); return false; } var procedure = ProcedureModels.FirstOrDefault(p => p.Id == product.MoveDownCameraLockPhotoProcedureId); if (procedure == null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照流程,无法执行取料拍照点位矫正!", Duration = 1 }); return false; } CancellationTokenSource _cts = new CancellationTokenSource(); //移动机器人至拍照点位,拍照 var rpoint = new RPoint() { X = screwCameraPoint[0].X_Position_Start, Y = screwCameraPoint[0].Y_Position_Start, Z = screwCameraPoint[0].Z_Position_Start, U = screwCameraPoint[0].U_Position_Start, V = screwCameraPoint[0].R_Position, }; await Robot.CalibMotionAsync(rpoint, 0); await Task.Delay(200); // 执行拍照并获取识别结果 var recognitionResult = await _remoteCommandService.ExecutePhotoGetSinglePointWithImage(procedure, null, new double[] { rpoint.X, rpoint.Y, 0 }, _cts.Token); //var Image = recognitionResult.Image; //var Graphic = null; //var Graphic = recognitionResult.Graphic; if (!recognitionResult.IsSucceed) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "拍照获取识别结果失败,无法执行取料拍照点位矫正!", Duration = 1 }); return false; } //第一个点位的校正结果 PointF worldP1 = new PointF((float)recognitionResult.X, (float)recognitionResult.Y); //移动机器人至拍照点位,拍照 rpoint = new RPoint() { X = screwCameraPoint[1].X_Position_Start, Y = screwCameraPoint[1].Y_Position_Start, Z = screwCameraPoint[1].Z_Position_Start, U = screwCameraPoint[1].U_Position_Start, V = screwCameraPoint[1].R_Position, }; await Robot.CalibMotionAsync(rpoint, 0); if (_cts.IsCancellationRequested) return false; await Task.Delay(200); // 执行拍照并获取识别结果 recognitionResult = await _remoteCommandService.ExecutePhotoGetSinglePointWithImage(procedure, null, new double[] { rpoint.X, rpoint.Y, 0 }, _cts.Token); //Image = recognitionResult.Image; //Graphic = null; //Graphic = recognitionResult.Graphic; if (!recognitionResult.IsSucceed) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "拍照获取识别结果失败,无法执行取料拍照点位矫正!", Duration = 1 }); return false; } //第一个点位的校正结果 PointF worldP2 = new PointF((float)recognitionResult.X, (float)recognitionResult.Y); //计算移动相机与拍照点之间的偏差 //获取校准 var calibration = _calibrationService.GetCalibration(procedure.CalibrationId); //获取mark点 var mark = calibration.MarkPoint; //获取中心点 var center = calibration.CenterPoint; //计算相机中心与披头之间的坐标偏差 var cameraOffsetX = mark.X - center.X; var cameraOffsetY = mark.Y - center.Y; //根据UpCameraPutResults[]中的索引1、2,和拍照点对应的Local下的坐标,从创建Local坐标系 PointF localP1 = new PointF(screwCameraLocalPoint1.X_Position_Start, screwCameraLocalPoint1.Y_Position_Start); PointF localP2 = new PointF(screwCameraLocalPoint2.X_Position_Start, screwCameraLocalPoint2.Y_Position_Start); local = new CoordinateTransformer(worldP1, worldP2, localP1, localP2); return true; } catch (Exception ex) { LogHelper.WriteLogError("计算锁付点位产品坐标系坐标时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); return false; } } /// /// 停止采集 /// void ExecuteStopGrabbingCommand() { if (Camera != null) Camera.StopGrabbing(); IsGrap = false; } bool CanExecuteStopGrabbingCommand() { return IsGrap; } /// /// 开始采集 /// void ExecuteStartGrabbingCommand() { if (Camera != null) Camera.StartGrabbing(); IsGrap = true; } bool CanExecuteStartGrabbingCommand() { return SelectedCamera != null && !IsGrap; } private void Camera_ImageCallbackEvent(ICogImage image, TimeSpan totaltime, string errormessage, Guid id) { Image = image; App.Current.Dispatcher.Invoke(new Action(() => { if (errormessage != null && !string.IsNullOrEmpty(errormessage)) { Message = $"{Lang.耗时}:{totaltime.TotalMilliseconds.ToString("F1")} ms Error:{errormessage}"; } else { Message = $"{Lang.耗时}:{totaltime.TotalMilliseconds.ToString("F1")} ms"; } })); } /// /// 动态测试分析仪 /// void ExecuteDynamicTestAnalyzerCommand() { try { IDialogParameters parameters = new DialogParameters(); parameters.Add("SelectProduct", SelectProduct); parameters.Add("Robot", Robot); _dialogService.Show("VisionDynamicAccuracyAnalyzer", parameters, rst => { //对话框关闭之后的回调函数,可以在这解析结果。 ButtonResult result1 = rst.Result; if (result1 == ButtonResult.OK) { //var param = rst.Parameters.GetValue("Tool"); //var param1 = rst.Parameters.GetValue>("RobotCameraRotationMatrix"); //var param2 = rst.Parameters.GetValue("Angle"); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 1 }); } }); } catch (Exception ex) { LogHelper.WriteLogError("执行动态测试分析仪命令时出错", ex); MessageBox.Show(ex.Message); } } #endregion #region 继承 /// /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。 /// /// /// public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { continuationCallback(true); } /// /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。 /// /// /// public async void OnNavigatedTo(NavigationContext navigationContext) { try { SelectProduct = navigationContext.Parameters.GetValue("SelectProduct"); // 默认选择 AOI 点位(索引 6),并初始化 Points SelectedIndex = 6; PickPoints = SelectProduct.PickPoints; Points = null; Points = SelectProduct.AoiPoints; // 默认选中第一个点(如果存在) SelectedPointInDataGrid = Points?.FirstOrDefault(); SelectedPointInComboBox = SelectedPointInDataGrid; if (Robot == null) { Robot = _robotService.GetRobotByNumber(1); } if (Robot != null && Robot.IsConnected) { this.Distance = _configService.GetRobotStepDistance(Robot.Id); Robot.EnterDebugMode = true; } else if (Robot != null) { Robot.EnterDebugMode = true; } ProcedureModels = new ObservableCollection(); foreach (var item in SelectProduct.CameraProcedures) { foreach (var item1 in item.ProcedureModels) { ProcedureModels.Add(item1); } } if (ProcedureModels !=null && !ProcedureModels.Any(pm => pm.Id == Guid.Empty)) { ProcedureModels.Insert(0, new ProcedureModel { Id = Guid.Empty, Name = "{无}" }); } //对锁付点的批量设置进行初始化 LockPointStartZ = SelectProduct.ScrewPoints.FirstOrDefault()?.Z_Position_Start ?? 0; LockZDepth= SelectProduct.ScrewPoints.FirstOrDefault() != null ? (SelectProduct.ScrewPoints.FirstOrDefault().Z_Position_Start - SelectProduct.ScrewPoints.FirstOrDefault().Z_Position_Stop) : 0; LockXSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.X_Velocity_Start ?? 100; LockYSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.Y_Velocity_Start ?? 100; LockZSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.Z_Velocity_Start ?? 100; LockUSpeed = SelectProduct.ScrewPoints.FirstOrDefault()?.U_Velocity_Start ?? 100; LockVSpeed = SelectProduct.ScrewPoints.FirstOrDefault()?.V_Velocity_Start ?? 100; LockWSpeed = SelectProduct.ScrewPoints.FirstOrDefault()?.W_Velocity_Start ?? 100; LockZDescendSpeed = SelectProduct.ScrewPoints.FirstOrDefault()?.Z_Velocity_Stop ?? 100; LockFeederNumber= SelectProduct.ScrewPoints.FirstOrDefault()?.Feeder ?? 1; LockScrewProgramNumber= SelectProduct.ScrewPoints.FirstOrDefault()?.ScrewProNum ?? 1; CameraList = new ObservableCollection(_configService.GetAllCameras()); } catch (Exception ex) { LogHelper.WriteLogError("机器人点位界面进入时出错!", ex); } } /// /// 是否允许导航到此视图模型。 /// /// /// public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } /// /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。 /// /// public void OnNavigatedFrom(NavigationContext navigationContext) { //if (Robot != null) //{ // Robot.EnterDebugMode = false; //} } #endregion #region 取料拍照点位矫正 private PlcPoint _SelectedCameraForPickPoint; public PlcPoint SelectedCameraForPickPoint { get { return _SelectedCameraForPickPoint; } set { SetProperty(ref _SelectedCameraForPickPoint, value); } } private ObservableCollection _PickPoints = new ObservableCollection(); /// /// 取料点位集合 /// public ObservableCollection PickPoints { get { return _PickPoints; } set { SetProperty(ref _PickPoints, value); } } // private PlcPoint _SelectedPickPoint; /// /// 选中的取料点位 /// public PlcPoint SelectedPickPoint { get { return _SelectedPickPoint; } set { SetProperty(ref _SelectedPickPoint, value); } } private DelegateCommand _AutoCorrectPickPointCommand; public DelegateCommand AutoCorrectPickPointCommand => _AutoCorrectPickPointCommand ?? (_AutoCorrectPickPointCommand = new DelegateCommand(ExecuteAutoCorrectPickPointCommand, CanExecuteAutoCorrectPickPointCommand) .ObservesProperty(()=> SelectedCameraForPickPoint).ObservesProperty(() => SelectedPickPoint).ObservesProperty(() => SelectProcedure).ObservesProperty(() => IsExecutingAutoCorrectPickPoint)); // private bool _IsExecutingAutoCorrectPickPoint = false; /// /// 正在执行取料拍照点位矫正 /// public bool IsExecutingAutoCorrectPickPoint { get { return _IsExecutingAutoCorrectPickPoint; } set { SetProperty(ref _IsExecutingAutoCorrectPickPoint, value); } } async void ExecuteAutoCorrectPickPointCommand() { try { IsExecutingAutoCorrectPickPoint = true; if (SelectedCameraForPickPoint == null || SelectedPickPoint == null || SelectProcedure == null) { return; } if (Robot == null || !Robot.IsConnected) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "机器人未连接,无法执行取料拍照点位矫正!", Duration = 1 }); return; } if (MessageBox.Show("确认要执行取料拍照点位矫正吗?", "取料拍照点位矫正", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return; } var waiting = new WaitingControl(); //show the dialog var task = DialogHost.Show(waiting, "RootDialog", null, null, null); // 1. 控制机器人移动至拍照点位 var rpoint = new RPoint() { X = SelectedCameraForPickPoint.X_Position_Start, Y = SelectedCameraForPickPoint.Y_Position_Start, Z = SelectedCameraForPickPoint.Z_Position_Start, U = SelectedCameraForPickPoint.U_Position_Start, V = SelectedCameraForPickPoint.R_Position, }; await Robot.CalibMotionAsync(rpoint, 0); var _cts = new CancellationTokenSource(); // 2. 执行拍照并获取识别结果 var recognitionResult =await _remoteCommandService.ExecutePhotoGetSinglePoint(SelectProcedure, null, new double[] { rpoint.X, rpoint.Y, 0 }, _cts.Token); if (!recognitionResult.IsSucceed) { if (DialogHost.IsDialogOpen("RootDialog")) { DialogHost.Close("RootDialog"); } await task; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "取料拍照点位矫正失败,识别未成功!", Duration = 1 }); return; } // 3. 根据识别结果更新取料点位坐标 SelectedPickPoint.X_Position_Start = (float)recognitionResult.X; SelectedPickPoint.Y_Position_Start = (float)recognitionResult.Y; if (DialogHost.IsDialogOpen("RootDialog")) { DialogHost.Close("RootDialog"); } await task; _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "取料拍照点位矫正完成!", Duration = 0.4 }); } catch (Exception ex) { LogHelper.WriteLogError("取料拍照点位矫正时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } finally { IsExecutingAutoCorrectPickPoint = false; } } bool CanExecuteAutoCorrectPickPointCommand() { return SelectedCameraForPickPoint!=null && SelectedPickPoint!=null && SelectProcedure!=null && !IsExecutingAutoCorrectPickPoint; } #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; } } } }