using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using MahApps.Metro.Controls.Dialogs; using MaterialDesignThemes.Wpf; 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.Linq; using System.Threading.Tasks; using System.Windows; using TeamAAS_VP; using TeamAAS_VP.Controls; using TeamAAS_VP.Core; using TeamAAS_VP.Core.Cameras; using TeamAAS_VP.Events; using TeamAAS_VP.Interfaces; using TeamAAS_VP.Models; using TeamAAS_VP.Models.Feeder; using TeamAAS_VP.Models.Product; using TeamAAS_VP.Resources.Languages; using TeamAAS_VP.Services; using static MaterialDesignThemes.Wpf.Theme.ToolBar; using static NPOI.HSSF.Util.HSSFColor; namespace TeamAAS_VP.ViewModels.Product { public class ProductProcessManageViewModel : BindableBase, IConfirmNavigationRequest { IRegionManager _regionManager; IEventAggregator _eventAggregator; IContainerProvider _container; IDialogService _dialogService; IConfigService _configService; ISystemDatabaseService _systemDatabaseService; #region 属性 private ProductModel _SelectProduct; /// /// 选中的产品 /// public ProductModel SelectProduct { get { return _SelectProduct; } set { SetProperty(ref _SelectProduct, value); } } private ProcedureModel _SelectedProcedure; public ProcedureModel SelectedProcedure { get { return _SelectedProcedure; } set { SetProperty(ref _SelectedProcedure, value); } } private object _SelectNote; public object SelectNote { get { return _SelectNote; } set { SetProperty(ref _SelectNote,value); } } private bool CanCreate { get { if (SelectNote!=null && SelectNote is CameraProcedure) { return true; } else { return false; } } } private bool CanRemove { get { if (SelectNote != null && SelectNote is ProcedureModel) { return true; } else { return false; } } } #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 _AddProProcessCommand; public DelegateCommand AddProProcessCommand => _AddProProcessCommand ?? (_AddProProcessCommand = new DelegateCommand(ExecuteAddProProcessCommand).ObservesCanExecute(()=> CanCreate).ObservesProperty(()=> SelectNote)); private DelegateCommand _RemoveProProcessCommand; public DelegateCommand RemoveProProcessCommand => _RemoveProProcessCommand ?? (_RemoveProProcessCommand = new DelegateCommand(ExecuteRemoveProProcessCommand).ObservesCanExecute(() => CanRemove).ObservesProperty(() => SelectNote)); private DelegateCommand _LoadedCommand; public DelegateCommand LoadedCommand => _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand)); #endregion #region 事件 #endregion public ProductProcessManageViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService, IConfigService configService,ISystemDatabaseService systemDatabaseService) { _regionManager = regionManager; _eventAggregator = ea; _container = container; _dialogService = dialogService; _configService = configService; _systemDatabaseService = systemDatabaseService; //订阅权限登录事件 _eventAggregator.GetEvent().Subscribe(LoginChange); } #region 方法 /// /// 下一步 /// void ExecuteNextCommand() { NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); param.Add("SelectedProcedure", SelectedProcedure); _regionManager.RequestNavigate("ProductRegionContext", "ProcessBasics", param); } void ExecuteBackCommand() { NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); _regionManager.RequestNavigate("ProductRegionContext", "ProductDescription", param); } /// /// 新建流程 /// async void ExecuteAddProProcessCommand(object SelectedItem) { try { if (SelectedItem is CameraProcedure) { string cameraname = (SelectedItem as CameraProcedure).Camera; var view = new AddProduct() { Title = $"{Lang.创建流程}:", Item = "Name" }; //show the dialog var result = await DialogHost.Show(view, "RootDialog", ExtendedOpenedEventHandler, ExtendedClosingEventHandler, ExtendedClosedEventHandler); if (result != null && !string.IsNullOrEmpty(result.ToString())) { string procedureName = result.ToString().Trim(); if (!FileHelper.CheckFileName(result.ToString())) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.输入的名称不符合文件名命名规则, Duration = 1 }); return; } //检查是否已有同名流程 var procedureList = SelectProduct.CameraProcedures.FirstOrDefault(c => c.Camera == cameraname); //获取指定相机的流程集合 if (procedureList == null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg =Lang.没有找到相机.Replace("{0}", cameraname), Duration = 1 }); return; } var procedure = procedureList.ProcedureModels.FirstOrDefault(p => p.Name == $"{SelectProduct.Name}-{cameraname}-{procedureName}"); if (procedure == null) { //创建新流程 var procedureModel = new ProcedureModel() { Name = $"{procedureName}", CameraId = ((CameraProcedure)SelectedItem).ID, CameraName = ((CameraProcedure)SelectedItem).Camera, ExposureTime = 5000, Gain = 0, Id = Guid.NewGuid(), VisionModel = Enums.VisionModel.Simple, TriggerCommand = $"{cameraname}_{procedureName}", FeederWorks = new FeederWorks() { FeederWorkList = new ObservableCollection() }, FeederStockWorks = new FeederStockWorks() { FeederWorkList = new ObservableCollection(), FeederStockWorkList = new ObservableCollection() }, ProcedureOutputs = new ObservableCollection(), ToolInfo = new ObservableCollection(), MinArea = 100, LightValue = 20, WaitPhoto = 200, WaitFeederStop = 2000, FeederFailLimit = 5, OutputPointCountMax = 8, IsExcludeNearPoint=false, ExcludeNearPointThreshol=1, OutputSeparator=";", ToolBlock = VisionProFileHelper.LoadObjectFromFileSafe(FilePath.SimpleProcedurePath), FeederFindFrequency = new FeederFrequencyModel(11) }; var waiting = new WaitingControl(); //show the dialog var task = DialogHost.Show(waiting, "RootDialog", null, null, null); await Task.Run(() => { procedureModel.ToolBlock = VisionProFileHelper.LoadObjectFromFileSafe(ProductService.TemplateToolBlock); }); if (DialogHost.IsDialogOpen("RootDialog")) { DialogHost.Close("RootDialog"); } await task; procedureModel.FeederWorks.Add(new FeederWork() { Function = Enums.VibrationFunction.I, Step = 0, Duration = 500 }); procedureModel.FeederStockWorks.FeederWorkList.Add(new FeederWork() { Function = Enums.VibrationFunction.J, Step = 0, Duration = 500 }); procedureModel.FeederStockWorks.FeederStockWorkList.Add(new FeederStockWork() { Step = 0, Function = Enums.VibrationFunction.A, Duration = 500 }); procedureList.AddProcedure(procedureModel); } else { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.流程已存在, Duration = 1 }); } } } } catch (Exception ex) { LogHelper.WriteLogError(Lang.流程界面新建流程时出错, ex); MessageBox.Show(ex.Message); } } /// /// 移除流程 /// /// void ExecuteRemoveProProcessCommand(object SelectedItem) { try { if (SelectedItem is ProcedureModel) { var procedureId = (SelectedItem as ProcedureModel).Id; if (MessageBox.Show(Lang.是否移除流程.Replace("{0}", (SelectedItem as ProcedureModel).Name) , Lang.移除流程, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { ProcedureModel procedure = SelectedItem as ProcedureModel; var procedureList = SelectProduct.CameraProcedures.FirstOrDefault(c => c.Camera == procedure.CameraName); //获取指定相机的流程集合 if (procedureList == null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.没有找到相机.Replace("{0}", procedure.CameraName), Duration = 1 }); return; } if (((ProcedureModel)SelectedItem).ToolBlock != null) { ((ProcedureModel)SelectedItem).ToolBlock.Dispose(); } procedureList.RemoveProcedure(procedure); } } } catch (Exception ex) { LogHelper.WriteLogError(Lang.流程界面移除流程时出错, ex); MessageBox.Show(ex.Message); } } void ExecuteLoadedCommand() { if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } } private void ExtendedOpenedEventHandler(object sender, DialogOpenedEventArgs eventArgs) { } private void ExtendedClosingEventHandler(object sender, DialogClosingEventArgs eventArgs) { } private void ExtendedClosedEventHandler(object sender, DialogClosedEventArgs eventArgs) { } public void TreeView_SelectedItemChanged(object sender, System.Windows.RoutedPropertyChangedEventArgs e) { SelectNote=e.NewValue; if (e.NewValue is ProcedureModel) { SelectedProcedure = e.NewValue as ProcedureModel; } else { SelectedProcedure = null; } } #endregion #region 继承 /// /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。 /// /// /// public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { continuationCallback(true); } /// /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。 /// /// /// public async void OnNavigatedTo(NavigationContext navigationContext) { SelectProduct = navigationContext.Parameters.GetValue("SelectProduct"); if (navigationContext.Parameters.ContainsKey("SelectedProcedure")) { SelectedProcedure= navigationContext.Parameters.GetValue("SelectedProcedure"); } //遍历所有的相机集合,确保所有的相机是意义对应的,为了解决,产品已经创建过,但是当新的相机配置后,产品没能更新过来新增的相机。 foreach (var item in _configService.GetAllCameras()) { var camera = SelectProduct.CameraProcedures.FirstOrDefault(cam => cam.ID == item.Id); if (camera == null) { SelectProduct.CameraProcedures.Add(new CameraProcedure() { Camera = item.CameraName, ID = item.Id, ProcedureModels = new ObservableCollection() }); } } List invalidCamera = new List(); foreach (var item in SelectProduct.CameraProcedures) { var camera = _configService.GetAllCameras().FirstOrDefault(cam => cam.Id == item.ID); if (camera == null) { invalidCamera.Add(item.ID); } } foreach (var item in invalidCamera) { var camera = SelectProduct.CameraProcedures.FirstOrDefault(cam => cam.ID == item); SelectProduct.CameraProcedures.Remove(camera); } } /// /// 是否允许导航到此视图模型。 /// /// /// 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; } } } }