feat: Factory Model

master
Tongg 4 months ago
parent 8ead72772d
commit bb800bbd0d
  1. 24
      App.xaml.cs
  2. 4
      Language/en_US.xaml
  3. 5
      Language/zh_CN.xaml
  4. 20
      Model/Extension/CommonExtension.cs
  5. 2
      Model/Helper/Common.cs
  6. 36
      ViewModel/Configuration/SettingsPages/SettingsVM.cs
  7. 24
      ViewModel/Grading/DiamondSelectVM.cs
  8. 6
      ViewModel/Grading/GradingLoadingVM.cs
  9. 60
      Views/Configuration/SettingPages/CustomSettingPage.xaml
  10. 2
      Views/UserControl/Viewport3D.xaml
  11. 22
      Views/UserControl/Viewport3D.xaml.cs
  12. 2
      Views/UserControl/ViewportData/Enum/PlaneType.cs
  13. 817
      Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs
  14. 4
      Views/UserControl/ViewportData/Helper/ViewportManager.cs
  15. 4
      Views/UserControl/ViewportData/ViewportData.cs

@ -4,6 +4,7 @@ using System.IO;
using System.Windows; using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Threading; using System.Windows.Threading;
using log4net;
using log4net.Config; using log4net.Config;
using SparkClient.Model.Helper; using SparkClient.Model.Helper;
using SparkClient.ViewModel.Configuration.SettingsPages; using SparkClient.ViewModel.Configuration.SettingsPages;
@ -15,21 +16,44 @@ namespace SparkClient;
/// </summary> /// </summary>
public partial class App : Application public partial class App : Application
{ {
private static readonly ILog Logger = LogManager.GetLogger(typeof(App));
protected override void OnStartup(StartupEventArgs e) protected override void OnStartup(StartupEventArgs e)
{ {
base.OnStartup(e); base.OnStartup(e);
//加载日志配置文件 //加载日志配置文件
XmlConfigurator.Configure(new FileInfo("log4net.config")); XmlConfigurator.Configure(new FileInfo("log4net.config"));
Logger.Info("==== ==== ==== ==== ==== ==== ==== ====");
Logger.Info("App Client Start: App Initialize");
Logger.Info("Loaded Logs Config: log4net.config");
//运行是否需要归档 //运行是否需要归档
Log4NetHelper.ArchiveOldLogs(); Log4NetHelper.ArchiveOldLogs();
Logger.Info("Check Logs need to be archived");
//打开数据库连接 //打开数据库连接
//读取数据库多语言配置 //读取数据库多语言配置
DataBaseHelper.CreateConnection(); DataBaseHelper.CreateConnection();
Logger.Info("Create Sqlite Connection...");
Logger.Info("Load Language Set");
string LanguageId = Settings.SelectValueById("LanguageId"); string LanguageId = Settings.SelectValueById("LanguageId");
if (LanguageId.Length == 0) if (LanguageId.Length == 0)
{ {
LanguageId = "zh-cn"; LanguageId = "zh-cn";
} }
MultilingualHelper.setLanguage(LanguageId); 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("==== ==== ==== ==== ==== ==== ==== ====");
} }
} }

@ -239,4 +239,8 @@
<sys:String x:Key="ViewportCutXuanZ">Rotate Cut Tool to This Face</sys:String> <sys:String x:Key="ViewportCutXuanZ">Rotate Cut Tool to This Face</sys:String>
<sys:String x:Key="ViewportCenterFlag">Show Center Mark</sys:String> <sys:String x:Key="ViewportCenterFlag">Show Center Mark</sys:String>
<sys:String x:Key="CustomSettingPageRunModeSet">RunModel</sys:String>
<sys:String x:Key="CustomSettingPageFactory">Factory</sys:String>
<sys:String x:Key="CustomSettingPageLaboratory">Laboratory</sys:String>
</ResourceDictionary> </ResourceDictionary>

@ -239,4 +239,9 @@
<sys:String x:Key="GradingLoadingPrevious">上一帧</sys:String> <sys:String x:Key="GradingLoadingPrevious">上一帧</sys:String>
<sys:String x:Key="GradingLoadingNext">下一帧</sys:String> <sys:String x:Key="GradingLoadingNext">下一帧</sys:String>
<!-- 2025/03/17 add -->
<sys:String x:Key="CustomSettingPageRunModeSet">运行模式</sys:String>
<sys:String x:Key="CustomSettingPageFactory">工厂模式</sys:String>
<sys:String x:Key="CustomSettingPageLaboratory">实验室模式</sys:String>
</ResourceDictionary> </ResourceDictionary>

@ -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);
}
}

@ -22,6 +22,8 @@ public class Common
public const string DataBaseName = "SparkDB"; public const string DataBaseName = "SparkDB";
public static int RunMode = 0;
/// <summary> /// <summary>
/// 将 DataTable 转换为 JSON 字符串 /// 将 DataTable 转换为 JSON 字符串
/// </summary> /// </summary>

