Explorar el Código

新增取料/二次定位/产品拍照功能及界面支持

本次提交为 PlcPointParamsViewModel 及其 XAML 视图增加了“取料”、“二次定位”、“产品拍照”三大功能的命令与界面操作。包括:
- 新增 IProductService 注入及 Inhal 属性,支持吸真空编号设置;
- 新增 GoPickCommand、GoRepositionCommand、TakeProductPhotoCommand 及其异步执行逻辑,完善机器人运动与视觉流程调用;
- XAML 精简批量设置 UI,改为按点位类型显示对应操作按钮,界面更直观简洁;
- 优化命令可用性判断与异常处理,提升用户体验和代码可维护性。
孝锋 徐 hace 8 meses
padre
commit
2443feb022

+ 324 - 656
TeamAAS-VM/ViewModels/Product/PlcPointParamsViewModel.cs

@@ -46,6 +46,7 @@ namespace TeamAAS_VP.ViewModels.Product
         IRemoteCommandService _remoteCommandService;
         ICalibrationService _calibrationService;
         ICameraService _cameraService;
+        IProductService _productService;
         CoordinateTransformer local=null;
 
         #region 属性
@@ -354,6 +355,12 @@ namespace TeamAAS_VP.ViewModels.Product
             }
         }
 
+        private int _Inhal=1;
+        public int Inhal
+        {
+            get { return _Inhal; }
+            set { SetProperty(ref _Inhal, value); }
+        }
         #endregion
 
         #region 命令
@@ -420,30 +427,6 @@ namespace TeamAAS_VP.ViewModels.Product
         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));
@@ -470,6 +453,19 @@ namespace TeamAAS_VP.ViewModels.Product
         public DelegateCommand<object> AdditionalAxisMotorOffCommand =>
             _AdditionalAxisMotorOffCommand ?? (_AdditionalAxisMotorOffCommand = new DelegateCommand<object>(ExecuteAdditionalAxisMotorOffCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
 
+        private DelegateCommand _GoPickCommand;
+        public DelegateCommand GoPickCommand =>
+            _GoPickCommand ?? (_GoPickCommand = new DelegateCommand(ExecuteGoPickCommand, CanExecuteCommandGoPickCommandName).ObservesProperty(()=>SelectedPoint));
+
+        private DelegateCommand _GoRepositionCommand;
+        public DelegateCommand GoRepositionCommand =>
+            _GoRepositionCommand ?? (_GoRepositionCommand = new DelegateCommand(ExecuteGoRepositionCommand, CanExecuteCommandGoPickCommandName).ObservesProperty(() => SelectedPoint));
+
+        private DelegateCommand _TakeProductPhotoCommand;
+        public DelegateCommand TakeProductPhotoCommand =>
+            _TakeProductPhotoCommand ?? (_TakeProductPhotoCommand = new DelegateCommand(ExecuteTakeProductPhotoCommand, CanExecuteCommandGoPickCommandName).ObservesProperty(() => SelectedPoint));
+
+        
         #endregion
 
         #region 事件
@@ -478,7 +474,7 @@ namespace TeamAAS_VP.ViewModels.Product
 
         public PlcPointParamsViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService,
             IConfigService configService, IRobotService robotService, ISystemDatabaseService systemDatabaseService, IRemoteCommandService remoteCommandService,
-            ICalibrationService calibrationService, ICameraService cameraService)
+            ICalibrationService calibrationService, ICameraService cameraService, IProductService productService)
         {
             _regionManager = regionManager;
             _eventAggregator = ea;
@@ -493,6 +489,7 @@ namespace TeamAAS_VP.ViewModels.Product
             _remoteCommandService = remoteCommandService;
             _calibrationService = calibrationService;
             _cameraService = cameraService;
+            _productService = productService;
         }
 
         #region 方法
@@ -620,33 +617,25 @@ namespace TeamAAS_VP.ViewModels.Product
             if (Robot == null || !Robot.IsConnected) return;
             try
             {
-                if (SelectedIndex == 4)
+                //确认要执行该点位的该运动指令吗
+                if (MessageBox.Show($"确认要执行点位 {SelectedPoint.Number} 的 {motionCmd} 指令吗?", "执行点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
                 {
-                    await ExecuteAutoCorrectLockPointAndExecuteCommand(SelectedPoint);
+                    return;
                 }
-                else
-                {
-                    //确认要执行该点位的该运动指令吗
-                    if (MessageBox.Show($"确认要执行点位 {SelectedPoint.Number} 的 {motionCmd} 指令吗?", "执行点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
-                    {
-                        return;
-                    }
 
-                    //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;
-                }    
+                //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;
+                }
                 _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 });
             }
             catch (Exception ex)
@@ -837,9 +826,7 @@ namespace TeamAAS_VP.ViewModels.Product
             switch (SelectedIndex)
             {
                 case 0:
-
                     Points = SelectProduct.PickCameraPoints;
-                    PickPoints = SelectProduct.PickPoints;
                     break;
                 case 1:
                     Points = SelectProduct.PickPoints;
@@ -1049,487 +1036,6 @@ namespace TeamAAS_VP.ViewModels.Product
             }
         }
 
