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 = CogSerializer.LoadObjectFromFile(FilePath.SimpleProcedurePath) as CogToolBlock,
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 = CogSerializer.LoadObjectFromFile(ProductService.TemplateToolBlock) as CogToolBlock;
});
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("流程界面-新建流程时出错", 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("流程界面-移除流程时出错", 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;
}
}
}
}