@ -48,6 +48,22 @@ namespace SparkClient.ViewModel.Configuration.SettingsPages
public DataTable _rules; public DataTable _rules;
public DataTable Rules { get { return _rules; } set { _rules = value; OnPropertyChanged(nameof(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() public SettingsVM()
{ {
try { try {
@ -83,6 +99,18 @@ namespace SparkClient.ViewModel.Configuration.SettingsPages
this.ExcelFileChecked = ExcelFileChecked; this.ExcelFileChecked = ExcelFileChecked;
bool.TryParse(Settings.SelectValueById("DatFileChecked"), out bool DatFileChecked); bool.TryParse(Settings.SelectValueById("DatFileChecked"), out bool DatFileChecked);
this.DatFileChecked = 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"); FilePath = Settings.SelectValueById("FilePath");
RuleId = Settings.SelectValueById("RuleId"); RuleId = Settings.SelectValueById("RuleId");
selectRules(); selectRules();
@ -197,6 +225,14 @@ namespace SparkClient.ViewModel.Configuration.SettingsPages
Value = RuleId, Value = RuleId,
}; };
RuleData.insert(); RuleData.insert();
Settings runModeData = new Settings()
{
Key = "RunMode",
ItemName = "运行模式",
Value = NowRunMode,
};
runModeData.insert();
} }
catch (Exception ex) catch (Exception ex)
{ {

@ -113,9 +113,27 @@ public class DiamondSelectVM : BaseViewModel
item.IsHighlighted = true; item.IsHighlighted = true;
}; };
List<ButtonViewModel> tempButtons2 = new List<ButtonViewModel>(); List<ButtonViewModel> tempButtons2 = new List<ButtonViewModel>();
var bitmap = new BitmapImage(new Uri("pack://application:,,,/Resource/Images/UIResource/round_P8-P8.png", UriKind.RelativeOrAbsolute)); if (Common.RunMode == 0)
ButtonViewModel button = new ButtonViewModel() { Text = "P8-P8", ImageSource = bitmap, Type = "ROUND P8 P8", Command = StartGradingCommand, IsFocused = true}; {
tempButtons2.Add(button); 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; Buttons2 = tempButtons2;
} }
} }

@ -157,6 +157,12 @@ public class GradingLoadingVM : BaseViewModel,IDisposable
stringBuilder.Append(line); stringBuilder.Append(line);
} }
Parameter = JsonConvert.DeserializeObject<AlgorithmResultEntity>(stringBuilder.ToString()); Parameter = JsonConvert.DeserializeObject<AlgorithmResultEntity>(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(); await CompleteProgressQuicklyAsync();
return 0; return 0;
} }