-        /// <summary>
-        /// 导入锁付拍照引导的产品坐标系中的点位
-        /// </summary>
-        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<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 });
-                    }
-                    else
-                    {
-                        _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "请导入两个点,分别为锁付拍照引导的起始点和结束点!", Duration = 1 });
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                LogHelper.WriteLogError("导入CAD点位时出错!", ex);
-                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
-            }
-        }
-
-        /// <summary>
-        /// 批量设置锁付点的供料器编号和螺丝程序编号
-        /// </summary>
-        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;
-            }
-        }
-
-        /// <summary>
-        /// 批量设置锁付点的速度
-        /// </summary>
-        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;
-            }
-        }
-
-        /// <summary>
-        /// 批量设置锁付点的Z深度
-        /// </summary>
-        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;
-            }
-        }
-
-        /// <summary>
-        /// 批量设置锁付点的起始Z坐标
-        /// </summary>
-        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);
-                }
-            }
-
-        }
-
-        /// <summary>
-        /// 通过相机自动矫正锁附点位
-        /// </summary>
-        async void ExecuteAutoCorrectLockPoint()
-        {
-            try
-            {
-                if (Camera != null)
-                {
-                    if (Camera.IsGrabbing)
-                    {
-                        ExecuteStopGrabbingCommand();
-                    }
-                }
-                //弹窗提示用户是否确认要通过相机自动矫正锁附点位
-                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 == screwCameraLocalPos1.X_Position && p.Y_Position == screwCameraLocalPos1.Y_Position);
-                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 == screwCameraLocalPos2.X_Position && p.Y_Position == screwCameraLocalPos2.Y_Position);
-                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("SelectProduct", SelectProduct);
-                parameters.Add("Points", new List<PlcPoint>(SelectProduct.ScrewPoints.ToArray()));
-                _dialogService.Show("AutoCorrectLockPoint", parameters, rst =>
-                {
-                    //对话框关闭之后的回调函数,可以在这解析结果。
-                    ButtonResult result1 = rst.Result;
-
-                    if (result1 == ButtonResult.OK)
-                    {
-                        var param = rst.Parameters.GetValue<ObservableCollection<PointEx>>("CorrectPoints");
-                        var local1= rst.Parameters.GetValue<CoordinateTransformer>("Local");
-                        if (local1!=null)
-                        {
-                            local = local1;
-                        }
-                        for (int i = 0; i < SelectProduct.ScrewPoints.Count; i++)
-                        {
-                            SelectProduct.ScrewPoints[i].X_Position = param[i].PostX;
-                            SelectProduct.ScrewPoints[i].Y_Position = param[i].PostY;
-                        }
-
-                        _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "完成!", Duration = 1 });
-                    }
-
-                });
-            }
-            catch (Exception ex)
-            {
-                LogHelper.WriteLogError("通过相机自动矫正锁附点位时出错!", ex);
-                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
-            }
-        }
-
-        /// <summary>
-        /// 通过相机先定位产品再执行锁付点位
-        /// </summary>
-        /// <param name="point"></param>
-        private async Task ExecuteAutoCorrectLockPointAndExecuteCommand(PlcPoint point)
-        {
-            var waiting = new WaitingControl();
-            Task<object> task;
-            try
-            {
-                if (Camera != null)
-                {
-                    if (Camera.IsGrabbing)
-                    {
-                        ExecuteStopGrabbingCommand();
-                    }
-                }
-                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<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "机器人未连接,无法执行取料拍照点位矫正!", Duration = 1 });
-                    return;
-                }
-                //获取当前产品
-                var product = SelectProduct;
-                if (product == null)
-                {
-                    _eventAggregator.GetEvent<SnackbarMessageNotification>().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, point.Y_Position);
-                var worldPoint = local.ToOldCoord(localPoint.X, localPoint.Y);
-                var point1 = point.Clone();
-                point1.X_Position = (float)worldPoint[0];
-                point1.Y_Position = (float)worldPoint[1];
-                //执行该点位
-                //移动机器人至拍照点位,拍照
-                var rpoint = new RPoint()
-                {
-                    X = point1.X_Position,
-                    Y = point1.Y_Position,
-                    Z = point1.Z_Position_Start,
-                };
-                await Robot.CalibMotionAsync(rpoint, 0);
-
-                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "完成!", Duration = 1 });
-            }
-            catch (Exception ex)
-            {
-                LogHelper.WriteLogError("通过相机自动矫正锁附点位并执行时出错!", ex);
-                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
-            }
-            finally
-            {
-                try
-                {
-                    if (DialogHost.IsDialogOpen("RootDialog"))
-                    {
-                        DialogHost.Close("RootDialog");
-                    }
-                }
-                catch (Exception)
-                {
-
-                }
-            }
-        }
-
-        /// <summary>
-        /// 移动相机拍产品两个Msrk点计算Local
-        /// </summary>
-        /// <param name="product"></param>
-        /// <returns></returns>
-        private async Task<bool> AutoCalibLockPointLocal(ProductModel product)
-        {
-            return true;
-            //try
-            //{
-            //    //获取锁付相机拍照点位
-            //    var screwCameraPoint = product.ScrewCameraPoints;
-            //    if (screwCameraPoint == null || screwCameraPoint.Count < 2)
-            //    {
-            //        _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照点位,无法执行取料拍照点位矫正!", Duration = 1 });
-            //        return false;
-            //    }
-            //    //获取相机拍照点位对应的锁付点
-            //    var screwCameraLocalPoint1 = product.ScrewCameraLocalPos1;
-            //    if (screwCameraLocalPoint1 == null)
-            //    {
-            //        _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照点位对应的锁付点,无法执行取料拍照点位矫正!", Duration = 1 });
-            //        return false;
-            //    }
-            //    var screwCameraLocalPoint2 = product.ScrewCameraLocalPos2;
-            //    if (screwCameraLocalPoint2 == null)
-            //    {
-            //        _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照点位对应的锁付点,无法执行取料拍照点位矫正!", Duration = 1 });
-            //        return false;
-            //    }
-            //    var ProcedureModels = new ObservableCollection<ProcedureModel>();
-            //    foreach (var item in product.CameraProcedures)
-            //    {
-            //        foreach (var item1 in item.ProcedureModels)
-            //        {
-            //            ProcedureModels.Add(item1);
-            //        }
-            //    }
-            //    //获取拍照流程
-            //    if (product.MoveDownCameraLockPhotoProcedureId == Guid.Empty)
-            //    {
-            //        _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照流程,无法执行取料拍照点位矫正!", Duration = 1 });
-            //        return false;
-            //    }
-            //    var procedure = ProcedureModels.FirstOrDefault(p => p.Id == product.MoveDownCameraLockPhotoProcedureId);
-            //    if (procedure == null)
-            //    {
-            //        _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "未获取到锁付相机拍照流程,无法执行取料拍照点位矫正!", Duration = 1 });
-            //        return false;
-            //    }
-
-            //    CancellationTokenSource _cts = new CancellationTokenSource();
-            //    //移动机器人至拍照点位,拍照
-            //    var rpoint = new RPoint()
-            //    {
-            //        X = screwCameraPoint[0].X_Position,
-            //        Y = screwCameraPoint[0].Y_Position,
-            //        Z = screwCameraPoint[0].Z_Position_Start,
-            //        U = screwCameraPoint[0].U_Position,
-            //        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<SnackbarMessageNotification>().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,
-            //        Y = screwCameraPoint[1].Y_Position,
-            //        Z = screwCameraPoint[1].Z_Position_Start,
-            //        U = screwCameraPoint[1].U_Position,
-            //        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<SnackbarMessageNotification>().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, screwCameraLocalPoint1.Y_Position);
-            //    PointF localP2 = new PointF(screwCameraLocalPoint2.X_Position, screwCameraLocalPoint2.Y_Position);
-            //    local = new CoordinateTransformer(worldP1, worldP2, localP1, localP2);
-            //    return true;
-            //}
-            //catch (Exception ex)
-            //{
-            //    LogHelper.WriteLogError("计算锁付点位产品坐标系坐标时出错!", ex);
-            //    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
-            //    return false;
-            //}
-        }
-
         /// <summary>
         /// 停止采集
         /// </summary>
