fix:网格线调试完成

master
sunhonglei 5 months ago
parent b259b16696
commit 6d2fe70b35
  1. 12
      Views/UserControl/Viewport3D.xaml.cs
  2. 11
      Views/UserControl/ViewportData/Helper/LineCalculationHelper.cs
  3. 58
      Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs
  4. 54
      Views/UserControl/ViewportData/Helper/ViewportManager.cs

@ -418,10 +418,14 @@ public partial class Viewport3D
var distance = maxDimension * 1.2; // 调整相机到模型的距离,保证视野范围内 var distance = maxDimension * 1.2; // 调整相机到模型的距离,保证视野范围内
// 获取当前相机 // 获取当前相机
var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera; var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera;
camera.Position = new Point3D(center.X, center.Y - distance, center.Z); // 从底部看,Y轴负方向 var Position = camera.Position;
camera.UpDirection = new Vector3D(0, 0, -1); var LookDirection = camera.LookDirection;
camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); bool isCrown = false;
ViewportManager.ShowMeshLines(checkResult); if(camera.LookDirection.Y >= 0 && camera.UpDirection.Y<=0)
{
isCrown = true;
}
ViewportManager.ShowMeshLines(checkResult, isCrown);
//camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); //camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z);
break; break;

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

@ -1279,11 +1279,15 @@ public class ViewportHelperPro
/// <param name="entities"></param> /// <param name="entities"></param>
/// <param name="thickness"></param> /// <param name="thickness"></param>
/// <returns></returns> /// <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(); moveLines = new();
List<LineGeometryModel3D> lines = new(); List<LineGeometryModel3D> lines = new();
var Y = -0.01F; var Y = -0.01F;
if (!isCrown)
{
Y = ViewportManager.ModelBounds.Maximum.Y + 0.01f;
}
var center = ViewportManager.CenterVector; var center = ViewportManager.CenterVector;
center.Y = Y; center.Y = Y;
Viewport3DTriangleEntity firstPoint = entities.Where(x => x.PlaneType == PlaneType.TableFacet).FirstOrDefault(); Viewport3DTriangleEntity firstPoint = entities.Where(x => x.PlaneType == PlaneType.TableFacet).FirstOrDefault();
@ -1299,63 +1303,73 @@ public class ViewportHelperPro
{ {
r = (float)(v*0.501); r = (float)(v*0.501);
} }
var x1 = r; //var x1 = r;
var z1 = lineCal.calZ(x1); //var z1 = lineCal.calZ(x1);
var x2 = -r; //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));
edgeLines = new List<Tuple<Vector3, Vector3>>();
var XLine = lineCal.calXline(r);
edgeLines.Add(XLine);
lines.Add(DisplayLineModel3D(edgeLines, XlineColor)); lines.Add(DisplayLineModel3D(edgeLines, XlineColor));
edgeLines = new List<Tuple<Vector3, Vector3>>(); 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); var lineA = DisplayLineModel3D(edgeLines, XlineColor);
lines.Add(lineA); lines.Add(lineA);
edgeLines = new List<Tuple<Vector3, Vector3>>(); 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); var lineB = DisplayLineModel3D(edgeLines, XlineColor);
lines.Add(lineB); lines.Add(lineB);
bindingMoveLine(lineA, lineB); bindingMoveLine(lineA, lineB);
edgeLines = new List<Tuple<Vector3, Vector3>>(); 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); var lineE = DisplayLineModel3D(edgeLines, XlineColor);
lines.Add(lineE); lines.Add(lineE);
edgeLines = new List<Tuple<Vector3, Vector3>>(); 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); var lineF = DisplayLineModel3D(edgeLines, XlineColor);
lines.Add(lineF); lines.Add(lineF);
bindingMoveLine(lineE, lineF); bindingMoveLine(lineE, lineF);
Color4 YlineColor = new Color4(0F, 80f, 0f, 1f); Color4 YlineColor = new Color4(0F, 80f, 0f, 1f);
var x3 = r; //var x3 = r;
var z3 = lineCal.calZVertical(x3); //var z3 = lineCal.calZVertical(x3);
var x4 = -r; //var x4 = -r;
var z4 = lineCal.calZVertical(x4); //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 = 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)); lines.Add(DisplayLineModel3D(edgeLines, YlineColor));
edgeLines = new List<Tuple<Vector3, Vector3>>(); 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); var lineC = DisplayLineModel3D(edgeLines, YlineColor);
lines.Add(lineC); lines.Add(lineC);
edgeLines = new List<Tuple<Vector3, Vector3>>(); 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); var lineD = DisplayLineModel3D(edgeLines, YlineColor);
lines.Add(lineD); lines.Add(lineD);
bindingMoveLine(lineC, lineD); bindingMoveLine(lineC, lineD);
edgeLines = new List<Tuple<Vector3, Vector3>>(); 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); var lineG = DisplayLineModel3D(edgeLines, YlineColor);
lines.Add(lineG); lines.Add(lineG);
edgeLines = new List<Tuple<Vector3, Vector3>>(); 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); var lineH = DisplayLineModel3D(edgeLines, YlineColor);
lines.Add(lineH); lines.Add(lineH);
bindingMoveLine(lineG, lineH); bindingMoveLine(lineG, lineH);
@ -1482,9 +1496,13 @@ public class ViewportHelperPro
/// <param name="radius"></param> /// <param name="radius"></param>
/// <param name="thickness"></param> /// <param name="thickness"></param>
/// <returns></returns> /// <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; var Y = -0.01F;
if (!isCrown)
{
Y = ViewportManager.ModelBounds.Maximum.Y + 0.01f;
}
var center = ViewportManager.CenterVector; var center = ViewportManager.CenterVector;
center.Y = Y; center.Y = Y;
return UpdateCircleGeometry(center, initialRadius); return UpdateCircleGeometry(center, initialRadius);

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

Loading…
Cancel
Save