|
|
|
@ -19,6 +19,8 @@ using PerspectiveCamera = HelixToolkit.Wpf.SharpDX.PerspectiveCamera; |
|
|
|
|
using System.Windows.Controls; |
|
|
|
|
using HelixToolkit.Wpf; |
|
|
|
|
using MeshBuilder = HelixToolkit.Wpf.SharpDX.MeshBuilder; |
|
|
|
|
using OrthographicCamera = HelixToolkit.Wpf.SharpDX.OrthographicCamera; |
|
|
|
|
using System.Windows.Input; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace SparkClient.Views.UserControl.ViewportData.Helper; |
|
|
|
@ -1010,7 +1012,7 @@ public class ViewportHelperPro |
|
|
|
|
/// <param name="fieldOfView"></param> |
|
|
|
|
/// <param name="aspectRatio"></param> |
|
|
|
|
/// <returns></returns> |
|
|
|
|
public static HelixToolkit.Wpf.SharpDX.PerspectiveCamera CalculateCamera(Vector3 positiveDirection, BoundingBox boundingBox, double fieldOfView = 45, double aspectRatio = 16.0 / 9.0) |
|
|
|
|
public static HelixToolkit.Wpf.SharpDX.OrthographicCamera CalculateCamera(Vector3 positiveDirection, BoundingBox boundingBox, double fieldOfView = 45, double aspectRatio = 16.0 / 9.0) |
|
|
|
|
{ |
|
|
|
|
// 单位化正方向 |
|
|
|
|
var normalizedDirection = Vector3.Normalize(positiveDirection); |
|
|
|
@ -1031,12 +1033,13 @@ public class ViewportHelperPro |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建并返回相机 |
|
|
|
|
return new HelixToolkit.Wpf.SharpDX.PerspectiveCamera |
|
|
|
|
return new HelixToolkit.Wpf.SharpDX.OrthographicCamera |
|
|
|
|
{ |
|
|
|
|
Position = cameraPosition.ToPoint3D(), |
|
|
|
|
LookDirection = lookDirection.ToVector3D(), |
|
|
|
|
UpDirection = new Vector3D(0, 1, 0), // 默认全局 Y 轴为上方向 |
|
|
|
|
FieldOfView = fieldOfView, |
|
|
|
|
NearPlaneDistance = 0.1f, |
|
|
|
|
FarPlaneDistance=1000 |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1279,11 +1282,18 @@ public class ViewportHelperPro |
|
|
|
|
/// <param name="entities"></param> |
|
|
|
|
/// <param name="thickness"></param> |
|
|
|
|
/// <returns></returns> |
|
|
|
|
public static List<LineGeometryModel3D> ShowMeshLines(List<Viewport3DTriangleEntity> entities, double thickness = 1.0) |
|
|
|
|
public static List<LineGeometryModel3D> ShowMeshLines(List<Viewport3DTriangleEntity> entities, bool isCrown = true, double thickness = 1.0) |
|
|
|
|
{ |
|
|
|
|
if (isCrown) |
|
|
|
|
{ |
|
|
|
|
moveLines = new(); |
|
|
|
|
} |
|
|
|
|
List<LineGeometryModel3D> lines = new(); |
|
|
|
|
var Y = -0.01F; |
|
|
|
|
if (!isCrown) |
|
|
|
|
{ |
|
|
|
|
Y = ViewportManager.ModelBounds.Maximum.Y + 0.01f; |
|
|
|
|
} |
|
|
|
|
var center = ViewportManager.CenterVector; |
|
|
|
|
center.Y = Y; |
|
|
|
|
Viewport3DTriangleEntity firstPoint = entities.Where(x => x.PlaneType == PlaneType.TableFacet).FirstOrDefault(); |
|
|
|
@ -1297,65 +1307,75 @@ public class ViewportHelperPro |
|
|
|
|
float r =5; |
|
|
|
|
if(double.TryParse(ViewportManager.DiamondData["M2"].ToString(), out var v)) |
|
|
|
|
{ |
|
|
|
|
r = (float)(v*0.501); |
|
|
|
|
r = (float)(v*0.51); |
|
|
|
|
} |
|
|
|
|
var x1 = r; |
|
|
|
|
var z1 = lineCal.calZ(x1); |
|
|
|
|
var x2 = -r; |
|
|
|
|
var z2 = lineCal.calZ(x2); |
|
|
|
|
edgeLines.Add(new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2))); |
|
|
|
|
//var x1 = r; |
|
|
|
|
//var z1 = lineCal.calZ(x1); |
|
|
|
|
//var x2 = -r; |
|
|
|
|
//var z2 = lineCal.calZ(x2); |
|
|
|
|
//edgeLines.Add(new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2))); |
|
|
|
|
//lines.Add(DisplayLineModel3D(edgeLines, XlineColor)); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
var XLine = lineCal.calXline(r); |
|
|
|
|
edgeLines.Add(XLine); |
|
|
|
|
lines.Add(DisplayLineModel3D(edgeLines, XlineColor)); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)),2)); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(XLine, 2)); |
|
|
|
|
var lineA = DisplayLineModel3D(edgeLines, XlineColor); |
|
|
|
|
lines.Add(lineA); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)), -2)); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(XLine, -2)); |
|
|
|
|
var lineB = DisplayLineModel3D(edgeLines, XlineColor); |
|
|
|
|
lines.Add(lineB); |
|
|
|
|
bindingMoveLine(lineA, lineB); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)), 4)); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(XLine, 4)); |
|
|
|
|
var lineE = DisplayLineModel3D(edgeLines, XlineColor); |
|
|
|
|
lines.Add(lineE); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)), -4)); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(XLine, -4)); |
|
|
|
|
var lineF = DisplayLineModel3D(edgeLines, XlineColor); |
|
|
|
|
lines.Add(lineF); |
|
|
|
|
bindingMoveLine(lineE, lineF); |
|
|
|
|
|
|
|
|
|
Color4 YlineColor = new Color4(0F, 80f, 0f, 1f); |
|
|
|
|
var x3 = r; |
|
|
|
|
var z3 = lineCal.calZVertical(x3); |
|
|
|
|
var x4 = -r; |
|
|
|
|
var z4 = lineCal.calZVertical(x4); |
|
|
|
|
//var x3 = r; |
|
|
|
|
//var z3 = lineCal.calZVertical(x3); |
|
|
|
|
//var x4 = -r; |
|
|
|
|
//var z4 = lineCal.calZVertical(x4); |
|
|
|
|
|
|
|
|
|
//edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
//edgeLines.Add(new Tuple<Vector3, Vector3>(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4))); |
|
|
|
|
//lines.Add(DisplayLineModel3D(edgeLines, YlineColor)); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(new Tuple<Vector3, Vector3>(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4))); |
|
|
|
|
var YLine = lineCal.calYline(r); |
|
|
|
|
edgeLines.Add(YLine); |
|
|
|
|
lines.Add(DisplayLineModel3D(edgeLines, YlineColor)); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(new Tuple<Vector3, Vector3>(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4)), 2)); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(YLine, 2)); |
|
|
|
|
var lineC = DisplayLineModel3D(edgeLines, YlineColor); |
|
|
|
|
lines.Add(lineC); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(new Tuple<Vector3, Vector3>(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4)), -2)); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(YLine, -2)); |
|
|
|
|
var lineD = DisplayLineModel3D(edgeLines, YlineColor); |
|
|
|
|
lines.Add(lineD); |
|
|
|
|
bindingMoveLine(lineC, lineD); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(new Tuple<Vector3, Vector3>(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4)), 4)); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(YLine, 4)); |
|
|
|
|
var lineG = DisplayLineModel3D(edgeLines, YlineColor); |
|
|
|
|
lines.Add(lineG); |
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(new Tuple<Vector3, Vector3>(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4)), -4)); |
|
|
|
|
edgeLines.Add(lineCal.calLineOfOffset(YLine, -4)); |
|
|
|
|
var lineH = DisplayLineModel3D(edgeLines, YlineColor); |
|
|
|
|
lines.Add(lineH); |
|
|
|
|
bindingMoveLine(lineG, lineH); |
|
|
|
@ -1431,12 +1451,16 @@ public class ViewportHelperPro |
|
|
|
|
private static void LineA_MouseUp3D(object sender, RoutedEventArgs e) |
|
|
|
|
{ |
|
|
|
|
isDrawing = false; |
|
|
|
|
var Viewport = ViewportManager.GetViewport3D(); |
|
|
|
|
Viewport.Cursor = Cursors.Arrow; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static void LineA_MouseDown3D(object sender, RoutedEventArgs e) |
|
|
|
|
{ |
|
|
|
|
isDrawing = true; |
|
|
|
|
if(e is HelixToolkit.Wpf.SharpDX.MouseDown3DEventArgs ev){ |
|
|
|
|
var Viewport = ViewportManager.GetViewport3D(); |
|
|
|
|
Viewport.Cursor = Cursors.SizeAll; |
|
|
|
|
// 获取鼠标点击的位置 |
|
|
|
|
var mousePosition = ev.Position; |
|
|
|
|
previousMousePosition = Get3DPointFromMouse(mousePosition); |
|
|
|
@ -1446,7 +1470,7 @@ public class ViewportHelperPro |
|
|
|
|
{ |
|
|
|
|
// 使用 HelixToolkit 的 Ray3D 和 Plane3D |
|
|
|
|
var Viewport = ViewportManager.GetViewport3D(); |
|
|
|
|
var camera = Viewport.Camera as PerspectiveCamera; |
|
|
|
|
var camera = Viewport.Camera as OrthographicCamera; |
|
|
|
|
|
|
|
|
|
// 创建射线 |
|
|
|
|
var ray = new Ray3D( |
|
|
|
@ -1482,9 +1506,13 @@ public class ViewportHelperPro |
|
|
|
|
/// <param name="radius"></param> |
|
|
|
|
/// <param name="thickness"></param> |
|
|
|
|
/// <returns></returns> |
|
|
|
|
public static LineGeometryModel3D ShowCircleLine(double radius = 1.0, double thickness = 1.0) |
|
|
|
|
public static LineGeometryModel3D ShowCircleLine(bool isCrown = true, double radius = 1.0, double thickness = 1.0) |
|
|
|
|
{ |
|
|
|
|
var Y = -0.01F; |
|
|
|
|
if (!isCrown) |
|
|
|
|
{ |
|
|
|
|
Y = ViewportManager.ModelBounds.Maximum.Y + 0.01f; |
|
|
|
|
} |
|
|
|
|
var center = ViewportManager.CenterVector; |
|
|
|
|
center.Y = Y; |
|
|
|
|
return UpdateCircleGeometry(center, initialRadius); |
|
|
|
@ -1532,6 +1560,10 @@ public class ViewportHelperPro |
|
|
|
|
// 现在鼠标对于3d模型的位置 |
|
|
|
|
var mousePosition = ev.Position; |
|
|
|
|
var Y = -0.01F; |
|
|
|
|
if (!IsCrown()) |
|
|
|
|
{ |
|
|
|
|
Y = ViewportManager.ModelBounds.Maximum.Y + 0.01F; |
|
|
|
|
} |
|
|
|
|
var center = ViewportManager.CenterVector; |
|
|
|
|
center.Y = Y; |
|
|
|
|
|
|
|
|
@ -1582,6 +1614,7 @@ public class ViewportHelperPro |
|
|
|
|
{ |
|
|
|
|
isDrawing = false; |
|
|
|
|
var Viewport = ViewportManager.GetViewport3D(); |
|
|
|
|
Viewport.Cursor = Cursors.Arrow; |
|
|
|
|
initialRadius = endRadius; |
|
|
|
|
initDistance = endDistance; |
|
|
|
|
// 释放鼠标捕获 |
|
|
|
@ -1599,14 +1632,29 @@ public class ViewportHelperPro |
|
|
|
|
dragStartPoint = ev.Position; |
|
|
|
|
Point3D mouseWorldPosition = Get3DPointFromMouse(dragStartPoint); |
|
|
|
|
var Y = -0.01F; |
|
|
|
|
if(!IsCrown()) |
|
|
|
|
{ |
|
|
|
|
Y = ViewportManager.ModelBounds.Maximum.Y + 0.01F; |
|
|
|
|
} |
|
|
|
|
var center = ViewportManager.CenterVector; |
|
|
|
|
center.Y = Y; |
|
|
|
|
initDistance = CalculateDistance(mouseWorldPosition, center.ToPoint3D()); |
|
|
|
|
var Viewport = ViewportManager.GetViewport3D(); |
|
|
|
|
Viewport.Cursor = Cursors.SizeAll; |
|
|
|
|
// 捕获鼠标 |
|
|
|
|
Viewport.CaptureMouse(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
public static bool IsCrown() |
|
|
|
|
{ |
|
|
|
|
bool isCrown = false; |
|
|
|
|
var camera = ViewportManager.GetViewport3D().Camera; |
|
|
|
|
if (camera.LookDirection.Y >= 0 && camera.UpDirection.Y <= 0) |
|
|
|
|
{ |
|
|
|
|
isCrown = true; |
|
|
|
|
} |
|
|
|
|
return isCrown; |
|
|
|
|
} |
|
|
|
|
#region 私有方法 |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|