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.

295 lines
10 KiB

using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using log4net;
using SparkClient.ViewModel.Grading;
using GeometryModel3D = HelixToolkit.Wpf.SharpDX.GeometryModel3D;
namespace SparkClient.Views.Grading;
public partial class GradingResult
{
private static readonly ILog Logger = LogManager.GetLogger(typeof(GradingResult));
// List<Viewport3DTriangleEntity> triangles = new List<Viewport3DTriangleEntity>();
List<GeometryModel3D> mouseAddModels = new List<GeometryModel3D>();
// 用于记录当前所有已存在的Popup
private List<Popup> _allPopups = new List<Popup>();
public GradingResult()
{
InitializeComponent();
// 在Window最外层捕获鼠标点击,判断是否点击在Popup之外,如果是则关闭所有Popup
this.PreviewMouseLeftButtonDown += Window_PreviewMouseLeftButtonDown;
//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 ChangSymLevel(object sender, SelectionChangedEventArgs e)
{
var d = DataContext as GradingResultVM;
d.ChangeSym(null);
}
// private void dataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
// {
// detailPopup.IsOpen = false;
// // 获取点击的目标元素
// var element = sender as FrameworkElement;
//
// var cell = FindVisualParent<DataGridCell>(element);
// if (cell == null) return;
//
// var row = FindVisualParent<DataGridRow>(cell);
// if (row == null) return;
//
// if (element != null)
// {
// // 将 firstCell 的边界转换为屏幕坐标系
// var firstCellBounds = cell.PointToScreen(new Point(0, 0));
//
// // 计算Popup的位置
// var popupPosition = new Point(firstCellBounds.X + cell.RenderSize.Width, firstCellBounds.Y + cell.RenderSize.Height);
// var selectObject = row.Item as DataInfo;
// string testItemId = selectObject.TestItemId;
// var d = DataContext as GradingResultVM;
// RowDetail rowDetail = d.getSelectData(testItemId);
// // 设置Popup的位置
// detailPopup.HorizontalOffset = popupPosition.X;
// detailPopup.VerticalOffset = popupPosition.Y;
// detailPopup.IsOpen = true;
// RowDetail.Items.Clear();
// RowDetail.Items.Add(rowDetail);
// }
// }
// 辅助方法:查找父元素
private T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
{
var parentObject = VisualTreeHelper.GetParent(child);
if (parentObject == null) return null;
if (parentObject is T parent)
{
return parent;
}
else
{
return FindVisualParent<T>(parentObject);
}
}
// private void Window_MouseDown(object sender, MouseButtonEventArgs e)
// {
// detailPopup.IsOpen = false;
// }
//
// private void Window_MouseDown(object sender, RoutedEventArgs e)
// {
// detailPopup.IsOpen = false;
// }
private void ClickArea_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var border = sender as Border;
if (border == null) return;
var parentGrid = border.Parent as Grid;
if (parentGrid == null) return;
var popup = parentGrid.FindName("RowPopup") as Popup;
if (popup == null) return;
popup.DataContext = this.DataContext;
// 先关闭所有已显示的 Popup
CloseAllPopups();
var oo = FindVisualParent<DataGridRow>(parentGrid);
if(oo == null) return;
var d = DataContext as GradingResultVM;
RowDetail rowDetail = d.getSelectData((oo.Item as DataInfo).TestItemId);
if (!_allPopups.Contains(popup))
{
_allPopups.Add(popup);
}
// 显示新Popup
popup.IsOpen = true;
popup.Visibility = Visibility.Visible;
}
private void CloseAllPopups()
{
foreach (var p in _allPopups)
{
p.IsOpen = false;
p.Visibility = Visibility.Collapsed;
}
}
private void CloseAllPopup_Click(object sender, RoutedEventArgs e)
{
CloseAllPopups();
}
private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// originalSource 是点击处的控件
var clickedElement = e.OriginalSource as DependencyObject;
// 遍历所有已知 Popup
bool isClickOnAnyPopup = false;
foreach (var p in _allPopups)
{
// 如果此 Popup 不可见或未打开,就不用检查了
if (!p.IsOpen)
continue;
// 判断点击处是否在此 Popup 内
if (IsDescendantOf(p.Child, clickedElement))
{
// 找到一个 Popup 包含这个点击
isClickOnAnyPopup = true;
break;
}
}
// 如果没点击到任何 Popup,就关闭全部
if (!isClickOnAnyPopup)
{
CloseAllPopups();
}
}
private bool IsDescendantOf(DependencyObject parent, DependencyObject clicked)
{
if (parent == null || clicked == null)
return false;
// 从 clicked 开始不断向上找 VisualTree
var current = clicked;
while (current != null)
{
if (current == parent)
{
return true;
}
current = VisualTreeHelper.GetParent(current);
}
return false;
}
private void UIElement_OnMouseLeave(object sender, MouseEventArgs e)
{
if (sender is Image image)
{
image.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/UIResource/01-8.png"));
}
}
private void UIElement_OnMouseEnter(object sender, MouseEventArgs e)
{
if (sender is Image image)
{
image.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/UIResource/01-8-1.png"));
}
}
}