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.
297 lines
10 KiB
297 lines
10 KiB
using System.Windows; |
|
using System.Windows.Controls; |
|
using System.Windows.Controls.Primitives; |
|
using System.Windows.Forms.VisualStyles; |
|
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 GradingLoading |
|
{ |
|
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 GradingLoading() |
|
{ |
|
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")); |
|
} |
|
} |
|
} |