fix: 3D模型优化

master
Tongg 5 months ago
parent 1da22e4d52
commit 5005419912
  1. 8
      SparkClient.csproj
  2. 6
      SparkClient.sln.DotSettings.user
  3. 2
      Views/UserControl/Viewport3D.xaml.cs
  4. 16
      Views/UserControl/ViewportData/Helper/UnityHelper.cs
  5. 179
      Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs
  6. 5
      Views/UserControl/ViewportData/Helper/ViewportManager.cs

@ -7,6 +7,13 @@
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
<ApplicationIcon>logo.ico</ApplicationIcon>
<Title>SparkClient - 星辉</Title>
<Authors>SparkClient Team</Authors>
<Description>SparkClient钻石检测工具</Description>
<Copyright>Copyright ©2025 北京跃洋新视科技有限公司</Copyright>
<Company>北京跃洋新视科技有限公司</Company>
<AssemblyVersion>1.0.0</AssemblyVersion>
<FileVersion>1.0.0</FileVersion>
</PropertyGroup>
<ItemGroup>
@ -19,6 +26,7 @@
<PackageReference Include="HandyControl" Version="3.5.1" />
<PackageReference Include="HandyControl.Lang.en" Version="3.5.1" />
<PackageReference Include="HandyControls.Lang.zh-CN" Version="3.5.3" />
<PackageReference Include="HelixToolkit.SharpDX.Assimp" Version="2.25.0" />
<PackageReference Include="HelixToolkit.Wpf" Version="2.25.0" />
<PackageReference Include="HelixToolkit.Wpf.SharpDX" Version="2.25.0" />
<PackageReference Include="log4net" Version="3.0.3" />

@ -32,8 +32,10 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8a03fcac5714437e83949a44ecf2e771c90920_003F6e_003F464f2557_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExecutionContext_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003F35_003F053c62c1_003FExecutionContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExporter_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F876888135b7d44baac30e9ec038e9f39f200_003F56_003F10f4418e_003FExporter_002Ecs_002Fz_003A2_002D1/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFileSystem_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F4c69bf2d25bb4f2497b2dbd14727a7811308b0_003F9b_003F7ca26691_003FFileSystem_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFile_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003F00_003Fb0994fb0_003FFile_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFolderBrowserDialog_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f2f0b08d2574f1aa35973d1cd0ae347cef920_003Fc5_003Fcd61a412_003FFolderBrowserDialog_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFrameworkElement_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6412d4331611499aab4eb63809a2a83bf60910_003F07_003Fdab5922a_003FFrameworkElement_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFrameworkElement_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6412d4331611499aab4eb63809a2a83bf60910_003F07_003Fdab5922a_003FFrameworkElement_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFuture_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F6f90c6c13479b8c2a5be98f3d75dfc3bd885a055652d8a32904ca2448132949e_003FFuture_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@ -55,11 +57,14 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMessageBox_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F476b8dbfd2cb40ab8ff230fdcda5e37081d20_003F0e_003F12425a46_003FMessageBox_002Ecs_002Fz_003A2_002D1/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMessageBox_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffdc001c928464b80ad45ffa09b838a3a15e200_003F55_003F1a844f6e_003FMessageBox_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMethodBaseInvoker_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd882146b4f265f10bcbec2663fce248db9ffec5fa1aeaf76e32a11ba5eafcd6_003FMethodBaseInvoker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AObjExporter_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F68d37d16685244cf9996bf767117a771210200_003Fb5_003F8d39bfb2_003FObjExporter_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APictureBoxSizeMode_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f2f0b08d2574f1aa35973d1cd0ae347cef920_003Fb2_003F76f4e66c_003FPictureBoxSizeMode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APrintPreviewDialog_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f2f0b08d2574f1aa35973d1cd0ae347cef920_003F07_003Fd26ee918_003FPrintPreviewDialog_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APropertyChangedEventArgs_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F4a37508f5f72412da47f18c02ce8145313928_003F27_003F53f616d3_003FPropertyChangedEventArgs_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARoutedEventArgs_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F1a88b4a860176dd5f825206bbebf3ee3d44ff3f058ceed9eb693c1eaa018_003FRoutedEventArgs_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARuntimeType_002ECoreCLR_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F955ec549fe664629353c3b5424b6ad6c7dfcec4ab59bae709ab962c228cf45_003FRuntimeType_002ECoreCLR_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARuntimeType_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5147b10c5a8c4522b56fba0a889139cfc8f908_003F45_003F2a5f113e_003FRuntimeType_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASceneNode_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcb6cfc793bda40e2bf434431c621ac561a7200_003Fc8_003Fe89a583f_003FSceneNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AScreenSpacedNode_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F68d37d16685244cf9996bf767117a771210200_003Ff9_003F61fd6f6c_003FScreenSpacedNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASerialPort_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5d0eccfb3f30419a9d4fa45d3592504e15930_003F76_003Fea59f066_003FSerialPort_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteCommand_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc7a59cb727594ed7a94648b2d66dbf702aa28_003F2f_003Fdc5f3094_003FSqliteCommand_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@ -78,6 +83,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AUndoStack_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F85eb3e3af2ef415e8072243864dec55a97e00_003F18_003F3f9ef08f_003FUndoStack_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AUnsafeNativeMethodsCLR_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F2e8b8aa5d488ba9b46d9ca2a747d6895994b3519f2f231f4e3d1af87b86320_003FUnsafeNativeMethodsCLR_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AUnwrapPromise_00601_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003F9d_003F0ea6b8e2_003FUnwrapPromise_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AVector3_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc45597e5b7ab42d99b3882b94d97e64034a00_003F78_003F89f75558_003FVector3_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindowChromeWorker_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6412d4331611499aab4eb63809a2a83bf60910_003Ff9_003F2f1adeba_003FWindowChromeWorker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd0db11e55b76dc7f234163f6cee32b297b8ddb591fb0b5cbad1b46ed17343e18_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0713c794b56e4feca091d5981a6f5967f60930_003Fc8_003F61b7e802_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>

