Răsfoiți Sursa

新增垂直精度检测与多图像显示

KWD 7 luni în urmă
părinte
comite
c89a397d5e

+ 1 - 2
TeamAAS-VM/Core/Management.cs

@@ -350,7 +350,7 @@ namespace TeamAAS_VP.Core
 
                 try
                 {
-                    Renders.Add(new ShowRender() { Id = item.Id, CameraName = item.CameraName });
+                    //Renders.Add(new ShowRender() { Id = item.Id, CameraName = item.CameraName });
                     _cameraService.CreateCamera(item.Id, item);
                     var camera = _cameraService.GetCamera(item.Id);
                     Status.Add(new StatusInfo(item.Id, item.CameraName + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
@@ -381,7 +381,6 @@ namespace TeamAAS_VP.Core
                 }
 
             }
-            _container.Resolve<ShowVisionRenderViewModel>().Renders = Renders;
 
             if (sb.Length == 0)
             {

+ 23 - 11
TeamAAS-VM/Models/ShowRender.cs

@@ -6,6 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using TeamAAS_VP.Enums;
+using TeamAAS_VP.Models.Product;
 
 namespace TeamAAS_VP.Models
 {
@@ -19,14 +20,6 @@ namespace TeamAAS_VP.Models
             set { SetProperty(ref _id, value); }
         }
 
-        private string _CameraName;
-
-        public string CameraName
-        {
-            get { return _CameraName; }
-            set { SetProperty(ref _CameraName, value); }
-        }
-
         private Cognex.VisionPro.ICogImage _Image;
 
         public Cognex.VisionPro.ICogImage Image
@@ -41,7 +34,7 @@ namespace TeamAAS_VP.Models
         public Cognex.VisionPro.CogGraphicCollection Graphic
         {
             get { return _Graphic; }
-            set { SetProperty(ref _Graphic,value); }
+            set { SetProperty(ref _Graphic, value); }
         }
 
         private Cognex.VisionPro.ICogRecord _Record;
@@ -57,7 +50,7 @@ namespace TeamAAS_VP.Models
         public bool Result
         {
             get { return _result; }
-            set { SetProperty(ref _result,value); }
+            set { SetProperty(ref _result, value); }
         }
 
         private bool _IsShow;
@@ -65,7 +58,7 @@ namespace TeamAAS_VP.Models
         public bool IsShow
         {
             get { return _IsShow; }
-            set { SetProperty(ref _IsShow,value); }
+            set { SetProperty(ref _IsShow, value); }
         }
 
         private bool _IsSaveImage;
@@ -117,5 +110,24 @@ namespace TeamAAS_VP.Models
             get { return _IsCompress; }
             set { SetProperty(ref _IsCompress, value); }
         }
+
+        private ProductModel _CurrentProduct;
+
+        public ProductModel CurrentProduct
+        {
+            get { return _CurrentProduct; }
+            set { _CurrentProduct = value; }
+        }
+
+
+        private string _ProceductName;
+
+        public string ProceductName
+        {
+            get { return _ProceductName; }
+            set { _ProceductName = value; }
+        }
+
+
     }
 }

+ 5 - 5
TeamAAS-VM/Services/RemoteCommandService.cs

@@ -1517,8 +1517,7 @@ namespace TeamAAS_VP.Services
                     }
                     _eventAggregator.GetEvent<RenderUpdateNotification>().Publish(new ShowRender()
                     {
-                        CameraName = procedure.CameraName,
-                        Id = procedure.CameraId,
+                        Id = procedure.Id,
                         Image = (ICogImage)procedure.ToolBlock.Inputs["InputImage"].Value,
                         Graphic = outputCollection["Graphic"].Value as CogGraphicCollection,
                         Record = record,
@@ -1529,6 +1528,7 @@ namespace TeamAAS_VP.Services
                         SaveImagePathModel = procedure.SaveImagePathModel,
                         SavePath = procedure.SavePath,
                         IsCompress = procedure.IsCompress,
+                        ProceductName = procedure.Name
                     });
                     return true;
                 }
@@ -1539,8 +1539,7 @@ namespace TeamAAS_VP.Services
                     outputCollection = null;
                     _eventAggregator.GetEvent<RenderUpdateNotification>().Publish(new ShowRender()
                     {
-                        CameraName = procedure.CameraName,
-                        Id = procedure.CameraId,
+                        Id = procedure.Id,
                         Image = (ICogImage)procedure.ToolBlock.Inputs["InputImage"].Value,
                         Graphic = new CogGraphicCollection(),
                         Result = false,
@@ -1548,7 +1547,8 @@ namespace TeamAAS_VP.Services
                         IsSaveImage = procedure.IsSaveImage,
                         SaveImageModel = procedure.SaveImageModel,
                         SaveImagePathModel = procedure.SaveImagePathModel,
-                        SavePath = procedure.SavePath
+                        SavePath = procedure.SavePath,
+                        ProceductName = procedure.Name,
                     });
                     return false;
                 }

+ 11 - 1
TeamAAS-VM/ViewModels/MainWindowViewModel.cs

@@ -32,6 +32,7 @@ using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
 using TeamAAS_VP.Resources.Languages;
 using TeamAAS_VP.Services;
+using TeamAAS_VP.ViewModels.Home;
 using TeamAAS_VP.Views;
 using WPFLocalizeExtension.Engine;
 using static MaterialDesignThemes.Wpf.Theme.ToolBar;
