From cd4f5b955fc5cdce99baff7d00aa7cc105e2624f Mon Sep 17 00:00:00 2001 From: Tongg Date: Fri, 7 Mar 2025 14:44:32 +0800 Subject: [PATCH] fix 1.2 1.3 3 --- Language/zh_CN.xaml | 1 + .../Entity/ApiEntity/AlgorithmResultEntity.cs | 2 + Model/Services/SOCClientService.cs | 83 ++++++++++-- ViewModel/BaseWindow/BaseControlVM.cs | 40 +++--- ViewModel/Grading/DiamondSelectVM.cs | 1 + ViewModel/Grading/GradingLoadingVM.cs | 7 + Views/UserControl/Viewport3D.xaml | 3 + Views/UserControl/Viewport3D.xaml.cs | 25 ++-- .../Entity/Viewport3DTriangleEntity.cs | 4 +- .../ViewportData/Helper/CommonHelper.cs | 5 +- .../ViewportData/Helper/ViewportHelperPro.cs | 122 ++++++------------ .../ViewportData/Helper/ViewportManager.cs | 22 +++- 12 files changed, 195 insertions(+), 120 deletions(-) diff --git a/Language/zh_CN.xaml b/Language/zh_CN.xaml index 4c77196..54fb6a7 100644 --- a/Language/zh_CN.xaml +++ b/Language/zh_CN.xaml @@ -155,6 +155,7 @@ 保存失败 选择路径 重置网格线 + 切工仪旋转至此面 星辉钻石检测系统 diff --git a/Model/Entity/ApiEntity/AlgorithmResultEntity.cs b/Model/Entity/ApiEntity/AlgorithmResultEntity.cs index 52c605f..6de152b 100644 --- a/Model/Entity/ApiEntity/AlgorithmResultEntity.cs +++ b/Model/Entity/ApiEntity/AlgorithmResultEntity.cs @@ -39,6 +39,8 @@ namespace SparkClient.Model.Entity.ApiEntity /// 面的类型。 /// public int facet_type { get; set; } + + public double theta { get; set; } } /// diff --git a/Model/Services/SOCClientService.cs b/Model/Services/SOCClientService.cs index 3d0de64..1f1f165 100644 --- a/Model/Services/SOCClientService.cs +++ b/Model/Services/SOCClientService.cs @@ -21,7 +21,7 @@ namespace SparkClient.Model.Services public class SOCClientService { // Log地址 - private const string LogFilePath = @"..\..\..\Resource\Document\log.txt"; + private static readonly ILog Logger = LogManager.GetLogger(typeof(SOCClientService)); @@ -35,6 +35,8 @@ namespace SparkClient.Model.Services /// private readonly string _authToken; + + private bool GenImage; /// /// 构造函数,初始化基础URL和认证令牌。 /// @@ -66,6 +68,7 @@ namespace SparkClient.Model.Services { try { + GenImage = true; // 光照度和半圆 int lightLevel = 0; string halfCircle = string.Empty; @@ -77,6 +80,7 @@ namespace SparkClient.Model.Services { throw new Exception("No data found for the specified keys."); } + foreach (DataRow row in table.Rows) { string key = row["Key"].ToString() ?? string.Empty; @@ -91,14 +95,14 @@ namespace SparkClient.Model.Services halfCircle = value; // 半圆 } } - + string url = $"{_baseUrl}/collect_images?light_level={lightLevel}&half_circle={halfCircle}"; - + var response = await SendGetRequestAsync(url); if (!response.IsSuccessStatusCode) { - return new SocResultEntity { Status = StatusCodes.DeviceNotFound, Images = new List()}; + return new SocResultEntity { Status = StatusCodes.DeviceNotFound, Images = new List() }; } var jsonResponse = await response.Content.ReadAsStringAsync(); @@ -106,10 +110,12 @@ namespace SparkClient.Model.Services if (result == null) { - return new SocResultEntity { Status = StatusCodes.DeviceNotFound, Images = new List()}; + return new SocResultEntity { Status = StatusCodes.DeviceNotFound, Images = new List() }; } - return new SocResultEntity { Status = result.Status, Images = new List() , DeviceId = result.device_id}; - + + return new SocResultEntity + { Status = result.Status, Images = new List(), DeviceId = result.device_id }; + } catch (Exception ex) { @@ -118,7 +124,12 @@ namespace SparkClient.Model.Services Logger.Warn($"Error in DoSoc: {ex.Message}"); // 或者使用日志框架记录日志 // logger.LogError(ex, "Error in DoSoc method."); - return new SocResultEntity { Status = StatusCodes.DeviceNotFound, Images = new List() , DeviceId = ""}; + return new SocResultEntity + { Status = StatusCodes.DeviceNotFound, Images = new List(), DeviceId = "" }; + } + finally + { + GenImage = false; } } @@ -298,6 +309,62 @@ namespace SparkClient.Model.Services } } + public async Task CutRevolve(double angle) + { + int param = (int)angle * 100; + string url = $"{_baseUrl}/rotate_to?angle={param}"; + if(GenImage) return StatusCodes.DeviceNotFound; + GenImage = true; + try + { + var response = await SendGetRequestAsync(url); + + if (response.IsSuccessStatusCode) + { + var jsonResponse = await response.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject(jsonResponse); + return result.Status; + } + + return StatusCodes.DeviceNotFound; + } + catch (Exception e) + { + string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 发生异常: {e.Message}{Environment.NewLine}"; + Logger.Error(logMessage); + return StatusCodes.DeviceNotFound; + } + finally + { + GenImage = false; + } + } + + public async Task OpenPump(bool isOpen = true) + { + if(GenImage) return StatusCodes.DeviceNotFound; + int param = isOpen? 1 : 0 ; + string url = $"{_baseUrl}/set_pump?on={param}"; + try + { + var response = await SendGetRequestAsync(url); + + if (response.IsSuccessStatusCode) + { + var jsonResponse = await response.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject(jsonResponse); + return result.Status; + } + + return StatusCodes.DeviceNotFound; + } + catch (Exception e) + { + string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 发生异常: {e.Message}{Environment.NewLine}"; + Logger.Error(logMessage); + return StatusCodes.DeviceNotFound; + } + } } diff --git a/ViewModel/BaseWindow/BaseControlVM.cs b/ViewModel/BaseWindow/BaseControlVM.cs index e40d751..041a4f2 100644 --- a/ViewModel/BaseWindow/BaseControlVM.cs +++ b/ViewModel/BaseWindow/BaseControlVM.cs @@ -3,6 +3,7 @@ using System.Windows.Input; using GlobalHotKey; using HandyControl.Controls; using SparkClient.Model.Helper; +using SparkClient.Model.Services; using SparkClient.ViewModel.Grading; using MessageBox = SparkClient.Views.Dialog.MessageBox; namespace SparkClient.ViewModel.BaseWindow; @@ -146,23 +147,28 @@ public class BaseControlVM : BaseViewModel { if(Content is GradingResultVM) { - bool isSaved = (Content as GradingResultVM).isSaved; - if (isSaved) - { - WindowManager.PreviousVM(); - WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); - } - else { - // 部署改造:2 - WindowManager.PreviousVM(); - WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); - // MessageBox message = new MessageBox(); - // MessageBoxResult result = message.ShowAsk(MultilingualHelper.getString("DiamodResultCloseConfirm")); - // if (MessageBoxResult.OK.Equals(result)) - // { - // WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); - // } - } + WindowManager.PreviousVM(); + WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); + var _socClientService = new SOCClientService(); + _socClientService.OpenPump(false); + //bool isSaved = (Content as GradingResultVM).isSaved; + // if (isSaved) + // { + // + // } + // else { + // // 部署改造:2 + // WindowManager.PreviousVM(); + // WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); + // var _socClientService = new SOCClientService(); + // _socClientService.OpenPump(false); + // // MessageBox message = new MessageBox(); + // // MessageBoxResult result = message.ShowAsk(MultilingualHelper.getString("DiamodResultCloseConfirm")); + // // if (MessageBoxResult.OK.Equals(result)) + // // { + // // WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); + // // } + // } } else { diff --git a/ViewModel/Grading/DiamondSelectVM.cs b/ViewModel/Grading/DiamondSelectVM.cs index 1a9d020..e91f229 100644 --- a/ViewModel/Grading/DiamondSelectVM.cs +++ b/ViewModel/Grading/DiamondSelectVM.cs @@ -207,6 +207,7 @@ public class DiamondSelectVM : BaseViewModel else { //正常模式 + var loadingView = new GradingLoadingVM(param.ToString(), DiamondCode); BaseControlVM vm = new BaseControlVM(loadingView, MultilingualHelper.getString("wait")); vm.WindowTitle = string.IsNullOrWhiteSpace(DiamondCode) ? vm.WindowTitle : $"{vm.WindowTitle} - {DiamondCode}"; diff --git a/ViewModel/Grading/GradingLoadingVM.cs b/ViewModel/Grading/GradingLoadingVM.cs index 040a908..2841fa4 100644 --- a/ViewModel/Grading/GradingLoadingVM.cs +++ b/ViewModel/Grading/GradingLoadingVM.cs @@ -168,6 +168,13 @@ public class GradingLoadingVM : BaseViewModel,IDisposable if(type == 0){ _socClientService = new SOCClientService(); + string openpupmStatus = await _socClientService.OpenPump(true); + if (!StatusCodes.Success.Equals(openpupmStatus)) + { + new MessageBox().Show("气泵开启失败!"); + return -1; + } + var processImage = _socClientService.ProcessImageCollectionAsync(); //通知页面可以播放图片 await processImage; diff --git a/Views/UserControl/Viewport3D.xaml b/Views/UserControl/Viewport3D.xaml index 8904949..611bf10 100644 --- a/Views/UserControl/Viewport3D.xaml +++ b/Views/UserControl/Viewport3D.xaml @@ -53,6 +53,9 @@ + + + diff --git a/Views/UserControl/Viewport3D.xaml.cs b/Views/UserControl/Viewport3D.xaml.cs index 44d9a92..d8b5f56 100644 --- a/Views/UserControl/Viewport3D.xaml.cs +++ b/Views/UserControl/Viewport3D.xaml.cs @@ -17,6 +17,7 @@ using SharpDX.Direct3D11; using SharpDX.DXGI; using MathNet.Numerics; using System.Windows.Media; +using SparkClient.Model.Services; using MessageBox = SparkClient.Views.Dialog.MessageBox; using ObjExporter = SparkClient.Views.UserControl.ViewportData.Helper.ObjExporter; @@ -69,15 +70,14 @@ public partial class Viewport3D ViewportRightMenuShowModelFaceByType.IsChecked = true; var a = Viewport3Dx.Items; -#if DEBUG - //Viewport3Dx.ShowViewCube = true; - //Viewport3Dx.ShowCoordinateSystem = true; - //Viewport3Dx.ShowCameraInfo = true; - //Viewport3Dx.ShowCameraTarget = !Viewport3Dx.ShowCameraTarget; - //Viewport3Dx.ShowFrameDetails = !Viewport3Dx.ShowFrameDetails; - //Viewport3Dx.ShowFrameRate = !Viewport3Dx.ShowFrameRate; - //Viewport3Dx.ShowTriangleCountInfo = !Viewport3Dx.ShowTriangleCountInfo; -#endif + + // Viewport3Dx.ShowViewCube = true; + // Viewport3Dx.ShowCoordinateSystem = true; + // Viewport3Dx.ShowCameraInfo = true; + // Viewport3Dx.ShowCameraTarget = !Viewport3Dx.ShowCameraTarget; + // Viewport3Dx.ShowFrameDetails = !Viewport3Dx.ShowFrameDetails; + // Viewport3Dx.ShowFrameRate = !Viewport3Dx.ShowFrameRate; + // Viewport3Dx.ShowTriangleCountInfo = !Viewport3Dx.ShowTriangleCountInfo; } @@ -502,6 +502,13 @@ public partial class Viewport3D case "ViewportRightMenuReset": ViewportManager.ResetMeshLines(); break; + case "ViewportCutXuanZ": + //获取当前选中的面,找到角度,*100,发送至切工仪 + var res = ViewportManager.ViewportTriangle.Find(e => ViewportManager.ChooseTriangleCode.Equals(e.TriangleCode)); + if (res == null) return; + SOCClientService service = new SOCClientService(); + service.CutRevolve(res.Theta); + break; } } #endregion diff --git a/Views/UserControl/ViewportData/Entity/Viewport3DTriangleEntity.cs b/Views/UserControl/ViewportData/Entity/Viewport3DTriangleEntity.cs index 70834c2..4f6cc94 100644 --- a/Views/UserControl/ViewportData/Entity/Viewport3DTriangleEntity.cs +++ b/Views/UserControl/ViewportData/Entity/Viewport3DTriangleEntity.cs @@ -36,6 +36,6 @@ public class Viewport3DTriangleEntity /// 可选值:PlaneType /// public PlaneType PlaneType { get; set; } - - + + public Double Theta { get; set; } } \ No newline at end of file diff --git a/Views/UserControl/ViewportData/Helper/CommonHelper.cs b/Views/UserControl/ViewportData/Helper/CommonHelper.cs index ea78d0e..c8a21b8 100644 --- a/Views/UserControl/ViewportData/Helper/CommonHelper.cs +++ b/Views/UserControl/ViewportData/Helper/CommonHelper.cs @@ -46,7 +46,7 @@ public class CommonHelper // 提取 PlaneCode 和 PlaneType string planeCode = jsonObject.facet_id ?? (string)jsonObject.facet_id; PlaneType planeType = (PlaneType)(int)jsonObject.facet_type; - + Double theta = jsonObject.theta ?? (Double)jsonObject.theta; // 生成 TriangleCode var triangleCode = GenerateTriangleCode(point1, point2, point3); @@ -58,7 +58,8 @@ public class CommonHelper Point3 = point3, TriangleCode = triangleCode, PlaneCode = planeCode, - PlaneType = planeType + PlaneType = planeType, + Theta = theta }; } diff --git a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs index 01de774..b614d76 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs @@ -521,16 +521,6 @@ public class ViewportHelperPro if (selFacetType == PlaneType.Girdle && string.IsNullOrWhiteSpace(valKey)) { Logger.Info($"【面文本生成】 命中面{selFacetType},是腰"); - // if (ViewportManager.MainModelGirdleMaxLines != null || ViewportManager.MainModelGirdleMinLines != null || - // ViewportManager.MainModelGirdleAvgLines != null) - // { - // result.Add(DisplayLineModel3D(new List>(){ViewportManager.MainModelGirdleMaxLines}, new Color4(1f, 0, 0, 1f) )); - // result.Add(DisplayLineModel3D(new List>(){ViewportManager.MainModelGirdleMinLines}, new Color4(0f, 1f, 0, 1f) )); - // result.Add(DisplayLineModel3D(new List>(){ViewportManager.MainModelGirdleAvgLines}, new Color4(1f, 0.5f, 0, 1f) )); - // result.Add(DisplayText3D($"{CalculateLength(ViewportManager.MainModelGirdleMaxLines)}mm", ViewportManager.MainModelGirdleMaxLines.Item1, textColor)); - // result.Add(DisplayText3D($"{CalculateLength(ViewportManager.MainModelGirdleMinLines)}mm", ViewportManager.MainModelGirdleMinLines.Item1, textColor)); - // result.Add(DisplayText3D($"{CalculateLength(ViewportManager.MainModelGirdleAvgLines)}mm", ViewportManager.MainModelGirdleAvgLines.Item1, textColor)); - // } List facetTypeAll = ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) @@ -615,27 +605,7 @@ public class ViewportHelperPro Logger.Info($"【面文本生成】 {valueFloat} -- {valueIndex}"); var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); - // foreach (var kv in groupedDic) - // { - // 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); }); - // - // int linePointType = facetIndex % 4; - // /*** - // * 0 1 2 3 - // * 4 5 6 7 - // * 面index+1 % 4 = 0 - // * 面id-loop4 = 0 - 高亮左边的竖线 - 波峰 - - // * 面id-loop4 = 1 - 高亮右边的竖线 - 波谷 - // * 面id-loop4 = 2 - 高亮左边的竖线 - 波谷 - // * 面id-loop4 = 3 - 高亮右边的竖线 - 波峰 - // */ - // - // } + } else if (selFacetType == PlaneType.Girdle && !string.IsNullOrWhiteSpace(valKey)) { Logger.Info($"【面文本生成】 命中面{selFacetType},是腰,显示值{valKey}"); @@ -697,8 +667,8 @@ public class ViewportHelperPro return result; } result.Add(DisplayLineModel3D(new List>() { showLine }, new Color4(1f, 0, 0, 1f), 2f)); - var valueFloat = ValueFormat(paramValue.ToString(), valKey); - result.Add(DisplayText3D($" {resIndex} \r\n {valueFloat}", facetTextPoint)); + var valueFloat = ValueFormat(paramValue.ToString(), valKey, true); + result.Add(DisplayText3D($"{valueFloat} \r\n {resIndex}", facetTextPoint)); } } @@ -712,6 +682,36 @@ public class ViewportHelperPro .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) { var value = kv.Value; @@ -734,7 +734,7 @@ public class ViewportHelperPro Logger.Info($"【面文本生成】 {param} Key不存在"); continue; } - var valueFloat = ValueFormat(paramValue.ToString(), param); + var valueFloat = ValueFormat(paramValue.ToString(), param, true); Logger.Info($"【面文本生成】 {valueFloat} -- {facetIndex}"); var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); @@ -758,10 +758,10 @@ public class ViewportHelperPro } Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} ==={paramValue}"); - var valueFloat = ValueFormat(paramValue.ToString(), param); + var valueFloat = ValueFormat(paramValue.ToString(), param, true); Logger.Info($"【面文本生成】 {valueFloat} -- {valueIndex}"); var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); - result.Add(DisplayText3D($" {facetIndex} \r\n {valueFloat}", new Vector3(facetTextPoint.X, facetTextPoint.Y + 0.1f, facetTextPoint.Z))); + 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) { @@ -782,53 +782,12 @@ public class ViewportHelperPro } Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{facetIndex} ==={paramValue}"); - var valueFloat = ValueFormat(paramValue.ToString(), param); + var valueFloat = ValueFormat(paramValue.ToString(), param, true); Logger.Info($"【面文本生成】 {valueFloat} -- {facetIndex}"); var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); - result.Add(DisplayText3D($" {facetIndex} \r\n {valueFloat}", facetTextPoint)); + result.Add(DisplayText3D($"{valueFloat} \r\n {facetIndex}", facetTextPoint)); } } - - /*** - * 思路: - * 1、以面分组,1组为台面、底面,8组、16组、64组、other - * 2、每组数据区别 - * 1组:取第一个数据 - * 8组:按索引0-7 -> 1-8 - * 16组:1-2、3-4、5-6、7-8、9-10、11-12、13-14、15-0共享数据 - * 64组:这组特殊理论上是腰,按照else里的东西来 - * 3、这个方法是主动点击,被动触发理论上通用 - * 4、主动触发:循环遍历面组,根据面类型获取算法存储的数据,在Manager里制定面-参数的一对多关系,主动触发时,取参数的首位为默认 - * 5、被动触发:根据结果页传入的参数编号,找到对应的面,循环遍历面组,根据面类型获取算法存储的数据,根据被动传入参数找到值 - * 6、 ①组面可能由至少两个三角形组成,计算出三角形拼接出的多边形的中心作为文字显示的中心 - * ②在从算法结果数据对应好面组的索引,做成值-组面id的文本,计算出这个文本的大小 - * ③在拼接的图片中心,平行于平面,向中心点外偏移“文本大小高度+0.1"个单位 显示文本 - */ - - // var selFaceVector = entities - // .SelectMany(entity => new[] { entity.Point1, entity.Point2, entity.Point3 }) - // .Distinct() - // .ToList(); - // var uniqueLines = new HashSet(); - // var sortedVectors = VectorClockwiseSort(selFaceVector); - // for (int i = 0; i < sortedVectors.Count; i++) - // { - // var current = sortedVectors[i]; - // var next = sortedVectors[(i + 1) % sortedVectors.Count]; - // - // double length = (next - current).Length(); - // string lineKey = $"{length:F2}"; - // if (showAll == false) - // { - // if (uniqueLines.Contains(lineKey)) continue; - // uniqueLines.Add(lineKey); - // } - // var midPoint = (current + next) / 2; - // var text = $"{length:F2}mm"; - // var textY = midPoint.Y > ViewportManager.CenterVector.Y ? midPoint.Y + 0.3f : midPoint.Y - 0.3f; - // var lengthTextModel = DisplayText3D(text, new Vector3(midPoint.X, textY, midPoint.Z),next - current, textColor); - // result.Add(lengthTextModel); - // } } @@ -2103,6 +2062,9 @@ public class ViewportHelperPro v = Math.Floor(v * 10) / 10; return hasUnit ? $"{v.ToString("F1")}mm" : v.ToString("F1"); case "PAV_ANGLE": + case "STAR_ANGLE": + case "UPPER_HALF_ANGLE": + case "LOWER_HALF_ANGLE": case "TWIST": v = Math.Floor(v * 10) / 10; return hasUnit ? $"{v.ToString("F1")}°" : v.ToString("F1"); @@ -2113,7 +2075,7 @@ public class ViewportHelperPro // case "CROWN HEIGHT": // case "PAV DEPTH": v *= 100; - return hasUnit ? $"{(Math.Round(v / 0.5) * 0.5).ToString("F1")}%" : (Math.Round(v / 0.5) * 0.5).ToString("F1"); + return hasUnit ? $"{v.ToString("F1")}%" : v.ToString("F1"); default: v = Math.Floor(v * 1000) / 1000; return hasUnit ? $"{(v*100).ToString("F1")}%" : (v*100).ToString("F1"); diff --git a/Views/UserControl/ViewportData/Helper/ViewportManager.cs b/Views/UserControl/ViewportData/Helper/ViewportManager.cs index e6de322..c9b27ba 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportManager.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportManager.cs @@ -148,6 +148,20 @@ public class ViewportManager public static bool DoubleClickSelectShowPlaneType = true; //选中三角形代码 public static string ChooseTriangleCode = string.Empty; + + private static bool _HasTriangleSelect; + public static bool HasTriangleSelect + { + get { return _HasTriangleSelect; } + + set + { + _HasTriangleSelect = value; + if(_viewport3D != null) + _viewport3D.ViewportCutXuanZ.IsEnabled = value; + } + } + //通过选中添加的元素 public static List ChooseAddModels = new List(); /// @@ -158,6 +172,7 @@ public class ViewportManager if (string.IsNullOrWhiteSpace(ChooseTriangleCode)) { ClearDicModels(); + HasTriangleSelect = false; return; } @@ -169,6 +184,7 @@ public class ViewportManager // if (DoubleClickSelectShowBorderAngle) models.Add(SelShowType.BorderAngle); if (DoubleClickSelectShowPlaneType) models.Add(SelShowType.IsTypePanel); ChooseAddModels.AddRange(ViewportHelperPro.GentrateChosenView(ChooseTriangleCode, valType, models.ToArray())); + HasTriangleSelect = true; ChooseAddModels.ForEach(e => { if (e != null) _viewport.Items.Add(e); @@ -184,6 +200,7 @@ public class ViewportManager _viewport.Items.Remove(item); } ChooseAddModels.Clear(); + HasTriangleSelect = false; } public static void InitMeshLines() { @@ -248,10 +265,11 @@ public class ViewportManager { { PlaneType.UpperMainFacet,"CROWN_ANGLE"}, { PlaneType.PavilionMainFacet, "PAV_ANGLE"}, - { PlaneType.StarFacet, "STAR"}, + { PlaneType.StarFacet, "STAR_ANGLE"}, { PlaneType.TableFacet, "TABLE"}, { PlaneType.Culet, "COC"}, - { PlaneType.LowerGirdleFact, "LOWER_HALVES_RATIO"}, + { PlaneType.LowerGirdleFact, "LOWER_HALF_ANGLE"}, + { PlaneType.UpperGirdleFacet, "UPPER_HALF_ANGLE"}, }; // 数据 -> 面 public static Dictionary DicValueParamToFacet = new Dictionary()