|
|
@@ -0,0 +1,462 @@
|
|
|
+using Cognex.VisionPro;
|
|
|
+using Cognex.VisionPro.ToolBlock;
|
|
|
+using Prism.Commands;
|
|
|
+using Prism.Events;
|
|
|
+using Prism.Ioc;
|
|
|
+using Prism.Mvvm;
|
|
|
+using Prism.Regions;
|
|
|
+using Prism.Services.Dialogs;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Collections.ObjectModel;
|
|
|
+using System.Drawing;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using System.Windows;
|
|
|
+using Team.FFFeederService.Interfaces;
|
|
|
+using TeamAAS_VP.Core;
|
|
|
+using TeamAAS_VP.Enums;
|
|
|
+using TeamAAS_VP.Events;
|
|
|
+using TeamAAS_VP.Interfaces;
|
|
|
+using TeamAAS_VP.Models;
|
|
|
+using TeamAAS_VP.Models.Calibration;
|
|
|
+using TeamAAS_VP.Services;
|
|
|
+
|
|
|
+namespace TeamAAS_VP.ViewModels.Calibration
|
|
|
+{
|
|
|
+ public class FixedUpCameraFindP0ViewModel : BindableBase
|
|
|
+ {
|
|
|
+ IRegionManager _regionManager;
|
|
|
+ IRegionNavigationService _regionNavigationService;
|
|
|
+ IContainerProvider _container;
|
|
|
+ IDialogService _dialogService;
|
|
|
+ IEventAggregator _eventAggregator;
|
|
|
+ IConfigService _configService;
|
|
|
+ IRobotService _robotService;
|
|
|
+ ICameraService _cameraService;
|
|
|
+ IFeederService _feederService;
|
|
|
+ ISystemDatabaseService _systemDatabaseService;
|
|
|
+ ICalibrationService _calibrationServvice;
|
|
|
+
|
|
|
+ #region 属性
|
|
|
+
|
|
|
+ private CogToolBlockEditV2 _ToolBlockEdit;
|
|
|
+
|
|
|
+ public CogToolBlockEditV2 ToolBlockEdit
|
|
|
+ {
|
|
|
+ get { return _ToolBlockEdit; }
|
|
|
+ set { SetProperty(ref _ToolBlockEdit, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private CalibrationInfo _SelectCalibration;
|
|
|
+
|
|
|
+ public CalibrationInfo SelectCalibration
|
|
|
+ {
|
|
|
+ get { return _SelectCalibration; }
|
|
|
+ set { SetProperty(ref _SelectCalibration, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private IRobot _Robot;
|
|
|
+
|
|
|
+ public IRobot Robot
|
|
|
+ {
|
|
|
+ get { return _Robot; }
|
|
|
+ set { SetProperty(ref _Robot, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private ICamera _Camera;
|
|
|
+
|
|
|
+ public ICamera Camera
|
|
|
+ {
|
|
|
+ get { return _Camera; }
|
|
|
+ set { SetProperty(ref _Camera, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private float _ExposureTime;
|
|
|
+ /// <summary>
|
|
|
+ /// 相机曝光时间
|
|
|
+ /// </summary>
|
|
|
+ public float ExposureTime
|
|
|
+ {
|
|
|
+ get { return _ExposureTime; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref _ExposureTime, value);
|
|
|
+ SelectCalibration.ExposureTime = value;
|
|
|
+ if (Camera != null)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ SelectCalibration.FixedUpCameraFindP0Info.ExposureTime = value;
|
|
|
+ Camera.SetExposureTime(value);
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private float _Gain;
|
|
|
+ /// <summary>
|
|
|
+ /// 相机增益
|
|
|
+ /// </summary>
|
|
|
+ public float Gain
|
|
|
+ {
|
|
|
+ get { return _Gain; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref _Gain, value);
|
|
|
+ SelectCalibration.Gain = value;
|
|
|
+ if (Camera != null)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ SelectCalibration.FixedUpCameraFindP0Info.Gain = value;
|
|
|
+ Camera.SetGain(value);
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private ObservableCollection<CameraInfo> _Cameras;
|
|
|
+ public ObservableCollection<CameraInfo> Cameras
|
|
|
+ {
|
|
|
+ get { return _Cameras; }
|
|
|
+ set { SetProperty(ref _Cameras, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private CameraInfo _SelectCamera;
|
|
|
+ public CameraInfo SelectCamera
|
|
|
+ {
|
|
|
+ get { return _SelectCamera; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref _SelectCamera, value);
|
|
|
+ if (value != null)
|
|
|
+ {
|
|
|
+ Camera = _cameraService.GetCamera(value.Id);
|
|
|
+ SelectCalibration.FixedUpCameraFindP0Info.CameraId = value.Id;
|
|
|
+ SelectCalibration.FixedUpCameraFindP0Info.CameraId = value.Id;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private ObservableCollection<CalibrationInfo> _CalibrationList;
|
|
|
+ public ObservableCollection<CalibrationInfo> CalibrationList
|
|
|
+ {
|
|
|
+ get { return _CalibrationList; }
|
|
|
+ set { SetProperty(ref _CalibrationList, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private CalibrationInfo _SelectedCalibration;
|
|
|
+ public CalibrationInfo SelectedCalibration
|
|
|
+ {
|
|
|
+ get { return _SelectedCalibration; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref _SelectedCalibration, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 命令
|
|
|
+ private DelegateCommand _LoadedCommand;
|
|
|
+ public DelegateCommand LoadedCommand =>
|
|
|
+ _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
|
|
|
+ private DelegateCommand _NextCommand;
|
|
|
+ public DelegateCommand NextCommand =>
|
|
|
+ _NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand));
|
|
|
+
|
|
|
+ private DelegateCommand _BackCommand;
|
|
|
+ public DelegateCommand BackCommand =>
|
|
|
+ _BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand));
|
|
|
+
|
|
|
+ private DelegateCommand _RunVisionProcessCommand;
|
|
|
+ public DelegateCommand RunVisionProcessCommand =>
|
|
|
+ _RunVisionProcessCommand ?? (_RunVisionProcessCommand = new DelegateCommand(ExecuteRunVisionProcessCommand));
|
|
|
+
|
|
|
+ private DelegateCommand _FindP0Command;
|
|
|
+ public DelegateCommand FindP0Command =>
|
|
|
+ _FindP0Command ?? (_FindP0Command = new DelegateCommand(ExecuteFindP0Command));
|
|
|
+
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 事件
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ public FixedUpCameraFindP0ViewModel(IRegionManager regionManager, IEventAggregator ea, IRegionNavigationService regionNavigationService, IContainerProvider container, IDialogService dialogService,
|
|
|
+ IConfigService configService, IRobotService robotService, ICameraService cameraService, IFeederService feederService, ISystemDatabaseService systemDatabaseService, ICalibrationService calibrationService)
|
|
|
+ {
|
|
|
+ _regionManager = regionManager;
|
|
|
+ _regionNavigationService = regionNavigationService;
|
|
|
+ _container = container;
|
|
|
+ _dialogService = dialogService;
|
|
|
+ _eventAggregator = ea;
|
|
|
+ _configService = configService;
|
|
|
+ _robotService = robotService;
|
|
|
+ _cameraService = cameraService;
|
|
|
+ _feederService = feederService;
|
|
|
+ _systemDatabaseService = systemDatabaseService;
|
|
|
+ _calibrationServvice = calibrationService;
|
|
|
+ }
|
|
|
+
|
|
|
+ #region 方法
|
|
|
+ void ExecuteLoadedCommand()
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator)
|
|
|
+ {
|
|
|
+ IsAllowEdit = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ IsAllowEdit = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ LogHelper.WriteLogError("相机校准加载视觉工具处理界面时出错!", ex);
|
|
|
+ MessageBox.Show(ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 下一步
|
|
|
+ /// </summary>
|
|
|
+ void ExecuteNextCommand()
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ string prcPath = FilePath.CalibrationPath + "//" + SelectCalibration.Name + "//" + "FixedUpCameraTool.vpp";
|
|
|
+ CogSerializer.SaveObjectToFile(ToolBlockEdit.Subject, prcPath);
|
|
|
+ NavigationParameters param = new NavigationParameters();
|
|
|
+ param.Add("SelectCalibration", SelectCalibration);
|
|
|
+ _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationAuto", param);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ LogHelper.WriteLogError("相机校准-下相机示教P0界面点击下一步时出错!", ex);
|
|
|
+ MessageBox.Show(ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 上一步
|
|
|
+ /// </summary>
|
|
|
+ void ExecuteBackCommand()
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ NavigationParameters param = new NavigationParameters();
|
|
|
+ param.Add("SelectCalibration", SelectCalibration);
|
|
|
+ _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationTeachCenterPoint", param);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ LogHelper.WriteLogError("相机校准-下相机示教P0界面点击上一步时出错!", ex);
|
|
|
+ MessageBox.Show(ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 运行视觉流程
|
|
|
+ /// </summary>
|
|
|
+ void ExecuteRunVisionProcessCommand()
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ ToolBlockEdit.Subject.Inputs["InputImage"].Value = Camera.Grab();
|
|
|
+ ToolBlockEdit.Subject.Run();
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ LogHelper.WriteLogError("相机校准-运行流程时出错时出错", ex);
|
|
|
+ _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 自动计算P0点
|
|
|
+ /// </summary>
|
|
|
+ async void ExecuteFindP0Command()
|
|
|
+ {
|
|
|
+ if (Camera == null)
|
|
|
+ {
|
|
|
+ MessageBox.Show("请先选择相机!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (SelectedCalibration == null)
|
|
|
+ {
|
|
|
+ MessageBox.Show("请先选择标定!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var result = await CaptureAndProcess();
|
|
|
+ if (result.IsSuccess)
|
|
|
+ {
|
|
|
+ if (SelectCalibration.MarkPoint == null)
|
|
|
+ {
|
|
|
+ SelectCalibration.MarkPoint = new RPoint();
|
|
|
+ }
|
|
|
+ SelectCalibration.MarkPoint.X = (float) result.X;
|
|
|
+ SelectCalibration.MarkPoint.Y = (float)result.Y;
|
|
|
+ MessageBox.Show($"P0点计算成功!X:{result.X},Y:{result.Y}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ MessageBox.Show("未找到P0点,请调整工件位置后重试!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 相机拍照
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task<(bool IsSuccess, double X, double Y, double U, int ImageWidth, int ImageHeight)> CaptureAndProcess()
|
|
|
+ {
|
|
|
+
|
|
|
+ ICogImage image = null;
|
|
|
+ //采集图像
|
|
|
+ if (Camera != null)
|
|
|
+ {
|
|
|
+ image = Camera.Grab();
|
|
|
+ ToolBlockEdit.Subject.Inputs["InputImage"].Value = image;
|
|
|
+ }
|
|
|
+ ToolBlockEdit.Subject.Run();
|
|
|
+ CogToolBlockTerminalCollection outputCollection = ToolBlockEdit.Subject.Outputs;
|
|
|
+ bool Found = (bool)(outputCollection["Found"].Value);
|
|
|
+ if (Found)
|
|
|
+ {
|
|
|
+ var strpoints = outputCollection["Point"].Value.ToString();
|
|
|
+ string[] items = strpoints.Split(',');
|
|
|
+ double x = double.Parse(items[0]);
|
|
|
+ double y = double.Parse(items[1]);
|
|
|
+
|
|
|
+ //校准转换
|
|
|
+ var calibResult = _calibrationServvice.ConvertPixelToPosition((x, y, 0), null, SelectedCalibration, Robot.Brand);
|
|
|
+ if (calibResult.IsSucceed)
|
|
|
+ {
|
|
|
+ x = calibResult.X;
|
|
|
+ y = calibResult.Y;
|
|
|
+ return (true, x, y, 0, image.Width, image.Height);
|
|
|
+ }
|
|
|
+
|
|
|
+ return (false, 0, 0, 0, image.Width, image.Height);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return (false, 0, 0, 0, image.Width, image.Height);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 继承
|
|
|
+ /// <summary>
|
|
|
+ /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="navigationContext"></param>
|
|
|
+ /// <param name="continuationCallback"></param>
|
|
|
+ public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
|
|
|
+ {
|
|
|
+ continuationCallback(true);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="navigationContext"></param>
|
|
|
+ /// <exception cref="NotImplementedException"></exception>
|
|
|
+ public async void OnNavigatedTo(NavigationContext navigationContext)
|
|
|
+ {
|
|
|
+ SelectCalibration = navigationContext.Parameters.GetValue<CalibrationInfo>("SelectCalibration");
|
|
|
+ if (SelectCalibration.FixedUpCameraFindP0Info == null)
|
|
|
+ {
|
|
|
+ SelectCalibration.FixedUpCameraFindP0Info = new FixedUpCameraFindP0Info();
|
|
|
+ }
|
|
|
+ if (ToolBlockEdit != null)
|
|
|
+ {
|
|
|
+ string prcPath = FilePath.CalibrationPath + "//" + SelectCalibration.Name + "//" + "FixedUpCameraTool.vpp";
|
|
|
+ if (File.Exists(prcPath))
|
|
|
+ {
|
|
|
+ ToolBlockEdit.Subject = CogSerializer.LoadObjectFromFile(prcPath) as CogToolBlock;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ToolBlockEdit.Subject = CogSerializer.LoadObjectFromFile(FilePath.CalibrationToolblockPath) as CogToolBlock;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (SelectCalibration.RobotId != Guid.Empty)
|
|
|
+ {
|
|
|
+ Robot = _robotService.GetRobot(SelectCalibration.RobotId);
|
|
|
+ }
|
|
|
+
|
|
|
+ Cameras = new ObservableCollection<CameraInfo>(_configService.GetAllCameras());
|
|
|
+ if (SelectCalibration.FixedUpCameraFindP0Info.CameraId != Guid.Empty)
|
|
|
+ {
|
|
|
+ SelectCamera = Cameras.FirstOrDefault(c => c.Id == SelectCalibration.FixedUpCameraFindP0Info.CameraId);
|
|
|
+
|
|
|
+ }
|
|
|
+ CalibrationList = new ObservableCollection<CalibrationInfo>(_calibrationServvice.GetAllCalibrations());
|
|
|
+ if (SelectCalibration.FixedUpCameraFindP0Info.CalibrationId != Guid.Empty)
|
|
|
+ {
|
|
|
+ SelectCalibration = CalibrationList.FirstOrDefault(c => c.Id == SelectCalibration.FixedUpCameraFindP0Info.CalibrationId);
|
|
|
+ }
|
|
|
+
|
|
|
+ ExposureTime = SelectCalibration.ExposureTime;
|
|
|
+ Gain = SelectCalibration.Gain;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 是否允许导航到此视图模型。
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="navigationContext"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool IsNavigationTarget(NavigationContext navigationContext)
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="navigationContext"></param>
|
|
|
+ public void OnNavigatedFrom(NavigationContext navigationContext)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ private bool _IsAllowEdit = false;
|
|
|
+
|
|
|
+ public bool IsAllowEdit
|
|
|
+ {
|
|
|
+ get { return _IsAllowEdit; }
|
|
|
+ set { SetProperty(ref _IsAllowEdit, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void LoginChange(Models.User user)
|
|
|
+ {
|
|
|
+ if (user.userPart == Enums.UserPart.Operator)
|
|
|
+ {
|
|
|
+ IsAllowEdit = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ IsAllowEdit = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|