@@ -343,8 +344,17 @@ namespace TeamAAS_VP.ViewModels
             Guid productid = _configService.GetSystemConfiguration().LastOpenedProductId;
             if (productid != Guid.Empty)
             {
-                _productService.LoadProduct(productid);
+                var res = _productService.LoadProduct(productid);
                 _productService.SetCurrentProduct(productid);
+
+                foreach (var item1 in res.CameraProcedures)
+                {
+                    foreach (var item2 in item1.ProcedureModels)
+                    {
+                        management.Renders.Add(new ShowRender() { Id = item2.Id, ProceductName = item2.Name });
+                    }
+                }
+                _container.Resolve<ShowVisionRenderViewModel>().Renders = management.Renders;
                 await management.WritePositionToPlcAsync();
             }
             var homeviewmodel = _container.Resolve<HomeViewModel>();

+ 335 - 86
TeamAAS-VM/ViewModels/Product/VisionDynamicAccuracyAnalyzerViewModel.cs

@@ -19,10 +19,12 @@ using System.Threading;
 using System.Threading.Tasks;
 using Team.FFFeederService.Interfaces;
 using TeamAAS_VP.Core;
+using TeamAAS_VP.Core.PLCs;
 using TeamAAS_VP.Enums;
 using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
 using TeamAAS_VP.Resources.Languages;
+using TeamAAS_VP.Services;
 using static TeamAAS_VP.Core.StabilityAnalyzer;
 
 namespace TeamAAS_VP.ViewModels.Product
@@ -39,10 +41,17 @@ namespace TeamAAS_VP.ViewModels.Product
         ISystemDatabaseService _systemDatabaseService;
         ICalibrationService _calibrationService;
         IConfigService _configService;
+        IPlcService _plcService;
 
         //测试过程中控制取消的CTS
         CancellationTokenSource _cts;
 
+        string manualToWork = "ns=4;s=DB_DriveControl|CylCtrl[6].Cmd.ManuToWork";
+        string manualToHome = "ns=4;s=DB_DriveControl|CylCtrl[6].Cmd.ManuToHome";
+        string inWork = "ns=4;s=DB_DriveControl|CylCtrl[6].Status.InWork";
+        string inHome = "ns=4;s=DB_DriveControl|CylCtrl[6].Status.InHome";
+
+
         #region 属性
 
         private ProductModel _SelectProduct;
@@ -212,7 +221,7 @@ namespace TeamAAS_VP.ViewModels.Product
             set { SetProperty(ref _ProcedureModels, value); }
         }
 
-        private int _MoveSpeed=100;
+        private int _MoveSpeed = 100;
         /// <summary>
         /// 移动速度
         /// </summary>
@@ -241,9 +250,7 @@ namespace TeamAAS_VP.ViewModels.Product
             get { return _precisionResult; }
             set { SetProperty(ref _precisionResult, value); }
         }
-
-
-        private int _ADelay = 300;
+        private int _ADelay = 3000;
         /// <summary>
         /// A点延时时间
         /// </summary>
@@ -253,7 +260,7 @@ namespace TeamAAS_VP.ViewModels.Product
             set { SetProperty(ref _ADelay, value); }
         }
 
-        private int _BDelay = 500;
+        private int _BDelay = 3000;
         /// <summary>
         /// B点延时时间
         /// </summary>
@@ -272,6 +279,36 @@ namespace TeamAAS_VP.ViewModels.Product
             get { return _IsTakePhoto; }
             set { SetProperty(ref _IsTakePhoto, value); }
         }
+
+        private bool _IsCylCtrl = true;
+        /// <summary>
+        /// 是否启用气缸
+        /// </summary>
+        public bool IsCylCtrl
+        {
+            get { return _IsCylCtrl; }
+            set { SetProperty(ref _IsCylCtrl, value); }
+        }
+
+        private bool _IsVertical = true;
+        /// <summary>
+        /// 是否启用垂直精度检测
+        /// </summary>
+        public bool IsVertical
+        {
+            get { return _IsVertical; }
+            set { SetProperty(ref _IsVertical, value); }
+        }
+
+        private float _Distance;
+
+        public float Distance
+        {
+            get { return _Distance; }
+            set { SetProperty(ref _Distance, value); }
+        }
+
+
         #endregion
 
         #region 命令
@@ -318,7 +355,7 @@ namespace TeamAAS_VP.ViewModels.Product
 
         private DelegateCommand _ProcedureSelectionChangedCommand;
         public DelegateCommand ProcedureSelectionChangedCommand =>
-            _ProcedureSelectionChangedCommand ?? (_ProcedureSelectionChangedCommand = new DelegateCommand(ExecuteProcedureSelectionChangedCommand, () => !IsRunning).ObservesProperty(() => IsRunning));
+            _ProcedureSelectionChangedCommand ?? (_ProcedureSelectionChangedCommand = new DelegateCommand(ExecuteProcedureSelectionChangedCommand, () => !IsRunning).ObservesProperty(() => IsRunning).ObservesProperty(() => SelectProcedure));
 
         private DelegateCommand _SingleTestCommand;
         public DelegateCommand SingleTestCommand =>
@@ -337,7 +374,7 @@ namespace TeamAAS_VP.ViewModels.Product
 
         public VisionDynamicAccuracyAnalyzerViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService,
             IFeederService feederService, IRobotService robotService, ICameraService cameraService, ISystemDatabaseService systemDatabaseService, ICalibrationService calibrationService,
-            IConfigService configService)
+            IConfigService configService, IPlcService plcService)
         {
             _regionManager = regionManager;
             _eventAggregator = ea;
@@ -350,6 +387,7 @@ namespace TeamAAS_VP.ViewModels.Product
             MessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(1));
             _calibrationService = calibrationService;
             _configService = configService;
+            _plcService = plcService;
         }
 
         #region 方法
