|
|
@ -1273,6 +1273,12 @@ public class ViewportHelperPro |
|
|
|
lights.ForEach(item => viewport.Items.Remove(item)); |
|
|
|
lights.ForEach(item => viewport.Items.Remove(item)); |
|
|
|
} |
|
|
|
} |
|
|
|
private static Dictionary<Guid, Guid> moveLines = new Dictionary<Guid, Guid>(); |
|
|
|
private static Dictionary<Guid, Guid> moveLines = new Dictionary<Guid, Guid>(); |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
|
|
|
/// 网状参考线 |
|
|
|
|
|
|
|
/// </summary> |
|
|
|
|
|
|
|
/// <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, double thickness = 1.0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
moveLines = new(); |
|
|
|
moveLines = new(); |
|
|
@ -1288,9 +1294,14 @@ public class ViewportHelperPro |
|
|
|
|
|
|
|
|
|
|
|
var edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
var edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
Color4 XlineColor =new Color4(80f, 0f, 0f, 1f); |
|
|
|
Color4 XlineColor =new Color4(80f, 0f, 0f, 1f); |
|
|
|
var x1 = 5; |
|
|
|
float r =5; |
|
|
|
|
|
|
|
if(double.TryParse(ViewportManager.DiamondData["M2"].ToString(), out var v)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
r = (float)(v*0.501); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
var x1 = r; |
|
|
|
var z1 = lineCal.calZ(x1); |
|
|
|
var z1 = lineCal.calZ(x1); |
|
|
|
var x2 = -5; |
|
|
|
var x2 = -r; |
|
|
|
var z2 = lineCal.calZ(x2); |
|
|
|
var z2 = lineCal.calZ(x2); |
|
|
|
edgeLines.Add(new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2))); |
|
|
|
edgeLines.Add(new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2))); |
|
|
|
lines.Add(DisplayLineModel3D(edgeLines, XlineColor)); |
|
|
|
lines.Add(DisplayLineModel3D(edgeLines, XlineColor)); |
|
|
@ -1318,9 +1329,9 @@ public class ViewportHelperPro |
|
|
|
bindingMoveLine(lineE, lineF); |
|
|
|
bindingMoveLine(lineE, lineF); |
|
|
|
|
|
|
|
|
|
|
|
Color4 YlineColor = new Color4(0F, 80f, 0f, 1f); |
|
|
|
Color4 YlineColor = new Color4(0F, 80f, 0f, 1f); |
|
|
|
var x3 = 5; |
|
|
|
var x3 = r; |
|
|
|
var z3 = lineCal.calZVertical(x3); |
|
|
|
var z3 = lineCal.calZVertical(x3); |
|
|
|
var x4 = -5; |
|
|
|
var x4 = -r; |
|
|
|
var z4 = lineCal.calZVertical(x4); |
|
|
|
var z4 = lineCal.calZVertical(x4); |
|
|
|
|
|
|
|
|
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
edgeLines = new List<Tuple<Vector3, Vector3>>(); |
|
|
@ -1350,7 +1361,11 @@ public class ViewportHelperPro |
|
|
|
bindingMoveLine(lineG, lineH); |
|
|
|
bindingMoveLine(lineG, lineH); |
|
|
|
return lines; |
|
|
|
return lines; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
|
|
|
/// 网状参考线 对向移动绑定 |
|
|
|
|
|
|
|
/// </summary> |
|
|
|
|
|
|
|
/// <param name="lineA"></param> |
|
|
|
|
|
|
|
/// <param name="lineB"></param> |
|
|
|
private static void bindingMoveLine(LineGeometryModel3D lineA, LineGeometryModel3D lineB) |
|
|
|
private static void bindingMoveLine(LineGeometryModel3D lineA, LineGeometryModel3D lineB) |
|
|
|
{ |
|
|
|
{ |
|
|
|
lineA.MouseDown3D += LineA_MouseDown3D; |
|
|
|
lineA.MouseDown3D += LineA_MouseDown3D; |
|
|
@ -1386,7 +1401,7 @@ public class ViewportHelperPro |
|
|
|
var perpendicularDirection = Vector3D.CrossProduct(lineDirection.ToVector3D(), Vector3D.CrossProduct(moveDirection, lineDirection.ToVector3D())); |
|
|
|
var perpendicularDirection = Vector3D.CrossProduct(lineDirection.ToVector3D(), Vector3D.CrossProduct(moveDirection, lineDirection.ToVector3D())); |
|
|
|
perpendicularDirection.Normalize(); |
|
|
|
perpendicularDirection.Normalize(); |
|
|
|
|
|
|
|
|
|
|
|
double scaleFactor = 0.1; // 缩放因子 |
|
|
|
double scaleFactor = 0.05; // 缩放因子 |
|
|
|
// 计算垂直距离 |
|
|
|
// 计算垂直距离 |
|
|
|
double perpendicularDistance = Vector3D.DotProduct(moveDirection, perpendicularDirection) * scaleFactor; |
|
|
|
double perpendicularDistance = Vector3D.DotProduct(moveDirection, perpendicularDirection) * scaleFactor; |
|
|
|
System.Console.WriteLine("距离:"+ perpendicularDistance); |
|
|
|
System.Console.WriteLine("距离:"+ perpendicularDistance); |
|
|
@ -1436,11 +1451,11 @@ public class ViewportHelperPro |
|
|
|
// 创建射线 |
|
|
|
// 创建射线 |
|
|
|
var ray = new Ray3D( |
|
|
|
var ray = new Ray3D( |
|
|
|
camera.Position, |
|
|
|
camera.Position, |
|
|
|
new Vector3D(mousePosition.X - Viewport.ActualWidth / 2, -(mousePosition.Y - Viewport.ActualHeight / 2), -camera.Position.Z) |
|
|
|
new Vector3D(mousePosition.X - Viewport.ActualWidth / 2, -camera.Position.Y, -(mousePosition.Y - Viewport.ActualHeight / 2) ) |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
// 创建平面(假设平面为 Y=0) |
|
|
|
// 创建平面(假设平面为 Y=0) |
|
|
|
var plane = new Plane3D(new Point3D(0, 0, 0), new Vector3D(0, 0, 1)); |
|
|
|
var plane = new Plane3D(new Point3D(0, 0, 0), new Vector3D(0, 1, 0)); |
|
|
|
|
|
|
|
|
|
|
|
// 计算射线与平面的交点 |
|
|
|
// 计算射线与平面的交点 |
|
|
|
var intersection = GetIntersection(ray, plane); |
|
|
|
var intersection = GetIntersection(ray, plane); |
|
|
@ -1456,13 +1471,23 @@ public class ViewportHelperPro |
|
|
|
// 使用 Plane3D.LineIntersection 方法计算交点 |
|
|
|
// 使用 Plane3D.LineIntersection 方法计算交点 |
|
|
|
return plane.LineIntersection(ray.Origin, rayEnd); |
|
|
|
return plane.LineIntersection(ray.Origin, rayEnd); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static double initialRadius = 1.0; // 初始半径 |
|
|
|
|
|
|
|
private static double endRadius = 1.0; // 拖拽后半径 |
|
|
|
|
|
|
|
private static double initDistance = 1.0; // 初始与圆心之间距离 |
|
|
|
|
|
|
|
private static double endDistance = 1.0; // 拖拽后与圆心之间距离 |
|
|
|
|
|
|
|
private static Point dragStartPoint; |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
|
|
|
/// 圆圈参考线 |
|
|
|
|
|
|
|
/// </summary> |
|
|
|
|
|
|
|
/// <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(double radius = 1.0, double thickness = 1.0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var Y = -0.01F; |
|
|
|
var Y = -0.01F; |
|
|
|
var center = ViewportManager.CenterVector; |
|
|
|
var center = ViewportManager.CenterVector; |
|
|
|
center.Y = Y; |
|
|
|
center.Y = Y; |
|
|
|
return UpdateCircleGeometry(center); |
|
|
|
return UpdateCircleGeometry(center, initialRadius); |
|
|
|
} |
|
|
|
} |
|
|
|
private static LineGeometryModel3D UpdateCircleGeometry(Vector3 center, double radius = 1.0) |
|
|
|
private static LineGeometryModel3D UpdateCircleGeometry(Vector3 center, double radius = 1.0) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -1482,11 +1507,106 @@ public class ViewportHelperPro |
|
|
|
indices.Add(i); |
|
|
|
indices.Add(i); |
|
|
|
indices.Add((i + 1) % segments); |
|
|
|
indices.Add((i + 1) % segments); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var Circle = DisplayLineModel3D(positions, Color4.Black); |
|
|
|
|
|
|
|
Circle.MouseDown3D += Circle_MouseDown3D; |
|
|
|
|
|
|
|
Circle.MouseUp3D += Circle_MouseUp3D; |
|
|
|
|
|
|
|
Circle.MouseMove3D += Circle_MouseMove3D; |
|
|
|
// 更新圆形线的几何形状 |
|
|
|
// 更新圆形线的几何形状 |
|
|
|
return DisplayLineModel3D(positions, Color4.Black); |
|
|
|
return Circle; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static void Circle_MouseMove3D(object sender, RoutedEventArgs e) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (isDrawing) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (e is HelixToolkit.Wpf.SharpDX.MouseMove3DEventArgs ev) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
var line = sender as LineGeometryModel3D; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (line==null) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
var MinRadius = 0.1; |
|
|
|
|
|
|
|
var MaxRadius = (ViewportManager.ModelBounds.Maximum.X - ViewportManager.ModelBounds.Minimum.X) * 0.6; |
|
|
|
|
|
|
|
// 现在鼠标对于3d模型的位置 |
|
|
|
|
|
|
|
var mousePosition = ev.Position; |
|
|
|
|
|
|
|
var Y = -0.01F; |
|
|
|
|
|
|
|
var center = ViewportManager.CenterVector; |
|
|
|
|
|
|
|
center.Y = Y; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Point3D mouseWorldPosition = Get3DPointFromMouse(mousePosition); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算鼠标与圆心的距离 |
|
|
|
|
|
|
|
double distance = CalculateDistance(mouseWorldPosition, center.ToPoint3D()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double scaleFactor = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (distance < initDistance) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// 鼠标靠近圆心,缩小半径 |
|
|
|
|
|
|
|
scaleFactor = -0.01; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// 鼠标远离圆心,扩大半径 |
|
|
|
|
|
|
|
scaleFactor = +0.01; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算鼠标移动的距离(以屏幕坐标为单位) |
|
|
|
|
|
|
|
double delta = (dragStartPoint - mousePosition).Length; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算新的半径 |
|
|
|
|
|
|
|
double newRadius = initialRadius + delta * scaleFactor; // 缩放因子 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 限制半径范围 |
|
|
|
|
|
|
|
newRadius = Math.Clamp(newRadius, MinRadius, MaxRadius); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var scaleTransform = new ScaleTransform3D(newRadius, 1, newRadius); // 缩放变换 |
|
|
|
|
|
|
|
line.Transform = scaleTransform; |
|
|
|
|
|
|
|
endRadius = newRadius; |
|
|
|
|
|
|
|
endDistance = distance; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 计算两点之间的距离 |
|
|
|
|
|
|
|
private static double CalculateDistance(Point3D p1, Point3D p2) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
double dx = p2.X - p1.X; |
|
|
|
|
|
|
|
double dy = p2.Y - p1.Y; |
|
|
|
|
|
|
|
double dz = p2.Z - p1.Z; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Math.Sqrt(dx * dx + dy * dy + dz * dz); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static void Circle_MouseUp3D(object sender, RoutedEventArgs e) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
isDrawing = false; |
|
|
|
|
|
|
|
var Viewport = ViewportManager.GetViewport3D(); |
|
|
|
|
|
|
|
initialRadius = endRadius; |
|
|
|
|
|
|
|
initDistance = endDistance; |
|
|
|
|
|
|
|
// 释放鼠标捕获 |
|
|
|
|
|
|
|
Viewport.ReleaseMouseCapture(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static void Circle_MouseDown3D(object sender, RoutedEventArgs e) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
isDrawing = true; |
|
|
|
|
|
|
|
if (e is HelixToolkit.Wpf.SharpDX.MouseDown3DEventArgs ev) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
var line = sender as LineGeometryModel3D; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取鼠标点击的位置 |
|
|
|
|
|
|
|
dragStartPoint = ev.Position; |
|
|
|
|
|
|
|
Point3D mouseWorldPosition = Get3DPointFromMouse(dragStartPoint); |
|
|
|
|
|
|
|
var Y = -0.01F; |
|
|
|
|
|
|
|
var center = ViewportManager.CenterVector; |
|
|
|
|
|
|
|
center.Y = Y; |
|
|
|
|
|
|
|
initDistance = CalculateDistance(mouseWorldPosition, center.ToPoint3D()); |
|
|
|
|
|
|
|
var Viewport = ViewportManager.GetViewport3D(); |
|
|
|
|
|
|
|
// 捕获鼠标 |
|
|
|
|
|
|
|
Viewport.CaptureMouse(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
#region 私有方法 |
|
|
|
#region 私有方法 |
|
|
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// <summary> |
|
|
|