using MaterialDesignThemes.Wpf; 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.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; 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; #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(); _ExecuteMotion?.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 _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); } } #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 _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 _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 _AutoCorrectLockPoint; public DelegateCommand AutoCorrectLockPoint => _AutoCorrectLockPoint ?? (_AutoCorrectLockPoint = new DelegateCommand(ExecuteAutoCorrectLockPoint)); #endregion #region 事件 #endregion public PlcPointParamsViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService, IConfigService configService, IRobotService robotService, ISystemDatabaseService systemDatabaseService, IRemoteCommandService remoteCommandService) { _regionManager = regionManager; _eventAggregator = ea; _container = container; _dialogService = dialogService; _configService = configService; _systemDatabaseService = systemDatabaseService; //订阅权限登录事件 _eventAggregator.GetEvent().Subscribe(LoginChange); management = _container.Resolve(); _robotService = robotService; _remoteCommandService = remoteCommandService; } #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 values = (object[])parameter; var point = new RPoint() { X= SelectedPoint.X_Position, Y= SelectedPoint.Y_Position, Z= SelectedPoint.Z_Position_Start, U=SelectedPoint.U_Position, V= SelectedPoint.R_Position, }; 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; try { var curpos = await Robot.GetRobotPosAsync(); SelectedPoint.X_Position = curpos.X; SelectedPoint.Y_Position = curpos.Y; SelectedPoint.Z_Position_Start = curpos.Z; SelectedPoint.U_Position = curpos.U; 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; } } /// /// 电机 /// /// 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; default: break; } } /// /// 增加点位 /// void ExecuteAddPointCommand() { //添加点位 Points.Add(new PlcPoint() { Number = Points.Count + 1, X_Velocity = 100, Y_Velocity = 100, Z_Velocity_Start = 100, Z_Velocity_Stop = 100, U_Velocity = 100, R_Velocity = 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 = point.X; existingPoint.Y_Position = point.Y; } else { Points.Add(new PlcPoint() { Number = startNumber + i, X_Position = point.X, Y_Position = point.Y, X_Velocity=100, Y_Velocity=100, Z_Velocity_Start=100, Z_Velocity_Stop=100, U_Velocity=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 = startPoint.X; SelectProduct.ScrewCameraLocalPos1.Y_Position = startPoint.Y; //结束点 var endPoint = cadPoints[1]; SelectProduct.ScrewCameraLocalPos2.X_Position = endPoint.X; SelectProduct.ScrewCameraLocalPos2.Y_Position = 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 || LockZDescendSpeed <= 0) { var result = MessageBox.Show("速度小于等于0,是否继续写入?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { return; } } //遍历所有点位,设置速度 foreach (var point in Points) { point.X_Velocity = LockXSpeed; point.Y_Velocity = LockYSpeed; point.Z_Velocity_Start = LockZSpeed; point.Z_Velocity_Stop = LockZDescendSpeed; } } /// /// 批量设置锁付点的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 view = new AutoCorrectLockPoint(); var vm = view.DataContext as AutoCorrectLockPointViewModel; vm.Robot = Robot; vm.AllScrewPoint = new List(Points.ToArray()); //show the dialog var result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null) { } } catch (Exception ex) { LogHelper.WriteLogError("通过相机自动矫正锁附点位时出错!", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } #endregion #region 继承 /// /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。 /// /// /// public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { continuationCallback(true); } /// /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。 /// /// /// public async void OnNavigatedTo(NavigationContext navigationContext) { try { SelectProduct = navigationContext.Parameters.GetValue("SelectProduct"); SelectedIndex = 0; PickPoints = SelectProduct.PickPoints; Points = SelectProduct.PickCameraPoints; 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); } } //对锁付点的批量设置进行初始化 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 ?? 100; LockYSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.Y_Velocity ?? 100; LockZSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.Z_Velocity_Start ?? 100; LockZDescendSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.Z_Velocity_Stop ?? 100; LockFeederNumber= SelectProduct.ScrewPoints.FirstOrDefault()?.Feeder ?? 1; LockScrewProgramNumber= SelectProduct.ScrewPoints.FirstOrDefault()?.ScrewProNum ?? 1; } 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, Y = SelectedCameraForPickPoint.Y_Position, Z = SelectedCameraForPickPoint.Z_Position_Start, U = SelectedCameraForPickPoint.U_Position, 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 = (float)recognitionResult.X; SelectedPickPoint.Y_Position = (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; } } } }