@@ -1680,6 +1186,291 @@ namespace TeamAAS_VP.ViewModels.Product
                 _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 0.4 });
             }
         }
+
+        /// <summary>
+        /// 去取料
+        /// </summary>
+        async void ExecuteGoPickCommand()
+        {
+            try
+            {
+                if (SelectedPoint == null)
+                {
+                    return;
+                }
+                if (Robot == null || !Robot.IsConnected)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().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 = SelectedPoint.X_Position,
+                    Y = SelectedPoint.Y_Position,
+                    Z = SelectedPoint.Z_Position_Start,
+                    U = SelectedPoint.U_Position,
+                    V = SelectedPoint.R_Position,
+                };
+                await Robot.CalibMotionAsync(rpoint, 0);
+
+                await Robot.CalibParameAsync(new PickInfo() { Inhal= Inhal,Blow=1},20,20,true,200,200);
+                //打开吸真空
+                await Robot.CalibOutIOAsync(true);
+
+               await Task.Delay(500);
+
+                rpoint.Z = 0;
+                await Robot.CalibMotionAsync(rpoint, 0);
+
+                if (DialogHost.IsDialogOpen("RootDialog"))
+                {
+                    DialogHost.Close("RootDialog");
+                }
+                await task;
+
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "取料完成!", Duration = 0.4 });
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("取料时出错!", ex);
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
+            }
+        }
+
+        bool CanExecuteCommandGoPickCommandName()
+        {
+            return SelectedPoint != null;
+        }
+
+
+        ToolCoord toolCoord = null;
+        /// <summary>
+        /// 去二次定位
+        /// </summary>
+        async void ExecuteGoRepositionCommand()
+        {
+            try
+            {
+                if (SelectedPoint == null)
+                {
+                    return;
+                }
+                if (Robot == null || !Robot.IsConnected)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().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 = SelectedPoint.X_Position,
+                    Y = SelectedPoint.Y_Position,
+                    Z = SelectedPoint.Z_Position_Start,
+                    U = SelectedPoint.U_Position,
+                    V = SelectedPoint.R_Position,
+                };
+                await Robot.CalibMotionAsync(rpoint, 0);
+                await Task.Delay(200);
+
+                //获取固定向上相机1的流程
+                var process1 = _productService.GetCurrentProductProcedureModelById(SelectProduct.FixedUpCamera1ProcedureId);
+                if (process1 == null)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"固定向上相机1视觉流程,流程ID:{SelectProduct.FixedUpCamera1ProcedureId} 未找到!", Duration = 1 });
+                    if (DialogHost.IsDialogOpen("RootDialog"))
+                    {
+                        DialogHost.Close("RootDialog");
+                    }
+                    await task;
+                    return;
+                }
+                //获取固定向上相机2的流程
+                var process2 = _productService.GetCurrentProductProcedureModelById(SelectProduct.FixedUpCamera2ProcedureId);
+                if (process2 == null)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"固定向上相机2视觉流程,流程ID:{SelectProduct.FixedUpCamera2ProcedureId} 未找到!", Duration = 1 });
+                    if (DialogHost.IsDialogOpen("RootDialog"))
+                    {
+                        DialogHost.Close("RootDialog");
+                    }
+                    await task;
+                    return;
+                }
+                // 执行视觉任务
+                var _cts = new CancellationTokenSource();
+                var task1 = _remoteCommandService.ExecutePhotoGetSinglePoint(process1, null, new double[] { rpoint.X, rpoint.Y, rpoint.U }, _cts.Token);
+                var task2 = _remoteCommandService.ExecutePhotoGetSinglePoint(process2, null, new double[] { rpoint.X, rpoint.Y, rpoint.U }, _cts.Token);
+                var visionResults = await Task.WhenAll(task1, task2);
+                if (visionResults[0].IsSucceed && visionResults[1].IsSucceed)
+                {
+                    float tool1X = (float)(visionResults[0].X - visionResults[0].X);
+                    float tool1Y = (float)(visionResults[0].Y - visionResults[0].Y);
+                    float tool2X = (float)(visionResults[1].Y - visionResults[1].Y);
+                    float tool2Y = (float)(visionResults[1].Y - visionResults[1].Y);
+                    float toolX = (tool1X + tool2X) / 2;
+                    float toolY = (tool1Y + tool2Y) / 2;
+                    toolCoord = new ToolCoord();
+                    toolCoord.SetTool(toolX, toolY);
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "视觉定位成功!", Duration = 0.4 });
+                    if (DialogHost.IsDialogOpen("RootDialog"))
+                    {
+                        DialogHost.Close("RootDialog");
+                    }
+                    await task;
+                    return;
+                }
+                else
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "视觉定位失败,无法进行二次定位!", Duration = 1 });
+                    if (DialogHost.IsDialogOpen("RootDialog"))
+                    {
+                        DialogHost.Close("RootDialog");
+                    }
+                    await task;
+                    return;
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("二次定位时出错!", ex);
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
+                if (DialogHost.IsDialogOpen("RootDialog"))
+                {
+                    DialogHost.Close("RootDialog");
+                }
+            }
+        }
+
+        /// <summary>
+        /// 执行产品拍照
+        /// </summary>
+        async void ExecuteTakeProductPhotoCommand()
+        {
+            try
+            {
+                if (SelectedPoint == null)
+                {
+                    return;
+                }
+                if (Robot == null || !Robot.IsConnected)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "机器人未连接,无法执行产品拍照!", Duration = 1 });
+                    return;
+                }
+                if (MessageBox.Show("确认要执行产品拍照吗?", "去产品位置拍照", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
+                {
+                    return;
+                }
+
+                //如果二次定位的工具坐标为空,则提示用户先进行二次定位
+                if (toolCoord == null)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "二次定位的工具坐标为空,无法执行产品拍照!", Duration = 1 });
+                    return;
+                }
+
+                var waiting = new WaitingControl();
+                //show the dialog
+                var task = DialogHost.Show(waiting, "RootDialog", null, null, null);
+
+                // 1. 控制机器人移动至拍照点位
+                var rpoint = new RPoint()
+                {
+                    X = SelectedPoint.X_Position,
+                    Y = SelectedPoint.Y_Position,
+                    Z = SelectedPoint.Z_Position_Start,
+                    U = SelectedPoint.U_Position,
+                    V = SelectedPoint.R_Position,
+                };
+                await Robot.CalibMotionAsync(rpoint, 0);
+                await Task.Delay(200);
+
+                //获取移动向下相机1的流程
+                var process1 = _productService.GetCurrentProductProcedureModelById(SelectProduct.MoveDownCamera1LockPhotoProcedureId);
+                if (process1 == null)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"移动向下相机1视觉流程,流程ID:{SelectProduct.MoveDownCamera1LockPhotoProcedureId} 未找到!", Duration = 1 });
+                    if (DialogHost.IsDialogOpen("RootDialog"))
+                    {
+                        DialogHost.Close("RootDialog");
+                    }
+                    await task;
+                    return;
+                }
+                //获取移动向下相机2的流程
+                var process2 = _productService.GetCurrentProductProcedureModelById(SelectProduct.MoveDownCamera2LockPhotoProcedureId);
+                if (process2 == null)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"移动向下相机2视觉流程,流程ID:{SelectProduct.MoveDownCamera2LockPhotoProcedureId} 未找到!", Duration = 1 });
+                    if (DialogHost.IsDialogOpen("RootDialog"))
+                    {
+                        DialogHost.Close("RootDialog");
+                    }
+                    await task;
+                    return;
+                }
+                // 执行视觉任务
+                var _cts = new CancellationTokenSource();
+                var task1 = _remoteCommandService.ExecutePhotoGetSinglePoint(process1, null, new double[] { rpoint.X, rpoint.Y, rpoint.U }, _cts.Token);
+                var task2 = _remoteCommandService.ExecutePhotoGetSinglePoint(process2, null, new double[] { rpoint.X, rpoint.Y, rpoint.U }, _cts.Token);
+                var visionResults = await Task.WhenAll(task1, task2);
+                if (visionResults[0].IsSucceed && visionResults[1].IsSucceed)
+                {
+                    float tool1X = (float)(visionResults[0].X - visionResults[0].X);
+                    float tool1Y = (float)(visionResults[0].Y - visionResults[0].Y);
+                    float tool2X = (float)(visionResults[1].Y - visionResults[1].Y);
+                    float tool2Y = (float)(visionResults[1].Y - visionResults[1].Y);
+                    float toolX = (tool1X + tool2X) / 2;
+                    float toolY = (tool1Y + tool2Y) / 2;
+
+                    if (DialogHost.IsDialogOpen("RootDialog"))
+                    {
+                        DialogHost.Close("RootDialog");
+                    }
+                    await task;
+                    return;
+                }
+                else
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "视觉定位失败,无法进行产品拍照!", Duration = 1 });
+                    if (DialogHost.IsDialogOpen("RootDialog"))
+                    {
+                        DialogHost.Close("RootDialog");
+                    }
+                    await task;
+                    return;
+                }
+
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("执行产品拍照时出错!", ex);
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
+                if (DialogHost.IsDialogOpen("RootDialog"))
+                {
+                    DialogHost.Close("RootDialog");
+                }
+            }
+        }
         #endregion
 
         #region 继承
