using MaterialDesignThemes.Wpf; using MathNet.Numerics.LinearAlgebra; using Microsoft.CodeAnalysis.Scripting; using NPOI.SS.Formula.Functions; 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.IO; using System.Linq; using System.Windows; using System.Windows.Forms; using Team.FFFeederService.Interfaces; using TeamAAS_VP; using TeamAAS_VP.Controls; using TeamAAS_VP.Core; using TeamAAS_VP.Data; using TeamAAS_VP.Enums; using TeamAAS_VP.Events; using TeamAAS_VP.Interfaces; using TeamAAS_VP.Models; using TeamAAS_VP.Models.Product; using TeamAAS_VP.Resources.Languages; using TeamAAS_VP.Services; using TeamAAS_VP.Views.DebugMod; namespace TeamAAS_VP.ViewModels.Product { public class ProcedureParamsViewModel : BindableBase, IConfirmNavigationRequest { IRegionManager _regionManager; IEventAggregator _eventAggregator; IContainerProvider _container; IDialogService _dialogService; IFeederService _feederService; IRobotService _robotService; ISystemDatabaseService _systemDatabaseService; #region 属性 private ProductModel _SelectProduct; /// /// 选中的产品 /// public ProductModel SelectProduct { get { return _SelectProduct; } set { SetProperty(ref _SelectProduct, value); } } private ProcedureModel _SelectProcedure; /// /// 选中的流程 /// public ProcedureModel SelectProcedure { get { return _SelectProcedure; } set { SetProperty(ref _SelectProcedure, value); } } private Management _management; public Management management { get { return _management; } set { SetProperty(ref _management,value); } } public IRobot Robot { get; set; } private ProcedureUserDefineParam _SelectedUserDefineParam; public ProcedureUserDefineParam SelectedUserDefineParam { get { return _SelectedUserDefineParam; } set { SetProperty(ref _SelectedUserDefineParam, value); } } #endregion #region 命令 private DelegateCommand _NextCommand; public DelegateCommand NextCommand => _NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand)); private DelegateCommand _BackCommand; public DelegateCommand BackCommand => _BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand)); private DelegateCommand _LoadedCommand; public DelegateCommand LoadedCommand => _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand)); private DelegateCommand _CalculateOffsetUAndToolCommand; public DelegateCommand CalculateOffsetUAndToolCommand => _CalculateOffsetUAndToolCommand ?? (_CalculateOffsetUAndToolCommand = new DelegateCommand(ExecuteCalculateOffsetUAndToolCommand)); private DelegateCommand _RemoveToolCommand; public DelegateCommand RemoveToolCommand => _RemoveToolCommand ?? (_RemoveToolCommand = new DelegateCommand(ExecuteRemoveToolCommand)); private DelegateCommand _AddToolCommand; public DelegateCommand AddToolCommand => _AddToolCommand ?? (_AddToolCommand = new DelegateCommand(ExecuteAddToolCommand)); private DelegateCommand _OverrideVisionTaskCommand; public DelegateCommand OverrideVisionTaskCommand => _OverrideVisionTaskCommand ?? (_OverrideVisionTaskCommand = new DelegateCommand(ExecuteOverrideVisionTaskCommand)); private DelegateCommand _AddUserDefineParameterCommand; public DelegateCommand AddUserDefineParameterCommand => _AddUserDefineParameterCommand ?? (_AddUserDefineParameterCommand = new DelegateCommand(ExecuteAddUserDefineParameterCommand, CanExecuteAddUserDefineParameterCommand)); private DelegateCommand _RemoveUserDefineParameterCommand; public DelegateCommand RemoveUserDefineParameterCommand => _RemoveUserDefineParameterCommand ?? (_RemoveUserDefineParameterCommand = new DelegateCommand(ExecuteRemoveUserDefineParameterCommand, CanExecuteRemoveUserDefineParameterCommand).ObservesProperty(()=> SelectedUserDefineParam)); #endregion #region 事件 private DelegateCommand _SelectSaveImagePathCommand; public DelegateCommand SelectSaveImagePathCommand => _SelectSaveImagePathCommand ?? (_SelectSaveImagePathCommand = new DelegateCommand(ExecuteSelectSaveImagePathCommand)); #endregion public ProcedureParamsViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService, IFeederService feederService, IRobotService robotService, ISystemDatabaseService systemDatabaseService) { _regionManager = regionManager; _eventAggregator = ea; _container = container; _dialogService = dialogService; _feederService = feederService; _systemDatabaseService = systemDatabaseService; //订阅权限登录事件 _eventAggregator.GetEvent().Subscribe(LoginChange); _robotService = robotService; } #region 方法 /// /// 下一步 /// void ExecuteNextCommand() { if (SelectProcedure.FeederId !=Guid.Empty) { var feeder = _feederService.GetFeeder(SelectProcedure.FeederId); if (feeder.IsConnected) { feeder.CloseLight(); } } NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); param.Add("SelectedProcedure", SelectProcedure); _regionManager.RequestNavigate("ProductRegionContext", "ProcessBasics", param); } /// /// 上一步 /// void ExecuteBackCommand() { NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); param.Add("SelectedProcedure", SelectProcedure); _regionManager.RequestNavigate("ProductRegionContext", "ProcedureVisionOutput", param); } void ExecuteLoadedCommand() { if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } } /// /// 添加工具 /// void ExecuteAddToolCommand() { try { if (SelectProcedure.ToolInfo == null) SelectProcedure.ToolInfo = new ObservableCollection(); SelectProcedure.ToolInfo.Add(new ToolInfo() { Id = Guid.NewGuid(), Pick = new RPoint(), Place = new RPoint(), Tool = new RobotTool(), PickInfo = new PickInfo() }); } catch (Exception ex) { LogHelper.WriteLogError(Lang.流程参数界面添加工具时出错, ex); } } /// /// 移除工具 /// /// async void ExecuteRemoveToolCommand(object id) { try { var tool = SelectProcedure.ToolInfo.FirstOrDefault(t => t.Id == (Guid)id); if (tool != null) { var view = new ShowMessage($"{Lang.工具末端}", Lang.是否移除工具末端); //show the dialog var result = await DialogHost.Show(view, "RootDialog", null, null, null); if (result != null && result is bool) { if (((bool)result)) { SelectProcedure.ToolInfo.Remove(tool); } } } } catch (Exception ex) { LogHelper.WriteLogError(Lang.流程参数界面移除工具时出错, ex); } } /// /// 计算角度补偿值和工具坐标 /// void ExecuteCalculateOffsetUAndToolCommand(object id) { try { if (Robot == null) return; var tool = SelectProcedure.ToolInfo.FirstOrDefault(t => t.Id == (Guid)id); if (tool == null) { return; } IDialogParameters parameters = new DialogParameters(); parameters.Add("ToolInfo", tool); _dialogService.Show("CalculateOffsetU", parameters, rst => { //对话框关闭之后的回调函数,可以在这解析结果。 ButtonResult result1 = rst.Result; if (result1 == ButtonResult.OK) { var param = rst.Parameters.GetValue("ToolInfo"); if (param != null) { tool = param; } } }); } catch (Exception ex) { LogHelper.WriteLogError(Lang.流程参数界面计算角度补偿值和工具坐标时出错, ex); } } /// /// 重写视觉处理逻辑 /// void ExecuteOverrideVisionTaskCommand() { string path = FilePath.ProductsPath + "//" + SelectProduct.Name + "//" + SelectProcedure.CameraName + "//" + SelectProcedure.Name + ".cs"; string script = ""; if (File.Exists(path)) { script = FileHelper.ReadFile(path); } else { if (File.Exists(FilePath.ScriptVisionTemplatePath)) { script = FileHelper.ReadFile(FilePath.ScriptVisionTemplatePath); } } IDialogParameters parameters = new DialogParameters(); parameters.Add("Script", script); parameters.Add("Path", path); _dialogService.Show("VisionScriptPage", parameters, rst => { //对话框关闭之后的回调函数,可以在这解析结果。 ButtonResult result1 = rst.Result; if (result1 == ButtonResult.OK) { //var param = rst.Parameters.GetValue("ToolInfo"); //if (param != null) //{ // tool = param; //} } }); } /// /// 选择保存图片路径 /// void ExecuteSelectSaveImagePathCommand() { if (SelectProcedure == null) { return; } using (FolderBrowserDialog dialog = new FolderBrowserDialog()) { // Optional: set the initial directory //dialog.SelectedPath = @"C:\"; // Show the folder browser dialog System.Windows.Forms.DialogResult result = dialog.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK) { SelectProcedure.SavePath = dialog.SelectedPath; } } } /// /// 移除自定义参数 /// void ExecuteRemoveUserDefineParameterCommand() { if (SelectedUserDefineParam==null) { return; } SelectProcedure.UserDefineParameters.Remove(SelectedUserDefineParam); } bool CanExecuteRemoveUserDefineParameterCommand() { return SelectedUserDefineParam != null; } /// /// 增加自定义参数 /// void ExecuteAddUserDefineParameterCommand() { if (SelectProcedure.UserDefineParameters==null) { SelectProcedure.UserDefineParameters = new ObservableCollection(); } SelectProcedure.UserDefineParameters.Add(new ProcedureUserDefineParam() { ParamName = (SelectProcedure.UserDefineParameters.Count + 1).ToString(), ParamValue = "" }); } bool CanExecuteAddUserDefineParameterCommand() { return true; } #endregion #region 继承 /// /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。 /// /// /// public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { continuationCallback(true); } /// /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。 /// /// /// public async void OnNavigatedTo(NavigationContext navigationContext) { try { SelectProduct = navigationContext.Parameters.GetValue("SelectProduct"); SelectProcedure = navigationContext.Parameters.GetValue("SelectedProcedure"); if (SelectProcedure.RobotId != Guid.Empty) { Robot = _robotService.GetRobot(SelectProcedure.RobotId); } } catch (Exception ex) { LogHelper.WriteLogError(Lang.流程参数界面进入时出错, ex); } } /// /// 是否允许导航到此视图模型。 /// /// /// public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } /// /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。 /// /// 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; } } } }