|
|
|
@ -328,34 +328,94 @@ public class ViewportHelperPro |
|
|
|
|
{ |
|
|
|
|
List<LineGeometryModel3D> result = new List<LineGeometryModel3D>(); |
|
|
|
|
//按面分组,腰面特殊单独生成 |
|
|
|
|
List<Viewport3DTriangleEntity> waistList = entities |
|
|
|
|
.Where(entity => entity.PlaneType == PlaneType.Girdle) |
|
|
|
|
.ToList(); |
|
|
|
|
List<Vector3> selFaceVector = new List<Vector3>(); |
|
|
|
|
// List<Viewport3DTriangleEntity> waistList = entities |
|
|
|
|
// .Where(entity => entity.PlaneType == PlaneType.Girdle) |
|
|
|
|
// .ToList(); |
|
|
|
|
// List<Vector3> selFaceVector = new List<Vector3>(); |
|
|
|
|
List<Tuple<Vector3, Vector3>> lines = new List<Tuple<Vector3, Vector3>>(); |
|
|
|
|
if (waistList.Count > 0) |
|
|
|
|
// if (waistList.Count > 0) |
|
|
|
|
// { |
|
|
|
|
// foreach (var entity in waistList) |
|
|
|
|
// { |
|
|
|
|
// selFaceVector.Add(entity.Point1); |
|
|
|
|
// selFaceVector.Add(entity.Point2); |
|
|
|
|
// selFaceVector.Add(entity.Point3); |
|
|
|
|
// } |
|
|
|
|
// HashSet<Vector3> uniqueVectors = new HashSet<Vector3>(selFaceVector); |
|
|
|
|
// var facetPoints = VectorClockwiseSort(uniqueVectors.ToList()); |
|
|
|
|
// for (int i = 0; i < facetPoints.ToList().Count - 1; i++) |
|
|
|
|
// { |
|
|
|
|
// var nowItem = facetPoints.ToList()[i]; |
|
|
|
|
// var nextItem = facetPoints.ToList()[i + 1]; |
|
|
|
|
// var line = new Tuple<Vector3, Vector3>(nowItem, nextItem); |
|
|
|
|
// if (IsLineSegmentParallelToYAxis(line)) |
|
|
|
|
// { |
|
|
|
|
// lines.Add(line); |
|
|
|
|
// result.Add(DisplayLineModel3D(new List<Vector3>() { nowItem, nextItem }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness)); |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
Dictionary<string, List<Viewport3DTriangleEntity>> feactList = entities |
|
|
|
|
.Where(entity => entity.PlaneType == PlaneType.Girdle) |
|
|
|
|
.GroupBy(entity => entity.PlaneCode) |
|
|
|
|
.ToDictionary(group => group.Key, group => group.ToList()); |
|
|
|
|
|
|
|
|
|
foreach (var yaoFace in feactList) |
|
|
|
|
{ |
|
|
|
|
foreach (var entity in waistList) |
|
|
|
|
List<Vector3> selFaceVector = new List<Vector3>(); |
|
|
|
|
foreach (var entity in yaoFace.Value) |
|
|
|
|
{ |
|
|
|
|
selFaceVector.Add(entity.Point1); |
|
|
|
|
selFaceVector.Add(entity.Point2); |
|
|
|
|
selFaceVector.Add(entity.Point3); |
|
|
|
|
} |
|
|
|
|
HashSet<Vector3> uniqueVectors = new HashSet<Vector3>(selFaceVector); |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < selFaceVector.ToList().Count - 1; i++) |
|
|
|
|
|
|
|
|
|
var facetPoints = VectorClockwiseSort(uniqueVectors.ToList()); |
|
|
|
|
Vector3 center = GetCentroid(uniqueVectors.ToList()); |
|
|
|
|
Console.WriteLine($"{yaoFace.Key} \t {center.X} \t {center.Y} \t {center.Z}"); |
|
|
|
|
List<Vector3> leftLine = new List<Vector3>(); |
|
|
|
|
List<Vector3> rightLine = new List<Vector3>(); |
|
|
|
|
|
|
|
|
|
foreach (var point in facetPoints) |
|
|
|
|
{ |
|
|
|
|
var nowItem = selFaceVector.ToList()[i]; |
|
|
|
|
var nextItem = selFaceVector.ToList()[i + 1]; |
|
|
|
|
var line = new Tuple<Vector3, Vector3>(nowItem, nextItem); |
|
|
|
|
if (IsLineSegmentParallelToYAxis(line)) |
|
|
|
|
var direction = point - center; |
|
|
|
|
|
|
|
|
|
var cross = Vector3.Cross(new Vector3(0, 0, 1), direction); |
|
|
|
|
|
|
|
|
|
if (cross.Y >= 0) |
|
|
|
|
{ |
|
|
|
|
rightLine.Add(point); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
lines.Add(line); |
|
|
|
|
result.Add(DisplayLineModel3D(new List<Vector3>() { nowItem, nextItem }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness)); |
|
|
|
|
leftLine.Add(point); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (rightLine.Count == 2 && leftLine.Count == 2) |
|
|
|
|
{ |
|
|
|
|
var leftLineTuple = new Tuple<Vector3, Vector3>(leftLine.First(), leftLine.Last()); |
|
|
|
|
var rightLineTuple = new Tuple<Vector3, Vector3>(rightLine.First(), rightLine.Last()); |
|
|
|
|
lines.Add(leftLineTuple); |
|
|
|
|
lines.Add(rightLineTuple); |
|
|
|
|
result.Add(DisplayLineModel3D(new List<Vector3>() { leftLine.First(), leftLine.Last() }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness)); |
|
|
|
|
result.Add(DisplayLineModel3D(new List<Vector3>() { rightLine.First(), rightLine.Last() }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness)); |
|
|
|
|
} |
|
|
|
|
// for (int i = 0; i < facetPoints.ToList().Count - 1; i++) |
|
|
|
|
// { |
|
|
|
|
// var nowItem = facetPoints.ToList()[i]; |
|
|
|
|
// var nextItem = facetPoints.ToList()[i + 1]; |
|
|
|
|
// var line = new Tuple<Vector3, Vector3>(nowItem, nextItem); |
|
|
|
|
// if (IsLineSegmentParallelToYAxis(line)) |
|
|
|
|
// { |
|
|
|
|
// lines.Add(line); |
|
|
|
|
// result.Add(DisplayLineModel3D(new List<Vector3>() { nowItem, nextItem }, color ?? ViewportManager.ColorConfig.MainBorderColor, thickness)); |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CalculateLineSegmentStats(lines, out ViewportManager.MainModelGirdleMaxLines, out ViewportManager.MainModelGirdleMinLines, out ViewportManager.MainModelGirdleAvgLines); |
|
|
|
|
ViewportManager.MainModelGirdleLines = lines; |
|
|
|
|
return result; |
|
|
|
@ -490,20 +550,27 @@ public class ViewportHelperPro |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
int linePointType = facetIndex % 4; |
|
|
|
|
|
|
|
|
|
Console.WriteLine(facetIndex); |
|
|
|
|
switch (linePointType) |
|
|
|
|
{ |
|
|
|
|
case 0: |
|
|
|
|
case 3: |
|
|
|
|
var longestLine1 = GetLongestOrShortestLineSegment(facetPoints, returnLongest: true); |
|
|
|
|
case 2: |
|
|
|
|
var longestLine1 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 24 && facetIndex <= 55 ? true : false); |
|
|
|
|
result.Add(DisplayLineModel3D(new List<Tuple<Vector3, Vector3>>() { longestLine1 }, new Color4(1f, 0, 0, 1f), 2f)); |
|
|
|
|
break; |
|
|
|
|
case 1: |
|
|
|
|
case 2: |
|
|
|
|
var longestLine2 = GetLongestOrShortestLineSegment(facetPoints, returnLongest: false); |
|
|
|
|
case 3: |
|
|
|
|
var longestLine2 = GetLeftOrRightLineSegment(facetPoints, facetIndex >= 24 && facetIndex <= 55 ? false : true); |
|
|
|
|
result.Add(DisplayLineModel3D(new List<Tuple<Vector3, Vector3>>() { longestLine2 }, new Color4(1f, 0, 0, 1f), 2f)); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (result.Exists(e => e == null)) |
|
|
|
|
{ |
|
|
|
|
Logger.Info("目标线段为空"); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//开始找值 |
|
|
|
|
string param = string.Empty; |
|
|
|
|
var valueIndex = 0; |
|
|
|
@ -1129,20 +1196,28 @@ public class ViewportHelperPro |
|
|
|
|
public static LineGeometryModel3D DisplayLineModel3D(List<Tuple<Vector3, Vector3>> points, Color4 lineColor, |
|
|
|
|
double thickness = 1.0) |
|
|
|
|
{ |
|
|
|
|
var lineBuilder = new LineBuilder(); |
|
|
|
|
foreach (var line in points) |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
lineBuilder.AddLine(line.Item1, line.Item2); |
|
|
|
|
var lineBuilder = new LineBuilder(); |
|
|
|
|
foreach (var line in points) |
|
|
|
|
{ |
|
|
|
|
lineBuilder.AddLine(line.Item1, line.Item2); |
|
|
|
|
} |
|
|
|
|
var edgeLinesModel = new LineGeometryModel3D |
|
|
|
|
{ |
|
|
|
|
Geometry = lineBuilder.ToLineGeometry3D(), |
|
|
|
|
Color = lineColor.ToColor(), |
|
|
|
|
Thickness = thickness, |
|
|
|
|
}; |
|
|
|
|
return edgeLinesModel; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var edgeLinesModel = new LineGeometryModel3D |
|
|
|
|
catch (Exception e) |
|
|
|
|
{ |
|
|
|
|
Geometry = lineBuilder.ToLineGeometry3D(), |
|
|
|
|
Color = lineColor.ToColor(), |
|
|
|
|
Thickness = thickness, |
|
|
|
|
}; |
|
|
|
|
return edgeLinesModel; |
|
|
|
|
Logger.Error(e.Message); |
|
|
|
|
Logger.Error(e.StackTrace); |
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
@ -1865,12 +1940,12 @@ public class ViewportHelperPro |
|
|
|
|
var v = p2 - p0; |
|
|
|
|
return Vector3.Cross(u, v); |
|
|
|
|
} |
|
|
|
|
private static bool IsLineSegmentParallelToYAxis(Tuple<Vector3, Vector3> lineSegment,float epsilon = 1e-6f) |
|
|
|
|
private static bool IsLineSegmentParallelToYAxis(Tuple<Vector3, Vector3> lineSegment,float epsilon = 0.001f) |
|
|
|
|
{ |
|
|
|
|
Vector3 nowItem = lineSegment.Item1; |
|
|
|
|
Vector3 nextItem = lineSegment.Item2; |
|
|
|
|
|
|
|
|
|
if (Math.Abs(nowItem.X - nextItem.X) < epsilon && Math.Abs(nowItem.Z - nextItem.Z) < epsilon) |
|
|
|
|
//&& Math.Abs(nowItem.Z - nextItem.Z) < epsilon |
|
|
|
|
if (Math.Abs(nowItem.X - nextItem.X) < epsilon ) |
|
|
|
|
{ |
|
|
|
|
return true; // 平行于 Y 轴 |
|
|
|
|
} |
|
|
|
@ -1888,6 +1963,8 @@ public class ViewportHelperPro |
|
|
|
|
Tuple<Vector3, Vector3> resultSegment = null; |
|
|
|
|
float resultLength = returnLongest ? float.MinValue : float.MaxValue; // 初始化为最小或最大长度 |
|
|
|
|
|
|
|
|
|
facetPoints = VectorClockwiseSort(new System.Collections.Generic.HashSet<Vector3>(facetPoints).ToList()); |
|
|
|
|
|
|
|
|
|
// 遍历所有相邻的点,构成线段 |
|
|
|
|
for (int i = 0; i < facetPoints.Count; i++) |
|
|
|
|
{ |
|
|
|
@ -1911,6 +1988,40 @@ public class ViewportHelperPro |
|
|
|
|
|
|
|
|
|
return resultSegment; // 返回符合条件的线段 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static Tuple<Vector3, Vector3> GetLeftOrRightLineSegment(List<Vector3> facetPoints, |
|
|
|
|
bool isLeft = true) |
|
|
|
|
{ |
|
|
|
|
Tuple<Vector3, Vector3> resultSegment = null; |
|
|
|
|
//去重 |
|
|
|
|
facetPoints = VectorClockwiseSort(new System.Collections.Generic.HashSet<Vector3>(facetPoints).ToList()); |
|
|
|
|
//计算中心点 |
|
|
|
|
Vector3 center = GetCentroid(facetPoints); |
|
|
|
|
|
|
|
|
|
List<Vector3> leftList = new List<Vector3>(); |
|
|
|
|
List<Vector3> rightList = new List<Vector3>(); |
|
|
|
|
|
|
|
|
|
foreach (var point in facetPoints) |
|
|
|
|
{ |
|
|
|
|
Vector3 direction = point - center; |
|
|
|
|
Vector3 cross = Vector3.Cross(new Vector3(0,0,1), direction); |
|
|
|
|
if (cross.Y >= 0) |
|
|
|
|
rightList.Add(point); |
|
|
|
|
else |
|
|
|
|
leftList.Add(point); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isLeft) |
|
|
|
|
resultSegment = new Tuple<Vector3, Vector3>(leftList.First(), leftList.Last()); |
|
|
|
|
else |
|
|
|
|
resultSegment = new Tuple<Vector3, Vector3>(rightList.First(), rightList.Last()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return resultSegment; // 返回符合条件的线段 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static void CalculateLineSegmentStats(List<Tuple<Vector3, Vector3>> lines, |
|
|
|
|
out Tuple<Vector3, Vector3> maxLine, |
|
|
|
|
out Tuple<Vector3, Vector3> minLine, |
|
|
|
|