feat: Factory Model

master
Tongg 4 months ago
parent 8ead72772d
commit bb800bbd0d
  1. 28
      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. 821
      Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs
  14. 4
      Views/UserControl/ViewportData/Helper/ViewportManager.cs
  15. 6
      Views/UserControl/ViewportData/ViewportData.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;
/// </summary>
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("==== ==== ==== ==== ==== ==== ==== ====");
}
}

@ -239,4 +239,8 @@
<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="CustomSettingPageRunModeSet">RunModel</sys:String>
<sys:String x:Key="CustomSettingPageFactory">Factory</sys:String>
<sys:String x:Key="CustomSettingPageLaboratory">Laboratory</sys:String>
</ResourceDictionary>

@ -239,4 +239,9 @@
<sys:String x:Key="GradingLoadingPrevious">上一帧</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>

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

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

@ -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)
{

@ -113,9 +113,27 @@ public class DiamondSelectVM : BaseViewModel
item.IsHighlighted = true;
};
List<ButtonViewModel> tempButtons2 = new List<ButtonViewModel>();
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;
}
}

@ -157,6 +157,12 @@ public class GradingLoadingVM : BaseViewModel,IDisposable
stringBuilder.Append(line);
}
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();
return 0;
}

@ -57,6 +57,8 @@
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Style="{DynamicResource BorderRowStyle}">
@ -144,52 +146,16 @@
DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding RuleId, Mode=TwoWay}"/>
</Grid>
</Border>
<!-- <Label Grid.Row="2" Content="{DynamicResource LanguageSettings}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="150" /> -->
<!-- <ComboBox Grid.Row="2" Grid.Column="1" Background="White" Width="150" HorizontalAlignment="Left" -->
<!-- ItemsSource="{Binding Languages}" Margin="10 0" DisplayMemberPath="Key" SelectedValuePath="Value" -->
<!-- SelectedValue="{Binding LanguageId, Mode=TwoWay}" > -->
<!-- </ComboBox> -->
<!-- <GridSplitter Grid.Row="3" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter> -->
<!-- <Label Content="{DynamicResource UpdateFile}" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="5" Grid.Row="4" Grid.Column="0" Width="150"/> -->
<!-- <Grid Grid.Row="4" Grid.Column="1" Width="88" HorizontalAlignment="Left"> -->
<!-- <Grid.RowDefinitions> -->
<!-- <RowDefinition /> -->
<!-- <RowDefinition /> -->
<!-- <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> -->
<Border Grid.Row="4" Style="{DynamicResource BorderRowStyle}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{StaticResource CustomSettingPageRunModeSet}" Style="{DynamicResource TextBlockStyle}" />
<ComboBox Grid.Column="1" Background="White" Width="150" HorizontalAlignment="Left" ItemsSource="{Binding RunMode}"
DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding NowRunMode, Mode=TwoWay}"/>
</Grid>
</Border>
</Grid>
</Border>

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

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

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

@ -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
/// <returns></returns>
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>();
if (selFacetType == PlaneType.Girdle && string.IsNullOrWhiteSpace(valKey))
string steps = ViewportManager.DiamondType.Split(" ").Last();
if (Common.RunMode == 0 && steps.StartsWith("S"))
{
// 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 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;
// }
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<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)
if (selFacetType == PlaneType.Girdle && string.IsNullOrWhiteSpace(valKey))
{
// 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 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;
// 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<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>>();
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<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;
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 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<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 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;
}
}
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)
else
{
var value = kv.Value;
var key = kv.Key;
var facetIndex = -1;
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($"【面文本生成】 命中面{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)
{
continue;
}
if (groupedDic.Count == 1)
{
var paramValue = ViewportManager.DiamondData[$"{param}"];
if (paramValue == null)
List<Vector3> tablePointList = new List<Vector3>();
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<Vector3> tablePointSet = new HashSet<Vector3>(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<Tuple<Vector3, Vector3>> line = new List<Tuple<Vector3, Vector3>>();
for (int i = 0; i < tablePointList.Count / 2; i++)
{
Logger.Info($"【面文本生成】 {param}_DETAIL Key不存在");
continue;
line.Add(new Tuple<Vector3, Vector3>(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<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;
}
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<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++)
if (PlaneType.StarFacet == selFacetType || PlaneType.UpperGirdleFacet == selFacetType)
{
List<Vector3> pointsTemp = new List<Vector3>();
allStartEntityGroupByFacet[$"13_{i}"].ForEach(e =>
//星刻面: 在底面的点显示 星刻面长度比
//上腰面: 在顶面的点显示 对应星刻面的 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++)
{
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<Vector3> pointsTemp = new List<Vector3>();
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<Viewport3DTriangleEntity> 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<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 (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<Viewport3DTriangleEntity> allLowerGirdleEntity =
ViewportManager.ViewportTriangle.FindAll(e => e.PlaneType == PlaneType.LowerGirdleFact);
var allLowerGirdleGroupByFacet = allLowerGirdleEntity.GroupBy(entity => entity.PlaneCode)
//有效数据
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 detail = ViewportManager.DiamondData[$"{valParam}_DETAIL"];
for (int i = 0; i < 8; i++)
foreach (var kv in groupedDic)
{
var valIndex = i + 1;
//获取点
List<Vector3> pointsTemp = new List<Vector3>();
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<Vector3> facetPoints = new List<Vector3>();
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<string> { "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;
}

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

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

Loading…
Cancel
Save