using MahApps.Metro.Controls.Dialogs; using MaterialDesignThemes.Wpf; 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.Windows; using TeamAAS_VP.Controls; using TeamAAS_VP.Events; using TeamAAS_VP.Core; using TeamAAS_VP.Models; using static MaterialDesignThemes.Wpf.Theme.ToolBar; using static NPOI.HSSF.Util.HSSFColor; using TeamAAS_VP; using Cognex.VisionPro.ToolBlock; using Cognex.VisionPro; using NPOI.SS.Formula.Functions; using TeamAAS_VP.Resources.Languages; namespace TeamAAS_VP.ViewModels.Product { public class ProductProcessManageViewModel : BindableBase { IRegionManager _regionManager; IEventAggregator _eventAggregator; IContainerProvider _container; IDialogService _dialogService; ProductsViewModel productsViewModel; #region 属性 private ProductModel _SelectProduct; /// /// 选中的产品 /// public ProductModel SelectProduct { get { return _SelectProduct; } set { SetProperty(ref _SelectProduct, 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) { _regionManager = regionManager; _eventAggregator = ea; _container = container; _dialogService = dialogService; //订阅权限登录事件 _eventAggregator.GetEvent().Subscribe(LoginChange); productsViewModel = _container.Resolve(); SelectProduct = productsViewModel.SelectProduct; } #region 方法 /// /// 下一步 /// void ExecuteNextCommand() { _regionManager.RequestNavigate("ProductRegionContext", "ProcessBasics"); } void ExecuteBackCommand() { _regionManager.RequestNavigate("ProductRegionContext", "ProductDescription"); } /// /// 新建流程 /// 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())) { 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}-{result.ToString()}"); if (procedure == null) { procedureList.ProcedureModels.Add(new ProcedureModel() { Name = $"{SelectProduct.Name}-{cameraname}-{result.ToString()}", CameraId= ((CameraProcedure)SelectedItem).ID, CameraName= ((CameraProcedure)SelectedItem).Camera, ExposureTime=5000, Gain=0, Id = Guid.NewGuid(), VisionModel = Enums.VisionModel.Simple, TriggerCommand = $"{cameraname}{result.ToString()}", 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, WaitSuction = 200, WaitBlow = 200, FeederFailLimit = 5, OutputPointCountMax = 8, ToolBlock= CogSerializer.LoadObjectFromFile(FilePath.SimpleProcedurePath) as CogToolBlock, FeederFindFrequency=new FeederFrequencyModel(11) }); procedureList.ProcedureModels[procedureList.ProcedureModels.Count - 1].FeederWorks.Add(new FeederWork() { Function = Enums.VibrationFunction.I, Step = 0, Duration = 500 }); procedureList.ProcedureModels[procedureList.ProcedureModels.Count - 1].FeederStockWorks.FeederWorkList.Add(new FeederWork() { Function = Enums.VibrationFunction.J, Step = 0, Duration = 500 }); procedureList.ProcedureModels[procedureList.ProcedureModels.Count - 1].FeederStockWorks.FeederStockWorkList.Add(new FeederStockWork() { Step = 0, Function = Enums.VibrationFunction.A, Duration = 500 }); } else { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.流程已存在, Duration = 1 }); } } } } catch (Exception ex) { LogHelper.WriteLogError("流程界面-新建流程时出错", 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) { var camera = SelectProduct.CameraProcedures.FirstOrDefault(a => a.Camera == (SelectedItem as ProcedureModel).CameraName); if (camera != null) { if (((ProcedureModel)SelectedItem).ToolBlock!=null) { ((ProcedureModel)SelectedItem).ToolBlock.Dispose(); } camera.ProcedureModels.Remove(SelectedItem as ProcedureModel); } } } } catch (Exception ex) { LogHelper.WriteLogError("流程界面-移除流程时出错", ex); MessageBox.Show(ex.Message); } } void ExecuteLoadedCommand() { if (_container.Resolve().CurrentUser.userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } productsViewModel = _container.Resolve(); SelectProduct = productsViewModel.SelectProduct; Management management = _container.Resolve(); //遍历所有的相机集合,确保所有的相机是意义对应的,为了解决,产品已经创建过,但是当新的相机配置后,产品没能更新过来新增的相机。 foreach (var item in management.DeviceConfig.Cameras) { 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 = management.DeviceConfig.Cameras.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); } } 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; } #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; } } } }