From bb800bbd0d492c91e87008d7978e9460dba20caa Mon Sep 17 00:00:00 2001 From: Tongg Date: Mon, 17 Mar 2025 17:27:20 +0800 Subject: [PATCH] feat: Factory Model --- App.xaml.cs | 28 +- Language/en_US.xaml | 4 + Language/zh_CN.xaml | 5 + Model/Extension/CommonExtension.cs | 20 + Model/Helper/Common.cs | 2 + .../Configuration/SettingsPages/SettingsVM.cs | 36 + ViewModel/Grading/DiamondSelectVM.cs | 24 +- ViewModel/Grading/GradingLoadingVM.cs | 6 + .../SettingPages/CustomSettingPage.xaml | 60 +- Views/UserControl/Viewport3D.xaml | 2 +- Views/UserControl/Viewport3D.xaml.cs | 22 + .../ViewportData/Enum/PlaneType.cs | 2 + .../ViewportData/Helper/ViewportHelperPro.cs | 821 ++++++++++-------- .../ViewportData/Helper/ViewportManager.cs | 4 + .../UserControl/ViewportData/ViewportData.cs | 6 +- 15 files changed, 620 insertions(+), 422 deletions(-) create mode 100644 Model/Extension/CommonExtension.cs diff --git a/App.xaml.cs b/App.xaml.cs index 6de3409..d520b0c 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -4,6 +4,7 @@ using System.IO; using System.Windows; using System.Windows.Media; using System.Windows.Threading; +using log4net; using log4net.Config; using SparkClient.Model.Helper; using SparkClient.ViewModel.Configuration.SettingsPages; @@ -15,21 +16,44 @@ namespace SparkClient; /// public partial class App : Application { + private static readonly ILog Logger = LogManager.GetLogger(typeof(App)); protected override void OnStartup(StartupEventArgs e) { - base.OnStartup(e); + base.OnStartup(e); //加载日志配置文件 XmlConfigurator.Configure(new FileInfo("log4net.config")); + Logger.Info("==== ==== ==== ==== ==== ==== ==== ===="); + Logger.Info("App Client Start: App Initialize"); + Logger.Info("Loaded Logs Config: log4net.config"); //运行是否需要归档 Log4NetHelper.ArchiveOldLogs(); + Logger.Info("Check Logs need to be archived"); //打开数据库连接 //读取数据库多语言配置 DataBaseHelper.CreateConnection(); + Logger.Info("Create Sqlite Connection..."); + + Logger.Info("Load Language Set"); string LanguageId = Settings.SelectValueById("LanguageId"); if (LanguageId.Length == 0) { LanguageId = "zh-cn"; - } + } MultilingualHelper.setLanguage(LanguageId); + Logger.Info($"Loaded Language is {LanguageId}"); + string runMode = Settings.SelectValueById("RunMode"); + Logger.Info($"Load RunMode Set {runMode}"); + if (runMode.Length != 0 && int.TryParse(runMode, out int iRunMode)) + { + Common.RunMode = iRunMode; + } + else + { + Common.RunMode = 0; + } + Logger.Info($"Load RunMode is {Common.RunMode}"); + + Logger.Info("App Client Start: App Initialize Succeed !!!"); + Logger.Info("==== ==== ==== ==== ==== ==== ==== ===="); } } \ No newline at end of file diff --git a/Language/en_US.xaml b/Language/en_US.xaml index 5678ef5..a06848e 100644 --- a/Language/en_US.xaml +++ b/Language/en_US.xaml @@ -239,4 +239,8 @@ Rotate Cut Tool to This Face Show Center Mark + + RunModel + Factory + Laboratory diff --git a/Language/zh_CN.xaml b/Language/zh_CN.xaml index 37dc1e1..390a981 100644 --- a/Language/zh_CN.xaml +++ b/Language/zh_CN.xaml @@ -239,4 +239,9 @@ 上一帧 下一帧 + + 运行模式 + 工厂模式 + 实验室模式 + \ No newline at end of file diff --git a/Model/Extension/CommonExtension.cs b/Model/Extension/CommonExtension.cs new file mode 100644 index 0000000..88a6348 --- /dev/null +++ b/Model/Extension/CommonExtension.cs @@ -0,0 +1,20 @@ +namespace SparkClient.Model.Extension; + +public static class CommonExtension +{ + public static string ToSafeString(this object obj) + { + if (null == obj) + { + return ""; + } + else + { + return obj.ToString( ); + } + } + public static bool IsNullOrEmpty(this string str) + { + return String.IsNullOrEmpty(str); + } +} \ No newline at end of file diff --git a/Model/Helper/Common.cs b/Model/Helper/Common.cs index a2b585d..93c07db 100644 --- a/Model/Helper/Common.cs +++ b/Model/Helper/Common.cs @@ -21,6 +21,8 @@ public class Common public const string DataBaseTempFileName = "SparkDBtemp.db"; public const string DataBaseName = "SparkDB"; + + public static int RunMode = 0; /// /// 将 DataTable 转换为 JSON 字符串 diff --git a/ViewModel/Configuration/SettingsPages/SettingsVM.cs b/ViewModel/Configuration/SettingsPages/SettingsVM.cs index 338a0d9..68dabc2 100644 --- a/ViewModel/Configuration/SettingsPages/SettingsVM.cs +++ b/ViewModel/Configuration/SettingsPages/SettingsVM.cs @@ -48,6 +48,22 @@ namespace SparkClient.ViewModel.Configuration.SettingsPages public DataTable _rules; public DataTable Rules { get { return _rules; } set { _rules = value; OnPropertyChanged(nameof(Rules)); } } + + private DataTable _runMode; + public DataTable RunMode + { + get { return _runMode;} + set { _runMode = value; OnPropertyChanged(nameof(RunMode)); } + } + + private string _nowRunMode; + + public string NowRunMode + { + get { return _nowRunMode; } + set { _nowRunMode = value; OnPropertyChanged(nameof(NowRunMode)); } + } + public SettingsVM() { try { @@ -83,6 +99,18 @@ namespace SparkClient.ViewModel.Configuration.SettingsPages this.ExcelFileChecked = ExcelFileChecked; bool.TryParse(Settings.SelectValueById("DatFileChecked"), out bool DatFileChecked); this.DatFileChecked = DatFileChecked; + + RunMode = new DataTable(); + RunMode.Columns.Add("Key"); + RunMode.Columns.Add("Value"); + RunMode.Rows.Add(MultilingualHelper.getString("CustomSettingPageFactory"), "1"); + RunMode.Rows.Add(MultilingualHelper.getString("CustomSettingPageLaboratory"), "0"); + NowRunMode = Settings.SelectValueById("RunMode"); + if (NowRunMode.Length == 0) + { + NowRunMode = "0"; + } + FilePath = Settings.SelectValueById("FilePath"); RuleId = Settings.SelectValueById("RuleId"); selectRules(); @@ -197,6 +225,14 @@ namespace SparkClient.ViewModel.Configuration.SettingsPages Value = RuleId, }; RuleData.insert(); + + Settings runModeData = new Settings() + { + Key = "RunMode", + ItemName = "运行模式", + Value = NowRunMode, + }; + runModeData.insert(); } catch (Exception ex) { diff --git a/ViewModel/Grading/DiamondSelectVM.cs b/ViewModel/Grading/DiamondSelectVM.cs index b883c2b..bce7c84 100644 --- a/ViewModel/Grading/DiamondSelectVM.cs +++ b/ViewModel/Grading/DiamondSelectVM.cs @@ -113,9 +113,27 @@ public class DiamondSelectVM : BaseViewModel item.IsHighlighted = true; }; List tempButtons2 = new List(); - 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); + 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/round_P8-P8.png", UriKind.RelativeOrAbsolute)); + ButtonViewModel button1 = new ButtonViewModel() { Text = "P8-P8 Stage 1", ImageSource = bitmap, Type = "ROUND P8 P8 S1", Command = StartGradingCommand, IsFocused = true}; + ButtonViewModel button2 = new ButtonViewModel() { Text = "P8-P8 Stage 2", ImageSource = bitmap, Type = "ROUND P8 P8 S2", Command = StartGradingCommand, IsFocused = true}; + ButtonViewModel button3 = new ButtonViewModel() { Text = "P8-P8 Stage 3", ImageSource = bitmap, Type = "ROUND P8 P8 S3", Command = StartGradingCommand, IsFocused = true}; + ButtonViewModel button4 = new ButtonViewModel() { Text = "P8-P8 Stage 4", ImageSource = bitmap, Type = "ROUND P8 P8 S4", Command = StartGradingCommand, IsFocused = true}; + ButtonViewModel button5 = new ButtonViewModel() { Text = "P8-P8", ImageSource = bitmap, Type = "ROUND P8 P8", Command = StartGradingCommand, IsFocused = true}; + tempButtons2.Add(button1); + tempButtons2.Add(button2); + tempButtons2.Add(button3); + tempButtons2.Add(button4); + tempButtons2.Add(button5); + } + + Buttons2 = tempButtons2; } } diff --git a/ViewModel/Grading/GradingLoadingVM.cs b/ViewModel/Grading/GradingLoadingVM.cs index 11ee063..f3184f8 100644 --- a/ViewModel/Grading/GradingLoadingVM.cs +++ b/ViewModel/Grading/GradingLoadingVM.cs @@ -157,6 +157,12 @@ public class GradingLoadingVM : BaseViewModel,IDisposable stringBuilder.Append(line); } Parameter = JsonConvert.DeserializeObject(stringBuilder.ToString()); + Parameter.DiamondCode = _diamondCode; + Parameter.Standard = getStandardName(); + Parameter.Shape = _diamnondType.Split(" ")[0]; + Parameter.CrownType = _diamnondType.Split(" ")[1]; + Parameter.PavType = _diamnondType.Split(" ")[2]; + Parameter.error_msg = _diamnondType; await CompleteProgressQuicklyAsync(); return 0; } diff --git a/Views/Configuration/SettingPages/CustomSettingPage.xaml b/Views/Configuration/SettingPages/CustomSettingPage.xaml index 7d0a214..7ca0de9 100644 --- a/Views/Configuration/SettingPages/CustomSettingPage.xaml +++ b/Views/Configuration/SettingPages/CustomSettingPage.xaml @@ -57,6 +57,8 @@ + + @@ -144,52 +146,16 @@ DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding RuleId, Mode=TwoWay}"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/Views/UserControl/Viewport3D.xaml b/Views/UserControl/Viewport3D.xaml index 7e5db06..0e2845f 100644 --- a/Views/UserControl/Viewport3D.xaml +++ b/Views/UserControl/Viewport3D.xaml @@ -52,7 +52,7 @@ - + diff --git a/Views/UserControl/Viewport3D.xaml.cs b/Views/UserControl/Viewport3D.xaml.cs index c443a21..45fa51b 100644 --- a/Views/UserControl/Viewport3D.xaml.cs +++ b/Views/UserControl/Viewport3D.xaml.cs @@ -78,6 +78,28 @@ public partial class Viewport3D // Viewport3Dx.ShowFrameDetails = !Viewport3Dx.ShowFrameDetails; // Viewport3Dx.ShowFrameRate = !Viewport3Dx.ShowFrameRate; // Viewport3Dx.ShowTriangleCountInfo = !Viewport3Dx.ShowTriangleCountInfo; + + //工厂模式屏蔽一些东西 + string step = ViewportManager.DiamondType.Split(" ").Last(); + if (Common.RunMode == 1 && step.StartsWith("S")) + { + //禁用部分右键菜单 + ViewportRightMenuShowModelFaceByType.IsChecked = false; //模型颜色按面分类 + ContextMenu.Items.Remove(ViewportRightMenuShowModelFaceByType); + ViewportRightMenuShowDefectFace.IsChecked = false; //瑕疵面 + ContextMenu.Items.Remove(ViewportRightMenuShowDefectFace); + ViewportRightMenuShowLighting.IsChecked = false; //关灯 + + if ("S1".Equals(step)) + { + //有效数据 + ViewportManager.DicValueParamToFacet.Clear(); + ViewportManager.DicValueParamToFacet.Add("CROWN_ANGLE", PlaneType.CrownIncomplete); + ViewportManager.DicValueParamToFacet.Add("CROWN_HEIGHT", PlaneType.CrownIncomplete); + } + + } + } diff --git a/Views/UserControl/ViewportData/Enum/PlaneType.cs b/Views/UserControl/ViewportData/Enum/PlaneType.cs index c548982..198d057 100644 --- a/Views/UserControl/ViewportData/Enum/PlaneType.cs +++ b/Views/UserControl/ViewportData/Enum/PlaneType.cs @@ -26,6 +26,8 @@ public enum PlaneType LowerGirdleFact = 22, [Description("底尖(或底小面)")] Culet = 23, + [Description("未完成的冠部")] + CrownIncomplete = 32, [Description("其他")] Other = 99 } \ No newline at end of file diff --git a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs index 8254d03..a1487da 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs @@ -1,5 +1,6 @@ using System.Collections.ObjectModel; using System.IO; +using System.Text; using System.Windows; using System.Windows.Media; using System.Windows.Media.Animation; @@ -21,6 +22,9 @@ using HelixToolkit.Wpf; using MeshBuilder = HelixToolkit.Wpf.SharpDX.MeshBuilder; using OrthographicCamera = HelixToolkit.Wpf.SharpDX.OrthographicCamera; using System.Windows.Input; +using SparkClient.Model.Extension; +using SparkClient.Model.Helper; +using MessageBox = SparkClient.Views.Dialog.MessageBox; namespace SparkClient.Views.UserControl.ViewportData.Helper; @@ -583,110 +587,181 @@ public class ViewportHelperPro /// public static List GenerateLineTextModels(List entities, string valKey = "") { - Logger.Info("【面文本生成】开始生成面相关文本信息"); - var selFacet = entities; - var selFacetType = entities.First().PlaneType; - var result = new List(); - if (selFacetType == PlaneType.Girdle && string.IsNullOrWhiteSpace(valKey)) + string steps = ViewportManager.DiamondType.Split(" ").Last(); + if (Common.RunMode == 0 && steps.StartsWith("S")) { - // Logger.Info($"【面文本生成】 命中面{selFacetType},是腰"); - // List facetTypeAll = - // ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); - // var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) - // .ToDictionary(group => group.Key, group => group.ToList()); - // Logger.Info($"【面文本生成】 腰由{groupedDic.Count}个面组成"); - // - // var selPlaneCode = entities.First().PlaneCode; - // Logger.Info($"【面文本生成】 当前选择{selPlaneCode}"); - // - // List facetPoints = new List(); - // entities.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); - // var facetIndex = -1; - // int.TryParse(selPlaneCode.Split("_")[1], out facetIndex); - // - // if (facetIndex == -1) - // { - // Logger.Info($"【面文本生成】 面索引解析失败{selPlaneCode}"); - // return result; - // } - // int linePointType = facetIndex % 4; - // Console.WriteLine(facetIndex); - // switch (linePointType) - // { - // case 0: - // case 2: - // var longestLine1 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? true : false); - // result.Add(DisplayLineModel3D(new List>() { longestLine1 }, new Color4(1f, 0, 0, 1f), 2f)); - // break; - // case 1: - // case 3: - // var longestLine2 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? false : true); - // result.Add(DisplayLineModel3D(new List>() { longestLine2 }, new Color4(1f, 0, 0, 1f), 2f)); - // break; - // } - // - // if (result.Exists(e => e == null)) - // { - // Logger.Info("目标线段为空"); - // return result; - // } + Logger.Info("【面文本生成】开始生成面相关文本信息"); + var selFacet = entities; + var selFacetType = entities.First().PlaneType; - //开始找值[选中线的值] - // string param = string.Empty; - // var valueIndex = 0; - // if (facetIndex % 8 == 0 || (facetIndex + 1) % 8 == 0) - // { - // //上腰面 - // Logger.Info($"【面文本生成】 腰面值 波峰【上腰面】"); - // valueIndex = (int)Math.Ceiling(facetIndex / 8.0) == 8 ? 0 : (int)Math.Ceiling(facetIndex / 8.0); - // param = "GIRDLE_BONE"; - // } else if (linePointType == 3 || linePointType == 0) - // { - // //风筝面 - // Logger.Info($"【面文本生成】 腰面值 波峰【风筝面】"); - // valueIndex = (facetIndex / 8); - // param = "GIRDLE_BEZEL"; - // } - // else - // { - // //腰厚比 - // Logger.Info($"【面文本生成】 腰面值 波峰【腰厚比】"); - // valueIndex = (facetIndex / 4); - // param = "GIRDLE_VALLEY"; - // } - // - // valueIndex += 1; - // var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; - // if (detail == null) - // { - // Logger.Info($"【面文本生成】 {param}_DETAIL Key不存在"); - // return result; - // } - // Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}"); - // var paramValue = detail[$"{param}_{valueIndex}"]; - // if (paramValue == null) - // { - // Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} Key不存在"); - // return result; - // } - // Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} ==={paramValue}"); - // var valueFloat = (Math.Floor(float.Parse(paramValue.ToString()) * 1000) / 10).ToString(); - // Logger.Info($"【面文本生成】 {valueFloat} -- {valueIndex}"); - // var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); - // result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); - List facetTypeAll = - ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); - var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) - .ToDictionary(group => group.Key, group => group.ToList()); - List girdleKey = new List { "GIRDLE_BEZEL", "GIRDLE_BONE", "GIRDLE_VALLEY" }; - var girdleResultDic = new Dictionary>>(); - foreach (var key in girdleKey) + + if (selFacetType == PlaneType.Girdle && string.IsNullOrWhiteSpace(valKey)) + { + // Logger.Info($"【面文本生成】 命中面{selFacetType},是腰"); + // List facetTypeAll = + // ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); + // var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) + // .ToDictionary(group => group.Key, group => group.ToList()); + // Logger.Info($"【面文本生成】 腰由{groupedDic.Count}个面组成"); + // + // var selPlaneCode = entities.First().PlaneCode; + // Logger.Info($"【面文本生成】 当前选择{selPlaneCode}"); + // + // List facetPoints = new List(); + // entities.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); + // var facetIndex = -1; + // int.TryParse(selPlaneCode.Split("_")[1], out facetIndex); + // + // if (facetIndex == -1) + // { + // Logger.Info($"【面文本生成】 面索引解析失败{selPlaneCode}"); + // return result; + // } + // int linePointType = facetIndex % 4; + // Console.WriteLine(facetIndex); + // switch (linePointType) + // { + // case 0: + // case 2: + // var longestLine1 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? true : false); + // result.Add(DisplayLineModel3D(new List>() { longestLine1 }, new Color4(1f, 0, 0, 1f), 2f)); + // break; + // case 1: + // case 3: + // var longestLine2 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? false : true); + // result.Add(DisplayLineModel3D(new List>() { longestLine2 }, new Color4(1f, 0, 0, 1f), 2f)); + // break; + // } + // + // if (result.Exists(e => e == null)) + // { + // Logger.Info("目标线段为空"); + // return result; + // } + + //开始找值[选中线的值] + // string param = string.Empty; + // var valueIndex = 0; + // if (facetIndex % 8 == 0 || (facetIndex + 1) % 8 == 0) + // { + // //上腰面 + // Logger.Info($"【面文本生成】 腰面值 波峰【上腰面】"); + // valueIndex = (int)Math.Ceiling(facetIndex / 8.0) == 8 ? 0 : (int)Math.Ceiling(facetIndex / 8.0); + // param = "GIRDLE_BONE"; + // } else if (linePointType == 3 || linePointType == 0) + // { + // //风筝面 + // Logger.Info($"【面文本生成】 腰面值 波峰【风筝面】"); + // valueIndex = (facetIndex / 8); + // param = "GIRDLE_BEZEL"; + // } + // else + // { + // //腰厚比 + // Logger.Info($"【面文本生成】 腰面值 波峰【腰厚比】"); + // valueIndex = (facetIndex / 4); + // param = "GIRDLE_VALLEY"; + // } + // + // valueIndex += 1; + // var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; + // if (detail == null) + // { + // Logger.Info($"【面文本生成】 {param}_DETAIL Key不存在"); + // return result; + // } + // Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}"); + // var paramValue = detail[$"{param}_{valueIndex}"]; + // if (paramValue == null) + // { + // Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} Key不存在"); + // return result; + // } + // Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} ==={paramValue}"); + // var valueFloat = (Math.Floor(float.Parse(paramValue.ToString()) * 1000) / 10).ToString(); + // Logger.Info($"【面文本生成】 {valueFloat} -- {valueIndex}"); + // var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); + // result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); + List facetTypeAll = + ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); + var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) + .ToDictionary(group => group.Key, group => group.ToList()); + List girdleKey = new List { "GIRDLE_BEZEL", "GIRDLE_BONE", "GIRDLE_VALLEY" }; + var girdleResultDic = new Dictionary>>(); + foreach (var key in girdleKey) + { + var resultDic = new Dictionary>(); + for (int i = 0; i < groupedDic.Count; i++) + { + switch (key) + { + case "GIRDLE_BEZEL": if (i % 8 == 4) resultDic.Add($"0_{i}", groupedDic[$"0_{i}"]); + break; + case "GIRDLE_BONE": if (i % 8 == 0) resultDic.Add($"0_{i}", groupedDic[$"0_{i}"]); + break; + case "GIRDLE_VALLEY": if (i % 4 == 2) resultDic.Add($"0_{i}", groupedDic[$"0_{i}"]); + break; + } + } + girdleResultDic.Add(key, resultDic); + } + + foreach (var gridleResult in girdleResultDic) + { + foreach (var dic in gridleResult.Value) + { + //高亮四边形左边的线,并绑定值 + List facetPoints = new List(); + dic.Value.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); + //高亮的线 + var facetIndex = int.Parse(dic.Key.Split("_")[1]) - 1; + if ("GIRDLE_VALLEY".Equals(gridleResult.Key)) + { + var showLine =GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? true : false);; + if (showLine == null) continue; + result.Add(DisplayLineModel3D(new List>() { showLine }, new Color4(1f, 0, 0, 1f), 2f)); + } + //文字显示位置 + var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); + var resIndex = gridleResult.Value.Keys.ToList().IndexOf(dic.Key); + if (resIndex == -1) continue; + resIndex += 1; + var detail = ViewportManager.DiamondData[$"{gridleResult.Key}_DETAIL"]; + if (detail == null) + { + Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL Key不存在"); + return result; + } + Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL == {detail}"); + var paramValue = detail[$"{gridleResult.Key}_{resIndex}"]; + if (paramValue == null) + { + Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL.{gridleResult.Key}_{resIndex} Key不存在"); + return result; + } + + var valueFloat = ValueFormat(paramValue.ToString(), gridleResult.Key, false); + result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); + } + } + + } else if (selFacetType == PlaneType.Girdle && !string.IsNullOrWhiteSpace(valKey)) { + Logger.Info($"【面文本生成】 命中面{selFacetType},是腰,显示值{valKey}"); + /*** + * GIRDLE_BEZEL 风筝 + * GIRDLE_BONE 上腰 + * GIRDLE_VALLEY 波谷 + */ + List facetTypeAll = + ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); + var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) + .ToDictionary(group => group.Key, group => group.ToList()); var resultDic = new Dictionary>(); for (int i = 0; i < groupedDic.Count; i++) { - switch (key) + switch (valKey) { case "GIRDLE_BEZEL": if (i % 8 == 4) resultDic.Add($"0_{i}", groupedDic[$"0_{i}"]); break; @@ -696,335 +771,345 @@ public class ViewportHelperPro break; } } - girdleResultDic.Add(key, resultDic); - } - foreach (var gridleResult in girdleResultDic) - { - foreach (var dic in gridleResult.Value) + if (resultDic.Count == 0) + { + Logger.Info($"【面文本生成】 关联面获取失败"); + } + + foreach (var dic in resultDic) { //高亮四边形左边的线,并绑定值 List facetPoints = new List(); dic.Value.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); //高亮的线 + // var showLine = GetLeftParallelLineSegment(facetPoints); var facetIndex = int.Parse(dic.Key.Split("_")[1]) - 1; - if ("GIRDLE_VALLEY".Equals(gridleResult.Key)) - { - var showLine =GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? true : false);; - if (showLine == null) continue; - result.Add(DisplayLineModel3D(new List>() { showLine }, new Color4(1f, 0, 0, 1f), 2f)); - } + var showLine =GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? true : false);; + if (showLine == null) continue; + //文字显示位置 var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); - var resIndex = gridleResult.Value.Keys.ToList().IndexOf(dic.Key); + var resIndex = resultDic.Keys.ToList().IndexOf(dic.Key); if (resIndex == -1) continue; resIndex += 1; - var detail = ViewportManager.DiamondData[$"{gridleResult.Key}_DETAIL"]; + var detail = ViewportManager.DiamondData[$"{valKey}_DETAIL"]; if (detail == null) { - Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL Key不存在"); + Logger.Info($"【面文本生成】 {valKey}_DETAIL Key不存在"); return result; } - Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL == {detail}"); - var paramValue = detail[$"{gridleResult.Key}_{resIndex}"]; + Logger.Info($"【面文本生成】 {valKey}_DETAIL == {detail}"); + var paramValue = detail[$"{valKey}_{resIndex}"]; if (paramValue == null) { - Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL.{gridleResult.Key}_{resIndex} Key不存在"); + Logger.Info($"【面文本生成】 {valKey}_DETAIL.{valKey}_{resIndex} Key不存在"); return result; } - - var valueFloat = ValueFormat(paramValue.ToString(), gridleResult.Key, false); - result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); + result.Add(DisplayLineModel3D(new List>() { showLine }, new Color4(1f, 0, 0, 1f), 2f)); + var valueFloat = ValueFormat(paramValue.ToString(), valKey, true); + result.Add(DisplayText3D($"{valueFloat} \r\n {resIndex}", facetTextPoint)); } - } - } else if (selFacetType == PlaneType.Girdle && !string.IsNullOrWhiteSpace(valKey)) - { - Logger.Info($"【面文本生成】 命中面{selFacetType},是腰,显示值{valKey}"); - /*** - * GIRDLE_BEZEL 风筝 - * GIRDLE_BONE 上腰 - * GIRDLE_VALLEY 波谷 - */ - List facetTypeAll = - ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); - var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) - .ToDictionary(group => group.Key, group => group.ToList()); - var resultDic = new Dictionary>(); - for (int i = 0; i < groupedDic.Count; i++) - { - switch (valKey) - { - case "GIRDLE_BEZEL": if (i % 8 == 4) resultDic.Add($"0_{i}", groupedDic[$"0_{i}"]); - break; - case "GIRDLE_BONE": if (i % 8 == 0) resultDic.Add($"0_{i}", groupedDic[$"0_{i}"]); - break; - case "GIRDLE_VALLEY": if (i % 4 == 2) resultDic.Add($"0_{i}", groupedDic[$"0_{i}"]); - break; - } } - - if (resultDic.Count == 0) - { - Logger.Info($"【面文本生成】 关联面获取失败"); - } - - foreach (var dic in resultDic) - { - //高亮四边形左边的线,并绑定值 - List facetPoints = new List(); - dic.Value.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); - //高亮的线 - // var showLine = GetLeftParallelLineSegment(facetPoints); - var facetIndex = int.Parse(dic.Key.Split("_")[1]) - 1; - var showLine =GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? true : false);; - if (showLine == null) continue; - - //文字显示位置 - var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); - var resIndex = resultDic.Keys.ToList().IndexOf(dic.Key); - if (resIndex == -1) continue; - resIndex += 1; - var detail = ViewportManager.DiamondData[$"{valKey}_DETAIL"]; - if (detail == null) - { - Logger.Info($"【面文本生成】 {valKey}_DETAIL Key不存在"); - return result; - } - Logger.Info($"【面文本生成】 {valKey}_DETAIL == {detail}"); - var paramValue = detail[$"{valKey}_{resIndex}"]; - if (paramValue == null) - { - Logger.Info($"【面文本生成】 {valKey}_DETAIL.{valKey}_{resIndex} Key不存在"); - return result; - } - result.Add(DisplayLineModel3D(new List>() { showLine }, new Color4(1f, 0, 0, 1f), 2f)); - var valueFloat = ValueFormat(paramValue.ToString(), valKey, true); - result.Add(DisplayText3D($"{valueFloat} \r\n {resIndex}", facetTextPoint)); - } - - } - else - { - Logger.Info($"【面文本生成】 命中面{selFacetType},不是腰"); - //查找同类面 - List facetTypeAll = - ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); - var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) - .ToDictionary(group => group.Key, group => group.ToList()); - Logger.Info($"【面文本生成】 同类面{groupedDic.Count}个"); - var valueIndex = 1; - //台面显示 - if (selFacetType == PlaneType.TableFacet) - { - List tablePointList = new List(); - foreach (var entity in groupedDic["11_0"]) - { - tablePointList.Add(entity.Point1); - tablePointList.Add(entity.Point2); - tablePointList.Add(entity.Point3); - } - HashSet tablePointSet = new HashSet(tablePointList); - tablePointList = VectorClockwiseSort(tablePointSet.ToList()); - - List> line = new List>(); - for (int i = 0; i < tablePointList.Count / 2; i++) - { - line.Add(new Tuple(tablePointList[i], tablePointList[i+tablePointList.Count / 2])); - } - string param = "TABLE"; - var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; - for (int i = 0; i < line.Count; i++) - { - Vector3 point = line[i].Item2; - var valueFloat = ValueFormat(detail[$"{param}_{i+1}"].ToString(), param, true); - result.Add(DisplayText3D($"{valueFloat}", new Vector3(point.X, point.Y - 0.4f, point.Z))); - } - result.Add( DisplayLineModel3D(line, new Color4(1f, 0, 0, 1f), 0.7f)); - - } - - foreach (var kv in groupedDic) + else { - var value = kv.Value; - var key = kv.Key; - var facetIndex = -1; - int.TryParse(key.Split("_")[1], out facetIndex); - List facetPoints = new List(); - value.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); - var param = string.IsNullOrWhiteSpace(valKey) ? ViewportManager.DicFacetToValueParam.ContainsKey(selFacetType) ? ViewportManager.DicFacetToValueParam[selFacetType] : null : valKey; - if (param == null) + Logger.Info($"【面文本生成】 命中面{selFacetType},不是腰"); + //查找同类面 + List facetTypeAll = + ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); + var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) + .ToDictionary(group => group.Key, group => group.ToList()); + Logger.Info($"【面文本生成】 同类面{groupedDic.Count}个"); + var valueIndex = 1; + //台面显示 + if (selFacetType == PlaneType.TableFacet) { - continue; - } - - if (groupedDic.Count == 1) - { - var paramValue = ViewportManager.DiamondData[$"{param}"]; - if (paramValue == null) + List tablePointList = new List(); + foreach (var entity in groupedDic["11_0"]) { - Logger.Info($"【面文本生成】 {param} Key不存在"); - continue; + tablePointList.Add(entity.Point1); + tablePointList.Add(entity.Point2); + tablePointList.Add(entity.Point3); } - var valueFloat = ValueFormat(paramValue.ToString(), param, true); - Logger.Info($"【面文本生成】 {valueFloat} -- {facetIndex}"); - var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); - result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); + HashSet tablePointSet = new HashSet(tablePointList); + tablePointList = VectorClockwiseSort(tablePointSet.ToList()); - } else if (groupedDic.Count == 16) - { - facetIndex += 1; - valueIndex = facetIndex == 16 ? 1 : facetIndex % 2 == 0 ? valueIndex + 1 : valueIndex; - var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; - if (detail == null) + List> line = new List>(); + for (int i = 0; i < tablePointList.Count / 2; i++) { - Logger.Info($"【面文本生成】 {param}_DETAIL Key不存在"); - continue; + line.Add(new Tuple(tablePointList[i], tablePointList[i+tablePointList.Count / 2])); } - Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}"); - var paramValue = detail[$"{param}_{valueIndex}"]; - if (paramValue == null) + string param = "TABLE"; + var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; + for (int i = 0; i < line.Count; i++) { - Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} Key不存在"); - continue; + Vector3 point = line[i].Item2; + var valueFloat = ValueFormat(detail[$"{param}_{i+1}"].ToString(), param, true); + result.Add(DisplayText3D($"{valueFloat}", new Vector3(point.X, point.Y - 0.4f, point.Z))); } - Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} ==={paramValue}"); - - var valueFloat = ValueFormat(paramValue.ToString(), param, true); - Logger.Info($"【面文本生成】 {valueFloat} -- {valueIndex}"); - var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); - if(PlaneType.LowerGirdleFact == selFacetType) - result.Add(DisplayText3D($"\r\n\r\n{valueFloat} \r\n {facetIndex}", new Vector3(facetTextPoint.X, facetTextPoint.Y, facetTextPoint.Z))); - else - result.Add(DisplayText3D($"{valueFloat} \r\n {facetIndex}", new Vector3(facetTextPoint.X, facetTextPoint.Y + 0.1f, facetTextPoint.Z))); + result.Add( DisplayLineModel3D(line, new Color4(1f, 0, 0, 1f), 0.7f)); + + } - } else if (ViewportManager.DiamondData.Count > 1 && facetIndex != -1) + foreach (var kv in groupedDic) { - facetIndex += 1; - - var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; - if (detail == null) + var value = kv.Value; + var key = kv.Key; + var facetIndex = -1; + int.TryParse(key.Split("_")[1], out facetIndex); + List facetPoints = new List(); + value.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); + var param = string.IsNullOrWhiteSpace(valKey) ? ViewportManager.DicFacetToValueParam.ContainsKey(selFacetType) ? ViewportManager.DicFacetToValueParam[selFacetType] : null : valKey; + if (param == null) { - Logger.Info($"【面文本生成】 {param}_DETAIL Key不存在"); continue; } - Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}"); - var paramValue = detail[$"{param}_{facetIndex}"]; - if (paramValue == null) + + if (groupedDic.Count == 1) { - Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{facetIndex} Key不存在"); - continue; - } - Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{facetIndex} ==={paramValue}"); + var paramValue = ViewportManager.DiamondData[$"{param}"]; + if (paramValue == null) + { + Logger.Info($"【面文本生成】 {param} Key不存在"); + continue; + } + var valueFloat = ValueFormat(paramValue.ToString(), param, true); + Logger.Info($"【面文本生成】 {valueFloat} -- {facetIndex}"); + var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); + result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); + + } else if (groupedDic.Count == 16) + { + facetIndex += 1; + valueIndex = facetIndex == 16 ? 1 : facetIndex % 2 == 0 ? valueIndex + 1 : valueIndex; + var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; + if (detail == null) + { + Logger.Info($"【面文本生成】 {param}_DETAIL Key不存在"); + continue; + } + Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}"); + var paramValue = detail[$"{param}_{valueIndex}"]; + if (paramValue == null) + { + Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} Key不存在"); + continue; + } + Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} ==={paramValue}"); + + var valueFloat = ValueFormat(paramValue.ToString(), param, true); + Logger.Info($"【面文本生成】 {valueFloat} -- {valueIndex}"); + var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); + if(PlaneType.LowerGirdleFact == selFacetType) + result.Add(DisplayText3D($"\r\n\r\n{valueFloat} \r\n {facetIndex}", new Vector3(facetTextPoint.X, facetTextPoint.Y, facetTextPoint.Z))); + else + result.Add(DisplayText3D($"{valueFloat} \r\n {facetIndex}", new Vector3(facetTextPoint.X, facetTextPoint.Y + 0.1f, facetTextPoint.Z))); + + } else if (ViewportManager.DiamondData.Count > 1 && facetIndex != -1) + { + facetIndex += 1; - var valueFloat = ValueFormat(paramValue.ToString(), param, true); - Logger.Info($"【面文本生成】 {valueFloat} -- {facetIndex}"); - var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); - result.Add(DisplayText3D($"{valueFloat} \r\n {facetIndex}", facetTextPoint)); + var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; + if (detail == null) + { + Logger.Info($"【面文本生成】 {param}_DETAIL Key不存在"); + continue; + } + Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}"); + var paramValue = detail[$"{param}_{facetIndex}"]; + if (paramValue == null) + { + Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{facetIndex} Key不存在"); + continue; + } + Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{facetIndex} ==={paramValue}"); + + var valueFloat = ValueFormat(paramValue.ToString(), param, true); + Logger.Info($"【面文本生成】 {valueFloat} -- {facetIndex}"); + var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); + result.Add(DisplayText3D($"{valueFloat} \r\n {facetIndex}", facetTextPoint)); + } } - } - if (string.IsNullOrWhiteSpace(valKey)) - { - if (PlaneType.StarFacet == selFacetType || PlaneType.UpperGirdleFacet == selFacetType) + if (string.IsNullOrWhiteSpace(valKey)) { - //星刻面: 在底面的点显示 星刻面长度比 - //上腰面: 在顶面的点显示 对应星刻面的 1-星刻面长度比 - string valParam = "STAR"; - List allStartEntity = - ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.StarFacet); - var allStartEntityGroupByFacet = allStartEntity.GroupBy(entity => entity.PlaneCode) - .ToDictionary(group => group.Key, group => group.ToList()); - List allUpperGridleEntity = - ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.UpperGirdleFacet); - var allUpperGridleEntityGroupByFacet = allUpperGridleEntity.GroupBy(entity => entity.PlaneCode) - .ToDictionary(group => group.Key, group => group.ToList()); - List points = new List(); - for (int i = 0; i < allStartEntityGroupByFacet.Count; i++) + if (PlaneType.StarFacet == selFacetType || PlaneType.UpperGirdleFacet == selFacetType) { - List pointsTemp = new List(); - - allStartEntityGroupByFacet[$"13_{i}"].ForEach(e => + //星刻面: 在底面的点显示 星刻面长度比 + //上腰面: 在顶面的点显示 对应星刻面的 1-星刻面长度比 + string valParam = "STAR"; + List allStartEntity = + ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.StarFacet); + var allStartEntityGroupByFacet = allStartEntity.GroupBy(entity => entity.PlaneCode) + .ToDictionary(group => group.Key, group => group.ToList()); + List allUpperGridleEntity = + ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.UpperGirdleFacet); + var allUpperGridleEntityGroupByFacet = allUpperGridleEntity.GroupBy(entity => entity.PlaneCode) + .ToDictionary(group => group.Key, group => group.ToList()); + List points = new List(); + for (int i = 0; i < allStartEntityGroupByFacet.Count; i++) { - pointsTemp.Add(e.Point1); - pointsTemp.Add(e.Point2); - pointsTemp.Add(e.Point3); - }); - int upperGridleIndex = ((i + 1) * 2) >= 16 ? 1 : ((i + 1) * 2); - // allUpperGridleEntityGroupByFacet[$"14_{upperGridleIndex}"].ForEach(e => - // { - // pointsTemp.Add(e.Point1); - // pointsTemp.Add(e.Point2); - // pointsTemp.Add(e.Point3); - // }); - allUpperGridleEntityGroupByFacet[$"14_{upperGridleIndex-1}"].ForEach(e => + List pointsTemp = new List(); + + allStartEntityGroupByFacet[$"13_{i}"].ForEach(e => + { + pointsTemp.Add(e.Point1); + pointsTemp.Add(e.Point2); + pointsTemp.Add(e.Point3); + }); + int upperGridleIndex = ((i + 1) * 2) >= 16 ? 1 : ((i + 1) * 2); + // allUpperGridleEntityGroupByFacet[$"14_{upperGridleIndex}"].ForEach(e => + // { + // pointsTemp.Add(e.Point1); + // pointsTemp.Add(e.Point2); + // pointsTemp.Add(e.Point3); + // }); + allUpperGridleEntityGroupByFacet[$"14_{upperGridleIndex-1}"].ForEach(e => + { + pointsTemp.Add(e.Point1); + pointsTemp.Add(e.Point2); + pointsTemp.Add(e.Point3); + }); + Vector3? mostFrequent = pointsTemp + .GroupBy(v => v) + .Select(group => new { Vector = group.Key, Count = group.Count() }) + .OrderByDescending(x => x.Count) + .FirstOrDefault()?.Vector; + if(mostFrequent.HasValue) + points.Add(mostFrequent.Value); + } + var detail = ViewportManager.DiamondData[$"{valParam}_DETAIL"]; + for (int i = 0; i < 8; i++) { - pointsTemp.Add(e.Point1); - pointsTemp.Add(e.Point2); - pointsTemp.Add(e.Point3); - }); - Vector3? mostFrequent = pointsTemp - .GroupBy(v => v) - .Select(group => new { Vector = group.Key, Count = group.Count() }) - .OrderByDescending(x => x.Count) - .FirstOrDefault()?.Vector; - if(mostFrequent.HasValue) - points.Add(mostFrequent.Value); - } - var detail = ViewportManager.DiamondData[$"{valParam}_DETAIL"]; - for (int i = 0; i < 8; i++) + var valIndex = i + 1; + var paramValue = detail[$"{valParam}_{valIndex}"]; + var valueFloat = ValueFormat(paramValue.ToString(), valParam); + var finalValue = PlaneType.StarFacet == selFacetType + ? valueFloat + : (100 - (double.Parse(valueFloat))).ToString(); + result.Add(DisplayText3D($"{finalValue}%", new Vector3(points[i].X,points[i].Y-0.2f,points[i].Z))); + } + + }else if (PlaneType.LowerGirdleFact == selFacetType) { - var valIndex = i + 1; - var paramValue = detail[$"{valParam}_{valIndex}"]; - var valueFloat = ValueFormat(paramValue.ToString(), valParam); - var finalValue = PlaneType.StarFacet == selFacetType - ? valueFloat - : (100 - (double.Parse(valueFloat))).ToString(); - result.Add(DisplayText3D($"{finalValue}%", new Vector3(points[i].X,points[i].Y-0.2f,points[i].Z))); + //下腰面: 在底面的点显示 下腰比 + string valParam = "LOWER_HALVES_RATIO"; + + List allLowerGirdleEntity = + ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.LowerGirdleFact); + var allLowerGirdleGroupByFacet = allLowerGirdleEntity.GroupBy(entity => entity.PlaneCode) + .ToDictionary(group => group.Key, group => group.ToList()); + + var detail = ViewportManager.DiamondData[$"{valParam}_DETAIL"]; + for (int i = 0; i < 8; i++) + { + var valIndex = i + 1; + //获取点 + List pointsTemp = new List(); + allLowerGirdleGroupByFacet[$"22_{i*2}"].ForEach(e => + { + pointsTemp.Add(e.Point1); + pointsTemp.Add(e.Point2); + pointsTemp.Add(e.Point3); + }); + float? maxY = pointsTemp.Any() ? pointsTemp.Max(v => v.Y) : (float?)null; + Vector3? points = pointsTemp + .Where(v => maxY.HasValue && v.Y == maxY.Value) + .GroupBy(v => v) + .Select(g => new { Point = g.Key, Count = g.Count() }) + .OrderByDescending(x => x.Count) + .ThenByDescending(x => x.Point.Y) + .FirstOrDefault()?.Point; + if(!points.HasValue)continue; + Vector3 point = points.Value; + //取值 + var paramValue = detail[$"{valParam}_{valIndex}"]; + var valueFloat = ValueFormat(paramValue.ToString(), valParam); + result.Add(DisplayText3D($"{valueFloat}%", new Vector3(point.X,point.Y+0.2f,point.Z))); + } } - - }else if (PlaneType.LowerGirdleFact == selFacetType) + } + } + }else if (Common.RunMode == 1) + { + // + var selFacetType = entities.First().PlaneType; + + string step = ViewportManager.DiamondType.Split(" ").Last(); + if ("S1".Equals(step)) + { + try { - //下腰面: 在底面的点显示 下腰比 - string valParam = "LOWER_HALVES_RATIO"; - - List allLowerGirdleEntity = - ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.LowerGirdleFact); - var allLowerGirdleGroupByFacet = allLowerGirdleEntity.GroupBy(entity => entity.PlaneCode) + //有效数据 + List facetTypeAll = + ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); + var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) .ToDictionary(group => group.Key, group => group.ToList()); + Logger.Info($"【面文本生成】 [工厂模式]同类面{groupedDic.Count}个"); - var detail = ViewportManager.DiamondData[$"{valParam}_DETAIL"]; - for (int i = 0; i < 8; i++) + foreach (var kv in groupedDic) { - var valIndex = i + 1; - //获取点 - List pointsTemp = new List(); - allLowerGirdleGroupByFacet[$"22_{i*2}"].ForEach(e => + var value = kv.Value; + var key = kv.Key; + var facetIndex = -1; + int.TryParse(key.Split("_")[1], out facetIndex); + List facetPoints = new List(); + value.ForEach(e => { - pointsTemp.Add(e.Point1); - pointsTemp.Add(e.Point2); - pointsTemp.Add(e.Point3); + facetPoints.Add(e.Point1); + facetPoints.Add(e.Point2); + facetPoints.Add(e.Point3); }); - float? maxY = pointsTemp.Any() ? pointsTemp.Max(v => v.Y) : (float?)null; - Vector3? points = pointsTemp - .Where(v => maxY.HasValue && v.Y == maxY.Value) - .GroupBy(v => v) - .Select(g => new { Point = g.Key, Count = g.Count() }) - .OrderByDescending(x => x.Count) - .ThenByDescending(x => x.Point.Y) - .FirstOrDefault()?.Point; - if(!points.HasValue)continue; - Vector3 point = points.Value; - //取值 - var paramValue = detail[$"{valParam}_{valIndex}"]; - var valueFloat = ValueFormat(paramValue.ToString(), valParam); - result.Add(DisplayText3D($"{valueFloat}%", new Vector3(point.X,point.Y+0.2f,point.Z))); + var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); + facetIndex += 1; + if (valKey.IsNullOrEmpty()) + { + //显示两个值 + var param = new List { "CROWN_ANGLE", "CROWN_HEIGHT" }; + + StringBuilder sbShowText = new StringBuilder(); + foreach (var p in param) + { + var detail = ViewportManager.DiamondData[$"{p}_DETAIL"]; + var paramValue = detail[$"{p}_{facetIndex}"]; + var valueFloat = ValueFormat(paramValue.ToString(), p, true); + sbShowText.Append(valueFloat); + sbShowText.Append("\r\n"); + } + + sbShowText.Append($" {facetIndex}"); + result.Add(DisplayText3D(sbShowText.ToString(), + new Vector3(facetTextPoint.X, facetTextPoint.Y - 0.4f, facetTextPoint.Z))); + } + else + { + //显示一个值 + StringBuilder sbShowText = new StringBuilder(); + var detail = ViewportManager.DiamondData[$"{valKey}_DETAIL"]; + var paramValue = detail[$"{valKey}_{facetIndex}"]; + var valueFloat = ValueFormat(paramValue.ToString(), valKey, true); + sbShowText.Append(valueFloat); + sbShowText.Append("\r\n"); + sbShowText.Append($" {facetIndex}"); + result.Add(DisplayText3D(sbShowText.ToString(), + new Vector3(facetTextPoint.X, facetTextPoint.Y - 0.2f, facetTextPoint.Z))); + } } } + catch (Exception ex) + { + new MessageBox().Show($"面取值错误:{ex.Message}"); + return result; + } } + + } + + return result; } diff --git a/Views/UserControl/ViewportData/Helper/ViewportManager.cs b/Views/UserControl/ViewportData/Helper/ViewportManager.cs index ea12854..61ad571 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportManager.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportManager.cs @@ -23,6 +23,10 @@ public class ViewportManager public static List ViewportTriangle = new List(); public static JsonObject DiamondData = new JsonObject(); + + public static string DiamondCode = string.Empty; + //钻石类型 + public static string DiamondType = string.Empty; /// /// 模型正方向(从模型中心出发的方向) /// diff --git a/Views/UserControl/ViewportData/ViewportData.cs b/Views/UserControl/ViewportData/ViewportData.cs index 59cb4db..8b8480c 100644 --- a/Views/UserControl/ViewportData/ViewportData.cs +++ b/Views/UserControl/ViewportData/ViewportData.cs @@ -1,5 +1,7 @@ using System.Text.Json.Nodes; using SharpDX; +using SparkClient.Model.Extension; +using SparkClient.Model.Helper; using SparkClient.Views.UserControl.ViewportData.Entity; using SparkClient.Views.UserControl.ViewportData.Enum; using SparkClient.Views.UserControl.ViewportData.Helper; @@ -92,7 +94,9 @@ public class ViewportData ViewportManager.PositiveDirection.Y = 0f; ViewportManager.PositiveDirection.Z = 0; } - + + ViewportManager.DiamondCode = DiamondCode; + ViewportManager.DiamondType = json.AsObject()["error_msg"].ToSafeString(); var measurements = json.AsObject()["measurements"]; ViewportManager.DiamondData = measurements==null?new JsonObject():measurements.AsObject(); var midZ = facets.SelectMany(e => new[] { e.Point1.X, e.Point2.X, e.Point3.X }).OrderBy(z => Math.Abs(z))