@@ -383,60 +421,141 @@ namespace TeamAAS_VP.ViewModels.Product
         /// </summary>
         async void ExecuteSingleTestCommand()
         {
-            if (Robot == null || !Robot.IsConnected)
-            {
-                SendTaskMessage("机器人未连接,无法示教!");
-                return;
-            }
+            IsRunning = true;
+            _cts = new CancellationTokenSource();
+            CurrentProgress = 0;
+            SuccessCount = 0;
+            SuccessRate = 0;
+            FailCount = 0;
+            Message = "测试进行中...";
+            TestResults = new ObservableCollection<DynamicTestResult>();
 
-            if (Camera == null || !Camera.IsConnected)
+            try
             {
-                SendTaskMessage("相机未连接,无法示教!");
-                return;
-            }
+                //弹窗提示是否进行连续测试
+                var result = System.Windows.MessageBox.Show("确定进行单次测试吗?", "提示", System.Windows.MessageBoxButton.YesNo, System.Windows.MessageBoxImage.Question);
+                if (result != System.Windows.MessageBoxResult.Yes)
+                {
+                    return;
+                }
 
-            //弹窗提示是否进行单次测试
-            var result = System.Windows.MessageBox.Show("确定进行单次测试吗?", "提示", System.Windows.MessageBoxButton.YesNo, System.Windows.MessageBoxImage.Question);
-            if (result != System.Windows.MessageBoxResult.Yes)
-            {
-                return;
-            }
+                var addressConfig = _configService.GetPlcAddresses();
+                var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
+
+                if (Robot == null || !Robot.IsConnected)
+                {
+                    SendTaskMessage("机器人未连接,无法示教!");
+                    return;
+                }
+
+                if (IsTakePhoto)
+                {
+                    if (Camera == null || !Camera.IsConnected)
+                    {
+                        SendTaskMessage("相机未连接,无法示教!");
+                        return;
+                    }
+                }
 
-            IsRunning = true;
-            try
-            {
-                DateTime startTime = DateTime.Now;
                 //为机器人设置移动速度
-                await Robot.CalibParameAsync(new PickInfo(), MoveSpeed,0,false,0,0);
+                await Robot.CalibParameAsync(new PickInfo(), MoveSpeed, 0, false, 0, 0);
 
-                //移动机器人至A点
-                bool isSuccess1 = await Robot.CalibMotionAsync(PointA, null);
-                if (!isSuccess1)
+
+                if (_cts.Token.IsCancellationRequested)
                 {
-                    SendTaskMessage("机器人移动到A点失败!");
+                    Message = "测试已取消!";
                     return;
                 }
-                await Task.Delay(ADelay);
+                DateTime startTime = DateTime.Now;
 
-                //移动机器人至B点
-                isSuccess1 = await Robot.CalibMotionAsync(PointB, null);
-                if (!isSuccess1)
+                if (!IsCylCtrl)
                 {
-                    SendTaskMessage("机器人移动到B点失败!");
-                    return;
+                    //移动机器人至A点
+                    bool isSuccess1 = await Robot.CalibMotionAsync(PointA, null);
+                    if (!isSuccess1)
+                    {
+                        SendTaskMessage("机器人移动到A点失败!");
+                        return;
+                    }
+                    await Task.Delay(ADelay);
+                    if (_cts.Token.IsCancellationRequested)
+                    {
+                        Message = "测试已取消!";
+                        return;
+                    }
+
+                    //移动机器人至B点
+                    isSuccess1 = await Robot.CalibMotionAsync(PointB, null);
+                    if (!isSuccess1)
+                    {
+                        SendTaskMessage("机器人移动到B点失败!");
+                        return;
+                    }
+                    await Task.Delay(BDelay);
+                    if (_cts.Token.IsCancellationRequested)
+                    {
+                        Message = "测试已取消!";
+                        return;
+                    }
+                }
+                else
+                {
+                    //气缸升上去
+                    await plc.WriteNodeAsync(manualToWork, true);
+                    await Task.Delay(BDelay);
+                    await plc.ReadNodeAsync<bool>(inWork);
+
+                    if (_cts.Token.IsCancellationRequested)
+                    {
+                        Message = "测试已取消!";
+                        return;
+                    }
                 }
-                await Task.Delay(BDelay);
                 if (IsTakePhoto)
                 {
                     //相机拍照并处理
                     (bool isSuccess, double pixelX, double pixelY, double angleU, double transformX, double transformY) = await ExecutePhotoEx(CurrentProgress);
+
+                    CycleTime = DateTime.Now.Subtract(startTime).TotalSeconds;
+
+                    if (isSuccess)
+                    {
+                        SuccessCount++;
+                    }
+                    else
+                    {
+                        FailCount++;
+                    }
+                    TestResults.Add(new DynamicTestResult(CurrentProgress, isSuccess, PointB, CycleTime, pixelX, pixelY, angleU, transformX, transformY));
+                    OnTestResultAdded();
+
+                    CurrentProgress++;
+                    SuccessRate = (double)SuccessCount / CurrentProgress * 100;
+                }
+                else
+                {
+                    CycleTime = DateTime.Now.Subtract(startTime).TotalSeconds;
+                    SuccessCount++;
+                    CurrentProgress++;
+                    SuccessRate = (double)SuccessCount / CurrentProgress * 100;
+                }
+                if (IsCylCtrl)
+                {
+                    await plc.WriteNodeAsync(manualToHome, true);
+                    await Task.Delay(ADelay);
+                    //inHome 气杆在底部  InWork在上面
+                    await plc.ReadNodeAsync<bool>(inHome);
+                    if (_cts.Token.IsCancellationRequested)
+                    {
+                        Message = "测试已取消!";
+                        return;
+                    }
                 }
-                CycleTime = DateTime.Now.Subtract(startTime).TotalSeconds;
+                Message = "测试完成!";
             }
             catch (Exception ex)
             {
-                LogHelper.WriteLogError("机器人移动到A点失败!", ex);
-                SendTaskMessage("机器人移动到A点失败!");
+                LogHelper.WriteLogError("视觉动态重复测试时出错!", ex);
             }
             finally
             {
@@ -457,6 +576,8 @@ namespace TeamAAS_VP.ViewModels.Product
             SuccessRate = 0;
             FailCount = 0;
             Message = "测试进行中...";
+            int up = 1;
+            int down = 0;
             TestResults = new ObservableCollection<DynamicTestResult>();
 
             try
@@ -467,17 +588,25 @@ namespace TeamAAS_VP.ViewModels.Product
                 {
                     return;
                 }
+
+                var addressConfig = _configService.GetPlcAddresses();
+                var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
+
                 if (Robot == null || !Robot.IsConnected)
                 {
                     SendTaskMessage("机器人未连接,无法示教!");
                     return;
                 }
 
-                if (Camera == null || !Camera.IsConnected)
+                if (IsTakePhoto)
                 {
-                    SendTaskMessage("相机未连接,无法示教!");
-                    return;
+                    if (Camera == null || !Camera.IsConnected)
+                    {
+                        SendTaskMessage("相机未连接,无法示教!");
+                        return;
+                    }
                 }
+
                 //为机器人设置移动速度
                 await Robot.CalibParameAsync(new PickInfo(), MoveSpeed, 0, false, 0, 0);
 
@@ -490,34 +619,75 @@ namespace TeamAAS_VP.ViewModels.Product
                     }
                     DateTime startTime = DateTime.Now;
 
-                    //移动机器人至A点
-                    bool isSuccess1 = await Robot.CalibMotionAsync(PointA, null);
-                    if (!isSuccess1)
+                    if (IsVertical)
                     {
-                        SendTaskMessage("机器人移动到A点失败!");
-                        return;
+                        RPoint verticalPosition = PointB.Clone();
+                        if (CurrentProgress > (RepeatCount / 2))
+                        {
+                            verticalPosition.Z += up++ * Distance;
+                        }
+                        else
+                        {
+                            verticalPosition.Z -= down++ * Distance;
+                        }
+                        //移动机器人至B点
+                        bool isSuccess1 = await Robot.GoAsync(verticalPosition);
+                        if (!isSuccess1)
+                        {
+                            SendTaskMessage("机器人移动到B点失败!");
+                            return;
+                        }
+                        await Task.Delay(BDelay);
+                        if (_cts.Token.IsCancellationRequested)
+                        {
+                            Message = "测试已取消!";
+                            break;
+                        }
                     }
-                    await Task.Delay(ADelay);
-                    if (_cts.Token.IsCancellationRequested)
+                    else if (!IsCylCtrl)
                     {
-                        Message = "测试已取消!";
-                        break;
-                    }
+                        IsVertical = false;
+                        //移动机器人至A点
+                        bool isSuccess1 = await Robot.CalibMotionAsync(PointA, null);
+                        if (!isSuccess1)
+                        {
+                            SendTaskMessage("机器人移动到A点失败!");
+                            return;
+                        }
+                        await Task.Delay(ADelay);
+                        if (_cts.Token.IsCancellationRequested)
+                        {
+                            Message = "测试已取消!";
+                            break;
+                        }
 
-                    //移动机器人至B点
-                    isSuccess1 = await Robot.CalibMotionAsync(PointB, null);
-                    if (!isSuccess1)
-                    {
-                        SendTaskMessage("机器人移动到B点失败!");
-                        return;
+                        //移动机器人至B点
+                        isSuccess1 = await Robot.CalibMotionAsync(PointB, null);
+                        if (!isSuccess1)
+                        {
+                            SendTaskMessage("机器人移动到B点失败!");
+                            return;
+                        }
+                        await Task.Delay(BDelay);
+                        if (_cts.Token.IsCancellationRequested)
+                        {
+                            Message = "测试已取消!";
+                            break;
+                        }
                     }
-                    await Task.Delay(BDelay);
-                    if (_cts.Token.IsCancellationRequested)
+                    else
                     {
-                        Message = "测试已取消!";
-                        break;
-                    }
+                        //气缸升上去
+                        await plc.WriteNodeAsync(manualToWork, true);
+                        await Task.Delay(BDelay);
+                        await plc.ReadNodeAsync<bool>(inWork);
 
+                        if (_cts.Token.IsCancellationRequested)
+                        {
+                            Message = "测试已取消!";
+                            break;
+                        }
+                    }
                     if (IsTakePhoto)
                     {
                         //相机拍照并处理
@@ -546,6 +716,18 @@ namespace TeamAAS_VP.ViewModels.Product
                         CurrentProgress++;
                         SuccessRate = (double)SuccessCount / CurrentProgress * 100;
                     }