@ -57,6 +57,8 @@
<RowDefinition Height="auto"/> <RowDefinition Height="auto"/>
<RowDefinition Height="auto"/> <RowDefinition Height="auto"/>
<RowDefinition Height="auto"/> <RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Border Grid.Row="0" Style="{DynamicResource BorderRowStyle}"> <Border Grid.Row="0" Style="{DynamicResource BorderRowStyle}">
@ -144,52 +146,16 @@
DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding RuleId, Mode=TwoWay}"/> DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding RuleId, Mode=TwoWay}"/>
</Grid> </Grid>
</Border> </Border>
<!-- <Label Grid.Row="2" Content="{DynamicResource LanguageSettings}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="150" /> --> <Border Grid.Row="4" Style="{DynamicResource BorderRowStyle}">
<!-- <ComboBox Grid.Row="2" Grid.Column="1" Background="White" Width="150" HorizontalAlignment="Left" --> <Grid>
<!-- ItemsSource="{Binding Languages}" Margin="10 0" DisplayMemberPath="Key" SelectedValuePath="Value" --> <Grid.ColumnDefinitions>
<!-- SelectedValue="{Binding LanguageId, Mode=TwoWay}" > --> <ColumnDefinition Width="150"/>
<!-- </ComboBox> --> <ColumnDefinition Width="*"/>
<!-- <GridSplitter Grid.Row="3" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter> --> </Grid.ColumnDefinitions>
<!-- <Label Content="{DynamicResource UpdateFile}" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="5" Grid.Row="4" Grid.Column="0" Width="150"/> --> <TextBlock Grid.Column="0" Text="{StaticResource CustomSettingPageRunModeSet}" Style="{DynamicResource TextBlockStyle}" />
<!-- <Grid Grid.Row="4" Grid.Column="1" Width="88" HorizontalAlignment="Left"> --> <ComboBox Grid.Column="1" Background="White" Width="150" HorizontalAlignment="Left" ItemsSource="{Binding RunMode}"
<!-- <Grid.RowDefinitions> --> DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding NowRunMode, Mode=TwoWay}"/>
<!-- <RowDefinition /> --> </Grid>
<!-- <RowDefinition /> --> </Border>
<!-- <RowDefinition /> -->
<!-- <RowDefinition /> -->
<!-- </Grid.RowDefinitions> -->
<!-- <CheckBox Grid.Row="0" Content="{DynamicResource TxtFile}" IsChecked="{Binding TxtFileChecked}"/> -->
<!-- <CheckBox Grid.Row="1" Content="{DynamicResource StlFile}" IsChecked="{Binding StlFileChecked}"/> -->
<!-- <CheckBox Grid.Row="2" Content="{DynamicResource ExcelFile}" IsChecked="{Binding ExcelFileChecked}"/> -->
<!-- <CheckBox Grid.Row="3" Content="{DynamicResource DatFile}" IsChecked="{Binding DatFileChecked}"/> -->
<!-- </Grid> -->
<!-- -->
<!-- <GridSplitter Grid.Row="5" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter> -->
<!-- <Label Grid.Row="6" Content="{DynamicResource SavePath}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="150"/> -->
<!-- <Grid Grid.Row="6" Grid.Column="1"> -->
<!-- <Grid.ColumnDefinitions> -->
<!-- <ColumnDefinition Width="300"/> -->
<!-- <ColumnDefinition/> -->
<!-- </Grid.ColumnDefinitions> -->
<!-- <TextBox TextWrapping="Wrap" Name ="filePath" Grid.Column="0" Text="{Binding FilePath}" Background="White" Width="300" HorizontalAlignment="Left"/> -->
<!-- <TextBlock Text="{DynamicResource Please enter}" Grid.Column="0" Foreground="#BBBBBB" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5"> -->
<!-- <TextBlock.Style> -->
<!-- <Style TargetType="TextBlock"> -->
<!-- <Setter Property="Visibility" Value="Collapsed"/> -->
<!-- <Style.Triggers> -->
<!-- <DataTrigger Binding="{Binding Path=Text, ElementName=filePath}" Value=""> -->
<!-- <Setter Property="Visibility" Value="Visible"/> -->
<!-- </DataTrigger> -->
<!-- </Style.Triggers> -->
<!-- </Style> -->
<!-- </TextBlock.Style> -->
<!-- </TextBlock> -->
<!-- <Button Grid.Column="1" Background="#A7896F" Content="{DynamicResource Select}" Foreground="White" HorizontalAlignment="Left" Width="80" Command="{Binding SelectFileCommand}"/> -->
<!-- </Grid> -->
<!-- <GridSplitter Grid.Row="7" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter> -->
<!-- <Label Grid.Row="8" Grid.Column="0" Content="{DynamicResource GradeStandard}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="150"/> -->
<!-- <ComboBox Grid.Row="8" Grid.Column="1" Background="White" Width="150" HorizontalAlignment="Left" ItemsSource="{Binding Rules}" -->
<!-- DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding RuleId, Mode=TwoWay}"/> -->
<!-- <GridSplitter Grid.Row="9" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter> -->
</Grid> </Grid>
</Border> </Border>

@ -52,7 +52,7 @@
</Grid> </Grid>
<Border Grid.Row="1" x:Name="MainBorder"> <Border Grid.Row="1" x:Name="MainBorder">
<Border.ContextMenu > <Border.ContextMenu >
<ContextMenu> <ContextMenu x:Name="ContextMenu">
<!-- ViewportCutXuanZ --> <!-- ViewportCutXuanZ -->
<MenuItem Header="{StaticResource ViewportCutXuanZ}" x:Name="ViewportCutXuanZ" Click="MenuItem_OnClick"/> <MenuItem Header="{StaticResource ViewportCutXuanZ}" x:Name="ViewportCutXuanZ" Click="MenuItem_OnClick"/>
<Separator /> <Separator />

@ -78,6 +78,28 @@ public partial class Viewport3D
// Viewport3Dx.ShowFrameDetails = !Viewport3Dx.ShowFrameDetails; // Viewport3Dx.ShowFrameDetails = !Viewport3Dx.ShowFrameDetails;
// Viewport3Dx.ShowFrameRate = !Viewport3Dx.ShowFrameRate; // Viewport3Dx.ShowFrameRate = !Viewport3Dx.ShowFrameRate;
// Viewport3Dx.ShowTriangleCountInfo = !Viewport3Dx.ShowTriangleCountInfo; // 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);
}
}
} }

@ -26,6 +26,8 @@ public enum PlaneType
LowerGirdleFact = 22, LowerGirdleFact = 22,
[Description("底尖(或底小面)")] [Description("底尖(或底小面)")]
Culet = 23, Culet = 23,
[Description("未完成的冠部")]
CrownIncomplete = 32,
[Description("其他")] [Description("其他")]
Other = 99 Other = 99
} }