@ -220,7 +220,7 @@ public partial class Viewport3D
break;
case "BtnShow3DView":
ObjExporter.ExportToObj2(ViewportManager.ViewportTriangle, @"D:\id03.obj");
//UnityHelper.GenerateRender(ViewportManager.ViewportTriangle.First().TriangleCode, "123");
UnityHelper.GenerateRender(ViewportManager.ViewportTriangle.First().TriangleCode, "123");
break;
}

@ -28,7 +28,7 @@ public class UnityHelper
*/
public static void GenerateRender(string modelInfo, string diamondCode)
{
string fileName = GenerateSignature(modelInfo, diamondCode) + ".stl";
string fileName = GenerateSignature(modelInfo, diamondCode);
string fullStlPath = Path.Combine(_stl_path, fileName);
// 1. 检查STL文件是否存在
@ -46,8 +46,8 @@ public class UnityHelper
CleanDirectory(_stl_path);
// 3. 导出模型为STL
ExportModelsToStl(fullStlPath);
ExportModelsToStl(fullStlPath + ".stl");
ObjExporter.ExportToObj2(ViewportManager.ViewportTriangle, fullStlPath + ".obj");
// 4. 执行Unity渲染命令两次
ExecuteUnityRendering(fileName, 0); // 渲染心图
ExecuteUnityRendering(fileName, 1); // 渲染箭图
@ -127,13 +127,15 @@ public class UnityHelper
{
Text = "心箭图模拟渲染",
Width = 800,
Height = 600
Height = 600,
MaximizeBox = false,
MinimizeBox = false,
};
PictureBox heartBox = new PictureBox
{
ImageLocation = Path.Combine(_image_path, "0.png"),
SizeMode = PictureBoxSizeMode.Zoom,
SizeMode = PictureBoxSizeMode.CenterImage,
Dock = DockStyle.Left,
Width = 400
};
@ -141,7 +143,7 @@ public class UnityHelper
PictureBox arrowBox = new PictureBox
{
ImageLocation = Path.Combine(_image_path, "1.png"),
SizeMode = PictureBoxSizeMode.Zoom,
SizeMode = PictureBoxSizeMode.CenterImage,
Dock = DockStyle.Right,
Width = 400
};
@ -151,7 +153,7 @@ public class UnityHelper
Label label = new Label
{
Text = "心箭图为模拟渲染,实际请以切工镜观测为准。",
Text = "[预览版]心箭图为模拟渲染,实际请以切工镜观测为准。",
Dock = DockStyle.Bottom,
Height = 30,
TextAlign = System.Drawing.ContentAlignment.MiddleCenter

@ -328,34 +328,94 @@ public class ViewportHelperPro
{
List<LineGeometryModel3D> result = new List<LineGeometryModel3D>();
//按面分组,腰面特殊单独生成
List<Viewport3DTriangleEntity> waistList = entities
.Where(entity => entity.PlaneType == PlaneType.Girdle)
.ToList();
List<Vector3> selFaceVector = new List<Vector3>();
// List<Viewport3DTriangleEntity> waistList = entities
// .Where(entity => entity.PlaneType == PlaneType.Girdle)
// .ToList();
// List<Vector3> selFaceVector = new List<Vector3>();
List<Tuple<Vector3, Vector3>> lines = new List<Tuple<Vector3, Vector3>>();
if (waistList.Count > 0)
// if (waistList.Count > 0)
// {
// foreach (var entity in waistList)
// {
// selFaceVector.Add(entity.Point1);
// selFaceVector.Add(entity.Point2);
// selFaceVector.Add(entity.Point3);
// }
// HashSet<Vector3> uniqueVectors = new HashSet<Vector3>(selFaceVector);
// var facetPoints = VectorClockwiseSort(uniqueVectors.ToList());
// for (int i = 0; i < facetPoints.ToList().Count - 1; i++)
// {
// var nowItem = facetPoints.ToList()[i];
// var nextItem = facetPoints.ToList()[i + 1];
// var line = new Tuple<Vector3, Vector3>(nowItem, nextItem);
// if (IsLineSegmentParallelToYAxis(line))
// {
// lines.Add(line);
// result.Add(DisplayLineModel3D(new List<Vector3>() { nowItem, nextItem }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness));
// }
// }
// }
Dictionary<string, List<Viewport3DTriangleEntity>> feactList = entities
.Where(entity => entity.PlaneType == PlaneType.Girdle)
.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList());
foreach (var yaoFace in feactList)
{
foreach (var entity in waistList)
List<Vector3> selFaceVector = new List<Vector3>();
foreach (var entity in yaoFace.Value)
{
selFaceVector.Add(entity.Point1);
selFaceVector.Add(entity.Point2);
selFaceVector.Add(entity.Point3);
}
HashSet<Vector3> uniqueVectors = new HashSet<Vector3>(selFaceVector);
for (int i = 0; i < selFaceVector.ToList().Count - 1; i++)
var facetPoints = VectorClockwiseSort(uniqueVectors.ToList());
Vector3 center = GetCentroid(uniqueVectors.ToList());
Console.WriteLine($"{yaoFace.Key} \t {center.X} \t {center.Y} \t {center.Z}");
List<Vector3> leftLine = new List<Vector3>();
List<Vector3> rightLine = new List<Vector3>();
foreach (var point in facetPoints)
{
var nowItem = selFaceVector.ToList()[i];
var nextItem = selFaceVector.ToList()[i + 1];
var line = new Tuple<Vector3, Vector3>(nowItem, nextItem);
if (IsLineSegmentParallelToYAxis(line))
var direction = point - center;
var cross = Vector3.Cross(new Vector3(0, 0, 1), direction);
if (cross.Y >= 0)
{
rightLine.Add(point);
}
else
{
lines.Add(line);
result.Add(DisplayLineModel3D(new List<Vector3>() { nowItem, nextItem }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness));
leftLine.Add(point);
}
}
}
if (rightLine.Count == 2 && leftLine.Count == 2)
{
var leftLineTuple = new Tuple<Vector3, Vector3>(leftLine.First(), leftLine.Last());
var rightLineTuple = new Tuple<Vector3, Vector3>(rightLine.First(), rightLine.Last());
lines.Add(leftLineTuple);
lines.Add(rightLineTuple);
result.Add(DisplayLineModel3D(new List<Vector3>() { leftLine.First(), leftLine.Last() }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness));
result.Add(DisplayLineModel3D(new List<Vector3>() { rightLine.First(), rightLine.Last() }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness));
}
// for (int i = 0; i < facetPoints.ToList().Count - 1; i++)
// {
// var nowItem = facetPoints.ToList()[i];
// var nextItem = facetPoints.ToList()[i + 1];
// var line = new Tuple<Vector3, Vector3>(nowItem, nextItem);
// if (IsLineSegmentParallelToYAxis(line))
// {
// lines.Add(line);
// result.Add(DisplayLineModel3D(new List<Vector3>() { nowItem, nextItem }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness));
// }
// }
}
CalculateLineSegmentStats(lines, out ViewportManager.MainModelGirdleMaxLines, out ViewportManager.MainModelGirdleMinLines, out ViewportManager.MainModelGirdleAvgLines);
ViewportManager.MainModelGirdleLines = lines;
return result;
@ -490,20 +550,27 @@ public class ViewportHelperPro
return result;
}
int linePointType = facetIndex % 4;
Console.WriteLine(facetIndex);
switch (linePointType)
{
case 0:
case 3:
var longestLine1 = GetLongestOrShortestLineSegment(facetPoints, returnLongest: true);
case 2:
var longestLine1 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 24 && facetIndex <= 55 ? true : false);
result.Add(DisplayLineModel3D(new List<Tuple<Vector3, Vector3>>() { longestLine1 }, new Color4(1f, 0, 0, 1f), 2f));
break;
case 1:
case 2:
var longestLine2 = GetLongestOrShortestLineSegment(facetPoints, returnLongest: false);
case 3:
var longestLine2 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 24 && facetIndex <= 55 ? 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;
@ -1129,20 +1196,28 @@ public class ViewportHelperPro
public static LineGeometryModel3D DisplayLineModel3D(List<Tuple<Vector3, Vector3>> points, Color4 lineColor,
double thickness = 1.0)
{
var lineBuilder = new LineBuilder();
foreach (var line in points)
try
{
lineBuilder.AddLine(line.Item1, line.Item2);
var lineBuilder = new LineBuilder();
foreach (var line in points)
{
lineBuilder.AddLine(line.Item1, line.Item2);
}
var edgeLinesModel = new LineGeometryModel3D
{
Geometry = lineBuilder.ToLineGeometry3D(),
Color = lineColor.ToColor(),
Thickness = thickness,
};
return edgeLinesModel;
}
var edgeLinesModel = new LineGeometryModel3D
catch (Exception e)
{
Geometry = lineBuilder.ToLineGeometry3D(),
Color = lineColor.ToColor(),
Thickness = thickness,
};
return edgeLinesModel;
Logger.Error(e.Message);
Logger.Error(e.StackTrace);
return null;
}
}
/// <summary>
@ -1865,12 +1940,12 @@ public class ViewportHelperPro
var v = p2 - p0;
return Vector3.Cross(u, v);
}
private static bool IsLineSegmentParallelToYAxis(Tuple<Vector3, Vector3> lineSegment,float epsilon = 1e-6f)
private static bool IsLineSegmentParallelToYAxis(Tuple<Vector3, Vector3> lineSegment,float epsilon = 0.001f)
{
Vector3 nowItem = lineSegment.Item1;
Vector3 nextItem = lineSegment.Item2;
if (Math.Abs(nowItem.X - nextItem.X) < epsilon && Math.Abs(nowItem.Z - nextItem.Z) < epsilon)
//&& Math.Abs(nowItem.Z - nextItem.Z) < epsilon
if (Math.Abs(nowItem.X - nextItem.X) < epsilon )
{
return true; // 平行于 Y 轴
}
@ -1888,6 +1963,8 @@ public class ViewportHelperPro
Tuple<Vector3, Vector3> resultSegment = null;
float resultLength = returnLongest ? float.MinValue : float.MaxValue; // 初始化为最小或最大长度
facetPoints = VectorClockwiseSort(new System.Collections.Generic.HashSet<Vector3>(facetPoints).ToList());
// 遍历所有相邻的点,构成线段
for (int i = 0; i < facetPoints.Count; i++)
{
@ -1911,6 +1988,40 @@ public class ViewportHelperPro
return resultSegment; // 返回符合条件的线段
}
private static Tuple<Vector3, Vector3> GetLeftOrRightLineSegment(List<Vector3> facetPoints,
bool isLeft = true)
{
Tuple<Vector3, Vector3> resultSegment = null;
//去重
facetPoints = VectorClockwiseSort(new System.Collections.Generic.HashSet<Vector3>(facetPoints).ToList());
//计算中心点
Vector3 center = GetCentroid(facetPoints);
List<Vector3> leftList = new List<Vector3>();
List<Vector3> rightList = new List<Vector3>();
foreach (var point in facetPoints)
{
Vector3 direction = point - center;
Vector3 cross = Vector3.Cross(new Vector3(0,0,1), direction);
if (cross.Y >= 0)
rightList.Add(point);
else
leftList.Add(point);
}
if (isLeft)
resultSegment = new Tuple<Vector3, Vector3>(leftList.First(), leftList.Last());
else
resultSegment = new Tuple<Vector3, Vector3>(rightList.First(), rightList.Last());
return resultSegment; // 返回符合条件的线段
}
private static void CalculateLineSegmentStats(List<Tuple<Vector3, Vector3>> lines,
out Tuple<Vector3, Vector3> maxLine,
out Tuple<Vector3, Vector3> minLine,

@ -166,7 +166,10 @@ public class ViewportManager
// if (DoubleClickSelectShowBorderAngle) models.Add(SelShowType.BorderAngle);
if (DoubleClickSelectShowPlaneType) models.Add(SelShowType.IsTypePanel);
ChooseAddModels.AddRange(ViewportHelperPro.GentrateChosenView(ChooseTriangleCode, valType, models.ToArray()));
ChooseAddModels.ForEach(e => _viewport.Items.Add(e));
ChooseAddModels.ForEach(e =>
{
if (e != null) _viewport.Items.Add(e);
});
}
/// <summary>
/// 清除所有的选中效果

Loading…
Cancel
Save