You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.7 KiB
132 lines
4.7 KiB
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<Viewport3DTriangleEntity> triangles = new List<Viewport3DTriangleEntity>(); |
|
List<GeometryModel3D> mouseAddModels = new List<GeometryModel3D>(); |
|
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); |
|
}; |
|
} |
|
|
|
|
|
/// <summary> |
|
/// 点击模型 |
|
/// </summary> |
|
/// <param name="sender"></param> |
|
/// <param name="e"></param> |
|
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<Viewport3DTriangleEntity> 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<Viewport3DTriangleEntity> 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) |
|
{ |
|
|
|
} |
|
|
|
private void DataGrid_SelectionChanged_1(object sender, SelectionChangedEventArgs e) |
|
{ |
|
|
|
} |
|
} |