using Cognex.VisionPro.ToolBlock; 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.Web.Hosting; using System.Windows; using System.Windows.Media.Media3D; using Team.FFFeederService; using Team.FFFeederService.Interfaces; using TeamAAS_VP; using TeamAAS_VP.Core; using TeamAAS_VP.Events; using TeamAAS_VP.Interfaces; using TeamAAS_VP.Models; using TeamAAS_VP.Resources.Languages; using TeamAAS_VP.Services; namespace TeamAAS_VP.ViewModels.Product { public class AdvancedProcedureViewModel : BindableBase, IConfirmNavigationRequest { IRegionManager _regionManager; IEventAggregator _eventAggregator; IContainerProvider _container; IDialogService _dialogService; IFeederService _feederService; IRobotService _robotService; ICameraService _cameraService; ISystemDatabaseService _systemDatabaseService; IConfigService _configService; #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); } } public CogToolBlockEditV2 ToolBlockEdit { get;set; } private IRobot _Robot; public IRobot Robot { get { return _Robot; } set { SetProperty(ref _Robot, value); } } private ICamera _Camera; public ICamera Camera { get { return _Camera; } set { SetProperty(ref _Camera, value); } } private string _Message; public string Message { get { return _Message; } set { SetProperty(ref _Message, 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 _RunVisionProcessCommand; public DelegateCommand RunVisionProcessCommand => _RunVisionProcessCommand ?? (_RunVisionProcessCommand = new DelegateCommand(ExecuteRunVisionProcessCommand)); #endregion #region 事件 #endregion public AdvancedProcedureViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService, IFeederService feederService, IRobotService robotService,ICameraService cameraService, ISystemDatabaseService systemDatabaseService, IConfigService configService) { _regionManager = regionManager; _eventAggregator = ea; _container = container; _dialogService = dialogService; _feederService = feederService; _robotService = robotService; _cameraService = cameraService; _configService = configService; _systemDatabaseService = systemDatabaseService; //订阅权限登录事件 _eventAggregator.GetEvent().Subscribe(LoginChange); _configService = configService; } #region 方法 /// /// 下一步 /// void ExecuteNextCommand() { try { NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); param.Add("SelectedProcedure", SelectProcedure); SelectProcedure.ToolBlock = ToolBlockEdit.Subject; if (SelectProcedure.FeederId == Guid.Empty) { _regionManager.RequestNavigate("ProductRegionContext", "ProcedureVisionOutput", param); } else { var management = _container.Resolve(); var Feeder = _feederService.GetFeeder(SelectProcedure.FeederId); if (Feeder.FeederBrand == FeederBrand.AFAG) { _regionManager.RequestNavigate("ProductRegionContext", "AfagFeederParams", param); } else { _regionManager.RequestNavigate("ProductRegionContext", "FeederParams", param); } } } catch (Exception ex) { LogHelper.WriteLogError(ex.Message,ex); } } /// /// 上一步 /// void ExecuteBackCommand() { try { NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); param.Add("SelectedProcedure", SelectProcedure); _regionManager.RequestNavigate("ProductRegionContext", "CameraParams", param); } catch (Exception ex) { LogHelper.WriteLogError(ex.Message, ex); } } void ExecuteLoadedCommand() { if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } } void ExecuteRunVisionProcessCommand() { try { SelectProcedure.ToolBlock = ToolBlockEdit.Subject; var image= Camera.Grab(); if (image != null) { var sysConfig = _configService.GetSystemConfiguration(); if(sysConfig.PhotoAI==true) { //Model rawModel = OVCore.Shared.ReadModel("best.onnx"); //PrePostProcessor pp = rawModel.CreatePrePostProcessor(); //PreProcessInputInfo inputInfo = pp.Inputs.Primary; //inputInfo.TensorInfo.Layout = Layout.NHWC; //inputInfo.ModelInfo.Layout = Layout.NCHW; //inputInfo.Dispose(); //m = pp.BuildModel(); //CompiledModel cm = OVCore.Shared.CompileModel(m, "CPU"); //ir = cm.CreateInferRequest(); ////string imagepath = @"C:\Users\18896\Desktop\Image1\2025-11-11 14_01_26_result.png"; ////Mat img = Cv2.ImRead(imagepath); ////SelectProcedure.ToolBlock.Inputs["InputImage"].Value = ImageHelper.MatConvertICogImage(img); //Mat src = ImageHelper.ICogImageConvertMat(SelectProcedure.ToolBlock.Outputs["OutputImage1"].Value as ICogImage); //Shape inputShape = m.Inputs.Primary.Shape; ////MessageBox.Show("1.2"); //Size2f sizeRatio = new Size2f(1f * src.Width / inputShape[2], 1f * src.Height / inputShape[1]); //Mat resized = src.Resize(new OpenCvSharp.Size(inputShape[2], inputShape[1])); //Mat f32 = new Mat(); //resized.ConvertTo(f32, MatType.CV_32FC3, 1.0 / 255); //using (Tensor input = f32.AsTensor()) //{ // ir.Inputs.Primary = input; //} ////执行预测 //var management = _container.Resolve(); //ir.Run(); //DetectionResult[] results; //using (Tensor output = ir.Outputs.Primary) //{ // ReadOnlySpan data = output.GetData(); // results = DetectionResult.FromYolov8DetectionResult(data, output.Shape, sizeRatio, management.dicts); // /*Cv2.PutText(src, $"Preprocess: {preprocessTime:F2}ms", new OpenCvSharp.Point(10, 20), HersheyFonts.HersheyPlain, 3, Scalar.Red, 2); // Cv2.PutText(src, $"Infer: {inferTime:F2}ms", new OpenCvSharp.Point(10, 40), HersheyFonts.HersheyPlain, 3, Scalar.Red, 2); // Cv2.PutText(src, $"Postprocess: {postprocessTime:F2}ms", new OpenCvSharp.Point(10, 60), HersheyFonts.HersheyPlain, 3, Scalar.Red, 2);*/ // //Cv2.PutText(src, $"Total: {totalTime:F2}ms", new OpenCvSharp.Point(10, 80), HersheyFonts.HersheyPlain, 3, Scalar.Red); // Cv2.PutText(src, $"detect Count: {results.Length}", new OpenCvSharp.Point(10, 120), HersheyFonts.HersheyPlain, 3, Scalar.Green, 2); // foreach (DetectionResult r in results) // { // Cv2.PutText(src, $"{r.Class}:{r.Confidence:P0}", r.Rect.TopLeft, HersheyFonts.HersheyPlain, 3, Scalar.Blue, 2); // Cv2.Rectangle(src, r.Rect, Scalar.Blue, thickness: 2); // MessageBox.Show(r.Class); // } // //Cv2.ImWrite("C:\\Users\\18896\\Desktop\\1.png", src); //} //resized.Dispose(); //src.Dispose(); //f32.Dispose(); } else { ToolBlockEdit.Subject.Inputs["InputImage"].Value = image; ToolBlockEdit.Subject.Run(); } Message = $"{Lang.图像采集耗时}:{Camera.TotalTime.TotalMilliseconds.ToString("F2")} ms {Lang.工具运行耗时}:{ToolBlockEdit.Subject.RunStatus.TotalTime.ToString("F2")} ms"; } else { Message=Lang.图像采集失败耗时.Replace("{0}", Camera.TotalTime.TotalMilliseconds.ToString("F2")).Replace("{1}", Camera.ErrorMessage); } } catch (Exception ex) { LogHelper.WriteLogError("高级模式-运行流程时出错时出错", ex); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 }); } } #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); if (Robot != null) { Robot.EnterDebugMode = true; } } Camera = _cameraService.GetCamera(SelectProcedure.CameraId); ToolBlockEdit.Subject = SelectProcedure.ToolBlock; } catch (Exception ex) { LogHelper.WriteLogError("高级视觉界面进入时出错!", ex); } } /// /// 是否允许导航到此视图模型。 /// /// /// public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } /// /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。 /// /// public void OnNavigatedFrom(NavigationContext navigationContext) { if (Robot != null) { Robot.EnterDebugMode = false; } } #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; } } } }