using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media.Media3D; using HelixToolkit.Wpf.SharpDX; using SharpDX; using SparkClient.Model.Entity; using SparkClient.Model.Helper; using SparkClient.ViewModel.Grading; using GeometryModel3D = HelixToolkit.Wpf.SharpDX.GeometryModel3D; using MeshGeometry3D = HelixToolkit.Wpf.SharpDX.MeshGeometry3D; using PerspectiveCamera = HelixToolkit.Wpf.SharpDX.PerspectiveCamera; namespace SparkClient.Views.Grading; public partial class GradingResult { List triangles = new List(); List mouseAddModels = new List(); public GradingResult() { InitializeComponent(); 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); }; } /// /// 点击模型 /// /// /// 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"); } } }