Merge remote-tracking branch 'origin/master'

master
handefeng 5 months ago
commit 9722b30e7e
  1. 18
      Views/UserControl/Viewport3D.xaml.cs
  2. 11
      Views/UserControl/ViewportData/Helper/LineCalculationHelper.cs
  3. 102
      Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs
  4. 54
      Views/UserControl/ViewportData/Helper/ViewportManager.cs

@ -129,7 +129,7 @@ public partial class Viewport3D
var maxDimension = ViewportManager.ModelBounds.Size.Length();
var distance = maxDimension *1.2; // 调整相机到模型的距离,保证视野范围内
// 获取当前相机
var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera;
var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.OrthographicCamera;
switch (directionName)
{
@ -187,7 +187,7 @@ public partial class Viewport3D
var center = ViewportManager.ModelBounds.Center;
var maxDimension = ViewportManager.ModelBounds.Size.Length();
var distance = maxDimension *1.2; // 调整相机到模型的距离,保证视野范围内
var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera;
var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.OrthographicCamera;
camera.Position = new Point3D(center.X, center.Y, center.Z + distance); // 从前面看,Z轴正方向
camera.UpDirection = new Vector3D(0, -1, 0);
camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z);
@ -211,7 +211,7 @@ public partial class Viewport3D
var directionValue = (int)TbCustomizeRevolve.Value; // 旋转角度(单位:度)
// 获取当前相机和模型中心
var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera;
var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.OrthographicCamera;
if (camera == null) return;
var modelCenter = ViewportManager.CenterVector; // 模型中心
@ -413,17 +413,7 @@ public partial class Viewport3D
ViewportManager.ResetChooseAddModels();
break;
case "ViewportRightMenuShowMeshLines":
var center = ViewportManager.ModelBounds.Center;
var maxDimension = ViewportManager.ModelBounds.Size.Length();
var distance = maxDimension * 1.2; // 调整相机到模型的距离,保证视野范围内
// 获取当前相机
var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera;
camera.Position = new Point3D(center.X, center.Y - distance, center.Z); // 从底部看,Y轴负方向
camera.UpDirection = new Vector3D(0, 0, -1);
camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z);
ViewportManager.ShowMeshLines(checkResult);
//camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z);
ViewportManager.ShowMeshLines(checkResult, ViewportHelperPro.IsCrown());
break;
}
}

@ -10,7 +10,7 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper
{
internal class LineCalculationHelper
{
private readonly float Y = -0.01F;
private float Y = -0.01F;
private Vector3 point1;
private Vector3 center;
/// <summary>
@ -24,6 +24,7 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper
public LineCalculationHelper(Vector3 point1, Vector3 center) {
this.point1 = point1;
this.center = center;
this.Y = center.Y;
this.a = calA(point1, center);
this.b = calB(point1, a);
}
@ -54,7 +55,7 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper
var x1 = twoPoint.p1.X;
var z1 = twoPoint.p1.Y;
var x2 = twoPoint.p2.X;
var z2 = twoPoint.p2.X;
var z2 = twoPoint.p2.Y;
return new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2));
}
public Tuple<Vector3, Vector3> calYline(float length)
@ -63,7 +64,7 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper
var x1 = twoPoint.p1.X;
var z1 = twoPoint.p1.Y;
var x2 = twoPoint.p2.X;
var z2 = twoPoint.p2.X;
var z2 = twoPoint.p2.Y;
return new Tuple<Vector3, Vector3>(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2));
}
@ -120,8 +121,8 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper
float t2 = (float)(-B - Math.Sqrt(discriminant)) / (2 * A);
// 计算两点坐标
var p1 = (X: t1, Y: k * t1 + b);
var p2 = (X: t2, Y: k * t2 + b);
var p1 = (X: t1, Y: (k * t1) + b);
var p2 = (X: t2, Y: (k * t2) + b);
return (p1, p2);
}

@ -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);
@ -1028,15 +1030,16 @@ public class ViewportHelperPro
// 相机位置和朝向
var cameraPosition = center - normalizedDirection * (float)distance; // 沿正方向放置相机
var lookDirection = center - cameraPosition; // 朝向模型中心
// 创建并返回相机
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)
{
moveLines = new();
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>

@ -50,11 +50,19 @@ public class ViewportManager
/// <summary>
/// 网格线
/// </summary>
public static List<LineGeometryModel3D> MainModelMeshLines = new List<LineGeometryModel3D>();
public static List<LineGeometryModel3D> MainModelMeshLines_C = new List<LineGeometryModel3D>();
/// <summary>
/// 网格线(圈)
/// </summary>
public static LineGeometryModel3D MainModelCircleLine = new LineGeometryModel3D();
public static LineGeometryModel3D MainModelCircleLine_C = new LineGeometryModel3D();
/// <summary>
/// 网格线
/// </summary>
public static List<LineGeometryModel3D> MainModelMeshLines_P = new List<LineGeometryModel3D>();
/// <summary>
/// 网格线(圈)
/// </summary>
public static LineGeometryModel3D MainModelCircleLine_P = new LineGeometryModel3D();
/// <summary>
/// 腰垂直线
/// </summary>
@ -278,9 +286,12 @@ public class ViewportManager
_viewport.Camera.UpDirection = new Vector3D(0, -1, 0);
_viewport.RenderHost.MSAA = MSAALevel.Maximum;
// TODO:
MainModelMeshLines.Clear();
MainModelMeshLines.AddRange(ViewportHelperPro.ShowMeshLines(entities));
MainModelCircleLine = ViewportHelperPro.ShowCircleLine();
MainModelMeshLines_C.Clear();
MainModelMeshLines_C.AddRange(ViewportHelperPro.ShowMeshLines(entities));
MainModelCircleLine_C = ViewportHelperPro.ShowCircleLine();
MainModelMeshLines_P.Clear();
MainModelMeshLines_P.AddRange(ViewportHelperPro.ShowMeshLines(entities, false));
MainModelCircleLine_P = ViewportHelperPro.ShowCircleLine(false);
}
/// <summary>
@ -422,24 +433,37 @@ public class ViewportManager
}
}
public static void ShowMeshLines(bool isShow) {
public static void ShowMeshLines(bool isShow,bool isCrown) {
if (_viewport == null) return;
if (isShow)
{
MainModelMeshLines.ForEach(e =>
if (isCrown) {
MainModelMeshLines_C.ForEach(e =>
{
if (!_viewport.Items.Contains(e))
_viewport.Items.Add(e);
});
if (!_viewport.Items.Contains(MainModelCircleLine_C))
_viewport.Items.Add(MainModelCircleLine_C);
}
else
{
if (!_viewport.Items.Contains(e))
_viewport.Items.Add(e);
});
if (!_viewport.Items.Contains(MainModelCircleLine))
_viewport.Items.Add(MainModelCircleLine);
MainModelMeshLines_P.ForEach(e =>
{
if (!_viewport.Items.Contains(e))
_viewport.Items.Add(e);
});
if (!_viewport.Items.Contains(MainModelCircleLine_P))
_viewport.Items.Add(MainModelCircleLine_P);
}
}
else
{
MainModelMeshLines.ForEach(e => _viewport.Items.Remove(e));
_viewport.Items.Remove(MainModelCircleLine);
MainModelMeshLines_C.ForEach(e => _viewport.Items.Remove(e));
_viewport.Items.Remove(MainModelCircleLine_C);
MainModelMeshLines_P.ForEach(e => _viewport.Items.Remove(e));
_viewport.Items.Remove(MainModelCircleLine_P);
}
}
#endregion

Loading…
Cancel
Save