+                    if (IsCylCtrl)
+                    {
+                        await plc.WriteNodeAsync(manualToHome, true);
+                        await Task.Delay(ADelay);
+                        //inHome 气杆在底部  InWork在上面
+                        await plc.ReadNodeAsync<bool>(inHome);
+                        if (_cts.Token.IsCancellationRequested)
+                        {
+                            Message = "测试已取消!";
+                            break;
+                        }
+                    }
                     SendTaskMessage($"测试进行中... {CurrentProgress}/{RepeatCount}");
                 }
                 if (CurrentProgress >= RepeatCount)
@@ -555,7 +737,7 @@ namespace TeamAAS_VP.ViewModels.Product
             }
             catch (Exception ex)
             {
-                LogHelper.WriteLogError("视觉态重复测试时出错!", ex);
+                LogHelper.WriteLogError("视觉态重复测试时出错!", ex);
             }
             finally
             {
@@ -1180,7 +1362,7 @@ namespace TeamAAS_VP.ViewModels.Product
                         //SendTaskMessage(Lang.拍照OK, MessageLevel.Debug);
 
                         // 3. 获取视觉输出结果
-                        
+
                         string points = (string)(outputCollection["Point"].Value);
                         string[] strpoints = points.Split(';');
                         //先将pos按照逗号进行分隔,拿到数组
@@ -1492,24 +1674,33 @@ namespace TeamAAS_VP.ViewModels.Product
         private void LoadConfig()
         {
             //配置文件路径:FilePath.ProductsPath//productName//VisionDynamicAccuracyAnalyzerConfig.json
-            string configPath = System.IO.Path.Combine(FilePath.ProductsPath, SelectProduct.Name, "VisionDynamicAccuracyAnalyzerConfig.json");
-            if (System.IO.File.Exists(configPath))
+            string configPath = Path.Combine(FilePath.ProductsPath, SelectProduct.Name, "VisionDynamicAccuracyAnalyzerConfig.json");
+            if (File.Exists(configPath))
             {
                 try
                 {
-                    string json = System.IO.File.ReadAllText(configPath);
+                    string json = File.ReadAllText(configPath);
                     var ConfigModel = JsonConvert.DeserializeObject<VisionDynamicAccuracyAnalyzerConfigModel>(json);
-                    //加载点位A、B
-                    PointA = ConfigModel.PointA;
-                    PointB = ConfigModel.PointB;
+                    //加载点位界面参数
+                    this.PointA = ConfigModel.PointA;
+                    this.PointB = ConfigModel.PointB;
+                    this.MoveSpeed = ConfigModel.RobotMoveSpeed;
+                    this.RepeatCount = ConfigModel.TestCount;
+                    this.ADelay = ConfigModel.ADelay;
+                    this.BDelay = ConfigModel.BDelay;
+                    this.IsCylCtrl = ConfigModel.IsCylCtrl;
+                    this.IsTakePhoto = ConfigModel.IsTakePhoto;
+                    this.IsVertical = ConfigModel.IsVertical;
+                    this.Distance = ConfigModel.Distance;
+
                     //加载选中视觉流程
                     var procedure = ProcedureModels.FirstOrDefault(p => p.Id == ConfigModel.SelectProcedureId);
                     if (procedure != null)
                     {
-                        SelectProcedure = procedure;
+                        this.SelectProcedure = procedure;
+                        this.Camera = _cameraService.GetCamera(SelectProcedure.CameraId);
                     }
-                    MoveSpeed = ConfigModel.RobotMoveSpeed;
-                    RepeatCount = ConfigModel.TestCount;
+
                 }
                 catch (Exception ex)
                 {
@@ -1526,25 +1717,31 @@ namespace TeamAAS_VP.ViewModels.Product
             try
             {
                 //配置文件路径:FilePath.ProductsPath//productName//VisionDynamicAccuracyAnalyzerConfig.json
-                string configPath = System.IO.Path.Combine(FilePath.ProductsPath, SelectProduct.Name, "VisionDynamicAccuracyAnalyzerConfig.json");
+                string configPath = Path.Combine(FilePath.ProductsPath, SelectProduct.Name, "VisionDynamicAccuracyAnalyzerConfig.json");
                 var ConfigModel = new VisionDynamicAccuracyAnalyzerConfigModel
                 {
-                    PointA = PointA,
-                    PointB = PointB,
-                    SelectProcedureId = SelectProcedure?.Id ?? Guid.Empty,
-                    SelectProcedureName = SelectProcedure?.Name ?? "",
-                    RobotMoveSpeed = MoveSpeed,
-                    TestCount = RepeatCount
+                    PointA = this.PointA,
+                    PointB = this.PointB,
+                    SelectProcedureId = this.SelectProcedure?.Id ?? Guid.Empty,
+                    SelectProcedureName = this.SelectProcedure?.Name ?? "",
+                    RobotMoveSpeed = this.MoveSpeed,
+                    TestCount = this.RepeatCount,
+                    ADelay = this.ADelay,
+                    BDelay = this.BDelay,
+                    IsCylCtrl = this.IsCylCtrl,
+                    IsTakePhoto = this.IsTakePhoto,
+                    IsVertical = this.IsVertical,
+                    Distance = this.Distance,
                 };
                 //如果配置文件夹不存在则创建
-                var configDir = System.IO.Path.GetDirectoryName(configPath);
+                var configDir = Path.GetDirectoryName(configPath);
                 if (!Directory.Exists(configDir))
                 {
-                     Directory.CreateDirectory(configDir);
+                    Directory.CreateDirectory(configDir);
                 }
 
                 string json = JsonConvert.SerializeObject(ConfigModel, Formatting.Indented);
-                System.IO.File.WriteAllText(configPath, json);
+                File.WriteAllText(configPath, json);
             }
             catch (Exception ex)
             {
@@ -1616,6 +1813,58 @@ namespace TeamAAS_VP.ViewModels.Product
                 set { SetProperty(ref _SelectProcedureName, value); }
             }
 
+            private int _ADelay;
+
+            public int ADelay
+            {
+                get { return _ADelay; }
+                set { _ADelay = value; }
+            }
+
+            private int _BDelay;
+
+            public int BDelay
+            {
+                get { return _BDelay; }
+                set { _BDelay = value; }
+            }
+
+            private bool _IsCylCtrl;
+
+            public bool IsCylCtrl
+            {
+                get { return _IsCylCtrl; }
+                set { _IsCylCtrl = value; }
+            }
+
+            private bool _IsTakePhoto;
+
+            public bool IsTakePhoto
+            {
+                get { return _IsTakePhoto; }
+                set { _IsTakePhoto = value; }
+            }
+
+            private bool _IsVertical = true;
+            /// <summary>
+            /// 是否启用垂直精度检测
+            /// </summary>
+            public bool IsVertical
+            {
+                get { return _IsVertical; }
+                set { SetProperty(ref _IsVertical, value); }
+            }
+
+            private float _Distance;
+
+            public float Distance
+            {
+                get { return _Distance; }
+                set { SetProperty(ref _Distance, value); }
+            }
+
+
+
         }
 
     }

+ 81 - 80
TeamAAS-VM/Views/Home/ShowVisionRender.xaml.cs

@@ -46,7 +46,7 @@ namespace TeamAAS_VP.Views.Home
             Titles = new Dictionary<Guid, TextBlock>();
             viewModel = DataContext as ShowVisionRenderViewModel;
             _eventAggregator = viewModel._eventAggregator;
-            _systemDatabaseService= ((Prism.PrismApplicationBase)App.Current).Container.Resolve<ISystemDatabaseService>();
+            _systemDatabaseService = ((Prism.PrismApplicationBase)App.Current).Container.Resolve<ISystemDatabaseService>();
             _productService = ((Prism.PrismApplicationBase)App.Current).Container.Resolve<IProductService>();
             viewModel.UpdateLayout += ViewModel_UpdateLayout;
             _eventAggregator.GetEvent<RenderUpdateNotification>().Subscribe(UpdateRenderModuleSource);
@@ -70,12 +70,12 @@ namespace TeamAAS_VP.Views.Home
             {
                 foreach (var item in vmRenders)
                 {
-                    if (((Cognex.VisionPro.CogRecordDisplay)item.Value.Child).Tag!=null && ((Cognex.VisionPro.CogRecordDisplay)item.Value.Child).Tag.ToString() == render.CameraName)
+                    if (((Cognex.VisionPro.CogRecordDisplay)item.Value.Child).Tag != null && ((Cognex.VisionPro.CogRecordDisplay)item.Value.Child).Tag.ToString() == render.ProceductName)
                     {
                         ((Cognex.VisionPro.CogRecordDisplay)item.Value.Child).Record = null;
                         ((Cognex.VisionPro.CogRecordDisplay)item.Value.Child).Image = render.Image;
                         ((Cognex.VisionPro.CogRecordDisplay)item.Value.Child).StaticGraphics.Clear();
-                        if (render.Graphic!=null)
+                        if (render.Graphic != null)
                             ((Cognex.VisionPro.CogRecordDisplay)item.Value.Child).StaticGraphics.AddList(render.Graphic, "");
 
                         if (render.Record != null)
@@ -92,7 +92,7 @@ namespace TeamAAS_VP.Views.Home
                 {
                     if (item is WindowsFormsHost && ((WindowsFormsHost)item).Child is Cognex.VisionPro.CogRecordDisplay)
                     {
-                        if (((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item).Child).Tag != null && ((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item).Child).Tag.ToString() == render.CameraName)
+                        if (((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item).Child).Tag != null && ((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item).Child).Tag.ToString() == render.ProceductName)
                         {
                             ((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item).Child).Image = render.Image;
                             ((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item).Child).StaticGraphics.Clear();
@@ -112,7 +112,7 @@ namespace TeamAAS_VP.Views.Home
                         {
                             if (item1 is WindowsFormsHost && ((WindowsFormsHost)item1).Child is Cognex.VisionPro.CogRecordDisplay)
                             {
-                                if (((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item1).Child).Tag != null && ((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item1).Child).Tag.ToString() == render.CameraName)
+                                if (((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item1).Child).Tag != null && ((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item1).Child).Tag.ToString() == render.ProceductName)
                                 {
                                     ((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item1).Child).Image = render.Image;
                                     ((Cognex.VisionPro.CogRecordDisplay)((WindowsFormsHost)item1).Child).StaticGraphics.Clear();
@@ -144,7 +144,7 @@ namespace TeamAAS_VP.Views.Home
         private void ViewModel_UpdateLayout(System.Collections.ObjectModel.ObservableCollection<Models.ShowRender> obj)
         {
             System.Windows.Media.FontFamily font = Application.Current.Resources["DefaultFont"] as System.Windows.Media.FontFamily;
-            
+
             if (vmRenders.Count > 0)
             {
                 foreach (var render in vmRenders)
@@ -161,11 +161,12 @@ namespace TeamAAS_VP.Views.Home
             gridRender.RowDefinitions.Clear();
             gridRender.ColumnDefinitions.Clear();
             System.Windows.Thickness margin = new System.Windows.Thickness(2);
+
             switch (obj.Count)
             {
                 case 1:
-                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].CameraName } });
-                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12 , Foreground = System.Windows.Media.Brushes.Black });
+                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].ProceductName } });
+                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
                     gridRender.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
                     gridRender.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
                     gridRender.ColumnDefinitions.Add(new ColumnDefinition());
@@ -186,10 +187,10 @@ namespace TeamAAS_VP.Views.Home
                     break;
                 case 2:
                     //增加显示界面
-                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].CameraName } });
-                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].CameraName } });
-                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12,Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].ProceductName } });
+                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].ProceductName } });
+                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
                     //布局
                     gridRender.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
                     gridRender.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
