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;
}
}
}
}