From 9dad1bc0c209272281c96521cbf9ecb0018dcf5b Mon Sep 17 00:00:00 2001 From: sunhonglei Date: Mon, 12 May 2025 16:47:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=A2=E7=8A=B6=E9=80=89=E6=8B=A9=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E8=BF=BD=E5=8A=A0=E2=86=92=E6=A2=A8=E5=BD=A2=E3=80=81?= =?UTF-8?q?=E6=A4=AD=E5=9C=86=E5=BD=A2=E5=8A=9F=E8=83=BD=E5=BC=80=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Images/UIResource/Diamond/oval_p8-p8.png | Bin 0 -> 7299 bytes .../Images/UIResource/Diamond/pear_P8-P8.png | Bin 0 -> 6263 bytes SparkClient.csproj | 6 + ViewModel/Grading/DiamondSelectVM.cs | 541 +++++++++++------- 4 files changed, 326 insertions(+), 221 deletions(-) create mode 100644 Resource/Images/UIResource/Diamond/oval_p8-p8.png create mode 100644 Resource/Images/UIResource/Diamond/pear_P8-P8.png diff --git a/Resource/Images/UIResource/Diamond/oval_p8-p8.png b/Resource/Images/UIResource/Diamond/oval_p8-p8.png new file mode 100644 index 0000000000000000000000000000000000000000..d9deaaef7e7f3156077e126712168193e6300eb6 GIT binary patch literal 7299 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 literal 0 HcmV?d00001 diff --git a/Resource/Images/UIResource/Diamond/pear_P8-P8.png b/Resource/Images/UIResource/Diamond/pear_P8-P8.png new file mode 100644 index 0000000000000000000000000000000000000000..e6edd145fde3526a30877668726e6610f8778bbc GIT binary patch literal 6263 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 literal 0 HcmV?d00001 diff --git a/SparkClient.csproj b/SparkClient.csproj index 4429073..03a3ba1 100644 --- a/SparkClient.csproj +++ b/SparkClient.csproj @@ -56,6 +56,8 @@ + + @@ -80,6 +82,10 @@ + + + + diff --git a/ViewModel/Grading/DiamondSelectVM.cs b/ViewModel/Grading/DiamondSelectVM.cs index bb517d7..71c1df4 100644 --- a/ViewModel/Grading/DiamondSelectVM.cs +++ b/ViewModel/Grading/DiamondSelectVM.cs @@ -30,7 +30,7 @@ namespace SparkClient.ViewModel.Grading; /// public class DiamondSelectVM : BaseViewModel { - + private SOCClientService _socClientService; private AlgorithmServer _algorithmServer; private AlgorithmConfigEntity _algorithmConfigEntity; @@ -39,7 +39,8 @@ public class DiamondSelectVM : BaseViewModel private List _buttons2; private ICommand ChangeDiamondTypeCommand; private ICommand StartGradingCommand; - public List Buttons { + public List Buttons + { get { return _buttons; } set { @@ -56,7 +57,7 @@ public class DiamondSelectVM : BaseViewModel OnPropertyChanged(nameof(Buttons2)); } } - + public DiamondSelectVM() { ChangeDiamondTypeCommand = new RelayCommand(ChangeDiamondType); @@ -66,7 +67,7 @@ public class DiamondSelectVM : BaseViewModel foreach (var buttonInfo in buttonInfos) { var bitmap = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/" + buttonInfo.ImageName, UriKind.RelativeOrAbsolute)); - ButtonViewModel button = new ButtonViewModel() { Text = buttonInfo.ButtonName, ImageSource = bitmap, Type = buttonInfo.Type, Command = ChangeDiamondTypeCommand ,IsEnabled= buttonInfo.IsEnabled, IsHighlighted = false}; + ButtonViewModel button = new ButtonViewModel() { Text = buttonInfo.ButtonName, ImageSource = bitmap, Type = buttonInfo.Type, Command = ChangeDiamondTypeCommand, IsEnabled = buttonInfo.IsEnabled, IsHighlighted = false }; tempButtons.Add(button); } Buttons = tempButtons; @@ -78,17 +79,17 @@ public class DiamondSelectVM : BaseViewModel /// private List GetButtonInfos() { - + List buttonInfos = new List(); buttonInfos.Add(new ButtonInfo() { Type = "round", IsEnabled = true, ImageName = "round.png", ButtonName = MultilingualHelper.getString("圆形") }); buttonInfos.Add(new ButtonInfo() { Type = "Hexagon", IsEnabled = false, ImageName = "Hexagon.png", ButtonName = MultilingualHelper.getString("六边形") }); buttonInfos.Add(new ButtonInfo() { Type = "cushion", IsEnabled = false, ImageName = "Cushion.png", ButtonName = MultilingualHelper.getString("枕形") }); - buttonInfos.Add(new ButtonInfo() { Type = "Pear", IsEnabled = false, ImageName = "Pear.png", ButtonName = MultilingualHelper.getString("梨形") }); + buttonInfos.Add(new ButtonInfo() { Type = "Pear", IsEnabled = true, ImageName = "Pear.png", ButtonName = MultilingualHelper.getString("梨形") }); buttonInfos.Add(new ButtonInfo() { Type = "Princess", IsEnabled = false, ImageName = "Princess.png", ButtonName = MultilingualHelper.getString("公主方形") }); - buttonInfos.Add(new ButtonInfo() { Type = "oval", IsEnabled = false, ImageName = "oval.png", ButtonName = MultilingualHelper.getString("椭圆形") }); + buttonInfos.Add(new ButtonInfo() { Type = "oval", IsEnabled = true, ImageName = "oval.png", ButtonName = MultilingualHelper.getString("椭圆形") }); buttonInfos.Add(new ButtonInfo() { Type = "Emerald", IsEnabled = false, ImageName = "Emerald.png", ButtonName = MultilingualHelper.getString("祖母绿形") }); buttonInfos.Add(new ButtonInfo() { Type = "Odd", IsEnabled = false, ImageName = "Odd.png", ButtonName = MultilingualHelper.getString("异形钻") }); - return buttonInfos; + return buttonInfos; } /// /// 获取钻石列表 @@ -107,26 +108,70 @@ public class DiamondSelectVM : BaseViewModel [Log] public void ChangeDiamondType(object type) { - if (type!= null) + // 非空处理 + if (type == null) return; + + // 获取当前点选钻石形状 + string selectedType = type.ToString(); + + // 恢复所有按钮状态,并高亮当前选中的按钮 + foreach (var item in Buttons) + { + item.IsHighlighted = item.Type == selectedType; + } + + //初始化按键集 + List tempButtons2 = new List(); + + // 设置二级图片按钮路径 + string basePath = "pack://application:,,,/Resource/Images/UIResource/Diamond/"; + Func getBitmap = (fileName) => new BitmapImage(new Uri(basePath + fileName, UriKind.RelativeOrAbsolute)); + + // 根据选中类型生成右侧按钮 + switch (selectedType.ToLower()) + { + case "round": + // 圆形钻石 + AddRoundButtons(tempButtons2, getBitmap); + break; + case "pear": + // 梨形钻石 + AddPearButtons(tempButtons2, getBitmap); + break; + case "oval": + // 椭圆形钻石 + AddOvalButtons(tempButtons2, getBitmap); + break; + default: + // 默认圆形 + AddRoundButtons(tempButtons2, getBitmap); + break; + } + Buttons2 = tempButtons2; + } + + /// + /// 圆形二级界面按键加载处理 + /// + /// 当前页面按键 + /// 图片路径 + private void AddRoundButtons(List buttons, Func getBitmap) + { + // 运行模式为实验室模式 + if (Common.RunMode == 0) { - foreach (var item in Buttons.Where(x => x.Type == type)) - { - item.IsHighlighted = true; - }; - List tempButtons2 = new List(); - if (Common.RunMode == 0) - { - var bitmap = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/round_P8-P8.png", UriKind.RelativeOrAbsolute)); - ButtonViewModel button = new ButtonViewModel() { Text = "P8-P8", ImageSource = bitmap, Type = "ROUND P8 P8", Command = StartGradingCommand, IsFocused = true}; - tempButtons2.Add(button); - }else if (Common.RunMode == 1) - { - var bitmap = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8.png", UriKind.RelativeOrAbsolute)); - var bitmap_p8p8s1 = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8-S1.png", UriKind.RelativeOrAbsolute)); - var bitmap_p8p8s2 = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8-S2.png", UriKind.RelativeOrAbsolute)); - var bitmap_p8p8s7 = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8-S7.png", UriKind.RelativeOrAbsolute)); - var bitmap_p8p8s8 = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8-S8.png", UriKind.RelativeOrAbsolute)); - List listBtn = new List() + var bitmap_p8p8 = getBitmap("round_P8-P8.png"); + buttons.Add(new ButtonViewModel() { Text = "P8-P8", ImageSource = bitmap_p8p8, Type = "ROUND P8 P8", Command = StartGradingCommand, IsFocused = true }); + } + // 运行模式为工厂模式 + else if (Common.RunMode == 1) + { + var bitmap = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8.png", UriKind.RelativeOrAbsolute)); + var bitmap_p8p8s1 = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8-S1.png", UriKind.RelativeOrAbsolute)); + var bitmap_p8p8s2 = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8-S2.png", UriKind.RelativeOrAbsolute)); + var bitmap_p8p8s7 = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8-S7.png", UriKind.RelativeOrAbsolute)); + var bitmap_p8p8s8 = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/Diamond/round_P8-P8-S8.png", UriKind.RelativeOrAbsolute)); + List listBtn = new List() { new ButtonViewModel() { Text = "P8-P8 Stage 1", ImageSource = bitmap_p8p8s1, Type = "ROUND P8 P8 S1", Command = StartGradingCommand, IsFocused = true}, new ButtonViewModel() { Text = "P8-P8 Stage 2", ImageSource = bitmap_p8p8s2, Type = "ROUND P8 P8 S2", Command = StartGradingCommand, IsFocused = true}, @@ -138,15 +183,66 @@ public class DiamondSelectVM : BaseViewModel new ButtonViewModel() { Text = "P8-P8 Stage 8", ImageSource = bitmap_p8p8s8, Type = "ROUND P8 P8 S8", Command = StartGradingCommand, IsFocused = true}, new ButtonViewModel() { Text = "P8-P8 Stage 9", ImageSource = bitmap, Type = "ROUND P8 P8 S9", Command = StartGradingCommand, IsFocused = true}, new ButtonViewModel() { Text = "P8-P8", ImageSource = bitmap, Type = "ROUND P8 P8", Command = StartGradingCommand, IsFocused = true}, - }; - - listBtn.ForEach(e => tempButtons2.Add(e)); - - } + listBtn.ForEach(e => buttons.Add(e)); + } + } + /// + /// 梨形二级界面按键加载处理 + /// + /// 当前页面按键 + /// 图片路径 + private void AddPearButtons(List buttons, Func getBitmap) + { + // 运行模式为实验室模式 + if (Common.RunMode == 0) + { + // TODO 待二级图片作成后替换,以及后续检测处理追加 + var bitmap_p8p8 = getBitmap("pear_P8-P8.png"); + buttons.Add(new ButtonViewModel { Text = "Pear Stage 1", ImageSource = bitmap_p8p8, Type = "PEAR S1", Command = StartGradingCommand, IsFocused = true }); - Buttons2 = tempButtons2; + // 追加按钮2 + //var bitmap_p8p8s2 = getBitmap("pear_P8-P8-S2.png"); + //buttons.Add(new ButtonViewModel { Text = "Pear Stage 2", ImageSource = bitmap_p8p8s2, Type = "PEAR S2", Command = StartGradingCommand, IsFocused = true }); + } + // 运行模式为工厂模式 + else if (Common.RunMode == 1) + { + // TODO 待二级图片作成后替换,以及后续检测处理追加 + var bitmap_p8p8 = getBitmap("pear_P8-P8.png"); + buttons.Add(new ButtonViewModel { Text = "Pear Stage 1", ImageSource = bitmap_p8p8, Type = "PEAR S1", Command = StartGradingCommand, IsFocused = true }); + + // TODO 虚拟追加按钮2 + var bitmap_p8p8s2 = getBitmap("pear_P8-P8.png"); + buttons.Add(new ButtonViewModel { Text = "Pear Stage 2", ImageSource = bitmap_p8p8, Type = "PEAR S2", Command = StartGradingCommand, IsFocused = true }); + } + } + + /// + /// 椭圆形二级界面按键加载处理 + /// + /// 当前页面按键 + /// 图片路径 + private void AddOvalButtons(List buttons, Func getBitmap) + { + // 运行模式为实验室模式 + if (Common.RunMode == 0) + { + // TODO 待二级图片作成后替换,以及后续检测处理追加 + var bitmap_p8p8 = getBitmap("oval_P8-P8.png"); + buttons.Add(new ButtonViewModel { Text = "Oval Stage 1", ImageSource = bitmap_p8p8, Type = "OVAL S1", Command = StartGradingCommand, IsFocused = true }); + } + // 运行模式为工厂模式 + else if (Common.RunMode == 1) + { + // TODO 待二级图片作成后替换,以及后续检测处理追加 + var bitmap_p8p8 = getBitmap("oval_P8-P8.png"); + buttons.Add(new ButtonViewModel { Text = "Oval Stage 1", ImageSource = bitmap_p8p8, Type = "OVAL S1", Command = StartGradingCommand, IsFocused = true }); + + // TODO 虚拟追加按钮2 + var bitmap_p8p8s2 = getBitmap("oval_P8-P8.png"); + buttons.Add(new ButtonViewModel { Text = "Oval Stage 2", ImageSource = bitmap_p8p8, Type = "OVAL S2", Command = StartGradingCommand, IsFocused = true }); } } @@ -186,11 +282,11 @@ public class DiamondSelectVM : BaseViewModel DiamondCode = ""; } - string runModel = ConfigurationHelper.ReadConfigValue("RunModel")??"1"; + string runModel = ConfigurationHelper.ReadConfigValue("RunModel") ?? "1"; if ("0".Equals(runModel)) - //json模式 - + //json模式 + { Logger.Info($"当前运行JSON模式:{runModel}"); var loadingView = new GradingLoadingVM(param.ToString(), DiamondCode); @@ -204,10 +300,10 @@ public class DiamondSelectVM : BaseViewModel { //返回 loadingView.Dispose(); - WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); + WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); return; } - if ( res <= -100) + if (res <= -100) { return; } @@ -223,18 +319,18 @@ public class DiamondSelectVM : BaseViewModel vm.WindowTitle = string.IsNullOrWhiteSpace(DiamondCode) ? vm.WindowTitle : $"{vm.WindowTitle} - {DiamondCode}"; WindowManager.mainViewModel.Content = vm; WindowManager.openContent.Add(vm); - + int res = await loadingView.Start(1); if (res > -100 && res < 0) { //返回 loadingView.Dispose(); - WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); + WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); await SOCClientService.Service.OpenPump(false); return; } - if ( res <= -100) + if (res <= -100) { return; } @@ -250,207 +346,207 @@ public class DiamondSelectVM : BaseViewModel vm.WindowTitle = string.IsNullOrWhiteSpace(DiamondCode) ? vm.WindowTitle : $"{vm.WindowTitle} - {DiamondCode}"; WindowManager.mainViewModel.Content = vm; WindowManager.openContent.Add(vm); - + int res = await loadingView.Start(); if (res > -100 && res < 0) { //返回 loadingView.Dispose(); - WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); + WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); await SOCClientService.Service.OpenPump(false); return; } - if ( res <= -100) + if (res <= -100) { return; } - + GradingResult(loadingView.Parameter); loadingView.Dispose(); - + } - - -/** - LoadingDialog loading = new LoadingDialog(DiamondCode); - try - { - if (param != null) - { - string progTime = ConfigurationHelper.ReadConfigValue("ProgressTime"); - int iProgTime = 50000; - int.TryParse(progTime, out iProgTime); - int setpTime = iProgTime / 97; + /** - var progressTask = Task.Run(() => Application.Current.Dispatcher.Invoke(() => loading.ShowDialog())); - await Task.Run(async () => + LoadingDialog loading = new LoadingDialog(DiamondCode); + try { - bool isEnd = false; - int progress = 0; - // 更新进度条的值(需要在UI线程上执行) - loading.Dispatcher.Invoke(async () => + if (param != null) { - for (int i = 0; i <= 97; i++) + string progTime = ConfigurationHelper.ReadConfigValue("ProgressTime"); + + int iProgTime = 50000; + int.TryParse(progTime, out iProgTime); + int setpTime = iProgTime / 97; + + var progressTask = Task.Run(() => Application.Current.Dispatcher.Invoke(() => loading.ShowDialog())); + await Task.Run(async () => { - if (isEnd) + bool isEnd = false; + int progress = 0; + // 更新进度条的值(需要在UI线程上执行) + loading.Dispatcher.Invoke(async () => + { + for (int i = 0; i <= 97; i++) + { + if (isEnd) + { + break; + } + // 模拟耗时操作 + //System.Threading.Thread.Sleep(50); // 休眠50毫秒 + await Task.Delay(setpTime); + loading.setValue(i); + progress = i; + } + }); + + SocResultEntity socResolt = new SocResultEntity(); + AlgorithmResultEntity parameter = new AlgorithmResultEntity(); + parameter.Standard = "IGI 2024"; + string value = param.ToString() ?? ""; + if (value != null && value.Split(" ").Length == 3) { - break; + parameter.Shape = value.Split(" ")[0]; + parameter.CrownType = value.Split(" ")[1]; + parameter.PavType = value.Split(" ")[2]; } - // 模拟耗时操作 - //System.Threading.Thread.Sleep(50); // 休眠50毫秒 - await Task.Delay(setpTime); - loading.setValue(i); - progress = i; - } - }); - - SocResultEntity socResolt = new SocResultEntity(); - AlgorithmResultEntity parameter = new AlgorithmResultEntity(); - parameter.Standard = "IGI 2024"; - string value = param.ToString() ?? ""; - if (value != null && value.Split(" ").Length == 3) - { - parameter.Shape = value.Split(" ")[0]; - parameter.CrownType = value.Split(" ")[1]; - parameter.PavType = value.Split(" ")[2]; - } - // 初始化SOC客户端服务,传入SOC端的地址和认证Token - _socClientService = new SOCClientService(); - // 启动soc - socResolt = await _socClientService.ProcessImageCollectionAsync(); - switch (socResolt.Status) - { - case StatusCodes.OpenOfTheHatch: - ShowErrorMessage(MultilingualHelper.getString("OpenOfTheHatch"), loading); - return; - case StatusCodes.DeviceNotFound: - ShowErrorMessage(MultilingualHelper.getString("DeviceNotFound"), loading); - return; - case StatusCodes.InProgress: - ShowErrorMessage(MultilingualHelper.getString("InProgress"), loading); - return; - case StatusCodes.CacheCleared: - ShowErrorMessage(MultilingualHelper.getString("CacheCleared"), loading); - return; - case StatusCodes.CannotSendCommand: - ShowErrorMessage(MultilingualHelper.getString("CannotSendCommand"), loading); - return; - case StatusCodes.MicrocontrollerTimeout: - ShowErrorMessage(MultilingualHelper.getString("MicrocontrollerTimeout"), loading); - return; - case StatusCodes.MicrocontrollerError: - ShowErrorMessage(MultilingualHelper.getString("MicrocontrollerError"), loading); - return; - case StatusCodes.CameraNotConnected: - ShowErrorMessage(MultilingualHelper.getString("CameraNotConnected"), loading); - return; - } - _algorithmServer = new AlgorithmServer(); - // //图片集合 - string image_files = JsonConvert.SerializeObject(socResolt.Images, Formatting.Indented); - // string image_files =$"[ \"image_0.bmp\", \"image_1.bmp\", \"image_2.bmp\", \"image_3.bmp\", \"image_4.bmp\", \"image_5.bmp\", \"image_6.bmp\", \"image_7.bmp\", \"image_8.bmp\", \"image_9.bmp\", \"image_10.bmp\", \"image_11.bmp\", \"image_12.bmp\", \"image_13.bmp\", \"image_14.bmp\", \"image_15.bmp\", \"image_16.bmp\", \"image_17.bmp\", \"image_18.bmp\", \"image_19.bmp\", \"image_20.bmp\", \"image_21.bmp\", \"image_22.bmp\", \"image_23.bmp\", \"image_24.bmp\", \"image_25.bmp\", \"image_26.bmp\", \"image_27.bmp\", \"image_28.bmp\", \"image_29.bmp\", \"image_30.bmp\", \"image_31.bmp\", \"image_32.bmp\", \"image_33.bmp\", \"image_34.bmp\", \"image_35.bmp\", \"image_36.bmp\", \"image_37.bmp\", \"image_38.bmp\", \"image_39.bmp\", \"image_40.bmp\", \"image_41.bmp\", \"image_42.bmp\", \"image_43.bmp\", \"image_44.bmp\", \"image_45.bmp\", \"image_46.bmp\", \"image_47.bmp\", \"image_48.bmp\", \"image_49.bmp\", \"image_50.bmp\", \"image_51.bmp\", \"image_52.bmp\", \"image_53.bmp\", \"image_54.bmp\", \"image_55.bmp\", \"image_56.bmp\", \"image_57.bmp\", \"image_58.bmp\", \"image_59.bmp\", \"image_60.bmp\", \"image_61.bmp\", \"image_62.bmp\", \"image_63.bmp\", \"image_64.bmp\", \"image_65.bmp\", \"image_66.bmp\", \"image_67.bmp\", \"image_68.bmp\", \"image_69.bmp\", \"image_70.bmp\", \"image_71.bmp\", \"image_72.bmp\", \"image_73.bmp\", \"image_74.bmp\", \"image_75.bmp\", \"image_76.bmp\", \"image_77.bmp\", \"image_78.bmp\", \"image_79.bmp\", \"image_80.bmp\", \"image_81.bmp\", \"image_82.bmp\", \"image_83.bmp\", \"image_84.bmp\", \"image_85.bmp\", \"image_86.bmp\", \"image_87.bmp\", \"image_88.bmp\", \"image_89.bmp\", \"image_90.bmp\", \"image_91.bmp\", \"image_92.bmp\", \"image_93.bmp\", \"image_94.bmp\", \"image_95.bmp\", \"image_96.bmp\", \"image_97.bmp\", \"image_98.bmp\", \"image_99.bmp\"]" ; + // 初始化SOC客户端服务,传入SOC端的地址和认证Token + _socClientService = new SOCClientService(); + // 启动soc + socResolt = await _socClientService.ProcessImageCollectionAsync(); + switch (socResolt.Status) + { + case StatusCodes.OpenOfTheHatch: + ShowErrorMessage(MultilingualHelper.getString("OpenOfTheHatch"), loading); + return; + case StatusCodes.DeviceNotFound: + ShowErrorMessage(MultilingualHelper.getString("DeviceNotFound"), loading); + return; + case StatusCodes.InProgress: + ShowErrorMessage(MultilingualHelper.getString("InProgress"), loading); + return; + case StatusCodes.CacheCleared: + ShowErrorMessage(MultilingualHelper.getString("CacheCleared"), loading); + return; + case StatusCodes.CannotSendCommand: + ShowErrorMessage(MultilingualHelper.getString("CannotSendCommand"), loading); + return; + case StatusCodes.MicrocontrollerTimeout: + ShowErrorMessage(MultilingualHelper.getString("MicrocontrollerTimeout"), loading); + return; + case StatusCodes.MicrocontrollerError: + ShowErrorMessage(MultilingualHelper.getString("MicrocontrollerError"), loading); + return; + case StatusCodes.CameraNotConnected: + ShowErrorMessage(MultilingualHelper.getString("CameraNotConnected"), loading); + return; + } + _algorithmServer = new AlgorithmServer(); + // //图片集合 + string image_files = JsonConvert.SerializeObject(socResolt.Images, Formatting.Indented); + // string image_files =$"[ \"image_0.bmp\", \"image_1.bmp\", \"image_2.bmp\", \"image_3.bmp\", \"image_4.bmp\", \"image_5.bmp\", \"image_6.bmp\", \"image_7.bmp\", \"image_8.bmp\", \"image_9.bmp\", \"image_10.bmp\", \"image_11.bmp\", \"image_12.bmp\", \"image_13.bmp\", \"image_14.bmp\", \"image_15.bmp\", \"image_16.bmp\", \"image_17.bmp\", \"image_18.bmp\", \"image_19.bmp\", \"image_20.bmp\", \"image_21.bmp\", \"image_22.bmp\", \"image_23.bmp\", \"image_24.bmp\", \"image_25.bmp\", \"image_26.bmp\", \"image_27.bmp\", \"image_28.bmp\", \"image_29.bmp\", \"image_30.bmp\", \"image_31.bmp\", \"image_32.bmp\", \"image_33.bmp\", \"image_34.bmp\", \"image_35.bmp\", \"image_36.bmp\", \"image_37.bmp\", \"image_38.bmp\", \"image_39.bmp\", \"image_40.bmp\", \"image_41.bmp\", \"image_42.bmp\", \"image_43.bmp\", \"image_44.bmp\", \"image_45.bmp\", \"image_46.bmp\", \"image_47.bmp\", \"image_48.bmp\", \"image_49.bmp\", \"image_50.bmp\", \"image_51.bmp\", \"image_52.bmp\", \"image_53.bmp\", \"image_54.bmp\", \"image_55.bmp\", \"image_56.bmp\", \"image_57.bmp\", \"image_58.bmp\", \"image_59.bmp\", \"image_60.bmp\", \"image_61.bmp\", \"image_62.bmp\", \"image_63.bmp\", \"image_64.bmp\", \"image_65.bmp\", \"image_66.bmp\", \"image_67.bmp\", \"image_68.bmp\", \"image_69.bmp\", \"image_70.bmp\", \"image_71.bmp\", \"image_72.bmp\", \"image_73.bmp\", \"image_74.bmp\", \"image_75.bmp\", \"image_76.bmp\", \"image_77.bmp\", \"image_78.bmp\", \"image_79.bmp\", \"image_80.bmp\", \"image_81.bmp\", \"image_82.bmp\", \"image_83.bmp\", \"image_84.bmp\", \"image_85.bmp\", \"image_86.bmp\", \"image_87.bmp\", \"image_88.bmp\", \"image_89.bmp\", \"image_90.bmp\", \"image_91.bmp\", \"image_92.bmp\", \"image_93.bmp\", \"image_94.bmp\", \"image_95.bmp\", \"image_96.bmp\", \"image_97.bmp\", \"image_98.bmp\", \"image_99.bmp\"]" ; - // 保存图片到历史记录文件夹 - HandleAlgorithmFailure(image_files, DiamondCode); + // 保存图片到历史记录文件夹 + HandleAlgorithmFailure(image_files, DiamondCode); - // 启动算法 - parameter = _algorithmServer.CallParseJsonAndReturnActions(parameter.Shape, parameter.CrownType, image_files); - //机器号 - parameter.DeviceId = socResolt.DeviceId; - switch (parameter.status) - { - case StatusCodes.AlgorithmFailed: - ShowErrorMessage(MultilingualHelper.getString("AlgorithmFailed"), loading); - return; - case StatusCodes.ImageFileReadFailure: - ShowErrorMessage(MultilingualHelper.getString("ImageFileReadFailure"), loading); - return; - case StatusCodes.JsonParseFailure: - ShowErrorMessage(MultilingualHelper.getString("JsonParseFailure"), loading); - return; - case StatusCodes.NoDiamond: - ShowErrorMessage(MultilingualHelper.getString("NoDiamond"), loading); - return; - } - parameter.Standard = getStandardName(); - parameter.Shape = value.Split(" ")[0]; - parameter.CrownType = value.Split(" ")[1]; - parameter.PavType = value.Split(" ")[2]; - parameter.DiamondCode = DiamondCode; - - if (!parameter.status.Equals(StatusCodes.Ok)) - parameter.error_msg = MultilingualHelper.getString(StatusCodes.GetConstantNameByValue(parameter.status)); - //参数实体转json输出 - try - { - string parameterJson = JsonConvert.SerializeObject(parameter); - parameterJson = JToken.Parse(parameterJson).ToString(); - string outputPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", "result"); - if (!Directory.Exists(outputPath)) - Directory.CreateDirectory(outputPath); - string outputFilePath = $"{outputPath}/{DiamondCode}-{DateTime.Now:yyyyMMdd_HHmmss}.json"; - using (var file = File.Create(outputFilePath)) - using (StreamWriter stream = new StreamWriter(file)) - { - stream.Write(parameterJson); - } - } - catch (Exception ex) - { - Logger.Error("output输出失败:"+ex.Message); - } - - isEnd = true; - //GradingResult(parameter); - await loading.Dispatcher.Invoke(async () => - { - for (int i = progress; progress <= 100; i++) - { - Random random = new Random(); int minValue = 20; int maxValue = 100; // 生成50到150之间的随机整数 - int randomNumber = random.Next(minValue, maxValue + 1); - await Task.Delay(randomNumber); - loading.setValue(i); - if (loading.ProgressBar.Value == 98) + // 启动算法 + parameter = _algorithmServer.CallParseJsonAndReturnActions(parameter.Shape, parameter.CrownType, image_files); + //机器号 + parameter.DeviceId = socResolt.DeviceId; + switch (parameter.status) { - GradingResult(parameter); + case StatusCodes.AlgorithmFailed: + ShowErrorMessage(MultilingualHelper.getString("AlgorithmFailed"), loading); + return; + case StatusCodes.ImageFileReadFailure: + ShowErrorMessage(MultilingualHelper.getString("ImageFileReadFailure"), loading); + return; + case StatusCodes.JsonParseFailure: + ShowErrorMessage(MultilingualHelper.getString("JsonParseFailure"), loading); + return; + case StatusCodes.NoDiamond: + ShowErrorMessage(MultilingualHelper.getString("NoDiamond"), loading); + return; } - if(loading.ProgressBar.Value >= 100) + parameter.Standard = getStandardName(); + parameter.Shape = value.Split(" ")[0]; + parameter.CrownType = value.Split(" ")[1]; + parameter.PavType = value.Split(" ")[2]; + parameter.DiamondCode = DiamondCode; + + if (!parameter.status.Equals(StatusCodes.Ok)) + parameter.error_msg = MultilingualHelper.getString(StatusCodes.GetConstantNameByValue(parameter.status)); + //参数实体转json输出 + try { - - loading.Close(); - break; + string parameterJson = JsonConvert.SerializeObject(parameter); + parameterJson = JToken.Parse(parameterJson).ToString(); + string outputPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", "result"); + if (!Directory.Exists(outputPath)) + Directory.CreateDirectory(outputPath); + string outputFilePath = $"{outputPath}/{DiamondCode}-{DateTime.Now:yyyyMMdd_HHmmss}.json"; + using (var file = File.Create(outputFilePath)) + using (StreamWriter stream = new StreamWriter(file)) + { + stream.Write(parameterJson); + } } - } - // 检测到钻石需进行清洁 - if (parameter.status == StatusCodes.Recheck) - { - ShowErrorMessage(MultilingualHelper.getString("Recheck"), loading); - } - - }); - }); - } - } - catch (DirectoryNotFoundException ex) - { - loading.Close(); - new MessageBox().Show(MultilingualHelper.getString("SavePathIsnotExists")); - } - catch (IOException ex) - { - loading.Close(); - new MessageBox().Show($"{MultilingualHelper.getString("FileOpened")}:{ex.Message}"); - } - finally { - - } -**/ + catch (Exception ex) + { + Logger.Error("output输出失败:"+ex.Message); + } + + isEnd = true; + //GradingResult(parameter); + await loading.Dispatcher.Invoke(async () => + { + for (int i = progress; progress <= 100; i++) + { + Random random = new Random(); int minValue = 20; int maxValue = 100; // 生成50到150之间的随机整数 + int randomNumber = random.Next(minValue, maxValue + 1); + await Task.Delay(randomNumber); + loading.setValue(i); + if (loading.ProgressBar.Value == 98) + { + GradingResult(parameter); + } + if(loading.ProgressBar.Value >= 100) + { + + loading.Close(); + break; + } + } + // 检测到钻石需进行清洁 + if (parameter.status == StatusCodes.Recheck) + { + ShowErrorMessage(MultilingualHelper.getString("Recheck"), loading); + } + + }); + }); + } + } + catch (DirectoryNotFoundException ex) + { + loading.Close(); + new MessageBox().Show(MultilingualHelper.getString("SavePathIsnotExists")); + } + catch (IOException ex) + { + loading.Close(); + new MessageBox().Show($"{MultilingualHelper.getString("FileOpened")}:{ex.Message}"); + } + finally { + + } + **/ } [Log] @@ -464,7 +560,7 @@ public class DiamondSelectVM : BaseViewModel } else { - return dataTable.Rows[0][MultilingualHelper.getString("NameType")].ToString()??""; + return dataTable.Rows[0][MultilingualHelper.getString("NameType")].ToString() ?? ""; } } // 将 UI 操作调度到主线程并显示错误信息 @@ -489,7 +585,8 @@ public class DiamondSelectVM : BaseViewModel public async void DoStartGrading(object param) { LoadingDialog loading = new LoadingDialog(DiamondCode); - try { + try + { if (param != null) { AlgorithmResultEntity parameter = new AlgorithmResultEntity(); @@ -512,9 +609,10 @@ public class DiamondSelectVM : BaseViewModel { return; } - + var tcs = new TaskCompletionSource(); - var progressTask = Task.Run(() => Application.Current.Dispatcher.Invoke(() => { + var progressTask = Task.Run(() => Application.Current.Dispatcher.Invoke(() => + { loading.Closed += (s, e) => tcs.SetResult(true); loading.ShowDialog(); } @@ -581,7 +679,7 @@ public class DiamondSelectVM : BaseViewModel [Log] public static void HandleAlgorithmFailure(string[] image_files, string dCode = "", string dType = "") { - + // 从配置文件中读取 imageHistoryPath // 定义历史记录文件夹路径 string? imageHistoryPath = ConfigurationManager.AppSettings["ImageHistoryPath"]; @@ -594,13 +692,13 @@ public class DiamondSelectVM : BaseViewModel // 生成时间戳,格式为 yyyyMMddHHmmss string timestamp = DateTime.Now.ToString("yyyyMMdd-HHmmss"); // 组合新的文件夹路径 - string newFolderPath = Path.Combine(imageHistoryPath, string.IsNullOrWhiteSpace(dCode) ? $"image-{timestamp}-{dType}" : $"image-{dCode}-{timestamp}-{dType}" ); - + string newFolderPath = Path.Combine(imageHistoryPath, string.IsNullOrWhiteSpace(dCode) ? $"image-{timestamp}-{dType}" : $"image-{dCode}-{timestamp}-{dType}"); + // 检查 D 盘内存空间 string strSafeSpace = ConfigurationHelper.ReadConfigValue("SafeSpaceReservation"); long safeSpace = 10L; long.TryParse(strSafeSpace, out safeSpace); - DriveInfo dDrive = new DriveInfo(imageHistoryPath.Substring(0,1)); + DriveInfo dDrive = new DriveInfo(imageHistoryPath.Substring(0, 1)); long requiredSpace = safeSpace * 1024 * 1024 * 1024; if (dDrive.TotalFreeSpace < requiredSpace) { @@ -687,7 +785,7 @@ public class DiamondSelectVM : BaseViewModel throw; } } - + } public class ButtonInfo { @@ -746,7 +844,7 @@ public class ButtonViewModel : BaseViewModel OnPropertyChanged(nameof(Type)); } } - public int Column + public int Column { get { return _col; } set @@ -790,7 +888,8 @@ public class ButtonViewModel : BaseViewModel public Brush BackgroundColor { - get { + get + { return _background; } set