diff --git a/Language/zh_CN.xaml b/Language/zh_CN.xaml index ae150a7..19ce6a7 100644 --- a/Language/zh_CN.xaml +++ b/Language/zh_CN.xaml @@ -99,4 +99,18 @@ 定级标准 保存路径不存在 RULE_NAME + + + 正面视角 + 截图当前视角到PNG + 显示模型面 + 显示模型边框 + 显示光照 + 双击选择面 + 显示选择面的边框 + 显示选择面边框长度文本 + 显示选择面夹角角度文本 + 显示选择面的同类面 + 显示瑕疵面 + 显示正方向标识 \ No newline at end of file diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 5fffa87..462342a 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -86,7 +86,7 @@ public partial class MainWindow { DataBaseHelper.CloseConnection(); this.Close(); - Application.Current.Shutdown(); + Environment.Exit(0); } } diff --git a/Resource/Images/UserControl/Bottom@3x.png b/Resource/Images/UserControl/Bottom@3x.png new file mode 100644 index 0000000..90231de Binary files /dev/null and b/Resource/Images/UserControl/Bottom@3x.png differ diff --git a/Resource/Images/UserControl/Top@3x.png b/Resource/Images/UserControl/Top@3x.png new file mode 100644 index 0000000..9bc8fee Binary files /dev/null and b/Resource/Images/UserControl/Top@3x.png differ diff --git a/Resource/Images/UserControl/arrow.png b/Resource/Images/UserControl/arrow.png new file mode 100644 index 0000000..0402534 Binary files /dev/null and b/Resource/Images/UserControl/arrow.png differ diff --git a/Resource/Images/UserControl/biaochi1@3x.png b/Resource/Images/UserControl/biaochi1@3x.png new file mode 100644 index 0000000..dc08e80 Binary files /dev/null and b/Resource/Images/UserControl/biaochi1@3x.png differ diff --git a/Resource/Images/UserControl/biaochi2@3x.png b/Resource/Images/UserControl/biaochi2@3x.png new file mode 100644 index 0000000..3291b3e Binary files /dev/null and b/Resource/Images/UserControl/biaochi2@3x.png differ diff --git a/Resource/Images/UserControl/zuanshi@1x.png b/Resource/Images/UserControl/zuanshi@1x.png new file mode 100644 index 0000000..f808965 Binary files /dev/null and b/Resource/Images/UserControl/zuanshi@1x.png differ diff --git a/Resource/Images/UserControl/zuanshi@3x.png b/Resource/Images/UserControl/zuanshi@3x.png new file mode 100644 index 0000000..e51dbfd Binary files /dev/null and b/Resource/Images/UserControl/zuanshi@3x.png differ diff --git a/SparkClient.csproj b/SparkClient.csproj index a920f72..abc6cc5 100644 --- a/SparkClient.csproj +++ b/SparkClient.csproj @@ -95,6 +95,21 @@ + + + + + + + + + + + + + + + diff --git a/Views/Grading/GradingResult.xaml b/Views/Grading/GradingResult.xaml index 7e0d8df..f0925a1 100644 --- a/Views/Grading/GradingResult.xaml +++ b/Views/Grading/GradingResult.xaml @@ -6,6 +6,7 @@ xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:local="clr-namespace:SparkClient.Views.Grading" xmlns:hx="http://helix-toolkit.org/wpf/SharpDX" + xmlns:userControl="clr-namespace:SparkClient.Views.UserControl" mc:Ignorable="d" d:DesignWidth="1000" d:DesignHeight="600" @@ -134,39 +135,39 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/Views/Grading/GradingResult.xaml.cs b/Views/Grading/GradingResult.xaml.cs index 63db910..0487d9a 100644 --- a/Views/Grading/GradingResult.xaml.cs +++ b/Views/Grading/GradingResult.xaml.cs @@ -22,21 +22,21 @@ public partial class GradingResult DataContext = new GradingResultVM(null); - this.Viewport3Dx.EffectsManager = new DefaultEffectsManager(); - this.Viewport3Dx.Camera = new PerspectiveCamera() - { - Position = new Point3D(0, 0, 5), - LookDirection = new Vector3D(0, 0, -1), - UpDirection = new Vector3D(0, 1, 0), - FarPlaneDistance = 1000, - NearPlaneDistance = 0.1 - }; - - Loaded += (sender, args) => - { - var entities = Viewport3DHelper.InitDemo(Viewport3Dx); - triangles.AddRange(entities); - }; + // this.Viewport3Dx.EffectsManager = new DefaultEffectsManager(); + // this.Viewport3Dx.Camera = new PerspectiveCamera() + // { + // Position = new Point3D(0, 0, 5), + // LookDirection = new Vector3D(0, 0, -1), + // UpDirection = new Vector3D(0, 1, 0), + // FarPlaneDistance = 1000, + // NearPlaneDistance = 0.1 + // }; + + // Loaded += (sender, args) => + // { + // var entities = Viewport3DHelper.InitDemo(Viewport3Dx); + // triangles.AddRange(entities); + // }; } @@ -47,77 +47,77 @@ public partial class GradingResult /// private void Viewport3Dx_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { - // 获取鼠标点击位置 - var mousePosition = e.GetPosition(Viewport3Dx); - - // 查找鼠标点击的 3D 对象 - var hits = Viewport3Dx.FindHits(mousePosition); - - // 如果没有命中任何 3D 对象 - if (hits == null || hits.Count == 0) - { - Console.WriteLine("未点击到任何模型"); - foreach (var item in mouseAddModels) - { - Viewport3Dx.Items.Remove(item); - } - mouseAddModels.Clear(); - return; - } - - // 获取第一个命中的对象 - var hit = hits[0]; - - // 检查是否是 MeshGeometryModel3D - if (hit.ModelHit is MeshGeometryModel3D modelHit) - { - foreach (var item in mouseAddModels) - { - Viewport3Dx.Items.Remove(item); - } - mouseAddModels.Clear(); - // 获取几何信息 - var geometry = modelHit.Geometry as MeshGeometry3D; - if (geometry != null) - { - // 获取命中的三角形索引 - var triangleIndex = hit.TriangleIndices; - - // 获取三角形顶点 - var vertex1 = geometry.Positions[triangleIndex.Item1]; - var vertex2 = geometry.Positions[triangleIndex.Item2]; - var vertex3 = geometry.Positions[triangleIndex.Item3]; - - string strPoint = vertex1.X + ","+ vertex1.Y+","+ vertex1.Z + ";"+ vertex2.X + ","+ vertex2.Y + ","+ vertex2.Z+";"+vertex3.X + ","+ vertex3.Y + ","+ vertex3.Z; - string triangleCode = Viewport3DTriangleEntity.GenerateMD5Hash(strPoint); - - //命中实体 - Viewport3DTriangleEntity res = triangles.Find(e => triangleCode.Equals(e.TriangleCode)); - - if (res == null) - return; - - //命中面 - List facet = triangles.Where(e => res.PlaneCode.Equals(e.PlaneCode)).ToList(); - var colorFacet = new Color4(1.0f, 1.0f, 0.0f, 1.0f); - var data1 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facet,colorFacet); - mouseAddModels.AddRange(data1); - //命中面标线 - var data2 = Viewport3DHelper.GenerateLineTextModelByEntity(Viewport3Dx, facet); - mouseAddModels.AddRange(data2); - //命中同类面 - List facetType = triangles.Where(e => res.PlaneType.Equals(e.PlaneType)).ToList(); - //排除自己 - facet.ForEach(e=>facetType.Remove(e)); - var colorFacetType = new Color4(0.9f, 0.9f, 0.7f, 1.0f); - var data3 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facetType,colorFacetType); - mouseAddModels.AddRange(data3); - } - } - else - { - Console.WriteLine("点击的对象不是 MeshGeometryModel3D"); - } + // // 获取鼠标点击位置 + // var mousePosition = e.GetPosition(Viewport3Dx); + // + // // 查找鼠标点击的 3D 对象 + // var hits = Viewport3Dx.FindHits(mousePosition); + // + // // 如果没有命中任何 3D 对象 + // if (hits == null || hits.Count == 0) + // { + // Console.WriteLine("未点击到任何模型"); + // foreach (var item in mouseAddModels) + // { + // Viewport3Dx.Items.Remove(item); + // } + // mouseAddModels.Clear(); + // return; + // } + // + // // 获取第一个命中的对象 + // var hit = hits[0]; + // + // // 检查是否是 MeshGeometryModel3D + // if (hit.ModelHit is MeshGeometryModel3D modelHit) + // { + // foreach (var item in mouseAddModels) + // { + // Viewport3Dx.Items.Remove(item); + // } + // mouseAddModels.Clear(); + // // 获取几何信息 + // var geometry = modelHit.Geometry as MeshGeometry3D; + // if (geometry != null) + // { + // // 获取命中的三角形索引 + // var triangleIndex = hit.TriangleIndices; + // + // // 获取三角形顶点 + // var vertex1 = geometry.Positions[triangleIndex.Item1]; + // var vertex2 = geometry.Positions[triangleIndex.Item2]; + // var vertex3 = geometry.Positions[triangleIndex.Item3]; + // + // string strPoint = vertex1.X + ","+ vertex1.Y+","+ vertex1.Z + ";"+ vertex2.X + ","+ vertex2.Y + ","+ vertex2.Z+";"+vertex3.X + ","+ vertex3.Y + ","+ vertex3.Z; + // string triangleCode = Viewport3DTriangleEntity.GenerateMD5Hash(strPoint); + // + // //命中实体 + // Viewport3DTriangleEntity res = triangles.Find(e => triangleCode.Equals(e.TriangleCode)); + // + // if (res == null) + // return; + // + // //命中面 + // List facet = triangles.Where(e => res.PlaneCode.Equals(e.PlaneCode)).ToList(); + // var colorFacet = new Color4(1.0f, 1.0f, 0.0f, 1.0f); + // var data1 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facet,colorFacet); + // mouseAddModels.AddRange(data1); + // //命中面标线 + // var data2 = Viewport3DHelper.GenerateLineTextModelByEntity(Viewport3Dx, facet); + // mouseAddModels.AddRange(data2); + // //命中同类面 + // List facetType = triangles.Where(e => res.PlaneType.Equals(e.PlaneType)).ToList(); + // //排除自己 + // facet.ForEach(e=>facetType.Remove(e)); + // var colorFacetType = new Color4(0.9f, 0.9f, 0.7f, 1.0f); + // var data3 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facetType,colorFacetType); + // mouseAddModels.AddRange(data3); + // } + // } + // else + // { + // Console.WriteLine("点击的对象不是 MeshGeometryModel3D"); + // } } private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) diff --git a/Views/UserControl/Viewport3D.xaml b/Views/UserControl/Viewport3D.xaml new file mode 100644 index 0000000..6d71402 --- /dev/null +++ b/Views/UserControl/Viewport3D.xaml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Views/UserControl/Viewport3D.xaml.cs b/Views/UserControl/Viewport3D.xaml.cs new file mode 100644 index 0000000..2fdb1cf --- /dev/null +++ b/Views/UserControl/Viewport3D.xaml.cs @@ -0,0 +1,41 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using HandyControl.Controls; + +namespace SparkClient.Views.UserControl; + +public partial class Viewport3D +{ + public Viewport3D() + { + InitializeComponent(); + DataContext = this; + } + + private void MenuItem_OnChecked(object sender, RoutedEventArgs e) + { + Growl.InfoGlobal("Viewport is checked" + e.OriginalSource); + } + + private void MenuItem_OnUnchecked(object sender, RoutedEventArgs e) + { + Growl.InfoGlobal("Viewport is Unchecked" + e.OriginalSource); + } + + private void UIElement_OnPreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e) + { + MainBorder.ContextMenu.IsOpen = true; + } + + private void UIElement_OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) + { + MainBorder.ContextMenu.IsOpen = false; + e.Handled = true; + } + + private void MenuItem_OnClick(object sender, RoutedEventArgs e) + { + + } +} \ No newline at end of file