@ -1,5 +1,6 @@
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.IO; using System.IO;
using System.Text;
using System.Windows; using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Animation; using System.Windows.Media.Animation;
@ -21,6 +22,9 @@ using HelixToolkit.Wpf;
using MeshBuilder = HelixToolkit.Wpf.SharpDX.MeshBuilder; using MeshBuilder = HelixToolkit.Wpf.SharpDX.MeshBuilder;
using OrthographicCamera = HelixToolkit.Wpf.SharpDX.OrthographicCamera; using OrthographicCamera = HelixToolkit.Wpf.SharpDX.OrthographicCamera;
using System.Windows.Input; using System.Windows.Input;
using SparkClient.Model.Extension;
using SparkClient.Model.Helper;
using MessageBox = SparkClient.Views.Dialog.MessageBox;
namespace SparkClient.Views.UserControl.ViewportData.Helper; namespace SparkClient.Views.UserControl.ViewportData.Helper;
@ -583,110 +587,181 @@ public class ViewportHelperPro
/// <returns></returns> /// <returns></returns>
public static List<GeometryModel3D> GenerateLineTextModels(List<Viewport3DTriangleEntity> entities, string valKey = "") public static List<GeometryModel3D> GenerateLineTextModels(List<Viewport3DTriangleEntity> entities, string valKey = "")
{ {
Logger.Info("【面文本生成】开始生成面相关文本信息");
var selFacet = entities;
var selFacetType = entities.First().PlaneType;
var result = new List<GeometryModel3D>(); var result = new List<GeometryModel3D>();
if (selFacetType == PlaneType.Girdle && string.IsNullOrWhiteSpace(valKey)) string steps = ViewportManager.DiamondType.Split(" ").Last();
if (Common.RunMode == 0 && steps.StartsWith("S"))
{ {
// Logger.Info($"【面文本生成】 命中面{selFacetType},是腰"); Logger.Info("【面文本生成】开始生成面相关文本信息");
// List<Viewport3DTriangleEntity> facetTypeAll = var selFacet = entities;
// ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType); var selFacetType = entities.First().PlaneType;
// 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<Vector3> facetPoints = new List<Vector3>();
// 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<Tuple<Vector3, Vector3>>() { 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<Tuple<Vector3, Vector3>>() { longestLine2 }, new Color4(1f, 0, 0, 1f), 2f));
// break;
// }
//
// if (result.Exists(e => e == null))
// {
// Logger.Info("目标线段为空");
// return result;
// }
//开始找值[选中线的值]
// string param = string.Empty; if (selFacetType == PlaneType.Girdle && string.IsNullOrWhiteSpace(valKey))
// var valueIndex = 0; {
// if (facetIndex % 8 == 0 || (facetIndex + 1) % 8 == 0) // Logger.Info($"【面文本生成】 命中面{selFacetType},是腰");
// { // List<Viewport3DTriangleEntity> facetTypeAll =
// //上腰面 // ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType);
// Logger.Info($"【面文本生成】 腰面值 波峰【上腰面】"); // var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode)
// valueIndex = (int)Math.Ceiling(facetIndex / 8.0) == 8 ? 0 : (int)Math.Ceiling(facetIndex / 8.0); // .ToDictionary(group => group.Key, group => group.ToList());
// param = "GIRDLE_BONE"; // Logger.Info($"【面文本生成】 腰由{groupedDic.Count}个面组成");
// } else if (linePointType == 3 || linePointType == 0) //
// { // var selPlaneCode = entities.First().PlaneCode;
// //风筝面 // Logger.Info($"【面文本生成】 当前选择{selPlaneCode}");
// Logger.Info($"【面文本生成】 腰面值 波峰【风筝面】"); //
// valueIndex = (facetIndex / 8); // List<Vector3> facetPoints = new List<Vector3>();
// param = "GIRDLE_BEZEL"; // entities.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); });
// } // var facetIndex = -1;
// else // int.TryParse(selPlaneCode.Split("_")[1], out facetIndex);
// { //
// //腰厚比 // if (facetIndex == -1)
// Logger.Info($"【面文本生成】 腰面值 波峰【腰厚比】"); // {
// valueIndex = (facetIndex / 4); // Logger.Info($"【面文本生成】 面索引解析失败{selPlaneCode}");
// param = "GIRDLE_VALLEY"; // return result;
// } // }
// // int linePointType = facetIndex % 4;
// valueIndex += 1; // Console.WriteLine(facetIndex);
// var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; // switch (linePointType)
// if (detail == null) // {
// { // case 0:
// Logger.Info($"【面文本生成】 {param}_DETAIL Key不存在"); // case 2:
// return result; // var longestLine1 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? true : false);
// } // result.Add(DisplayLineModel3D(new List<Tuple<Vector3, Vector3>>() { longestLine1 }, new Color4(1f, 0, 0, 1f), 2f));
// Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}"); // break;
// var paramValue = detail[$"{param}_{valueIndex}"]; // case 1:
// if (paramValue == null) // case 3:
// { // var longestLine2 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? false : true);
// Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} Key不存在"); // result.Add(DisplayLineModel3D(new List<Tuple<Vector3, Vector3>>() { longestLine2 }, new Color4(1f, 0, 0, 1f), 2f));
// return result; // break;
// } // }
// Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} ==={paramValue}"); //
// var valueFloat = (Math.Floor(float.Parse(paramValue.ToString()) * 1000) / 10).ToString(); // if (result.Exists(e => e == null))
// Logger.Info($"【面文本生成】 {valueFloat} -- {valueIndex}"); // {
// var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); // Logger.Info("目标线段为空");
// result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); // return result;
List<Viewport3DTriangleEntity> facetTypeAll = // }
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType);
var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode) //开始找值[选中线的值]
.ToDictionary(group => group.Key, group => group.ToList()); // string param = string.Empty;
List<string> girdleKey = new List<string> { "GIRDLE_BEZEL", "GIRDLE_BONE", "GIRDLE_VALLEY" }; // var valueIndex = 0;
var girdleResultDic = new Dictionary<string, Dictionary<string, List<Viewport3DTriangleEntity>>>(); // if (facetIndex % 8 == 0 || (facetIndex + 1) % 8 == 0)
foreach (var key in girdleKey) // {
// //上腰面
// 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<Viewport3DTriangleEntity> facetTypeAll =
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType);
var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList());
List<string> girdleKey = new List<string> { "GIRDLE_BEZEL", "GIRDLE_BONE", "GIRDLE_VALLEY" };
var girdleResultDic = new Dictionary<string, Dictionary<string, List<Viewport3DTriangleEntity>>>();
foreach (var key in girdleKey)
{
var resultDic = new Dictionary<string, List<Viewport3DTriangleEntity>>();
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<Vector3> facetPoints = new List<Vector3>();
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<Tuple<Vector3, Vector3>>() { 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<Viewport3DTriangleEntity> 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<string, List<Viewport3DTriangleEntity>>(); var resultDic = new Dictionary<string, List<Viewport3DTriangleEntity>>();
for (int i = 0; i < groupedDic.Count; i++) 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}"]); case "GIRDLE_BEZEL": if (i % 8 == 4) resultDic.Add($"0_{i}", groupedDic[$"0_{i}"]);
break; break;
@ -696,335 +771,345 @@ public class ViewportHelperPro
break; break;
} }
} }
girdleResultDic.Add(key, resultDic);
}
foreach (var gridleResult in girdleResultDic) if (resultDic.Count == 0)
{ {
foreach (var dic in gridleResult.Value) Logger.Info($"【面文本生成】 关联面获取失败");
}
foreach (var dic in resultDic)
{ {
//高亮四边形左边的线,并绑定值 //高亮四边形左边的线,并绑定值
List<Vector3> facetPoints = new List<Vector3>(); List<Vector3> facetPoints = new List<Vector3>();
dic.Value.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); 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 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;
var showLine =GetLeftOrRightLineSegment(facetPoints, facetIndex >= 25 && facetIndex <= 57 ? true : false);;
if (showLine == null) continue;
result.Add(DisplayLineModel3D(new List<Tuple<Vector3, Vector3>>() { showLine }, new Color4(1f, 0, 0, 1f), 2f));
}
//文字显示位置 //文字显示位置
var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); 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; if (resIndex == -1) continue;
resIndex += 1; resIndex += 1;
var detail = ViewportManager.DiamondData[$"{gridleResult.Key}_DETAIL"]; var detail = ViewportManager.DiamondData[$"{valKey}_DETAIL"];
if (detail == null) if (detail == null)
{ {
Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL Key不存在"); Logger.Info($"【面文本生成】 {valKey}_DETAIL Key不存在");
return result; return result;
} }
Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL == {detail}"); Logger.Info($"【面文本生成】 {valKey}_DETAIL == {detail}");
var paramValue = detail[$"{gridleResult.Key}_{resIndex}"]; var paramValue = detail[$"{valKey}_{resIndex}"];
if (paramValue == null) if (paramValue == null)
{ {
Logger.Info($"【面文本生成】 {gridleResult.Key}_DETAIL.{gridleResult.Key}_{resIndex} Key不存在"); Logger.Info($"【面文本生成】 {valKey}_DETAIL.{valKey}_{resIndex} Key不存在");
return result; return result;
} }
result.Add(DisplayLineModel3D(new List<Tuple<Vector3, Vector3>>() { showLine }, new Color4(1f, 0, 0, 1f), 2f));
var valueFloat = ValueFormat(paramValue.ToString(), gridleResult.Key, false); var valueFloat = ValueFormat(paramValue.ToString(), valKey, true);
result.Add(DisplayText3D($"{valueFloat}", facetTextPoint)); 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<Viewport3DTriangleEntity> 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<string, List<Viewport3DTriangleEntity>>();
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;
}
} }
else
if (resultDic.Count == 0)
{
Logger.Info($"【面文本生成】 关联面获取失败");
}
foreach (var dic in resultDic)
{
//高亮四边形左边的线,并绑定值
List<Vector3> facetPoints = new List<Vector3>();
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<Tuple<Vector3, Vector3>>() { 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<Viewport3DTriangleEntity> 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<Vector3> tablePointList = new List<Vector3>();
foreach (var entity in groupedDic["11_0"])
{
tablePointList.Add(entity.Point1);
tablePointList.Add(entity.Point2);
tablePointList.Add(entity.Point3);
}
HashSet<Vector3> tablePointSet = new HashSet<Vector3>(tablePointList);
tablePointList = VectorClockwiseSort(tablePointSet.ToList());
List<Tuple<Vector3, Vector3>> line = new List<Tuple<Vector3, Vector3>>();
for (int i = 0; i < tablePointList.Count / 2; i++)
{
line.Add(new Tuple<Vector3, Vector3>(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; Logger.Info($"【面文本生成】 命中面{selFacetType},不是腰");
var key = kv.Key; //查找同类面
var facetIndex = -1; List<Viewport3DTriangleEntity> facetTypeAll =
int.TryParse(key.Split("_")[1], out facetIndex); ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType);
List<Vector3> facetPoints = new List<Vector3>(); var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode)
value.ForEach(e => { facetPoints.Add(e.Point1); facetPoints.Add(e.Point2); facetPoints.Add(e.Point3); }); .ToDictionary(group => group.Key, group => group.ToList());
var param = string.IsNullOrWhiteSpace(valKey) ? ViewportManager.DicFacetToValueParam.ContainsKey(selFacetType) ? ViewportManager.DicFacetToValueParam[selFacetType] : null : valKey; Logger.Info($"【面文本生成】 同类面{groupedDic.Count}个");
if (param == null) var valueIndex = 1;
//台面显示
if (selFacetType == PlaneType.TableFacet)
{ {
continue; List<Vector3> tablePointList = new List<Vector3>();
} foreach (var entity in groupedDic["11_0"])
if (groupedDic.Count == 1)
{
var paramValue = ViewportManager.DiamondData[$"{param}"];
if (paramValue == null)
{ {
Logger.Info($"【面文本生成】 {param} Key不存在"); tablePointList.Add(entity.Point1);
continue; tablePointList.Add(entity.Point2);
tablePointList.Add(entity.Point3);
} }
var valueFloat = ValueFormat(paramValue.ToString(), param, true); HashSet<Vector3> tablePointSet = new HashSet<Vector3>(tablePointList);
Logger.Info($"【面文本生成】 {valueFloat} -- {facetIndex}"); tablePointList = VectorClockwiseSort(tablePointSet.ToList());
var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector);
result.Add(DisplayText3D($"{valueFloat}", facetTextPoint));
} else if (groupedDic.Count == 16) List<Tuple<Vector3, Vector3>> line = new List<Tuple<Vector3, Vector3>>();
{ for (int i = 0; i < tablePointList.Count / 2; i++)
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不存在"); line.Add(new Tuple<Vector3, Vector3>(tablePointList[i], tablePointList[i+tablePointList.Count / 2]));
continue;
} }
Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}"); string param = "TABLE";
var paramValue = detail[$"{param}_{valueIndex}"]; var detail = ViewportManager.DiamondData[$"{param}_DETAIL"];
if (paramValue == null) for (int i = 0; i < line.Count; i++)
{ {
Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{valueIndex} Key不存在"); Vector3 point = line[i].Item2;
continue; 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}"); result.Add( DisplayLineModel3D(line, new Color4(1f, 0, 0, 1f), 0.7f));
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) foreach (var kv in groupedDic)
{ {
facetIndex += 1; var value = kv.Value;
var key = kv.Key;
var detail = ViewportManager.DiamondData[$"{param}_DETAIL"]; var facetIndex = -1;
if (detail == null) int.TryParse(key.Split("_")[1], out facetIndex);
List<Vector3> facetPoints = new List<Vector3>();
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; continue;
} }
Logger.Info($"【面文本生成】 {param}_DETAIL == {detail}");
var paramValue = detail[$"{param}_{facetIndex}"]; if (groupedDic.Count == 1)
if (paramValue == null)
{ {
Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{facetIndex} Key不存在"); var paramValue = ViewportManager.DiamondData[$"{param}"];
continue; if (paramValue == null)
} {
Logger.Info($"【面文本生成】 {param}_DETAIL.{param}_{facetIndex} ==={paramValue}"); 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); var detail = ViewportManager.DiamondData[$"{param}_DETAIL"];
Logger.Info($"【面文本生成】 {valueFloat} -- {facetIndex}"); if (detail == null)
var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector); {
result.Add(DisplayText3D($"{valueFloat} \r\n {facetIndex}", facetTextPoint)); 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 (string.IsNullOrWhiteSpace(valKey))
{
if (PlaneType.StarFacet == selFacetType || PlaneType.UpperGirdleFacet == selFacetType)
{ {
//星刻面: 在底面的点显示 星刻面长度比 if (PlaneType.StarFacet == selFacetType || PlaneType.UpperGirdleFacet == selFacetType)
//上腰面: 在顶面的点显示 对应星刻面的 1-星刻面长度比
string valParam = "STAR";
List<Viewport3DTriangleEntity> allStartEntity =
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.StarFacet);
var allStartEntityGroupByFacet = allStartEntity.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList());
List<Viewport3DTriangleEntity> allUpperGridleEntity =
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.UpperGirdleFacet);
var allUpperGridleEntityGroupByFacet = allUpperGridleEntity.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList());
List<Vector3> points = new List<Vector3>();
for (int i = 0; i < allStartEntityGroupByFacet.Count; i++)
{ {
List<Vector3> pointsTemp = new List<Vector3>(); //星刻面: 在底面的点显示 星刻面长度比
//上腰面: 在顶面的点显示 对应星刻面的 1-星刻面长度比
allStartEntityGroupByFacet[$"13_{i}"].ForEach(e => string valParam = "STAR";
List<Viewport3DTriangleEntity> allStartEntity =
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.StarFacet);
var allStartEntityGroupByFacet = allStartEntity.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList());
List<Viewport3DTriangleEntity> allUpperGridleEntity =
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.UpperGirdleFacet);
var allUpperGridleEntityGroupByFacet = allUpperGridleEntity.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList());
List<Vector3> points = new List<Vector3>();
for (int i = 0; i < allStartEntityGroupByFacet.Count; i++)
{ {
pointsTemp.Add(e.Point1); List<Vector3> pointsTemp = new List<Vector3>();
pointsTemp.Add(e.Point2);
pointsTemp.Add(e.Point3); allStartEntityGroupByFacet[$"13_{i}"].ForEach(e =>
}); {
int upperGridleIndex = ((i + 1) * 2) >= 16 ? 1 : ((i + 1) * 2); pointsTemp.Add(e.Point1);
// allUpperGridleEntityGroupByFacet[$"14_{upperGridleIndex}"].ForEach(e => pointsTemp.Add(e.Point2);
// { pointsTemp.Add(e.Point3);
// pointsTemp.Add(e.Point1); });
// pointsTemp.Add(e.Point2); int upperGridleIndex = ((i + 1) * 2) >= 16 ? 1 : ((i + 1) * 2);
// pointsTemp.Add(e.Point3); // allUpperGridleEntityGroupByFacet[$"14_{upperGridleIndex}"].ForEach(e =>
// }); // {
allUpperGridleEntityGroupByFacet[$"14_{upperGridleIndex-1}"].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); var valIndex = i + 1;
pointsTemp.Add(e.Point2); var paramValue = detail[$"{valParam}_{valIndex}"];
pointsTemp.Add(e.Point3); var valueFloat = ValueFormat(paramValue.ToString(), valParam);
}); var finalValue = PlaneType.StarFacet == selFacetType
Vector3? mostFrequent = pointsTemp ? valueFloat
.GroupBy(v => v) : (100 - (double.Parse(valueFloat))).ToString();
.Select(group => new { Vector = group.Key, Count = group.Count() }) result.Add(DisplayText3D($"{finalValue}%", new Vector3(points[i].X,points[i].Y-0.2f,points[i].Z)));
.OrderByDescending(x => x.Count) }
.FirstOrDefault()?.Vector;
if(mostFrequent.HasValue) }else if (PlaneType.LowerGirdleFact == selFacetType)
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}"]; string valParam = "LOWER_HALVES_RATIO";
var valueFloat = ValueFormat(paramValue.ToString(), valParam);
var finalValue = PlaneType.StarFacet == selFacetType List<Viewport3DTriangleEntity> allLowerGirdleEntity =
? valueFloat ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.LowerGirdleFact);
: (100 - (double.Parse(valueFloat))).ToString(); var allLowerGirdleGroupByFacet = allLowerGirdleEntity.GroupBy(entity => entity.PlaneCode)
result.Add(DisplayText3D($"{finalValue}%", new Vector3(points[i].X,points[i].Y-0.2f,points[i].Z))); .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<Vector3> pointsTemp = new List<Vector3>();
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 (Common.RunMode == 1)
{
//
var selFacetType = entities.First().PlaneType;
}else if (PlaneType.LowerGirdleFact == selFacetType) string step = ViewportManager.DiamondType.Split(" ").Last();
if ("S1".Equals(step))
{
try
{ {
//下腰面: 在底面的点显示 下腰比 //有效数据
string valParam = "LOWER_HALVES_RATIO"; List<Viewport3DTriangleEntity> facetTypeAll =
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == selFacetType);
List<Viewport3DTriangleEntity> allLowerGirdleEntity = var groupedDic = facetTypeAll.GroupBy(entity => entity.PlaneCode)
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.LowerGirdleFact);
var allLowerGirdleGroupByFacet = allLowerGirdleEntity.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList()); .ToDictionary(group => group.Key, group => group.ToList());
Logger.Info($"【面文本生成】 [工厂模式]同类面{groupedDic.Count}个");
var detail = ViewportManager.DiamondData[$"{valParam}_DETAIL"]; foreach (var kv in groupedDic)
for (int i = 0; i < 8; i++)
{ {
var valIndex = i + 1; var value = kv.Value;
//获取点 var key = kv.Key;
List<Vector3> pointsTemp = new List<Vector3>(); var facetIndex = -1;
allLowerGirdleGroupByFacet[$"22_{i*2}"].ForEach(e => int.TryParse(key.Split("_")[1], out facetIndex);
List<Vector3> facetPoints = new List<Vector3>();
value.ForEach(e =>
{ {
pointsTemp.Add(e.Point1); facetPoints.Add(e.Point1);
pointsTemp.Add(e.Point2); facetPoints.Add(e.Point2);
pointsTemp.Add(e.Point3); facetPoints.Add(e.Point3);
}); });
float? maxY = pointsTemp.Any() ? pointsTemp.Max(v => v.Y) : (float?)null; var facetTextPoint = GetOffsetCenter(facetPoints, ViewportManager.CenterVector);
Vector3? points = pointsTemp facetIndex += 1;
.Where(v => maxY.HasValue && v.Y == maxY.Value) if (valKey.IsNullOrEmpty())
.GroupBy(v => v) {
.Select(g => new { Point = g.Key, Count = g.Count() }) //显示两个值
.OrderByDescending(x => x.Count) var param = new List<string> { "CROWN_ANGLE", "CROWN_HEIGHT" };
.ThenByDescending(x => x.Point.Y)
.FirstOrDefault()?.Point; StringBuilder sbShowText = new StringBuilder();
if(!points.HasValue)continue; foreach (var p in param)
Vector3 point = points.Value; {
//取值 var detail = ViewportManager.DiamondData[$"{p}_DETAIL"];
var paramValue = detail[$"{valParam}_{valIndex}"]; var paramValue = detail[$"{p}_{facetIndex}"];
var valueFloat = ValueFormat(paramValue.ToString(), valParam); var valueFloat = ValueFormat(paramValue.ToString(), p, true);
result.Add(DisplayText3D($"{valueFloat}%", new Vector3(point.X,point.Y+0.2f,point.Z))); 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; return result;
} }

@ -23,6 +23,10 @@ public class ViewportManager
public static List<Viewport3DTriangleEntity> ViewportTriangle = new List<Viewport3DTriangleEntity>(); public static List<Viewport3DTriangleEntity> ViewportTriangle = new List<Viewport3DTriangleEntity>();
public static JsonObject DiamondData = new JsonObject(); public static JsonObject DiamondData = new JsonObject();
public static string DiamondCode = string.Empty;
//钻石类型
public static string DiamondType = string.Empty;
/// <summary> /// <summary>
/// 模型正方向(从模型中心出发的方向) /// 模型正方向(从模型中心出发的方向)
/// </summary> /// </summary>

@ -1,5 +1,7 @@
using System.Text.Json.Nodes; using System.Text.Json.Nodes;
using SharpDX; using SharpDX;
using SparkClient.Model.Extension;
using SparkClient.Model.Helper;
using SparkClient.Views.UserControl.ViewportData.Entity; using SparkClient.Views.UserControl.ViewportData.Entity;
using SparkClient.Views.UserControl.ViewportData.Enum; using SparkClient.Views.UserControl.ViewportData.Enum;
using SparkClient.Views.UserControl.ViewportData.Helper; using SparkClient.Views.UserControl.ViewportData.Helper;
@ -93,6 +95,8 @@ public class ViewportData
ViewportManager.PositiveDirection.Z = 0; ViewportManager.PositiveDirection.Z = 0;
} }
ViewportManager.DiamondCode = DiamondCode;
ViewportManager.DiamondType = json.AsObject()["error_msg"].ToSafeString();
var measurements = json.AsObject()["measurements"]; var measurements = json.AsObject()["measurements"];
ViewportManager.DiamondData = measurements==null?new JsonObject():measurements.AsObject(); 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)) var midZ = facets.SelectMany(e => new[] { e.Point1.X, e.Point2.X, e.Point3.X }).OrderBy(z => Math.Abs(z))

Loading…
Cancel
Save