@@ -222,12 +223,12 @@ namespace TeamAAS_VP.Views.Home
                     break;
                 case 3:
                     //增加显示界面
-                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].CameraName } });
-                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].CameraName } });
-                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].CameraName } });
-                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12,Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12,  Foreground = System.Windows.Media.Brushes.Black });
+                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].ProceductName } });
+                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].ProceductName } });
+                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].ProceductName } });
+                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
                     //布局
                     gridRender.RowDefinitions.Add(new RowDefinition());
                     gridRender.RowDefinitions.Add(new RowDefinition());
@@ -287,14 +288,14 @@ namespace TeamAAS_VP.Views.Home
                     break;
                 case 4:
                     //增加显示界面
-                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].CameraName } });
-                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].CameraName } });
-                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].CameraName } });
-                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].CameraName } });
-                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].ProceductName } });
+                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].ProceductName } });
+                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].ProceductName } });
+                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].ProceductName } });
+                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
 
                     //布局
                     gridRender.RowDefinitions.Add(new RowDefinition());
@@ -369,23 +370,23 @@ namespace TeamAAS_VP.Views.Home
                     break;
                 case 5:
                     //增加显示界面
-                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].CameraName } });
-                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].CameraName } });
-                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].CameraName } });
-                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].CameraName } });
-                    vmRenders.Add(obj[4].Id, new WindowsFormsHost() { Tag = obj[4].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[4].CameraName } });
-                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12 ,Foreground= System.Windows.Media.Brushes.Black});
-                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[4].Id, new TextBlock() { Text = obj[4].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].ProceductName } });
+                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].ProceductName } });
+                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].ProceductName } });
+                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].ProceductName } });
+                    vmRenders.Add(obj[4].Id, new WindowsFormsHost() { Tag = obj[4].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[4].ProceductName } });
+                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[4].Id, new TextBlock() { Text = obj[4].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
                     //布局
                     gridRender.RowDefinitions.Add(new RowDefinition());
                     gridRender.RowDefinitions.Add(new RowDefinition());
                     gridRender.ColumnDefinitions.Add(new ColumnDefinition());
                     gridRender.ColumnDefinitions.Add(new ColumnDefinition());
                     gridRender.ShowGridLines = true;
-                    grid1 = new Grid() { Background= System.Windows.Media.Brushes.White };
+                    grid1 = new Grid() { Background = System.Windows.Media.Brushes.White };
                     grid2 = new Grid() { Background = System.Windows.Media.Brushes.White };
                     grid3 = new Grid() { Background = System.Windows.Media.Brushes.White };
                     grid4 = new Grid() { Background = System.Windows.Media.Brushes.White };
@@ -470,18 +471,18 @@ namespace TeamAAS_VP.Views.Home
                     break;
                 case 6:
                     //增加显示界面
-                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].CameraName } });
-                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].CameraName } });
-                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].CameraName } });
-                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].CameraName } });
-                    vmRenders.Add(obj[4].Id, new WindowsFormsHost() { Tag = obj[4].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[4].CameraName } });
-                    vmRenders.Add(obj[5].Id, new WindowsFormsHost() { Tag = obj[5].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[5].CameraName } });
-                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[4].Id, new TextBlock() { Text = obj[4].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[5].Id, new TextBlock() { Text = obj[5].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].ProceductName } });
+                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].ProceductName } });
+                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].ProceductName } });
+                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].ProceductName } });
+                    vmRenders.Add(obj[4].Id, new WindowsFormsHost() { Tag = obj[4].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[4].ProceductName } });
+                    vmRenders.Add(obj[5].Id, new WindowsFormsHost() { Tag = obj[5].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[5].ProceductName } });
+                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[4].Id, new TextBlock() { Text = obj[4].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[5].Id, new TextBlock() { Text = obj[5].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
                     //布局
                     gridRender.RowDefinitions.Add(new RowDefinition());
                     gridRender.RowDefinitions.Add(new RowDefinition());
@@ -575,20 +576,20 @@ namespace TeamAAS_VP.Views.Home
                     break;
                 case 7:
                     //增加显示界面
-                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].CameraName } });
-                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].CameraName } });
-                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].CameraName } });
-                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].CameraName } });
-                    vmRenders.Add(obj[4].Id, new WindowsFormsHost() { Tag = obj[4].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[4].CameraName } });
-                    vmRenders.Add(obj[5].Id, new WindowsFormsHost() { Tag = obj[5].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[5].CameraName } });
-                    vmRenders.Add(obj[6].Id, new WindowsFormsHost() { Tag = obj[6].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[6].CameraName } });
-                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[4].Id, new TextBlock() { Text = obj[4].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[5].Id, new TextBlock() { Text = obj[5].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[6].Id, new TextBlock() { Text = obj[6].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].ProceductName } });
+                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].ProceductName } });
+                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].ProceductName } });
+                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].ProceductName } });
+                    vmRenders.Add(obj[4].Id, new WindowsFormsHost() { Tag = obj[4].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[4].ProceductName } });
+                    vmRenders.Add(obj[5].Id, new WindowsFormsHost() { Tag = obj[5].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[5].ProceductName } });
+                    vmRenders.Add(obj[6].Id, new WindowsFormsHost() { Tag = obj[6].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[6].ProceductName } });
+                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[4].Id, new TextBlock() { Text = obj[4].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[5].Id, new TextBlock() { Text = obj[5].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[6].Id, new TextBlock() { Text = obj[6].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
                     //布局
                     gridRender.RowDefinitions.Add(new RowDefinition());
                     gridRender.RowDefinitions.Add(new RowDefinition());
@@ -695,22 +696,22 @@ namespace TeamAAS_VP.Views.Home
                     break;
                 case 8:
                     //增加显示界面
-                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].CameraName } });
-                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].CameraName } });
-                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].CameraName } });
-                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].CameraName } });
-                    vmRenders.Add(obj[4].Id, new WindowsFormsHost() { Tag = obj[4].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[4].CameraName } });
-                    vmRenders.Add(obj[5].Id, new WindowsFormsHost() { Tag = obj[5].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[5].CameraName } });
-                    vmRenders.Add(obj[6].Id, new WindowsFormsHost() { Tag = obj[6].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[6].CameraName } });
-                    vmRenders.Add(obj[7].Id, new WindowsFormsHost() { Tag = obj[6].CameraName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[7].CameraName } });
-                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[4].Id, new TextBlock() { Text = obj[4].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[5].Id, new TextBlock() { Text = obj[5].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[6].Id, new TextBlock() { Text = obj[6].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
-                    Titles.Add(obj[7].Id, new TextBlock() { Text = obj[7].CameraName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    vmRenders.Add(obj[0].Id, new WindowsFormsHost() { Tag = obj[0].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[0].ProceductName } });
+                    vmRenders.Add(obj[1].Id, new WindowsFormsHost() { Tag = obj[1].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[1].ProceductName } });
+                    vmRenders.Add(obj[2].Id, new WindowsFormsHost() { Tag = obj[2].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[2].ProceductName } });
+                    vmRenders.Add(obj[3].Id, new WindowsFormsHost() { Tag = obj[3].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[3].ProceductName } });
+                    vmRenders.Add(obj[4].Id, new WindowsFormsHost() { Tag = obj[4].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[4].ProceductName } });
+                    vmRenders.Add(obj[5].Id, new WindowsFormsHost() { Tag = obj[5].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[5].ProceductName } });
+                    vmRenders.Add(obj[6].Id, new WindowsFormsHost() { Tag = obj[6].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[6].ProceductName } });
+                    vmRenders.Add(obj[7].Id, new WindowsFormsHost() { Tag = obj[6].ProceductName, Child = new Cognex.VisionPro.CogRecordDisplay() { Tag = obj[7].ProceductName } });
+                    Titles.Add(obj[0].Id, new TextBlock() { Text = obj[0].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[1].Id, new TextBlock() { Text = obj[1].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[2].Id, new TextBlock() { Text = obj[2].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[3].Id, new TextBlock() { Text = obj[3].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[4].Id, new TextBlock() { Text = obj[4].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[5].Id, new TextBlock() { Text = obj[5].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[6].Id, new TextBlock() { Text = obj[6].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
+                    Titles.Add(obj[7].Id, new TextBlock() { Text = obj[7].ProceductName, HorizontalAlignment = System.Windows.HorizontalAlignment.Center, FontWeight = FontWeights.Bold, FontFamily = font, FontSize = 12, Foreground = System.Windows.Media.Brushes.Black });
                     //布局
                     gridRender.RowDefinitions.Add(new RowDefinition());
                     gridRender.RowDefinitions.Add(new RowDefinition());
@@ -1100,7 +1101,7 @@ namespace TeamAAS_VP.Views.Home
                     {
                         LogHelper.WriteLogError(Lang.切换产品清除主页图像时出错, ex);
                     }
-                    
+
                 }
             }));
         }

+ 28 - 2
TeamAAS-VM/Views/Product/VisionDynamicAccuracyAnalyzer.xaml

@@ -261,6 +261,7 @@
                                     <ColumnDefinition Width="*" />
                                     <ColumnDefinition Width="*" />
                                     <ColumnDefinition Width="*" />
+                                    <ColumnDefinition Width="*" />
                                 </Grid.ColumnDefinitions>
 
                                 <!-- 重复次数 -->
@@ -289,11 +290,10 @@
                                                        HorizontalAlignment="Stretch"
                                                        IsEnabled="{Binding IsRunning, Converter={StaticResource InvertBooleanConverter}}" />
                                 </StackPanel>
-
                                 <!-- A点延时 -->
                                 <StackPanel Grid.Column="2"
                                             Margin="10,0,0,0">
-                                    <TextBlock Text="A点延时(ms):"/>
+                                    <TextBlock Text="A点延时(ms):" />
                                     <mah:NumericUpDown Value="{Binding ADelay, Mode=TwoWay}"
                                                        Minimum="50"
                                                        d:Value="300"
@@ -314,6 +314,18 @@
                                                        HorizontalContentAlignment="Center"
                                                        HorizontalAlignment="Stretch"
                                                        IsEnabled="{Binding IsRunning, Converter={StaticResource InvertBooleanConverter}}" />
+
+                                </StackPanel>
+                                <StackPanel Grid.Column="4"
+                                            Margin="10,0,0,0">
+                                    <TextBlock Text="垂直步进距离(ms):" />
+                                    <uControl:myNumericUpDowm MinWidth="100"
+                                                              Interval="0.1"
+                                                              Maximum="10"
+                                                              Minimum="0"
+                                                              StringFormat="{}{0:N3} mm"
+                                                              Value="{Binding Distance,Mode=TwoWay}"
+                                                              Margin="10,0" />
                                 </StackPanel>
                             </Grid>
 
@@ -331,6 +343,20 @@
 
                             <WrapPanel HorizontalAlignment="Center"
                                        Margin="0 10 0 0">
+                                <CheckBox Content="启用垂直检测"
+                                          Foreground="Black"
+                                          Style="{StaticResource MaterialDesignCheckBox}"
+                                          VerticalAlignment="Center"
+                                          IsChecked="{Binding IsVertical}"
+                                          Margin="10,0"
+                                          FontSize="15" />
+                                <CheckBox Content="启用气缸"
+                                          Foreground="Black"
+                                          Style="{StaticResource MaterialDesignCheckBox}"
+                                          VerticalAlignment="Center"
+                                          IsChecked="{Binding IsCylCtrl}"
+                                          Margin="10,0"
+                                          FontSize="15" />
                                 <CheckBox Content="启用拍照"
                                           Foreground="Black"
                                           Style="{StaticResource MaterialDesignCheckBox}"