@@ -1702,11 +1493,11 @@ namespace TeamAAS_VP.ViewModels.Product
         {
             try
             {
+                toolCoord = null;
                 local = null;
                 SelectProduct = navigationContext.Parameters.GetValue<ProductModel>("SelectProduct");
 
                 SelectedIndex = 0;
-                PickPoints = SelectProduct.PickPoints;
                 Points = SelectProduct.PickCameraPoints;
 
                 if (Robot == null)
@@ -1794,129 +1585,6 @@ namespace TeamAAS_VP.ViewModels.Product
         }
         #endregion
 
-        #region 取料拍照点位矫正
-        private PlcPoint _SelectedCameraForPickPoint;
-        public PlcPoint SelectedCameraForPickPoint
-        {
-            get { return _SelectedCameraForPickPoint; }
-            set { SetProperty(ref _SelectedCameraForPickPoint, value); }
-        }
-
-
-        private ObservableCollection<PlcPoint> _PickPoints = new ObservableCollection<PlcPoint>();
-        /// <summary>
-        /// 取料点位集合
-        /// </summary>
-        public ObservableCollection<PlcPoint> PickPoints
-        {
-            get { return _PickPoints; }
-            set { SetProperty(ref _PickPoints, value); }
-        }
-
-        //
-        private PlcPoint _SelectedPickPoint;
-        /// <summary>
-        /// 选中的取料点位
-        /// </summary>
-        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;
-        /// <summary>
-        /// 正在执行取料拍照点位矫正
-        /// </summary>
-        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<SnackbarMessageNotification>().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<SnackbarMessageNotification>().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<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = "取料拍照点位矫正完成!", Duration = 0.4 });
-            }
-            catch (Exception ex)
-            {
-                LogHelper.WriteLogError("取料拍照点位矫正时出错!", ex);
-                _eventAggregator.GetEvent<SnackbarMessageNotification>().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;
 

+ 41 - 417
TeamAAS-VM/Views/Product/PlcPointParams.xaml

@@ -340,8 +340,8 @@
                             <!--不同点位类型的操作面板-->
                             <StackPanel DockPanel.Dock="Bottom"
                                         Orientation="Vertical">
-                                <!--取料拍照点位面板-->
-                                <!--<StackPanel x:Name="AutoCorrectPickPointPanel"
+                                <!--取料点位面板-->
+                                <StackPanel x:Name="AutoCorrectPickPointPanel"
                                             Orientation="Vertical"
                                             d:Visibility="Visible">
                                     <StackPanel.Style>
@@ -349,101 +349,40 @@
                                             <Setter Property="Visibility"
                                                     Value="Collapsed" />
                                             <Style.Triggers>
-                                                --><!-- 当 SelectedIndex == 0 时显示此面板 --><!--
+                                                <!--当 SelectedIndex == 1 时显示此面板-->
                                                 <DataTrigger Binding="{Binding SelectedIndex}"
-                                                             Value="0">
+                                                             Value="1">
                                                     <Setter Property="Visibility"
                                                             Value="Visible" />
                                                 </DataTrigger>
                                             </Style.Triggers>
                                         </Style>
                                     </StackPanel.Style>
-                                    <StackPanel Orientation="Horizontal">
-                                        <ToggleButton x:Name="btn_AutoCorrectPickPoint"
-                                                      d:IsChecked="True"
-                                                      Style="{StaticResource MaterialDesignSwitchToggleButton}">
-                                            <materialDesign:PackIcon Kind="Pin"
-                                                                     RenderTransformOrigin=".5,.5">
-                                                <materialDesign:PackIcon.RenderTransform>
-                                                    <RotateTransform Angle="45" />
-                                                </materialDesign:PackIcon.RenderTransform>
-                                            </materialDesign:PackIcon>
-                                            <materialDesign:ToggleButtonAssist.OnContent>
-                                                <materialDesign:PackIcon Kind="Pin" />
-                                            </materialDesign:ToggleButtonAssist.OnContent>
-                                        </ToggleButton>
-                                        <TextBlock Text="通过相机自动矫正取料点位"
-                                                   FontWeight="Bold"
-                                                   Margin="0,10,0,5" />
-                                    </StackPanel>
                                     <ScrollViewer HorizontalScrollBarVisibility="Auto"
                                                   VerticalScrollBarVisibility="Disabled">
                                         <StackPanel Orientation="Horizontal"
                                                     HorizontalAlignment="Left"
-                                                    Visibility="{Binding ElementName=btn_AutoCorrectPickPoint,Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}">
-                                            <TextBlock Text="选择拍照点:"
+                                                    >
+                                            <TextBlock Text="吸真空编号:"
                                                        VerticalAlignment="Center" />
-                                            <ComboBox MinWidth="50"
-                                                      Margin="5,0,0,0"
-                                                      ItemsSource="{Binding Points}"
-                                                      SelectedItem="{Binding SelectedCameraForPickPoint}">
-                                                <ComboBox.ItemTemplate>
-                                                    <DataTemplate>
-                                                        <StackPanel HorizontalAlignment="Left"
-                                                                    Orientation="Horizontal">
-                                                            <TextBlock Text="{Binding Number,StringFormat={}{0}:}" />
-                                                            <TextBlock Text="{Binding Label}" />
-                                                        </StackPanel>
-                                                    </DataTemplate>
-                                                </ComboBox.ItemTemplate>
-                                            </ComboBox>
-                                            <TextBlock Margin="5,0,0,0"
-                                                       VerticalAlignment="Center"
-                                                       Text="选择移动视觉流程:" />
-                                            <ComboBox MinWidth="50"
-                                                      Margin="5,0,0,0"
-                                                      ItemsSource="{Binding ProcedureModels}"
-                                                      SelectedItem="{Binding SelectProcedure}">
-                                                <ComboBox.ItemTemplate>
-                                                    <DataTemplate>
-                                                        <StackPanel Orientation="Horizontal">
-                                                            <materialDesign:PackIcon Kind="VideoOutline" />
-                                                            <TextBlock Text="{Binding CameraName}"
-                                                                       Margin="6,0" />
-                                                            <materialDesign:PackIcon Kind="ProgressWrench" />
-                                                            <TextBlock Text="{Binding Name}"
-                                                                       Margin="6,0" />
-                                                        </StackPanel>
-                                                    </DataTemplate>
-                                                </ComboBox.ItemTemplate>
-                                            </ComboBox>
-                                            <TextBlock Margin="5,0,0,0"
-                                                       VerticalAlignment="Center"
-                                                       Text="选择要校准的取料位:" />
-                                            <ComboBox MinWidth="50"
-                                                      Margin="5,0,0,0"
-                                                      ItemsSource="{Binding PickPoints}"
-                                                      SelectedItem="{Binding SelectedPickPoint}">
-                                                <ComboBox.ItemTemplate>
-                                                    <DataTemplate>
-                                                        <StackPanel HorizontalAlignment="Left"
-                                                                    Orientation="Horizontal">
-                                                            <TextBlock Text="{Binding Number,StringFormat={}{0}:}" />
-                                                            <TextBlock Text="{Binding Label}" />
-                                                        </StackPanel>
-                                                    </DataTemplate>
-                                                </ComboBox.ItemTemplate>
-                                            </ComboBox>
-                                            <Button Content="执行位置"
+                                            <mah:NumericUpDown MinWidth="100"
+                                                               HorizontalContentAlignment="Center"
+                                                               VerticalContentAlignment="Center"
+                                                               Minimum="0"
+                                                               Maximum="100"
+                                                               Value="{Binding Inhal,Mode=OneWay}"
+                                                               Margin="5,0,0,0" />
+
+                                            <Button Content="执行取料"
                                                     Margin="10,0,0,0"
                                                     materialDesign:ButtonAssist.CornerRadius="5"
-                                                    Command="{Binding AutoCorrectPickPointCommand}" />
+                                                    Command="{Binding GoPickCommand}" />
                                         </StackPanel>
                                     </ScrollViewer>
-                                </StackPanel>-->
+                                </StackPanel>
 
-                                <!--锁付拍照面板-->
-                                <!--<StackPanel x:Name="LockCameraPanel"
+                                <!--下相机二次定位-->
+                                <StackPanel x:Name="DownCameraRepositionPanel"
                                             Orientation="Vertical"
                                             d:Visibility="Visible">
                                     <StackPanel.Style>
@@ -451,9 +390,9 @@
                                             <Setter Property="Visibility"
                                                     Value="Collapsed" />
                                             <Style.Triggers>
-                                                --><!-- 当 SelectedIndex == 4 时显示此面板 --><!--
+                                                <!--当 SelectedIndex == 1 时显示此面板-->
                                                 <DataTrigger Binding="{Binding SelectedIndex}"
-                                                             Value="3">
+                                                             Value="2">
                                                     <Setter Property="Visibility"
                                                             Value="Visible" />
                                                 </DataTrigger>
@@ -462,166 +401,18 @@
                                     </StackPanel.Style>
                                     <ScrollViewer HorizontalScrollBarVisibility="Auto"
                                                   VerticalScrollBarVisibility="Disabled">
-                                        <StackPanel Orientation="Vertical">
-                                            <TextBlock Text="拍1锁多时,相机拍照位置对应的产品坐标系中位置" />
-                                            <Grid HorizontalAlignment="Left">
-                                                <Grid.ColumnDefinitions>
-                                                    <ColumnDefinition Width="Auto" />
-                                                    <ColumnDefinition Width="Auto" />
-                                                    <ColumnDefinition Width="Auto" />
-                                                    <ColumnDefinition Width="Auto" />
-                                                    <ColumnDefinition Width="Auto" />
-                                                    <ColumnDefinition Width="Auto" />
-                                                    <ColumnDefinition Width="Auto" />
-                                                    <ColumnDefinition Width="Auto" />
-                                                    <ColumnDefinition Width="Auto" />
-                                                </Grid.ColumnDefinitions>
-                                                <Grid.RowDefinitions>
-                                                    <RowDefinition Height="Auto" />
-                                                    <RowDefinition Height="Auto" />
-                                                </Grid.RowDefinitions>
-                                                --><!--拍照1--><!--
-                                                <TextBlock Grid.Row="0"
-                                                           Grid.Column="0"
-                                                           Text="拍照1:"
-                                                           VerticalAlignment="Center" />
-
-                                                <TextBlock Grid.Row="0"
-                                                           Grid.Column="1"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center"
-                                                           Text="X:" />
-                                                <mah:NumericUpDown Grid.Row="0"
-                                                                   Grid.Column="2"
-                                                                   Value="{Binding SelectProduct.ScrewCameraLocalPos1.X_Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="-9999.000"
-                                                                   Maximum="9999.000"
-                                                                   Interval="0.1"
-                                                                   StringFormat="F3"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Grid.Row="0"
-                                                           Grid.Column="3"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center"
-                                                           Text="Y:" />
-                                                <mah:NumericUpDown Grid.Row="0"
-                                                                   Grid.Column="4"
-                                                                   Value="{Binding SelectProduct.ScrewCameraLocalPos1.Y_Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="-9999.000"
-                                                                   Maximum="9999.000"
-                                                                   Interval="0.1"
-                                                                   StringFormat="F3"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Grid.Row="0"
-                                                           Grid.Column="5"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center"
-                                                           Text="Z:" />
-                                                <mah:NumericUpDown Grid.Row="0"
-                                                                   Grid.Column="6"
-                                                                   Value="{Binding SelectProduct.ScrewCameraLocalPos1.Z_Position_Start, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="-9999.000"
-                                                                   Maximum="9999.000"
-                                                                   Interval="0.1"
-                                                                   StringFormat="F3"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                --><!--拍照2--><!--
-                                                <TextBlock Grid.Row="1"
-                                                           Grid.Column="0"
-                                                           Text="拍照2:"
-                                                           VerticalAlignment="Center" />
-
-                                                <TextBlock Grid.Row="1"
-                                                           Grid.Column="1"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center"
-                                                           Text="X:" />
-                                                <mah:NumericUpDown Grid.Row="1"
-                                                                   Grid.Column="2"
-                                                                   Value="{Binding SelectProduct.ScrewCameraLocalPos2.X_Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="-9999.000"
-                                                                   Maximum="9999.000"
-                                                                   Interval="0.1"
-                                                                   StringFormat="F3"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Grid.Row="1"
-                                                           Grid.Column="3"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center"
-                                                           Text="Y:" />
-                                                <mah:NumericUpDown Grid.Row="1"
-                                                                   Grid.Column="4"
-                                                                   Value="{Binding SelectProduct.ScrewCameraLocalPos2.Y_Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="-9999.000"
-                                                                   Maximum="9999.000"
-                                                                   Interval="0.1"
-                                                                   StringFormat="F3"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Grid.Row="1"
-                                                           Grid.Column="5"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center"
-                                                           Text="Z:" />
-                                                <mah:NumericUpDown Grid.Row="1"
-                                                                   Grid.Column="6"
-                                                                   Value="{Binding SelectProduct.ScrewCameraLocalPos2.Z_Position_Start, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="-9999.000"
-                                                                   Maximum="9999.000"
-                                                                   Interval="0.1"
-                                                                   StringFormat="F3"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                --><!--通过CAD导入点位按钮--><!--
-                                                <Button Content="通过CAD导入点位"
-                                                        Grid.Row="0"
-                                                        Grid.Column="7"
-                                                        Grid.RowSpan="2"
-                                                        Margin="10,0"
-                                                        MinWidth="100"
-                                                        HorizontalAlignment="Left"
-                                                        materialDesign:ButtonAssist.CornerRadius="5"
-                                                        Command="{Binding ImportCadLockCameraPointCommand}" />
-                                                --><!--通过相机自动矫正锁附点位--><!--
-                                                <Button Content="通过相机自动矫正锁附点位"
-                                                        Grid.Row="0"
-                                                        Grid.Column="8"
-                                                        Grid.RowSpan="2"
-                                                        Margin="10,0"
-                                                        MinWidth="150"
-                                                        HorizontalAlignment="Left"
-                                                        materialDesign:ButtonAssist.CornerRadius="5"
-                                                        Command="{Binding AutoCorrectLockPointCommand}" />
-
-                                            </Grid>
+                                        <StackPanel Orientation="Horizontal"
+                                                    HorizontalAlignment="Left">
+                                            <Button Content="执行二次定位"
+                                                    Margin="10,0,0,0"
+                                                    materialDesign:ButtonAssist.CornerRadius="5"
+                                                    Command="{Binding GoRepositionCommand}"
+                                                    />
                                         </StackPanel>
                                     </ScrollViewer>
-                                </StackPanel>-->
-
-                                <!--锁付点位面板-->
-                                <!--<StackPanel x:Name="LockPointPanel"
+                                </StackPanel>
+                                <!--产品拍照-->
+                                <StackPanel 
                                             Orientation="Vertical"
                                             d:Visibility="Visible">
                                     <StackPanel.Style>
@@ -629,9 +420,9 @@
                                             <Setter Property="Visibility"
                                                     Value="Collapsed" />
                                             <Style.Triggers>
-                                                --><!-- 当 SelectedIndex == 4 时显示此面板 --><!--
+                                                <!--当 SelectedIndex == 1 时显示此面板-->
                                                 <DataTrigger Binding="{Binding SelectedIndex}"
-                                                             Value="4">
+                                                             Value="3">
                                                     <Setter Property="Visibility"
                                                             Value="Visible" />
                                                 </DataTrigger>
@@ -640,183 +431,16 @@
                                     </StackPanel.Style>
                                     <ScrollViewer HorizontalScrollBarVisibility="Auto"
                                                   VerticalScrollBarVisibility="Disabled">
-                                        <StackPanel Orientation="Vertical">
-
-                                            <StackPanel Orientation="Horizontal"
-                                                        HorizontalAlignment="Left">
-                                                <TextBlock Text="批量设置所有锁付点的起始Z轴高度:"
-                                                           VerticalAlignment="Center" />
-                                                <TextBlock Text="起始Z轴高度:"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center" />
-                                                <mah:NumericUpDown Value="{Binding LockPointStartZ, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="-9999.000"
-                                                                   Maximum="9999.000"
-                                                                   Interval="0.1"
-                                                                   StringFormat="F3"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Margin="0"
-                                                           VerticalAlignment="Center"
-                                                           Text="mm" />
-                                                --><!--应用按钮--><!--
-                                                <Button Content="应用"
-                                                        Margin="10,0,0,0"
-                                                        MinWidth="60"
-                                                        HorizontalAlignment="Left"
-                                                        materialDesign:ButtonAssist.CornerRadius="5"
-                                                        Command="{Binding ApplyLockPointStartZCommand}" />
-                                            </StackPanel>
-                                            <StackPanel Orientation="Horizontal"
-                                                        HorizontalAlignment="Left">
-                                                <TextBlock Text="批量设置所有锁付点的锁付深度:"
-                                                           VerticalAlignment="Center" />
-                                                <TextBlock Text="锁付深度:"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center" />
-                                                <mah:NumericUpDown Value="{Binding LockZDepth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="-9999.000"
-                                                                   Maximum="9999.000"
-                                                                   Interval="0.1"
-                                                                   StringFormat="F3"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Margin="0"
-                                                           VerticalAlignment="Center"
-                                                           Text="mm" />
-                                                --><!--应用按钮--><!--
-                                                <Button Content="应用"
-                                                        Margin="10,0,0,0"
-                                                        MinWidth="60"
-                                                        HorizontalAlignment="Left"
-                                                        materialDesign:ButtonAssist.CornerRadius="5"
-                                                        Command="{Binding ApplyLockPointDepthCommand}" />
-                                            </StackPanel>
-                                            <StackPanel Orientation="Horizontal"
-                                                        HorizontalAlignment="Left">
-                                                <TextBlock Text="批量设置所有锁付点的各轴速度:"
-                                                           VerticalAlignment="Center" />
-                                                <TextBlock Text="X轴速度:"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center" />
-                                                <mah:NumericUpDown Value="{Binding LockXSpeed, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="0"
-                                                                   Maximum="20000"
-                                                                   Interval="1"
-                                                                   StringFormat="F1"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Margin="0"
-                                                           VerticalAlignment="Center"
-                                                           Text="mm/s" />
-                                                <TextBlock Text="Y轴速度:"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center" />
-                                                <mah:NumericUpDown Value="{Binding LockYSpeed, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="0"
-                                                                   Maximum="20000"
-                                                                   Interval="1"
-                                                                   StringFormat="F1"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Margin="0"
-                                                           VerticalAlignment="Center"
-                                                           Text="mm/s" />
-                                                <TextBlock Text="Z轴速度:"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center" />
-                                                <mah:NumericUpDown Value="{Binding LockZSpeed, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="0"
-                                                                   Maximum="20000"
-                                                                   Interval="1"
-                                                                   StringFormat="F1"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Margin="0"
-                                                           VerticalAlignment="Center"
-                                                           Text="mm/s" />
-                                                <TextBlock Text="Z轴锁付下降速度:"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center" />
-                                                <mah:NumericUpDown Value="{Binding LockZDescendSpeed, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="0"
-                                                                   Maximum="20000"
-                                                                   Interval="1"
-                                                                   StringFormat="F1"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Margin="0"
-                                                           VerticalAlignment="Center"
-                                                           Text="mm/s" />
-                                                --><!--应用按钮--><!--
-                                                <Button Content="应用"
-                                                        Margin="10,0,0,0"
-                                                        MinWidth="60"
-                                                        HorizontalAlignment="Left"
-                                                        materialDesign:ButtonAssist.CornerRadius="5"
-                                                        Command="{Binding ApplyLockPointSpeedCommand}" />
-                                            </StackPanel>
-                                            --><!--批量设置所有锁付点的供料器编号和电批程序编号--><!--
-                                            <StackPanel Orientation="Horizontal"
-                                                        HorizontalAlignment="Left">
-                                                <TextBlock Text="批量设置所有锁付点的供料器编号和电批程序编号:"
-                                                           VerticalAlignment="Center" />
-                                                <TextBlock Text="供料器编号:"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center" />
-                                                <mah:NumericUpDown Value="{Binding LockFeederNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="0"
-                                                                   Maximum="9999"
-                                                                   Interval="1"
-                                                                   StringFormat="F0"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                <TextBlock Text="电批程序编号:"
-                                                           Margin="5,0,0,0"
-                                                           VerticalAlignment="Center" />
-                                                <mah:NumericUpDown Value="{Binding LockScrewProgramNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
-                                                                   Minimum="0"
-                                                                   Maximum="100"
-                                                                   Interval="1"
-                                                                   StringFormat="F0"
-                                                                   MinWidth="60"
-                                                                   HorizontalAlignment="Stretch"
-                                                                   VerticalAlignment="Center"
-                                                                   Margin="0"
-                                                                   Padding="2" />
-                                                --><!--应用按钮--><!--
-                                                <Button Content="应用"
-                                                        Margin="10,0,0,0"
-                                                        MinWidth="60"
-                                                        HorizontalAlignment="Left"
-                                                        materialDesign:ButtonAssist.CornerRadius="5"
-                                                        Command="{Binding ApplyLockPointFeederAndScrewProgramCommand}" />
-                                            </StackPanel>
-
+                                        <StackPanel Orientation="Horizontal"
+                                                    HorizontalAlignment="Left">
+                                            <Button Content="执行产品拍照"
+                                                    Margin="10,0,0,0"
+                                                    materialDesign:ButtonAssist.CornerRadius="5"
+                                                    Command="{Binding TakeProductPhotoCommand}" />
                                         </StackPanel>
                                     </ScrollViewer>
-                                </StackPanel>-->
+                                </StackPanel>
+
 
 
                             </StackPanel>