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

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