Revert "fix:视图standard微调"

This reverts commit 2b51b94193.
master
sunhonglei 5 months ago
parent 6dad916ace
commit f1cc5a4e17
  1. 0
      Libs/AlgorithmServer.dll
  2. 4
      LoginWindow.xaml.cs
  3. 15
      Model/Entity/ApiEntity/ImageCollectionResult.cs
  4. 83
      Model/Entity/MethodConfigEntity.cs
  5. 129
      Model/Entity/Viewport3DTriangleEntity.cs
  6. 65
      Model/Helper/FileEncrypterDecrypter.cs
  7. 825
      Model/Helper/Viewport3DHelper.cs
  8. 310
      Resource/DimDemo.txt
  9. BIN
      Resource/Images/Algor_Def@3x.png
  10. BIN
      Resource/Images/Algor_Sel@3x.png
  11. BIN
      Resource/Images/Cushion-shaped.png
  12. BIN
      Resource/Images/Cut_Def@3x.png
  13. BIN
      Resource/Images/Cut_Sel@3x.png
  14. BIN
      Resource/Images/Emerald-shape.png
  15. BIN
      Resource/Images/Heart-shaped.png
  16. BIN
      Resource/Images/IGILogo.png
  17. BIN
      Resource/Images/Level_Def@3x.png
  18. BIN
      Resource/Images/Level_Sel@3x.png
  19. BIN
      Resource/Images/Odd-shaped.png
  20. BIN
      Resource/Images/Pear-shaped.png
  21. BIN
      Resource/Images/Princess-shaped.png
  22. BIN
      Resource/Images/Setting_Def@3x.png
  23. BIN
      Resource/Images/Setting_Sel@3x.png
  24. BIN
      Resource/Images/config_3x.png
  25. BIN
      Resource/Images/diam_3x.png
  26. BIN
      Resource/Images/diamtest_3x.png
  27. BIN
      Resource/Images/hand_3x.png
  28. BIN
      Resource/Images/help_3x.png
  29. BIN
      Resource/Images/homebg.png
  30. BIN
      Resource/Images/oval.png
  31. BIN
      Resource/Images/round_3x.png
  32. BIN
      Resource/Images/round_P8-P8.png
  33. BIN
      Resource/Images/ze-add-o 1@1x.png
  34. 88
      SparkClient - Backup (1).csproj
  35. 32
      SparkClient.csproj.user
  36. BIN
      SparkDB.db
  37. 41
      ViewModel/Configuration/LevelConfigVM.cs
  38. 72
      ViewModel/Grading/GradingResultVM.cs
  39. 78
      Views/Configuration/SettingsPage.xaml
  40. 28
      Views/Configuration/SettingsPage.xaml.cs
  41. 45
      Views/Dialog/MsgDialog.xaml
  42. 62
      Views/Dialog/MsgDialog.xaml.cs
  43. 85
      Views/Dialog/SaveDialog.xaml
  44. 90
      Views/Dialog/SaveDialog.xaml.cs
  45. 85
      Views/Dialog/StartDialog.xaml
  46. 97
      Views/Dialog/StartDialog.xaml.cs

@ -81,8 +81,8 @@ public partial class LoginWindow : Window
private void ConfirmButton_Click(object sender, RoutedEventArgs e)
{
#if DEBUG
savePassword();
new MainWindow().Show();
new MainWindow().Show();
this.Close();
#else

@ -1,15 +0,0 @@
namespace SparkClient.Model.Common;
public class ImageCollectionResult
{
/// <summary>
/// 状态码
/// </summary>
public string Status { get; set; }
/// <summary>
/// 图片名称列表
/// </summary>
public List<string> Images { get; set; }
}

@ -1,83 +0,0 @@
using SparkClient.Model.Entity.Base;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace SparkClient.Model.Entity;
/// <summary>
/// 系统设置实体
/// </summary>
public class MethodConfigEntity
{
public static readonly string TableName = "METHOD_CONFIG";
[DbField("GUID")]
public Guid GUID { get; set; }
/// <summary>
/// json内容
/// </summary>
[DbField("JSON")]
public required string Json { get; set; }
/// <summary>
/// Json排序
/// </summary>
[DbField("JSON_ORDER")]
public required int JsonOrder { get; set; }
private static Dictionary<string, string> GetFieldMappings()
{
var properties = typeof(MethodConfigEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);
return properties
.Where(p => Attribute.IsDefined(p, typeof(DbFieldAttribute)))
.ToDictionary(
p => p.Name,
p => ((DbFieldAttribute)p.GetCustomAttribute(typeof(DbFieldAttribute))).FieldName
);
}
// 生成 Insert 语句
public string GenerateInsertSQL()
{
var mappings = GetFieldMappings();
var columns = string.Join(", ", mappings.Values);
var values = string.Join(", ", mappings.Keys.Select(k => $"@{k}"));
return $"INSERT INTO {TableName} ({columns}) VALUES ({values});";
}
// 生成 Update 语句
public string GenerateUpdateSQL(Dictionary<string, object> fieldsToUpdate = null)
{
if (fieldsToUpdate == null || fieldsToUpdate.Count == 0)
{
// 默认根据 ID 更新所有字段
var mappings = GetFieldMappings();
var setClause = string.Join(", ", mappings.Values.Select(f => $"{f} = @{f}"));
return $"UPDATE {TableName} SET {setClause} WHERE GUID = " + GUID.ToString() + ";";
}
else
{
// 根据传入的字段更新
var setClause = string.Join(", ", fieldsToUpdate.Keys.Select(f => $"{f} = @{f}"));
return $"UPDATE {TableName} SET {setClause} WHERE GUID = " + GUID.ToString() + ";";
}
}
// 生成 Delete 语句
public string GenerateDeleteSQL(Dictionary<string, object> conditions = null)
{
if (conditions == null || conditions.Count == 0)
{
// 默认根据 ID 删除
return $"DELETE FROM {TableName} WHERE GUID =" + GUID.ToString() + ";";
}
else
{
// 根据传入条件删除
var whereClause = string.Join(" AND ", conditions.Keys.Select(f => $"{f} = @{f}"));
return $"DELETE FROM {TableName} WHERE {whereClause};";
}
}
}

@ -1,129 +0,0 @@
using System.Security.Cryptography;
using System.Text;
using SharpDX;
using SparkClient.Model.Enums;
namespace SparkClient.Model.Entity;
/// <summary>
/// 三角形
/// </summary>
public class Viewport3DTriangleEntity
{
/// <summary>
/// 点1
/// </summary>
public Vector3 Point1 { get; set; }
/// <summary>
/// 点2
/// </summary>
public Vector3 Point2 { get; set; }
/// <summary>
/// 点3
/// </summary>
public Vector3 Point3 { get; set; }
/// <summary>
/// 三角形代码[生成]
/// 按顺序:p1.x,p1.y,p1.z;p2.x,p2.y,p2.z;p3.x,p3.y,p3.z 拼接后使用生成大写16位md5
/// </summary>
public String TriangleCode { get; set; }
/// <summary>
/// 面代码
/// 由多个三角形组成的面的代码:entity1、entity2组成了一个正方形,那么他俩的TriangleCode属性值一致
/// </summary>
public String PlaneCode { get; set; }
/// <summary>
/// 面类型
/// 比如这个面时钻石的腰部分,那么type统一,当面类型为err时则该面是一个异常面
/// 可选值:PlaneType
/// </summary>
public PlaneType PlaneType { get; set; }
public static Viewport3DTriangleEntity CreateByString(string str)
{
if (string.IsNullOrWhiteSpace(str))
{
throw new ArgumentException("Input string cannot be null or empty");
}
// 分割为四段
var parts = str.Split('|');
if (parts.Length != 4)
{
throw new ArgumentException("Input string format is incorrect. Expected 4 parts separated by '|'.");
}
// 解析第一段:坐标
var coordinates = parts[0].Split(';');
if (coordinates.Length != 3)
{
throw new ArgumentException("Coordinates part must contain exactly 3 points separated by ';'.");
}
var points = coordinates.Select(ParseVector3).ToArray();
// 解析第二段:TriangleCode [内部标记]
// 解析第三段:PlaneCode
string planeCode = parts[2];
if (string.IsNullOrWhiteSpace(planeCode))
{
throw new ArgumentException("PlaneCode cannot be null or empty");
}
// 解析第四段:PlaneType
if (!int.TryParse(parts[3], out int planeTypeValue) || !Enum.IsDefined(typeof(PlaneType), planeTypeValue))
{
throw new ArgumentException("Invalid PlaneType value");
}
PlaneType planeType = (PlaneType)planeTypeValue;
// 生成 TriangleCode 格式:p1.x,p1.y,p1.z;p2.x,p2.y,p2.z;p3.x,p3.y,p3.z 生成 MD5
string concatenatedPoints = string.Join(";", points.Select(p => $"{p.X},{p.Y},{p.Z}"));
string generatedTriangleCode = GenerateMD5Hash(concatenatedPoints);
return new Viewport3DTriangleEntity
{
Point1 = points[0],
Point2 = points[1],
Point3 = points[2],
TriangleCode = generatedTriangleCode,
PlaneCode = planeCode,
PlaneType = planeType
};
}
// public static Viewport3DTriangleEntity CreateByJsonStr(string str)
// {
//
// }
private static Vector3 ParseVector3(string coordinate)
{
var values = coordinate.Split(',');
if (values.Length != 3)
{
throw new ArgumentException("Each coordinate must contain exactly 3 values separated by ','");
}
if (!float.TryParse(values[0], out float x) ||
!float.TryParse(values[1], out float y) ||
!float.TryParse(values[2], out float z))
{
throw new ArgumentException("Coordinate values must be valid floating-point numbers");
}
return new Vector3(x, y, z);
}
public static string GenerateMD5Hash(string input)
{
using (var md5 = MD5.Create())
{
var inputBytes = Encoding.UTF8.GetBytes(input);
var hashBytes = md5.ComputeHash(inputBytes);
// 转换为大写的16位十六进制字符串
return string.Concat(hashBytes.Take(8).Select(b => b.ToString("X2")));
}
}
}

@ -1,65 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
internal class FileEncrypterDecrypter
{
/// <summary>
/// 加密文件
/// </summary>
/// <param name="inputFile"></param>
/// <param name="outputFile"></param>
/// <param name="password"></param>
public static void EncryptFile(string inputFile, string outputFile, string password)
{
var aes = Aes.Create();
var pdb = new Rfc2898DeriveBytes(password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
aes.Key = pdb.GetBytes(32);
aes.IV = pdb.GetBytes(16);
using (var fs = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
{
using (var cs = new CryptoStream(fs, aes.CreateEncryptor(), CryptoStreamMode.Read))
{
using (var fsOut = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
{
cs.CopyTo(fsOut);
}
}
}
}
/// <summary>
/// 解密文件
/// </summary>
/// <param name="inputFile"></param>
/// <param name="outputFile"></param>
/// <param name="password"></param>
public static void DecryptFile(string inputFile, string outputFile, string password)
{
var aes = Aes.Create();
var pdb = new Rfc2898DeriveBytes(password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
aes.Key = pdb.GetBytes(32);
aes.IV = pdb.GetBytes(16);
using (var fs = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
{
using (var cs = new CryptoStream(fs, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
StreamReader sr = new StreamReader(cs);
sr.ReadLine();
using (var fsOut = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
{
cs.CopyTo(fsOut);
}
}
}
}
}
}

@ -1,825 +0,0 @@
using System.IO;
using System.Windows.Media;
using System.Windows.Media.Media3D;
using SharpDX.Direct3D11;
using SparkClient.Model.Entity;
namespace SparkClient.Model.Helper;
using HelixToolkit.Wpf.SharpDX;
using SharpDX;
using System.Collections.Generic;
public class Viewport3DHelper
{
// 加载环境贴图
// public static Stream stream =
// File.Open("D:\\WorkSpace\\spark\\HelixToolkitSharpDX-Demo\\morning_racing_circuit_16k.dds", FileMode.Open);
/// <summary>
/// 生成一个多边形钻石
/// </summary>
/// <param name="viewport">控件</param>
/// <param name="sides">边数</param>
public static void GenerateDiamond(Viewport3DX viewport, int sides)
{
// 启用法线生成
var meshBuilder = new MeshBuilder(true, false);
//设置抗锯齿
viewport.RenderHost.MSAA = MSAALevel.Maximum;
double radius = 3.2915;
double smallRadius = radius / 2;
double topHeight = 1.67;
double bottomHeight = 4.43;
double smallOffset = 1.25;
var largeVertices = new List<Vector3>();
var smallVertices = new List<Vector3>();
var edgeLines = new List<Tuple<Vector3, Vector3>>();
// 生成大八边形顶点
for (int i = 0; i < sides; i++)
{
double angle = i * Math.PI / (sides / 2);
largeVertices.Add(new Vector3((float)(radius * Math.Cos(angle)), (float)topHeight,
(float)(radius * Math.Sin(angle))));
}
// 生成小八边形顶点
for (int i = 0; i < sides; i++)
{
double angle = i * Math.PI / (sides / 2);
smallVertices.Add(new Vector3((float)(smallRadius * Math.Cos(angle)), (float)(topHeight + smallOffset),
(float)(smallRadius * Math.Sin(angle))));
}
var bottomPoint = new Vector3(0, (float)(topHeight - bottomHeight), 0);
var topPoint = new Vector3(0, (float)topHeight, 0);
// 生成底部面
for (int i = 0; i < sides; i++)
{
int nextIndex = (i + 1) % sides;
// 计算法线
// Vector3 edge1 = largeVertices[nextIndex] - bottomPoint;
// Vector3 edge2 = largeVertices[i] - bottomPoint;
// Vector3 normal = Vector3.Cross(edge1, edge2);
// normal.Normalize();
List<Vector3> fanPositions2 = new List<Vector3>()
{ bottomPoint, largeVertices[nextIndex], largeVertices[i] };
List<Vector3> fanNormals2 = new List<Vector3>()
{ new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 0) };
meshBuilder.AddTriangleFan(fanPositions2, fanNormals2);
// meshBuilder.AddTriangle(bottomPoint, largeVertices[nextIndex], largeVertices[i]);
// meshBuilder.AddTriangle(topPoint, largeVertices[i], largeVertices[nextIndex]);
// 添加边框线
edgeLines.Add(new Tuple<Vector3, Vector3>(bottomPoint, largeVertices[nextIndex]));
edgeLines.Add(new Tuple<Vector3, Vector3>(largeVertices[nextIndex], largeVertices[i]));
edgeLines.Add(new Tuple<Vector3, Vector3>(largeVertices[i], bottomPoint));
}
// 生成法线并添加小八边形的面
var smallNormals = new List<Vector3>();
for (int i = 0; i < smallVertices.Count; i++)
{
smallNormals.Add(new Vector3(0, 1, 0)); // 小八边形法线向上
}
meshBuilder.AddTriangleFan(smallVertices, smallNormals);
// 生成大八边形和小八边形的连接面
for (int i = 0; i < sides; i++)
{
int nextIndex = (i + 1) % sides;
// 计算法线
// Vector3 edge1 = largeVertices[nextIndex] - largeVertices[i];
// Vector3 edge2 = smallVertices[nextIndex] - largeVertices[i];
// Vector3 normal1 = Vector3.Cross(edge1, edge2);
// normal1.Normalize();
//
// Vector3 edge3 = smallVertices[nextIndex] - largeVertices[i];
// Vector3 edge4 = smallVertices[i] - largeVertices[i];
// Vector3 normal2 = Vector3.Cross(edge3, edge4);
// normal2.Normalize();
List<Vector3> fanPositions1 = new List<Vector3>()
{ largeVertices[i], largeVertices[nextIndex], smallVertices[nextIndex] };
List<Vector3> fanNormals1 = new List<Vector3>()
{ new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 0) };
meshBuilder.AddTriangleFan(fanPositions1, fanNormals1);
//meshBuilder.AddTriangle(largeVertices[i], largeVertices[nextIndex], smallVertices[nextIndex]);
List<Vector3> fanPositions2 = new List<Vector3>()
{ largeVertices[i], smallVertices[nextIndex], smallVertices[i] };
List<Vector3> fanNormals2 = new List<Vector3>()
{ new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 0) };
meshBuilder.AddTriangleFan(fanPositions2, fanNormals2);
//meshBuilder.AddTriangle(largeVertices[i], smallVertices[nextIndex], smallVertices[i]);
// 添加边框线
edgeLines.Add(new Tuple<Vector3, Vector3>(largeVertices[i], largeVertices[nextIndex]));
edgeLines.Add(new Tuple<Vector3, Vector3>(largeVertices[nextIndex], smallVertices[nextIndex]));
edgeLines.Add(new Tuple<Vector3, Vector3>(smallVertices[nextIndex], smallVertices[i]));
edgeLines.Add(new Tuple<Vector3, Vector3>(smallVertices[i], largeVertices[i]));
}
var mesh = meshBuilder.ToMeshGeometry3D();
var material = new PBRMaterial
{
AlbedoColor = new Color4(0.11f, 0.56f, 1f, 0.6f), // 纯白色
MetallicFactor = 0.0,
RoughnessFactor = 0.01,
ReflectanceFactor = 1.0,
ClearCoatStrength = 1.0,
ClearCoatRoughness = 0.0,
// RenderEnvironmentMap = true,
// IrradianceMap = TextureModel.Create(stream), // 环境贴图
};
// 设置材质的采样器状态
material.SurfaceMapSampler = new SamplerStateDescription
{
Filter = Filter.MinMagMipLinear,
AddressU = TextureAddressMode.Wrap,
AddressV = TextureAddressMode.Wrap,
AddressW = TextureAddressMode.Wrap
};
//边框
var lineBuilder = new LineBuilder();
foreach (var line in edgeLines)
{
lineBuilder.AddLine(line.Item1, line.Item2);
}
var edgeLinesModel = new LineGeometryModel3D
{
Geometry = lineBuilder.ToLineGeometry3D(),
Color = System.Windows.Media.Colors.Black,
Thickness = 1.0
};
viewport.Items.Add(edgeLinesModel);
var geometryModel = new MeshGeometryModel3D
{
Geometry = mesh,
Material = material
};
viewport.Items.Add(geometryModel);
viewport.ZoomExtents();
}
public static void GenerateModelByEntity(Viewport3DX viewport, List<Viewport3DTriangleEntity> entities)
{
var meshBuilder = new MeshBuilder(true, false);
viewport.RenderHost.MSAA = MSAALevel.Maximum;
foreach (var entity in entities)
{
List<Vector3> vertices = new List<Vector3>(){entity.Point1, entity.Point2, entity.Point3};
meshBuilder.AddPolygon(vertices);
}
var mesh = meshBuilder.ToMeshGeometry3D();
var material = new PBRMaterial
{
AlbedoColor = new Color4(0.11f, 0.56f, 1f, 0.6f),
MetallicFactor = 0.0,
RoughnessFactor = 0.01,
ReflectanceFactor = 1.0,
ClearCoatStrength = 1.0,
ClearCoatRoughness = 0.0,
};
// 设置材质的采样器状态
material.SurfaceMapSampler = new SamplerStateDescription
{
Filter = Filter.MinMagMipLinear,
AddressU = TextureAddressMode.Wrap,
AddressV = TextureAddressMode.Wrap,
AddressW = TextureAddressMode.Wrap
};
var geometryModel = new MeshGeometryModel3D
{
Geometry = mesh,
Material = material
};
viewport.Items.Add(geometryModel);
}
/// <summary>
/// 传入一个三角形,找到关联面
/// </summary>
/// <param name="viewport">控件</param>
/// <param name="triangleIndex">三角形顶点</param>
/// <param name="selColor">选择主体颜色</param>
/// <param name="linkColor">选择关联颜色(null不渲染)</param>
/// <param name="borderColor">选择边框颜色(null不渲染)</param>
/// <returns></returns>
public static List<GeometryModel3D> HighlightAssociatedFaces(Viewport3DX viewport,
Tuple<Vector3, Vector3, Vector3> triangleIndex, Color4 selColor, Color4? linkColor = null,
Color4? borderColor = null)
{
List<GeometryModel3D> result = new List<GeometryModel3D>();
//选中平面上的点(实现选中高亮、边框线)
List<Vector3> selFaceVector = new List<Vector3>();
selFaceVector.Add(triangleIndex.Item1);
selFaceVector.Add(triangleIndex.Item2);
selFaceVector.Add(triangleIndex.Item3);
foreach (var item in viewport.Items)
{
if (item is MeshGeometryModel3D geometryModel)
{
var geometry = geometryModel.Geometry;
if (geometry != null)
{
var positions = geometry.Positions; // 顶点列表
var indices = geometry.Indices; // 索引列表
// 确保 Indices 是三角形格式
for (int i = 0; i < indices.Count; i += 3)
{
// 获取三角形的三个顶点索引
int index0 = indices[i];
int index1 = indices[i + 1];
int index2 = indices[i + 2];
// 获取三角形的三个顶点坐标
var vertex0 = positions[index0];
var vertex1 = positions[index1];
var vertex2 = positions[index2];
List<Vector3> temp = new List<Vector3>() { vertex0, vertex1, vertex2 };
if (ArePointsOnSamePlane(triangleIndex, temp))
{
//所有点共面,两种情况,三角形自己,三角形相连在同一个平面
if (temp.Count == 3 && temp.Contains(triangleIndex.Item1) &&
temp.Contains(triangleIndex.Item2) && temp.Contains(triangleIndex.Item3))
continue;
foreach (var vector in temp)
{
// if(!selFaceVector.Contains(vector))
selFaceVector.Add(vector);
}
}
}
}
}
}
//当前选中的平面
var meshBuilder = new MeshBuilder(true, false);
List<Vector3> fanNormals2 = new List<Vector3>();
foreach (var vertex in selFaceVector)
fanNormals2.Add(new Vector3(0, 1, 0));
meshBuilder.AddTriangleFan(selFaceVector, fanNormals2);
var mesh = meshBuilder.ToMeshGeometry3D();
var material = new PBRMaterial
{
AlbedoColor = selColor, // 纯白色
MetallicFactor = 0,
RoughnessFactor = 1,
ReflectanceFactor = 0.5,
};
var geometryModel1 = new MeshGeometryModel3D
{
Geometry = mesh,
Material = material
};
//当前选中平面边框线
var edgeLines = new List<Tuple<Vector3, Vector3>>();
var lengths = new List<double>(); // 长度列表
var angles = new List<double>(); // 夹角列表
HashSet<Vector3> uniqueVectors = new HashSet<Vector3>(selFaceVector);
List<Vector3> sortedVectors = uniqueVectors.ToList();
Vector3 center = GetCentroid(sortedVectors);
// 按极角顺时针排序
sortedVectors.Sort((v1, v2) =>
{
double angle1 = Math.Atan2(v1.Z - center.Z, v1.X - center.X); // 计算第一个点的角度
double angle2 = Math.Atan2(v2.Z - center.Z, v2.X - center.X); // 计算第二个点的角度
return angle1.CompareTo(angle2); // 按角度从小到大排序
});
for (int i = 0; i < sortedVectors.Count - 1; i++)
{
var nowItem = sortedVectors[i];
var nextItem = sortedVectors[i + 1];
edgeLines.Add(new Tuple<Vector3, Vector3>(nowItem, nextItem));
// 计算当前线段的长度
lengths.Add((nextItem - nowItem).Length());
}
edgeLines.Add(new Tuple<Vector3, Vector3>(sortedVectors.Last(), sortedVectors.First()));
lengths.Add((sortedVectors.Last() - sortedVectors.First()).Length());
//计算夹角
for (int i = 0; i < sortedVectors.Count; i++)
{
int prevIndex = (i - 1 + sortedVectors.Count) % sortedVectors.Count;
int nextIndex = (i + 1) % sortedVectors.Count;
// 获取三点
var p1 = sortedVectors[prevIndex];
var p2 = sortedVectors[i];
var p3 = sortedVectors[nextIndex];
// 计算夹角
var v1 = p2 - p1;
var v2 = p3 - p2;
double angle = AngleBetween(v1, v2);
angles.Add(angle); // 夹角,单位是度
}
if (sortedVectors.Count == lengths.Count && sortedVectors.Count == angles.Count)
{
for (int i = 0; i < sortedVectors.Count; i++)
{
var point = sortedVectors[i];
var pointNext = i + 1 >= sortedVectors.Count ? sortedVectors.First() : sortedVectors[i + 1];
var lengthText = $"L: {lengths[i]:F2}";
var angleText = $"Angle: {angles[i]:F2}°";
var lengthTextPoint = (pointNext + point) / 2;
// 在合适位置显示文本
var text3DL = DisplayText3D(lengthText,
new Vector3(lengthTextPoint.X, lengthTextPoint.Y + 0.5f, lengthTextPoint.Z));
var text3DA = DisplayText3D(angleText, new Vector3(point.X, point.Y + 0.5f, point.Z + 0.5f));
viewport.Items.Add(text3DL);
viewport.Items.Add(text3DA);
result.Add(text3DL);
result.Add(text3DA);
}
}
else
{
// 如果列表长度不一致,给出提示信息
Console.WriteLine("The lengths or angles list size does not match the sorted vectors list.");
}
var lineBuilder = new LineBuilder();
foreach (var line in edgeLines)
{
lineBuilder.AddLine(line.Item1, line.Item2);
}
var edgeLinesModel = new LineGeometryModel3D
{
Geometry = lineBuilder.ToLineGeometry3D(),
Color = System.Windows.Media.Colors.Red,
Thickness = 1.0
};
viewport.Items.Add(edgeLinesModel);
viewport.Items.Add(geometryModel1);
result.Add(geometryModel1);
result.Add(edgeLinesModel);
return result;
}
/// <summary>
/// 遍历视图中的所有三角形
/// </summary>
/// <param name="viewport"></param>
/// <returns></returns>
public static List<Tuple<Vector3, Vector3, Vector3>> ForeachViewPortTriangle(Viewport3DX viewport)
{
List<Tuple<Vector3, Vector3, Vector3>> result = new List<Tuple<Vector3, Vector3, Vector3>>();
foreach (var item in viewport.Items)
{
if (item is MeshGeometryModel3D geometryModel)
{
var geometry = geometryModel.Geometry;
if (geometry != null)
{
var positions = geometry.Positions; // 顶点列表
var indices = geometry.Indices; // 索引列表
// 确保 Indices 是三角形格式
for (int i = 0; i < indices.Count; i += 3)
{
// 获取三角形的三个顶点索引
int index0 = indices[i];
int index1 = indices[i + 1];
int index2 = indices[i + 2];
// 获取三角形的三个顶点坐标
var vertex0 = positions[index0];
var vertex1 = positions[index1];
var vertex2 = positions[index2];
result.Add(new Tuple<Vector3, Vector3, Vector3>(vertex0, vertex1, vertex2));
}
}
}
}
return result;
}
private static BillboardTextModel3D DisplayText3D(string text, Vector3 position)
{
var billboardTextModel = new BillboardTextModel3D();
var billboardText = new BillboardText3D();
billboardText.TextInfo.Add(new TextInfo(text, position)
{
Foreground = Color.Green,
Scale = 0.5f,
});
billboardTextModel.Geometry = billboardText;
return billboardTextModel;
}
public static float AngleBetween(Vector3 v1, Vector3 v2)
{
// 计算两个向量的点积
float dotProduct = Vector3.Dot(v1, v2);
// 计算每个向量的模长
float magnitudeV1 = v1.Length();
float magnitudeV2 = v2.Length();
// 防止除以零错误
if (magnitudeV1 == 0 || magnitudeV2 == 0)
{
return 0f;
}
// 计算夹角的余弦值
float cosTheta = dotProduct / (magnitudeV1 * magnitudeV2);
// 限制cosTheta的值范围在 -1 到 1 之间,以防计算机浮点误差
cosTheta = Math.Max(-1f, Math.Min(1f, cosTheta));
// 返回角度,单位是度
return (float)(Math.Acos(cosTheta) * (180.0 / Math.PI));
}
// 计算点集合的中心点(几何质心)
private static Vector3 GetCentroid(List<Vector3> vectors)
{
float x = vectors.Sum(v => v.X) / vectors.Count;
float y = vectors.Sum(v => v.Y) / vectors.Count;
float z = vectors.Sum(v => v.Z) / vectors.Count;
return new Vector3(x, y, z);
}
/// <summary>
/// 判断集合元素是狗共面
/// </summary>
/// <param name="triangle"></param>
/// <param name="points"></param>
/// <returns></returns>
public static bool ArePointsOnSamePlane(Tuple<Vector3, Vector3, Vector3> triangle, List<Vector3> points)
{
// 获取三角形的三个点
var P1 = triangle.Item1;
var P2 = triangle.Item2;
var P3 = triangle.Item3;
// 计算平面的法线
Vector3 V1 = P2 - P1; // 向量P1P2
Vector3 V2 = P3 - P1; // 向量P1P3
Vector3 normal = Vector3.Cross(V1, V2); // 叉积得到平面法线
// 对每个点进行检查
foreach (var point in points)
{
if (!IsPointInPlane(P1, normal, point))
{
return false; // 如果有点不在平面上,返回false
}
}
return true; // 如果所有点都在平面上,返回true
}
/// <summary>
/// 判断点是否在平面上
/// </summary>
/// <returns></returns>
private static bool IsPointInPlane(Vector3 planePoint, Vector3 normal, Vector3 point)
{
// 计算点到平面的距离
// 点到平面的距离公式:d = (point - planePoint) · normal / |normal|
float distance = Vector3.Dot(point - planePoint, normal) / normal.Length();
// 如果距离为0,说明点在平面上
return Math.Abs(distance) < 1e-6; // 容忍一个小的误差
}
public static void GenerateLightingForModel(Viewport3DX viewport)
{
// 移除现有的灯光
List<Light3D> lights = new List<Light3D>();
foreach (var item in viewport.Items)
{
if (item is Light3D)
{
lights.Add(item as Light3D);
}
}
lights.ForEach(item => viewport.Items.Remove(item));
// 获取场景中最大的模型
var models = viewport.Items.OfType<MeshGeometryModel3D>();
if (!models.Any()) return;
var largestModel = models
.OrderByDescending(m => GetBoundingBoxVolume(m.Geometry.Bound))
.FirstOrDefault();
if (largestModel == null) return;
// 获取最大模型的边界立方体
var boundingBox = largestModel.Geometry.Bound;
var size = boundingBox.Size;
var center = boundingBox.Center;
// 计算 Bounding Box 的八个顶点
var corners = new List<Point3D>
{
boundingBox.Minimum.ToPoint3D(), // 左下后
new Point3D(boundingBox.Maximum.X, boundingBox.Minimum.Y, boundingBox.Minimum.Z), // 右下后
new Point3D(boundingBox.Minimum.X, boundingBox.Maximum.Y, boundingBox.Minimum.Z), // 左上后
new Point3D(boundingBox.Minimum.X, boundingBox.Minimum.Y, boundingBox.Maximum.Z), // 左下前
boundingBox.Maximum.ToPoint3D(), // 右上前
new Point3D(boundingBox.Maximum.X, boundingBox.Maximum.Y, boundingBox.Minimum.Z), // 右上后
new Point3D(boundingBox.Minimum.X, boundingBox.Maximum.Y, boundingBox.Maximum.Z), // 左上前
new Point3D(boundingBox.Maximum.X, boundingBox.Minimum.Y, boundingBox.Maximum.Z) // 右下前
};
// 在每个顶点处添加光源
for (int i = 0; i < corners.Count; i++)
{
var corner = corners[i];
// 设置点光源的颜色和强度,使得八个点的光源具有不同效果
var color = i % 2 == 0 ? Colors.LightGoldenrodYellow : Colors.LightSkyBlue;
// 添加点光源
var pointLight = new PointLight3D
{
Position = corner,
Color = color,
Range = (float)size.Length() * 4 // 光照范围覆盖整个模型
};
viewport.Items.Add(pointLight);
}
// 添加顶部的多处光源(从上向下照射,模拟太阳光)
double topLightDistance = size.Y * 1.2; // 适当调整顶部光源的高度
var topLightPositions = new List<Point3D>
{
new Point3D(center.X, boundingBox.Maximum.Y + topLightDistance, center.Z),
new Point3D(boundingBox.Minimum.X - size.X / 3, boundingBox.Maximum.Y + topLightDistance, center.Z),
new Point3D(boundingBox.Maximum.X + size.X / 3, boundingBox.Maximum.Y + topLightDistance, center.Z)
};
foreach (var position in topLightPositions)
{
var topLight = new PointLight3D
{
Position = position,
Color = Colors.LightGoldenrodYellow,
Range = (float)size.Length() * 0.5, // 增加光的照射范围
Attenuation = new Vector3D(1, 0.1f, 0.05f) // 控制光的衰减,使光在距离内更有效
};
viewport.Items.Add(topLight);
}
// 添加环境光以柔化整体效果并增加亮度
var ambientLight = new AmbientLight3D
{
Color = Colors.LightGray
};
viewport.Items.Add(ambientLight);
var ambientLigh1t = new AmbientLight3D
{
Color = Colors.Gray // 设置环境光颜色
};
viewport.Items.Add(ambientLigh1t);
// 添加环境光以柔化整体效果并增加亮度
// var ambientLight = new AmbientLight3D
// {
// Color = Colors.LightGray
// };
// viewport.Items.Add(ambientLight);
// 添加底部的光源(从底部中心向上照射)
// var bottomLightPosition = new Point3D(center.X, boundingBox.Minimum.Y - 1.0f, center.Z); // 位于底部中心点下方
// var bottomLight = new PointLight3D
// {
// Position = bottomLightPosition,
// Color = Colors.White, // 白色光源
// Range = (float)size.Length() * 2 // 设置光照范围
// };
// viewport.Items.Add(bottomLight);
}
// 辅助方法:获取边界体积
private static double GetBoundingBoxVolume(BoundingBox bound)
{
var size = bound.Size;
return size.X * size.Y * size.Z;
}
public static List<Viewport3DTriangleEntity> InitDemo(Viewport3DX viewport)
{
List<Viewport3DTriangleEntity> entities = new List<Viewport3DTriangleEntity>();
try
{
using (FileStream fileStream = new FileStream(AppDomain.CurrentDomain.BaseDirectory + @"Resource\DimDemo.txt", FileMode.Open, FileAccess.Read))
using (StreamReader reader = new StreamReader(fileStream))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if(string.IsNullOrWhiteSpace(line))continue;
if(line.StartsWith("-- "))continue;
entities.Add(Viewport3DTriangleEntity.CreateByString(line));
}
}
}
catch (Exception ex)
{
Console.WriteLine($"读取文件时出错:{ex.Message}");
}
GenerateModelByEntity(viewport, entities);
GenerateLightingForModel(viewport);
return entities;
}
public static List<GeometryModel3D> GenerateEmissiveModelByEntity(Viewport3DX viewport, List<Viewport3DTriangleEntity> entities, Color4 emissiveColor)
{
// 创建 MeshBuilder,启用法线生成
var meshBuilder = new MeshBuilder(true, false);
viewport.RenderHost.MSAA = MSAALevel.Maximum;
// 通过实体构建三角形面
foreach (var entity in entities)
{
List<Vector3> vertices = new List<Vector3>() { entity.Point1, entity.Point2, entity.Point3 };
meshBuilder.AddPolygon(vertices);
}
// 生成网格
var mesh = meshBuilder.ToMeshGeometry3D();
// 创建自发光材质
var material = new PBRMaterial
{
AlbedoColor = new Color4(0, 0, 0, 1.0f), // 黑色,避免其他光照影响
EmissiveColor = emissiveColor, // 自发光颜色
MetallicFactor = 0.0, // 非金属
RoughnessFactor = 1.0, // 高粗糙度,避免反射效果
ReflectanceFactor = 0.0, // 无反射
ClearCoatStrength = 0.0, // 无清漆效果
ClearCoatRoughness = 1.0, // 高粗糙度
};
// 设置材质的采样器状态
material.SurfaceMapSampler = new SamplerStateDescription
{
Filter = Filter.MinMagMipLinear,
AddressU = TextureAddressMode.Wrap,
AddressV = TextureAddressMode.Wrap,
AddressW = TextureAddressMode.Wrap
};
// 创建几何模型
var geometryModel = new MeshGeometryModel3D
{
Geometry = mesh,
Material = material
};
// 将几何模型添加到视图中
viewport.Items.Add(geometryModel);
List<GeometryModel3D> result = new List<GeometryModel3D>();
result.Add(geometryModel);
return result;
}
public static List<GeometryModel3D> GenerateLineTextModelByEntity(Viewport3DX viewport, List<Viewport3DTriangleEntity> entities)
{
List<GeometryModel3D> result = new List<GeometryModel3D>();
List<Vector3> selFaceVector = new List<Vector3>();
foreach (var entity in entities)
{
selFaceVector.Add(entity.Point1);
selFaceVector.Add(entity.Point2);
selFaceVector.Add(entity.Point3);
}
var edgeLines = new List<Tuple<Vector3, Vector3>>();
var lengths = new List<double>(); // 长度列表
var angles = new List<double>(); // 夹角列表
HashSet<Vector3> uniqueVectors = new HashSet<Vector3>(selFaceVector);
List<Vector3> sortedVectors = uniqueVectors.ToList();
Vector3 center = GetCentroid(sortedVectors);
sortedVectors.Sort((v1, v2) =>
{
double angle1 = Math.Atan2(v1.Z - center.Z, v1.X - center.X); // 计算第一个点的角度
double angle2 = Math.Atan2(v2.Z - center.Z, v2.X - center.X); // 计算第二个点的角度
return angle1.CompareTo(angle2); // 按角度从小到大排序
});
for (int i = 0; i < sortedVectors.Count - 1; i++)
{
var nowItem = sortedVectors[i];
var nextItem = sortedVectors[i + 1];
edgeLines.Add(new Tuple<Vector3, Vector3>(nowItem, nextItem));
// 计算当前线段的长度
lengths.Add((nextItem - nowItem).Length());
}
edgeLines.Add(new Tuple<Vector3, Vector3>(sortedVectors.Last(), sortedVectors.First()));
lengths.Add((sortedVectors.Last() - sortedVectors.First()).Length());
//计算夹角
for (int i = 0; i < sortedVectors.Count; i++)
{
int prevIndex = (i - 1 + sortedVectors.Count) % sortedVectors.Count;
int nextIndex = (i + 1) % sortedVectors.Count;
// 获取三点
var p1 = sortedVectors[prevIndex];
var p2 = sortedVectors[i];
var p3 = sortedVectors[nextIndex];
// 计算夹角
var v1 = p2 - p1;
var v2 = p3 - p2;
double angle = AngleBetween(v1, v2);
angles.Add(angle); // 夹角,单位是度
}
if (sortedVectors.Count == lengths.Count && sortedVectors.Count == angles.Count)
{
for (int i = 0; i < sortedVectors.Count; i++)
{
var point = sortedVectors[i];
var pointNext = i + 1 >= sortedVectors.Count ? sortedVectors.First() : sortedVectors[i + 1];
var lengthText = $"L: {lengths[i]:F2}";
var angleText = $"Angle: {angles[i]:F2}°";
var lengthTextPoint = (pointNext + point) / 2;
// 在合适位置显示文本
var text3DL = DisplayText3D(lengthText,
new Vector3(lengthTextPoint.X, lengthTextPoint.Y + 0.5f, lengthTextPoint.Z));
var text3DA = DisplayText3D(angleText, new Vector3(point.X, point.Y + 0.5f, point.Z + 0.5f));
viewport.Items.Add(text3DL);
viewport.Items.Add(text3DA);
result.Add(text3DL);
result.Add(text3DA);
}
}
else
{
// 如果列表长度不一致,给出提示信息
Console.WriteLine("The lengths or angles list size does not match the sorted vectors list.");
}
var lineBuilder = new LineBuilder();
foreach (var line in edgeLines)
{
lineBuilder.AddLine(line.Item1, line.Item2);
}
var edgeLinesModel = new LineGeometryModel3D
{
Geometry = lineBuilder.ToLineGeometry3D(),
Color = System.Windows.Media.Colors.Red,
Thickness = 1.0
};
viewport.Items.Add(edgeLinesModel);
result.Add(edgeLinesModel);
return result;
}
}

@ -1,310 +0,0 @@
-- 腰
-39.660,46.816,-30.448;-43.304,46.817,-24.996;-39.662,48.374,-30.446|0|7dbb404af789839a701aebd8b3b603e1|0
-48.293,46.816,-12.953;-46.194,49.000,-19.134;-46.194,46.000,-19.134|0|7dbb404af789839a701aebd8b3b603e1|0
-30.446,48.374,-39.662;-30.442,46.817,-39.665;-35.355,46.000,-35.355|0|7dbb404af789839a701aebd8b3b603e1|0
19.134,49.000,-46.194;24.992,48.374,-43.306;19.134,46.000,-46.194|0|7dbb404af789839a701aebd8b3b603e1|0
35.355,49.000,-35.355;35.355,46.000,-35.355;30.448,46.816,-39.660|0|7dbb404af789839a701aebd8b3b603e1|0
35.355,49.000,-35.355;39.662,48.374,-30.446;35.355,46.000,-35.355|0|7dbb404af789839a701aebd8b3b603e1|0
30.446,48.374,-39.662;30.448,46.816,-39.660;24.996,46.817,-43.304|0|7dbb404af789839a701aebd8b3b603e1|0
-12.946,46.817,-48.295;-19.134,46.000,-46.194;-12.950,48.374,-48.294|0|7dbb404af789839a701aebd8b3b603e1|0
39.665,46.817,-30.442;43.306,48.374,-24.992;43.307,46.816,-24.989|0|7dbb404af789839a701aebd8b3b603e1|0
48.294,48.374,-12.950;46.194,46.000,-19.134;46.194,49.000,-19.134|0|7dbb404af789839a701aebd8b3b603e1|0
6.521,46.817,-49.573;-0.000,46.000,-50.000;6.517,48.374,-49.573|0|7dbb404af789839a701aebd8b3b603e1|0
48.295,46.817,-12.946;49.573,48.374,-6.517;49.574,46.816,-6.513|0|7dbb404af789839a701aebd8b3b603e1|0
43.307,46.816,-24.989;46.194,49.000,-19.134;46.194,46.000,-19.134|0|7dbb404af789839a701aebd8b3b603e1|0
24.996,46.817,-43.304;19.134,46.000,-46.194;24.992,48.374,-43.306|0|7dbb404af789839a701aebd8b3b603e1|0
50.000,46.000,-0.000;49.574,46.816,-6.513;50.000,49.000,0.000|0|7dbb404af789839a701aebd8b3b603e1|0
48.294,48.374,12.950;48.293,46.816,12.953;49.573,46.817,6.521|0|7dbb404af789839a701aebd8b3b603e1|0
39.665,46.817,-30.442;35.355,46.000,-35.355;39.662,48.374,-30.446|0|7dbb404af789839a701aebd8b3b603e1|0
46.194,46.000,19.134;48.293,46.816,12.953;46.194,49.000,19.134|0|7dbb404af789839a701aebd8b3b603e1|0
50.000,49.000,0.000;49.573,48.374,6.517;50.000,46.000,-0.000|0|7dbb404af789839a701aebd8b3b603e1|0
48.295,46.817,-12.946;46.194,46.000,-19.134;48.294,48.374,-12.950|0|7dbb404af789839a701aebd8b3b603e1|0
46.194,46.000,19.134;46.194,49.000,19.134;43.306,48.374,24.992|0|7dbb404af789839a701aebd8b3b603e1|0
30.446,48.374,39.662;35.355,46.000,35.355;35.355,49.000,35.355|0|7dbb404af789839a701aebd8b3b603e1|0
49.573,46.817,6.521;50.000,46.000,-0.000;49.573,48.374,6.517|0|7dbb404af789839a701aebd8b3b603e1|0
39.660,46.816,30.448;35.355,49.000,35.355;35.355,46.000,35.355|0|7dbb404af789839a701aebd8b3b603e1|0
39.660,46.816,30.448;43.304,46.817,24.996;39.662,48.374,30.446|0|7dbb404af789839a701aebd8b3b603e1|0
43.304,46.817,24.996;46.194,46.000,19.134;43.306,48.374,24.992|0|7dbb404af789839a701aebd8b3b603e1|0
19.134,46.000,46.194;19.134,49.000,46.194;12.950,48.374,48.294|0|7dbb404af789839a701aebd8b3b603e1|0
30.442,46.817,39.665;35.355,46.000,35.355;30.446,48.374,39.662|0|7dbb404af789839a701aebd8b3b603e1|0
12.946,46.817,48.295;6.517,48.374,49.573;6.513,46.816,49.574|0|7dbb404af789839a701aebd8b3b603e1|0
19.134,49.000,46.194;19.134,46.000,46.194;24.989,46.816,43.307|0|7dbb404af789839a701aebd8b3b603e1|0
12.946,46.817,48.295;19.134,46.000,46.194;12.950,48.374,48.294|0|7dbb404af789839a701aebd8b3b603e1|0
6.513,46.816,49.574;6.517,48.374,49.573;-0.000,49.000,50.000|0|7dbb404af789839a701aebd8b3b603e1|0
0.000,46.000,50.000;6.513,46.816,49.574;-0.000,49.000,50.000|0|7dbb404af789839a701aebd8b3b603e1|0
12.953,46.816,-48.293;19.134,49.000,-46.194;19.134,46.000,-46.194|0|7dbb404af789839a701aebd8b3b603e1|0
6.517,48.374,49.573;12.946,46.817,48.295;12.950,48.374,48.294|0|7dbb404af789839a701aebd8b3b603e1|0
24.989,46.816,43.307;24.992,48.374,43.306;19.134,49.000,46.194|0|7dbb404af789839a701aebd8b3b603e1|0
24.992,48.374,43.306;30.442,46.817,39.665;30.446,48.374,39.662|0|7dbb404af789839a701aebd8b3b603e1|0
24.989,46.816,43.307;30.442,46.817,39.665;24.992,48.374,43.306|0|7dbb404af789839a701aebd8b3b603e1|0
39.660,46.816,30.448;39.662,48.374,30.446;35.355,49.000,35.355|0|7dbb404af789839a701aebd8b3b603e1|0
6.521,46.817,-49.573;12.950,48.374,-48.294;12.953,46.816,-48.293|0|7dbb404af789839a701aebd8b3b603e1|0
39.662,48.374,30.446;43.304,46.817,24.996;43.306,48.374,24.992|0|7dbb404af789839a701aebd8b3b603e1|0
48.293,46.816,12.953;48.294,48.374,12.950;46.194,49.000,19.134|0|7dbb404af789839a701aebd8b3b603e1|0
6.517,48.374,-49.573;-0.000,46.000,-50.000;-0.000,49.000,-50.000|0|7dbb404af789839a701aebd8b3b603e1|0
48.294,48.374,12.950;49.573,46.817,6.521;49.573,48.374,6.517|0|7dbb404af789839a701aebd8b3b603e1|0
49.574,46.816,-6.513;49.573,48.374,-6.517;50.000,49.000,0.000|0|7dbb404af789839a701aebd8b3b603e1|0
-0.000,46.000,-50.000;-6.513,46.816,-49.574;-0.000,49.000,-50.000|0|7dbb404af789839a701aebd8b3b603e1|0
49.573,48.374,-6.517;48.295,46.817,-12.946;48.294,48.374,-12.950|0|7dbb404af789839a701aebd8b3b603e1|0
43.307,46.816,-24.989;43.306,48.374,-24.992;46.194,49.000,-19.134|0|7dbb404af789839a701aebd8b3b603e1|0
-6.517,48.374,-49.573;-6.513,46.816,-49.574;-12.946,46.817,-48.295|0|7dbb404af789839a701aebd8b3b603e1|0
43.306,48.374,-24.992;39.665,46.817,-30.442;39.662,48.374,-30.446|0|7dbb404af789839a701aebd8b3b603e1|0
30.448,46.816,-39.660;30.446,48.374,-39.662;35.355,49.000,-35.355|0|7dbb404af789839a701aebd8b3b603e1|0
-19.134,46.000,-46.194;-19.134,49.000,-46.194;-12.950,48.374,-48.294|0|7dbb404af789839a701aebd8b3b603e1|0
30.446,48.374,-39.662;24.996,46.817,-43.304;24.992,48.374,-43.306|0|7dbb404af789839a701aebd8b3b603e1|0
12.953,46.816,-48.293;12.950,48.374,-48.294;19.134,49.000,-46.194|0|7dbb404af789839a701aebd8b3b603e1|0
-24.989,46.816,-43.307;-19.134,49.000,-46.194;-19.134,46.000,-46.194|0|7dbb404af789839a701aebd8b3b603e1|0
12.950,48.374,-48.294;6.521,46.817,-49.573;6.517,48.374,-49.573|0|7dbb404af789839a701aebd8b3b603e1|0
-6.513,46.816,-49.574;-6.517,48.374,-49.573;-0.000,49.000,-50.000|0|7dbb404af789839a701aebd8b3b603e1|0
-24.989,46.816,-43.307;-30.442,46.817,-39.665;-24.992,48.374,-43.306|0|7dbb404af789839a701aebd8b3b603e1|0
-6.517,48.374,-49.573;-12.946,46.817,-48.295;-12.950,48.374,-48.294|0|7dbb404af789839a701aebd8b3b603e1|0
-24.989,46.816,-43.307;-24.992,48.374,-43.306;-19.134,49.000,-46.194|0|7dbb404af789839a701aebd8b3b603e1|0
-39.660,46.816,-30.448;-35.355,49.000,-35.355;-35.355,46.000,-35.355|0|7dbb404af789839a701aebd8b3b603e1|0
-35.355,49.000,-35.355;-30.446,48.374,-39.662;-35.355,46.000,-35.355|0|7dbb404af789839a701aebd8b3b603e1|0
-24.992,48.374,-43.306;-30.442,46.817,-39.665;-30.446,48.374,-39.662|0|7dbb404af789839a701aebd8b3b603e1|0
-43.304,46.817,-24.996;-43.306,48.374,-24.992;-39.662,48.374,-30.446|0|7dbb404af789839a701aebd8b3b603e1|0
-39.660,46.816,-30.448;-39.662,48.374,-30.446;-35.355,49.000,-35.355|0|7dbb404af789839a701aebd8b3b603e1|0
-43.304,46.817,-24.996;-46.194,46.000,-19.134;-43.306,48.374,-24.992|0|7dbb404af789839a701aebd8b3b603e1|0
-43.306,48.374,-24.992;-46.194,46.000,-19.134;-46.194,49.000,-19.134|0|7dbb404af789839a701aebd8b3b603e1|0
-49.574,46.816,6.513;-49.573,48.374,6.517;-50.000,49.000,-0.000|0|7dbb404af789839a701aebd8b3b603e1|0
-49.573,46.817,-6.521;-49.573,48.374,-6.517;-48.294,48.374,-12.950|0|7dbb404af789839a701aebd8b3b603e1|0
-46.194,49.000,19.134;-48.294,48.374,12.950;-46.194,46.000,19.134|0|7dbb404af789839a701aebd8b3b603e1|0
-49.573,48.374,6.517;-48.295,46.817,12.946;-48.294,48.374,12.950|0|7dbb404af789839a701aebd8b3b603e1|0
-35.355,49.000,35.355;-39.662,48.374,30.446;-35.355,46.000,35.355|0|7dbb404af789839a701aebd8b3b603e1|0
-35.355,49.000,35.355;-35.355,46.000,35.355;-30.448,46.816,39.660|0|7dbb404af789839a701aebd8b3b603e1|0
-43.307,46.816,24.989;-43.306,48.374,24.992;-46.194,49.000,19.134|0|7dbb404af789839a701aebd8b3b603e1|0
-19.134,49.000,46.194;-19.134,46.000,46.194;-12.953,46.816,48.293|0|7dbb404af789839a701aebd8b3b603e1|0
-19.134,46.000,46.194;-19.134,49.000,46.194;-24.992,48.374,43.306|0|7dbb404af789839a701aebd8b3b603e1|0
-30.448,46.816,39.660;-30.446,48.374,39.662;-35.355,49.000,35.355|0|7dbb404af789839a701aebd8b3b603e1|0
-6.517,48.374,49.573;-6.521,46.817,49.573;0.000,46.000,50.000|0|7dbb404af789839a701aebd8b3b603e1|0
-6.521,46.817,49.573;-6.517,48.374,49.573;-12.950,48.374,48.294|0|7dbb404af789839a701aebd8b3b603e1|0
-12.953,46.816,48.293;-12.950,48.374,48.294;-19.134,49.000,46.194|0|7dbb404af789839a701aebd8b3b603e1|0
-30.446,48.374,39.662;-24.996,46.817,43.304;-24.992,48.374,43.306|0|7dbb404af789839a701aebd8b3b603e1|0
0.000,46.000,50.000;-0.000,49.000,50.000;-6.517,48.374,49.573|0|7dbb404af789839a701aebd8b3b603e1|0
-19.134,46.000,46.194;-24.992,48.374,43.306;-24.996,46.817,43.304|0|7dbb404af789839a701aebd8b3b603e1|0
-6.521,46.817,49.573;-12.950,48.374,48.294;-12.953,46.816,48.293|0|7dbb404af789839a701aebd8b3b603e1|0
-39.665,46.817,30.442;-35.355,46.000,35.355;-39.662,48.374,30.446|0|7dbb404af789839a701aebd8b3b603e1|0
-24.996,46.817,43.304;-30.446,48.374,39.662;-30.448,46.816,39.660|0|7dbb404af789839a701aebd8b3b603e1|0
-39.662,48.374,30.446;-43.306,48.374,24.992;-39.665,46.817,30.442|0|7dbb404af789839a701aebd8b3b603e1|0
-43.307,46.816,24.989;-46.194,49.000,19.134;-46.194,46.000,19.134|0|7dbb404af789839a701aebd8b3b603e1|0
-39.665,46.817,30.442;-43.306,48.374,24.992;-43.307,46.816,24.989|0|7dbb404af789839a701aebd8b3b603e1|0
-48.295,46.817,12.946;-46.194,46.000,19.134;-48.294,48.374,12.950|0|7dbb404af789839a701aebd8b3b603e1|0
-50.000,49.000,-0.000;-50.000,46.000,-0.000;-49.574,46.816,6.513|0|7dbb404af789839a701aebd8b3b603e1|0
-48.295,46.817,12.946;-49.573,48.374,6.517;-49.574,46.816,6.513|0|7dbb404af789839a701aebd8b3b603e1|0
-50.000,49.000,-0.000;-49.573,48.374,-6.517;-50.000,46.000,-0.000|0|7dbb404af789839a701aebd8b3b603e1|0
-50.000,46.000,-0.000;-49.573,48.374,-6.517;-49.573,46.817,-6.521|0|7dbb404af789839a701aebd8b3b603e1|0
-49.573,46.817,-6.521;-48.294,48.374,-12.950;-48.293,46.816,-12.953|0|7dbb404af789839a701aebd8b3b603e1|0
-46.194,49.000,-19.134;-48.293,46.816,-12.953;-48.294,48.374,-12.950|0|7dbb404af789839a701aebd8b3b603e1|0
-- 台面
25.058,63.400,-0.000;17.719,63.400,-17.719;-0.000,63.400,-25.058|0|396b3abcea691c830e02a40289596796|11
-17.719,63.400,-17.719;17.719,63.400,17.719;25.058,63.400,-0.000|0|396b3abcea691c830e02a40289596796|11
-0.000,63.400,-25.058;-17.719,63.400,-17.719;25.058,63.400,-0.000|0|396b3abcea691c830e02a40289596796|11
0.000,63.400,25.058;17.719,63.400,17.719;-25.058,63.400,0.000|0|396b3abcea691c830e02a40289596796|11
-25.058,63.400,0.000;-17.719,63.400,17.719;0.000,63.400,25.058|0|396b3abcea691c830e02a40289596796|11
-17.719,63.400,-17.719;-25.058,63.400,0.000;17.719,63.400,17.719|0|396b3abcea691c830e02a40289596796|11
-- 下腰面 22
-48.295,46.817,12.946;-10.002,9.202,4.100;-46.194,46.000,19.134|0|a4895d6e10f22c829b9d793bd382bafd|22
-49.574,46.816,6.513;-10.002,9.202,4.100;-48.295,46.817,12.946|0|a4895d6e10f22c829b9d793bd382bafd|22
-49.574,46.816,6.513;-50.000,46.000,-0.000;-10.002,9.202,4.100|0|a4895d6e10f22c829b9d793bd382bafd|22
-9.972,9.202,-4.173;-39.660,46.816,-30.448;-35.355,46.000,-35.355|0|00dc5045a0aaa20edee44fa48934fe79|22
-39.660,46.816,-30.448;-9.972,9.202,-4.173;-43.304,46.817,-24.996|0|00dc5045a0aaa20edee44fa48934fe79|22
-9.972,9.202,-4.173;-46.194,46.000,-19.134;-43.304,46.817,-24.996|0|00dc5045a0aaa20edee44fa48934fe79|22
24.996,46.817,-43.304;4.173,9.202,-9.972;19.134,46.000,-46.194|0|d4bce1a0044d59d475f7c90909c737be|22
30.448,46.816,-39.660;4.173,9.202,-9.972;24.996,46.817,-43.304|0|d4bce1a0044d59d475f7c90909c737be|22
4.173,9.202,-9.972;30.448,46.816,-39.660;35.355,46.000,-35.355|0|d4bce1a0044d59d475f7c90909c737be|22
4.173,9.202,-9.972;6.521,46.817,-49.573;12.953,46.816,-48.293|0|2ac8e5af58984a47577a703618d5a05e|22
4.173,9.202,-9.972;12.953,46.816,-48.293;19.134,46.000,-46.194|0|2ac8e5af58984a47577a703618d5a05e|22
4.173,9.202,-9.972;-0.000,46.000,-50.000;6.521,46.817,-49.573|0|2ac8e5af58984a47577a703618d5a05e|22
-4.100,9.202,-10.002;-12.946,46.817,-48.295;-6.513,46.816,-49.574|0|78b4ef23c9f365322759fbdfbe2eceac|22
-0.000,46.000,-50.000;-4.100,9.202,-10.002;-6.513,46.816,-49.574|0|78b4ef23c9f365322759fbdfbe2eceac|22
-12.946,46.817,-48.295;-4.100,9.202,-10.002;-19.134,46.000,-46.194|0|78b4ef23c9f365322759fbdfbe2eceac|22
-19.134,46.000,-46.194;-4.100,9.202,-10.002;-24.989,46.816,-43.307|0|38c7a333470f49e5c29e1bc691f8aeb5|22
-24.989,46.816,-43.307;-4.100,9.202,-10.002;-30.442,46.817,-39.665|0|38c7a333470f49e5c29e1bc691f8aeb5|22
-4.100,9.202,-10.002;-35.355,46.000,-35.355;-30.442,46.817,-39.665|0|38c7a333470f49e5c29e1bc691f8aeb5|22
-10.002,9.202,4.100;-35.355,46.000,35.355;-39.665,46.817,30.442|0|9189072cfbf3cccb1c2ef0eb831cf149|22
-39.665,46.817,30.442;-43.307,46.816,24.989;-10.002,9.202,4.100|0|9189072cfbf3cccb1c2ef0eb831cf149|22
-10.002,9.202,4.100;-43.307,46.816,24.989;-46.194,46.000,19.134|0|9189072cfbf3cccb1c2ef0eb831cf149|22
-46.194,46.000,-19.134;-9.972,9.202,-4.173;-48.293,46.816,-12.953|0|08a840488158522766bd3b24fde624da|22
-48.293,46.816,-12.953;-9.972,9.202,-4.173;-49.573,46.817,-6.521|0|08a840488158522766bd3b24fde624da|22
-9.972,9.202,-4.173;-50.000,46.000,-0.000;-49.573,46.817,-6.521|0|08a840488158522766bd3b24fde624da|22
10.002,9.202,-4.100;48.295,46.817,-12.946;49.574,46.816,-6.513|0|dd7c41b1fce549f42aeacd7aab372fac|22
50.000,46.000,-0.000;10.002,9.202,-4.100;49.574,46.816,-6.513|0|dd7c41b1fce549f42aeacd7aab372fac|22
48.295,46.817,-12.946;10.002,9.202,-4.100;46.194,46.000,-19.134|0|dd7c41b1fce549f42aeacd7aab372fac|22
43.304,46.817,24.996;9.972,9.202,4.173;46.194,46.000,19.134|0|e75da2414a4fa8b60247f78d30ec2e5c|22
39.660,46.816,30.448;9.972,9.202,4.173;43.304,46.817,24.996|0|e75da2414a4fa8b60247f78d30ec2e5c|22
9.972,9.202,4.173;39.660,46.816,30.448;35.355,46.000,35.355|0|e75da2414a4fa8b60247f78d30ec2e5c|22
9.972,9.202,4.173;49.573,46.817,6.521;48.293,46.816,12.953|0|c894271128a77e1a047b177ccdbf4607|22
9.972,9.202,4.173;48.293,46.816,12.953;46.194,46.000,19.134|0|c894271128a77e1a047b177ccdbf4607|22
9.972,9.202,4.173;50.000,46.000,-0.000;49.573,46.817,6.521|0|c894271128a77e1a047b177ccdbf4607|22
46.194,46.000,-19.134;10.002,9.202,-4.100;43.307,46.816,-24.989|0|4664b8df612337edf03ba928bd73808b|22
43.307,46.816,-24.989;10.002,9.202,-4.100;39.665,46.817,-30.442|0|4664b8df612337edf03ba928bd73808b|22
10.002,9.202,-4.100;35.355,46.000,-35.355;39.665,46.817,-30.442|0|4664b8df612337edf03ba928bd73808b|22
-19.134,46.000,46.194;-4.173,9.202,9.972;-12.953,46.816,48.293|0|1d6fc5b123e903da99e2eab57bb260ec|22
-12.953,46.816,48.293;-4.173,9.202,9.972;-6.521,46.817,49.573|0|1d6fc5b123e903da99e2eab57bb260ec|22
-4.173,9.202,9.972;0.000,46.000,50.000;-6.521,46.817,49.573|0|1d6fc5b123e903da99e2eab57bb260ec|22
4.100,9.202,10.002;30.442,46.817,39.665;24.989,46.816,43.307|0|aa6881482e26977e69a0984677871631|22
4.100,9.202,10.002;24.989,46.816,43.307;19.134,46.000,46.194|0|aa6881482e26977e69a0984677871631|22
4.100,9.202,10.002;35.355,46.000,35.355;30.442,46.817,39.665|0|aa6881482e26977e69a0984677871631|22
12.946,46.817,48.295;4.100,9.202,10.002;19.134,46.000,46.194|0|da3ca69e937333c4995bd186e06e6660|22
6.513,46.816,49.574;4.100,9.202,10.002;12.946,46.817,48.295|0|da3ca69e937333c4995bd186e06e6660|22
6.513,46.816,49.574;0.000,46.000,50.000;4.100,9.202,10.002|0|da3ca69e937333c4995bd186e06e6660|22
-19.134,46.000,46.194;-24.996,46.817,43.304;-4.173,9.202,9.972|0|67b54da250ef377dc19356e7603055ff|22
-30.448,46.816,39.660;-4.173,9.202,9.972;-24.996,46.817,43.304|0|67b54da250ef377dc19356e7603055ff|22
-30.448,46.816,39.660;-35.355,46.000,35.355;-4.173,9.202,9.972|0|67b54da250ef377dc19356e7603055ff|22
-- 亭部主刻面 21
0.000,0.000,-0.000;-50.000,46.000,-0.000;-9.766,8.985,-4.045|0|cda6c912b39797c7ba8cf3ffea613640|21
-50.000,46.000,-0.000;0.000,0.000,-0.000;-9.766,8.985,4.045|0|cda6c912b39797c7ba8cf3ffea613640|21
-4.045,8.985,9.766;-9.766,8.985,4.045;0.000,0.000,-0.000|0|93990da555a0dbdbecda185365def922|21
-4.173,9.202,9.972;-9.766,8.985,4.045;-4.045,8.985,9.766|0|93990da555a0dbdbecda185365def922|21
-9.766,8.985,4.045;-4.173,9.202,9.972;-35.355,46.000,35.355|0|93990da555a0dbdbecda185365def922|21
9.972,9.202,4.173;35.355,46.000,35.355;4.045,8.985,9.766|0|d7b0cbd2902f01b69995ac44aa07deff|21
9.766,8.985,4.045;4.045,8.985,9.766;0.000,0.000,-0.000|0|d7b0cbd2902f01b69995ac44aa07deff|21
9.766,8.985,4.045;9.972,9.202,4.173;4.045,8.985,9.766|0|d7b0cbd2902f01b69995ac44aa07deff|21
4.173,9.202,-9.972;35.355,46.000,-35.355;9.766,8.985,-4.045|0|44979f9e3066ce33059f50702fcb0c0a|21
4.045,8.985,-9.766;9.766,8.985,-4.045;0.000,0.000,-0.000|0|44979f9e3066ce33059f50702fcb0c0a|21
4.045,8.985,-9.766;4.173,9.202,-9.972;9.766,8.985,-4.045|0|44979f9e3066ce33059f50702fcb0c0a|21
-9.766,8.985,-4.045;-4.045,8.985,-9.766;0.000,0.000,-0.000|0|5ccb9023f767a55a8498a2af13084186|21
-9.972,9.202,-4.173;-4.045,8.985,-9.766;-9.766,8.985,-4.045|0|5ccb9023f767a55a8498a2af13084186|21
-4.045,8.985,-9.766;-9.972,9.202,-4.173;-35.355,46.000,-35.355|0|5ccb9023f767a55a8498a2af13084186|21
-4.045,8.985,-9.766;-0.000,46.000,-50.000;0.000,0.000,-0.000|0|ee94fca4a7073265020c9d5044dbedb0|21
0.000,0.000,-0.000;-0.000,46.000,-50.000;4.045,8.985,-9.766|0|ee94fca4a7073265020c9d5044dbedb0|21
9.766,8.985,-4.045;50.000,46.000,-0.000;0.000,0.000,-0.000|0|1493d5a442ff1b307d8cfe6e736a45c2|21
0.000,0.000,-0.000;50.000,46.000,-0.000;9.766,8.985,4.045|0|1493d5a442ff1b307d8cfe6e736a45c2|21
0.000,0.000,-0.000;0.000,46.000,50.000;-4.045,8.985,9.766|0|f677990350a0533680a5ae5477b48fe3|21
4.045,8.985,9.766;0.000,46.000,50.000;0.000,0.000,-0.000|0|f677990350a0533680a5ae5477b48fe3|21
-- 亭部缝隙??
-50.000,46.000,-0.000;-9.766,8.985,4.045;-10.002,9.202,4.100|0|0|99
-50.000,46.000,-0.000;-9.972,9.202,-4.173;-9.766,8.985,-4.045|0|0|99
-0.000,46.000,-50.000;-4.045,8.985,-9.766;-4.100,9.202,-10.002|0|0|99
50.000,46.000,-0.000;9.766,8.985,-4.045;10.002,9.202,-4.100|0|0|99
4.100,9.202,10.002;0.000,46.000,50.000;4.045,8.985,9.766|0|0|99
4.045,8.985,-9.766;-0.000,46.000,-50.000;4.173,9.202,-9.972|0|0|99
-35.355,46.000,-35.355;-4.100,9.202,-10.002;-4.045,8.985,-9.766|0|0|99
9.766,8.985,4.045;50.000,46.000,-0.000;9.972,9.202,4.173|0|0|99
35.355,46.000,-35.355;10.002,9.202,-4.100;9.766,8.985,-4.045|0|0|99
0.000,46.000,50.000;-4.173,9.202,9.972;-4.045,8.985,9.766|0|0|99
4.100,9.202,10.002;4.045,8.985,9.766;35.355,46.000,35.355|0|0|99
-10.002,9.202,4.100;-9.766,8.985,4.045;-35.355,46.000,35.355|0|0|99
-- 冠部主刻面(风筝面) 11
-25.058,63.400,0.000;-35.315,57.478,-14.626;-50.000,49.000,-0.000|0|0bbf439750922c7f2e219a59d12a99c5|12
-50.000,49.000,-0.000;-35.316,57.478,14.627;-25.058,63.400,0.000|0|0bbf439750922c7f2e219a59d12a99c5|12
17.719,63.400,17.719;35.355,49.000,35.355;35.315,57.478,14.629|0|dbba6f34125fd5b2c424d907fa689490|12
35.355,49.000,35.355;17.719,63.400,17.719;14.629,57.478,35.313|0|dbba6f34125fd5b2c424d907fa689490|12
17.719,63.400,-17.719;35.355,49.000,-35.355;14.629,57.478,-35.315|0|99f6930e4b75d96d2def876408192739|12
35.355,49.000,-35.355;17.719,63.400,-17.719;35.313,57.478,-14.629|0|99f6930e4b75d96d2def876408192739|12
-0.000,63.400,-25.058;-0.000,49.000,-50.000;-14.627,57.478,-35.316|0|08383999f8e7205240c161d03f7dfb84|12
-0.000,63.400,-25.058;14.629,57.478,-35.315;-0.000,49.000,-50.000|0|08383999f8e7205240c161d03f7dfb84|12
-17.719,63.400,-17.719;-35.355,49.000,-35.355;-35.315,57.478,-14.626|0|e4266b2dd15a1c3da6e58b750c715eed|12
-17.719,63.400,-17.719;-14.627,57.478,-35.316;-35.355,49.000,-35.355|0|e4266b2dd15a1c3da6e58b750c715eed|12
25.058,63.400,-0.000;50.000,49.000,0.000;35.313,57.478,-14.629|0|c6e1c0df3fffda386444d1d5fcabb530|12
25.058,63.400,-0.000;35.315,57.478,14.629;50.000,49.000,0.000|0|c6e1c0df3fffda386444d1d5fcabb530|12
0.000,63.400,25.058;-0.000,49.000,50.000;14.629,57.478,35.313|0|71c4bbfd0f33113e25ad5263483c0b1c|12
0.000,63.400,25.058;-14.626,57.478,35.315;-0.000,49.000,50.000|0|71c4bbfd0f33113e25ad5263483c0b1c|12
-17.719,63.400,17.719;-35.355,49.000,35.355;-14.626,57.478,35.315|0|45f8d52f83c5f7430398b405873a1d92|12
-17.719,63.400,17.719;-35.316,57.478,14.627;-35.355,49.000,35.355|0|45f8d52f83c5f7430398b405873a1d92|12
-- 星刻面
-35.315,57.478,-14.626;-25.058,63.400,0.000;-17.719,63.400,-17.719|0|86b6a3c846d148b11bb1a42f80a83609|13
-14.626,57.478,35.315;0.000,63.400,25.058;-17.719,63.400,17.719|0|96027456fb0953612f46c7407d4d9789|13
-25.058,63.400,0.000;-35.316,57.478,14.627;-17.719,63.400,17.719|0|65f35d216ac8996693fa14131b5a5e0b|13
0.000,63.400,25.058;14.629,57.478,35.313;17.719,63.400,17.719|0|6e4c972b21512ab99a14aec93b598f6a|13
17.719,63.400,17.719;35.315,57.478,14.629;25.058,63.400,-0.000|0|6820ce13dc7f6667dcc4a412afe0f3ac|13
35.313,57.478,-14.629;17.719,63.400,-17.719;25.058,63.400,-0.000|0|7F343D202CE6C46623B9098993F4F498|13
-14.627,57.478,-35.316;-17.719,63.400,-17.719;-0.000,63.400,-25.058|0|015DE61BEAE0BB2CE98C05C8D25E07ED|13
17.719,63.400,-17.719;14.629,57.478,-35.315;-0.000,63.400,-25.058|0|81245B930647AA46C51C4989D41639E4|13
-- 上腰面
-35.355,49.000,35.355;-35.316,57.478,14.627;-39.662,48.374,30.446|0|d7f46d06662280b465e80e44baaf6656|14
-46.194,49.000,19.134;-43.306,48.374,24.992;-35.316,57.478,14.627|0|d7f46d06662280b465e80e44baaf6656|14
-39.662,48.374,30.446;-35.316,57.478,14.627;-43.306,48.374,24.992|0|d7f46d06662280b465e80e44baaf6656|14
-46.194,49.000,19.134;-35.316,57.478,14.627;-48.294,48.374,12.950|0|6273974b7ba6e76f538fc2443e709984|14
-50.000,49.000,-0.000;-49.573,48.374,6.517;-35.316,57.478,14.627|0|6273974b7ba6e76f538fc2443e709984|14
-48.294,48.374,12.950;-35.316,57.478,14.627;-49.573,48.374,6.517|0|6273974b7ba6e76f538fc2443e709984|14
14.629,57.478,-35.315;6.517,48.374,-49.573;-0.000,49.000,-50.000|0|03b25c5175e9e4d8619c96fd2780a4c8|14
14.629,57.478,-35.315;12.950,48.374,-48.294;6.517,48.374,-49.573|0|03b25c5175e9e4d8619c96fd2780a4c8|14
14.629,57.478,-35.315;19.134,49.000,-46.194;12.950,48.374,-48.294|0|03b25c5175e9e4d8619c96fd2780a4c8|14
-14.627,57.478,-35.316;-30.446,48.374,-39.662;-35.355,49.000,-35.355|0|63b0f0caa3909830e589f01de7b8144f|14
-30.446,48.374,-39.662;-14.627,57.478,-35.316;-24.992,48.374,-43.306|0|63b0f0caa3909830e589f01de7b8144f|14
-24.992,48.374,-43.306;-14.627,57.478,-35.316;-19.134,49.000,-46.194|0|63b0f0caa3909830e589f01de7b8144f|14
35.313,57.478,-14.629;39.662,48.374,-30.446;35.355,49.000,-35.355|0|82e6e851718c1e77c4d2872412645ee2|14
39.662,48.374,-30.446;35.313,57.478,-14.629;43.306,48.374,-24.992|0|82e6e851718c1e77c4d2872412645ee2|14
43.306,48.374,-24.992;35.313,57.478,-14.629;46.194,49.000,-19.134|0|82e6e851718c1e77c4d2872412645ee2|14
35.315,57.478,14.629;49.573,48.374,6.517;50.000,49.000,0.000|0|cc0526c6c2f54bd71b11be0ca77c72a1|14
35.315,57.478,14.629;48.294,48.374,12.950;49.573,48.374,6.517|0|cc0526c6c2f54bd71b11be0ca77c72a1|14
35.315,57.478,14.629;46.194,49.000,19.134;48.294,48.374,12.950|0|cc0526c6c2f54bd71b11be0ca77c72a1|14
14.629,57.478,35.313;19.134,49.000,46.194;24.992,48.374,43.306|0|4b95459cf9f65a489618d114ec9561b1|14
30.446,48.374,39.662;35.355,49.000,35.355;14.629,57.478,35.313|0|4b95459cf9f65a489618d114ec9561b1|14
14.629,57.478,35.313;24.992,48.374,43.306;30.446,48.374,39.662|0|4b95459cf9f65a489618d114ec9561b1|14
-14.626,57.478,35.315;-6.517,48.374,49.573;-0.000,49.000,50.000|0|c169ff75fbf71e9d8e52dc1d035618a8|14
-14.626,57.478,35.315;-19.134,49.000,46.194;-12.950,48.374,48.294|0|c169ff75fbf71e9d8e52dc1d035618a8|14
-6.517,48.374,49.573;-14.626,57.478,35.315;-12.950,48.374,48.294|0|c169ff75fbf71e9d8e52dc1d035618a8|14
-35.315,57.478,-14.626;-49.573,48.374,-6.517;-50.000,49.000,-0.000|0|3046264364e3284ab25d874dfafc5b13|14
-35.315,57.478,-14.626;-46.194,49.000,-19.134;-48.294,48.374,-12.950|0|3046264364e3284ab25d874dfafc5b13|14
-49.573,48.374,-6.517;-35.315,57.478,-14.626;-48.294,48.374,-12.950|0|3046264364e3284ab25d874dfafc5b13|14
-14.626,57.478,35.315;-24.992,48.374,43.306;-19.134,49.000,46.194|0|a9783029b821c23fe8724485645e2067|14
-24.992,48.374,43.306;-14.626,57.478,35.315;-30.446,48.374,39.662|0|a9783029b821c23fe8724485645e2067|14
-14.626,57.478,35.315;-35.355,49.000,35.355;-30.446,48.374,39.662|0|a9783029b821c23fe8724485645e2067|14
19.134,49.000,46.194;14.629,57.478,35.313;12.950,48.374,48.294|0|9a48e09f3da15e8ad7f88eb749440fc9|14
-0.000,49.000,50.000;6.517,48.374,49.573;14.629,57.478,35.313|0|9a48e09f3da15e8ad7f88eb749440fc9|14
12.950,48.374,48.294;14.629,57.478,35.313;6.517,48.374,49.573|0|9a48e09f3da15e8ad7f88eb749440fc9|14
43.306,48.374,24.992;46.194,49.000,19.134;35.315,57.478,14.629|0|c5c6965a2da976f05d6b2af107edd438|14
35.355,49.000,35.355;39.662,48.374,30.446;35.315,57.478,14.629|0|c5c6965a2da976f05d6b2af107edd438|14
43.306,48.374,24.992;35.315,57.478,14.629;39.662,48.374,30.446|0|c5c6965a2da976f05d6b2af107edd438|14
35.313,57.478,-14.629;49.573,48.374,-6.517;48.294,48.374,-12.950|0|e7db2f10bfc06b6bd66626ce54239040|14
35.313,57.478,-14.629;48.294,48.374,-12.950;46.194,49.000,-19.134|0|e7db2f10bfc06b6bd66626ce54239040|14
35.313,57.478,-14.629;50.000,49.000,0.000;49.573,48.374,-6.517|0|e7db2f10bfc06b6bd66626ce54239040|14
24.992,48.374,-43.306;19.134,49.000,-46.194;14.629,57.478,-35.315|0|40ad8b5dc3d50fbce654fd1ebdddf174|14
35.355,49.000,-35.355;30.446,48.374,-39.662;14.629,57.478,-35.315|0|40ad8b5dc3d50fbce654fd1ebdddf174|14
24.992,48.374,-43.306;14.629,57.478,-35.315;30.446,48.374,-39.662|0|40ad8b5dc3d50fbce654fd1ebdddf174|14
-14.627,57.478,-35.316;-6.517,48.374,-49.573;-12.950,48.374,-48.294|0|513a3ebeecf54327e17972ddac75d4e9|14
-14.627,57.478,-35.316;-12.950,48.374,-48.294;-19.134,49.000,-46.194|0|513a3ebeecf54327e17972ddac75d4e9|14
-14.627,57.478,-35.316;-0.000,49.000,-50.000;-6.517,48.374,-49.573|0|513a3ebeecf54327e17972ddac75d4e9|14
-35.315,57.478,-14.626;-43.306,48.374,-24.992;-46.194,49.000,-19.134|0|d7efe8af63a3706f1e8ebe01a7ccac04|14
-43.306,48.374,-24.992;-35.315,57.478,-14.626;-39.662,48.374,-30.446|0|d7efe8af63a3706f1e8ebe01a7ccac04|14
-35.315,57.478,-14.626;-35.355,49.000,-35.355;-39.662,48.374,-30.446|0|d7efe8af63a3706f1e8ebe01a7ccac04|14

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1008 B

@ -1,88 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AvalonEdit" Version="6.3.0.90" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.3.2" />
<PackageReference Include="HandyControl" Version="3.5.1" />
<PackageReference Include="HandyControl.Lang.en" Version="3.5.1" />
<PackageReference Include="HandyControls.Lang.zh-CN" Version="3.5.3" />
<PackageReference Include="log4net" Version="3.0.3" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2903.40" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlcipher" Version="2.1.10" />
</ItemGroup>
<ItemGroup>
<None Remove="Resource\Images\IGILogo.png" />
<Resource Include="Resource\Images\IGILogo.png" />
<None Remove="Resource\Images\homebg.png" />
<Resource Include="Resource\Images\homebg.png" />
<None Update="log4net.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SparkDB.db">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Remove="Resource\Images\config_3x.png" />
<Resource Include="Resource\Images\config_3x.png" />
<None Remove="Resource\Images\diam_3x.png" />
<Resource Include="Resource\Images\diam_3x.png" />
<None Remove="Resource\Images\hand_3x.png" />
<Resource Include="Resource\Images\hand_3x.png" />
<None Remove="Resource\Images\help_3x.png" />
<Resource Include="Resource\Images\help_3x.png" />
<None Remove="Resource\Images\diamtest_3x.png" />
<Resource Include="Resource\Images\diamtest_3x.png" />
<None Remove="Resource\Images\Level_Def@3x.png" />
<Resource Include="Resource\Images\Level_Def@3x.png" />
<None Remove="Resource\Images\Level_Sel@3x.png" />
<Resource Include="Resource\Images\Level_Sel@3x.png" />
<None Remove="Resource\Images\Cut_Sel@3x.png" />
<Resource Include="Resource\Images\Cut_Sel@3x.png" />
<None Remove="Resource\Images\Cut_Def@3x.png" />
<Resource Include="Resource\Images\Cut_Def@3x.png" />
<None Remove="Resource\Images\Algor_Sel@3x.png" />
<Resource Include="Resource\Images\Algor_Sel@3x.png" />
<None Remove="Resource\Images\Algor_Def@3x.png" />
<Resource Include="Resource\Images\Algor_Def@3x.png" />
<None Remove="Resource\Document\Instructor简易软件使用教程.pdf" />
<Content Include="Resource\Document\Helper.pdf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Remove="Resource\Other\Json-Mode-Default.xshd" />
<EmbeddedResource Include="Resource\Other\Json-Mode-Default.xshd" />
</ItemGroup>
<ItemGroup>
<Page Update="Views\Configuration\AlgorithmConfigPage.xaml">
<Generator>MSBuild:Compile</Generator>
<XamlRuntime>Wpf</XamlRuntime>
<SubType>Designer</SubType>
</Page>
<Page Update="Views\Configuration\ConfigMenuPage.xaml">
<Generator>MSBuild:Compile</Generator>
<XamlRuntime>Wpf</XamlRuntime>
<SubType>Designer</SubType>
</Page>
<Page Update="Views\Configuration\CutConfigPage.xaml">
<Generator>MSBuild:Compile</Generator>
<XamlRuntime>Wpf</XamlRuntime>
<SubType>Designer</SubType>
</Page>
<Page Update="Views\Configuration\LevelConfigPage.xaml">
<Generator>MSBuild:Compile</Generator>
<XamlRuntime>Wpf</XamlRuntime>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
</Project>

@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
<ItemGroup>
<Compile Update="Views\Dialog\JsonImport.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="Views\Dialog\LoadingDialog.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="Views\Dialog\StartDialog.xaml.cs">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Page Update="Views\Dialog\JsonImport.xaml">
<SubType>Designer</SubType>
</Page>
<Page Update="Views\Dialog\ExportDialog.xaml">
<SubType>Designer</SubType>
</Page>
<Page Update="Views\Dialog\LoadingDialog.xaml">
<SubType>Designer</SubType>
</Page>
<Page Update="Views\Dialog\SaveDialog.xaml">
<SubType>Designer</SubType>
</Page>
<Page Update="Views\Dialog\StartDialog.xaml">
<SubType>Designer</SubType>
</Page>
</ItemGroup>
</Project>

Binary file not shown.

@ -155,34 +155,12 @@ public class LevelConfigVM : BaseViewModel
string value = "";
if (rowInfo.Count == 0)
{
string value1 = row["STANDARD_MIN"].ToString();
string value2 = row["STANDARD_MAX"].ToString();
if (!string.IsNullOrEmpty(value1)&& !string.IsNullOrEmpty(value2))
{
value =
value =
getFix(row, "MIN_PREFIX") +
value1 + row["UNIT"].ToString() + "-"
+ value2 + row["UNIT"].ToString()
row["STANDARD_MIN"].ToString() + row["UNIT"].ToString() + "-"
+ row["STANDARD_MAX"].ToString() + row["UNIT"].ToString()
+ getFix(row, "MIN_SUFFIX")
;
}
else if(!string.IsNullOrEmpty(value1))
{
value =
getFix(row, "MIN_PREFIX") +
value1 + row["UNIT"].ToString()
+ getFix(row, "MIN_SUFFIX")
;
}
else if(!string.IsNullOrEmpty(value2))
{
value =
getFix(row, "MIN_PREFIX") +
value2 + row["UNIT"].ToString()
+ getFix(row, "MIN_SUFFIX")
;
}
var arr = value.Split("\r\n",2);
rowInfo.Add(arr[0]);
if (arr.Length > 1) {
@ -365,42 +343,35 @@ public class LevelConfigVM : BaseViewModel
// 标准数据登录
string gradeConfigSql = "";
int index = 0;
foreach (var gradeConfig in jsonEntity.GradeConfigs)
{
if (index == 0)
if (gradeConfigSql.Length == 0)
{
gradeConfigSql += gradeConfig.getDeleteSql();
}
gradeConfigSql += gradeConfig.getInsertSql();
index++;
}
index = 0;
foreach (var gradeConfigDetail in jsonEntity.GradeConfigDetails)
{
if (index == 0)
if (gradeConfigSql.Length == 0)
{
gradeConfigSql += gradeConfigDetail.getDeleteSql(shapeId,ruleId);
}
gradeConfigSql += gradeConfigDetail.getInsertSql();
index++;
}
index = 0;
foreach (var gradeConfigParameter in jsonEntity.GradeConfigParameters)
{
if (index == 0)
if (gradeConfigSql.Length == 0)
{
gradeConfigSql += gradeConfigParameter.getDeleteSql(shapeId, ruleId);
}
gradeConfigSql += gradeConfigParameter.getInsertSql();
index++;
}
count = DataBaseHelper.ExecuteNonQuery(gradeConfigSql);
if (count < 0)
{
DataBaseHelper.rollback();
Growl.Error(save_fail_message);
return;
}
DataBaseHelper.commit();
Growl.Info(Save_successful_message);

@ -82,7 +82,6 @@ public class GradingResultVM : BaseViewModel
algorithmResult = result as AlgorithmResultEntity?? new AlgorithmResultEntity();
InitView(algorithmResult);
machine = algorithmResult.DeviceId;
username = Settings.SelectValueByName("PERMISSIONS");
}
DS = "NA";
AutoSave();
@ -94,7 +93,7 @@ public class GradingResultVM : BaseViewModel
// DS下拉列表初始化
InitDSlist();
string sql = $"SELECT GRADE_NAME AS NAME, GRADE_EN_S_NAME AS EN_NAME, GRADE_EN_NAME AS EN_ALL_NAME, GRADE_ORDER FROM GRADE WHERE SHAPE_ID = '{shapeId}' AND RULE_ID = '{getActualRuleId()}'; ";
string sql = $"SELECT GRADE_NAME AS NAME, GRADE_EN_S_NAME AS EN_NAME, GRADE_EN_NAME AS EN_ALL_NAME, GRADE_ORDER FROM GRADE WHERE SHAPE_ID = '{shapeId}' AND RULE_ID = '{ruleId}'; ";
GradeList = DataBaseHelper.ExecuteQuery(sql);
}
private void InitViewportData(AlgorithmResultEntity result)
@ -179,7 +178,7 @@ public class GradingResultVM : BaseViewModel
}
private string getRuleId()
{
return Settings.SelectValueByName("RuleId");
return "IGI2023";
}
#endregion
/// <summary>
@ -210,52 +209,17 @@ public class GradingResultVM : BaseViewModel
return list;
}
#region 定级计算
private string getActualRuleId()
{
string ruleIdForSelect = "";
if (ruleId.StartsWith("IGI"))
{
ruleIdForSelect = ruleId;
}
else if (ruleId.StartsWith("GB"))
{
double ta = algorithmResult.measurements.TABLE * 100;
ta = (RoundFiveDownSixUp(ta * 2) / 2);
if (ta < 49)
{
ruleIdForSelect = ruleId + "_TA_49";
}
else if (ta > 71)
{
ruleIdForSelect = ruleId + "_TA_71";
}
else
{
ruleIdForSelect = ruleId + "_TA_" + Math.Floor(ta);
}
}
else
{
ruleIdForSelect = ruleId;
}
return ruleIdForSelect;
}
private List<CalGradeInfo> GetCalGradeInfos(string item)
{
string ruleIdForSelect = getActualRuleId();
string sql = $"Select GRADE_ORDER as gradeOrder,STANDARD_MIN Min, STANDARD_MAX Max,IS_MAX_EXIST as isMaxExist,IS_MIN_EXIST as isMinExist from STANDARD where TEST_ITEM_ID = '{item}' AND SHAPE_ID = UPPER('{shapeId}') AND RULE_ID = '{ruleIdForSelect}' ";
string sql = $"Select GRADE_ORDER as gradeOrder,STANDARD_MIN Min, STANDARD_MAX Max,IS_MAX_EXIST as isMaxExist,IS_MIN_EXIST as isMinExist from STANDARD where TEST_ITEM_ID = '{item}' AND SHAPE_ID = UPPER('{shapeId}') AND RULE_ID = '{ruleId}' ";
List<CalGradeInfo> calGrades = DataBaseHelper.ExecuteQuery<CalGradeInfo>(sql);
return calGrades;
}
private int calGrade(string item ,double value)
{
int order = 1;
decimal cValue = Convert.ToDecimal(value);
List<CalGradeInfo> calGrades = GetCalGradeInfos(item);
if (calGrades.Count == 0)
{
return 0;
}
int order = 1;
foreach (CalGradeInfo gradeInfo in calGrades)
{
bool isThisGrade = true;
@ -357,31 +321,6 @@ public class GradingResultVM : BaseViewModel
result = GetGradeName(order);
return result;
}
private string calGrade_CULET(double avg)
{
string result = "";
int order = calGrade("CULET", avg * 100);
result = GetGradeName(order);
return result;
}
private string calGrade_STAR(double min, double max)
{
string result = "";
int order1 = calGrade("STAR", min * 100);
int order2 = calGrade("STAR", max * 100);
int order = Math.Max(order1, order2);
result = GetGradeName(order);
return result;
}
private string calGrade_LOWER_HALVES_RATIO(double min, double max)
{
string result = "";
int order1 = calGrade("LOWER_HALVES_RATIO", min * 100);
int order2 = calGrade("LOWER_HALVES_RATIO", max * 100);
int order = Math.Max(order1, order2);
result = GetGradeName(order);
return result;
}
#endregion
#region 参数列表行编辑
private DataInfo getDIAMETER(AlgorithmResultEntity result)
@ -516,7 +455,6 @@ public class GradingResultVM : BaseViewModel
info.Avg = FormatDouble_Avg(result.measurements.STAR*100, Accuracy.Z5);
info.Min = FormatDouble_P(result.measurements.STAR_MIN);
info.Max = FormatDouble_P(result.measurements.STAR_MAX);
info.CutLevel = calGrade_STAR(result.measurements.STAR_MIN, result.measurements.STAR_MAX);
info.isEnabled = false;
return info;
}
@ -529,7 +467,6 @@ public class GradingResultVM : BaseViewModel
info.Avg = FormatDouble_Avg(result.measurements.LOWER_HALVES_RATIO*100, Accuracy.Z5);
info.Min = FormatDouble_P(result.measurements.LOWER_HALVES_RATIO_MIN);
info.Max = FormatDouble_P(result.measurements.LOWER_HALVES_RATIO_MAX);
info.CutLevel = calGrade_LOWER_HALVES_RATIO(result.measurements.LOWER_HALVES_RATIO_MIN, result.measurements.LOWER_HALVES_RATIO_MAX);
info.isEnabled = false;
return info;
}
@ -540,7 +477,6 @@ public class GradingResultVM : BaseViewModel
info.TestItemId = "CULET";
info.TestItemName = GetName("CULET");
info.Avg = FormatDouble_Avg(result.measurements.CULET * 100, Accuracy.ZD1);
info.CutLevel = calGrade_CULET(result.measurements.CULET);
info.isEnabled = false;
return info;
}

@ -1,78 +0,0 @@
<Border x:Class="SparkClient.Views.Configuration.SettingsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SparkClient.Views"
xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d">
<Grid Background="#FDFEFD" Opacity="0.8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="20*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="30"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="120"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="30"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="30"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Grid.Column="1" Background="#A7896F" Content="{DynamicResource SaveAs}" Foreground="White" HorizontalAlignment="Right" Margin="0 0 10 0" Command="{Binding SaveUpdateCommand}"/>
<GridSplitter Grid.Row="1" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB" ></GridSplitter>
<Label Grid.Row="2" Content="{DynamicResource Language settings}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="150" />
<ComboBox Grid.Row="2" Grid.Column="1" Background="White" Width="150" HorizontalAlignment="Left"
ItemsSource="{Binding Languages}" Margin="10 0" DisplayMemberPath="Key" SelectedValuePath="Value"
SelectedValue="{Binding LanguageId, Mode=TwoWay}" >
</ComboBox>
<GridSplitter Grid.Row="3" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter>
<Label Content="{DynamicResource UpdateFile}" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="5" Grid.Row="4" Grid.Column="0" Width="150"/>
<Grid Grid.Row="4" Grid.Column="1" Width="88" HorizontalAlignment="Left">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<CheckBox Grid.Row="0" Content="{DynamicResource TxtFile}" IsChecked="{Binding TxtFileChecked}"/>
<CheckBox Grid.Row="1" Content="{DynamicResource StlFile}" IsChecked="{Binding StlFileChecked}"/>
<CheckBox Grid.Row="2" Content="{DynamicResource ExcelFile}" IsChecked="{Binding ExcelFileChecked}"/>
<CheckBox Grid.Row="3" Content="{DynamicResource DatFile}" IsChecked="{Binding DatFileChecked}"/>
</Grid>
<GridSplitter Grid.Row="5" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter>
<Label Grid.Row="6" Content="{DynamicResource SavePath}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="150"/>
<Grid Grid.Row="6" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox TextWrapping="Wrap" Name ="filePath" Grid.Column="0" Text="{Binding FilePath}" Background="White" Width="300" HorizontalAlignment="Left"/>
<TextBlock Text="{DynamicResource Please enter}" Grid.Column="0" Foreground="#BBBBBB" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Text, ElementName=filePath}" Value="">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<Button Grid.Column="1" Background="#A7896F" Content="{DynamicResource Select}" Foreground="White" HorizontalAlignment="Left" Width="80" Command="{Binding SelectFileCommand}"/>
</Grid>
<GridSplitter Grid.Row="7" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter>
<Label Grid.Row="8" Grid.Column="0" Content="{DynamicResource GradeStandard}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="150"/>
<ComboBox Grid.Row="8" Grid.Column="1" Background="White" Width="150" HorizontalAlignment="Left" ItemsSource="{Binding Rules}"
DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding RuleId, Mode=TwoWay}"/>
<GridSplitter Grid.Row="9" Grid.ColumnSpan="2" Height="1" HorizontalAlignment="Stretch" Background="#BBBBBB"></GridSplitter>
</Grid>
</Border>

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SparkClient.Views.Configuration
{
/// <summary>
/// SettingsPage.xaml 的交互逻辑
/// </summary>
public partial class SettingsPage
{
public SettingsPage()
{
InitializeComponent();
}
}
}

@ -1,45 +0,0 @@
<Window x:Class="SparkClient.Views.Dialog.MsgDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowStyle="None" AllowsTransparency="True"
Background="Transparent" ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
MouseLeftButtonDown="Window_MouseLeftButtonDown">
<!-- 窗口圆角和背景 -->
<Border CornerRadius="20" Background="White" Width="400" Height="250">
<Grid Margin="20">
<!-- 布局定义 -->
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- 右上角关闭按钮 -->
<Button Background="Transparent" BorderBrush="Transparent" Click="CloseButton_Click">
<Viewbox Stretch="Uniform"/>
</Button>
<!-- 标题 -->
<TextBlock Grid.Row="0" Text="XXXXXXXXXXXXXX"
FontSize="16" FontWeight="Bold" Foreground="Black"
HorizontalAlignment="Center" Margin="0,70" />
<!-- 按钮区域 -->
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,10,0,0">
<!-- 确定按钮 -->
<Button Content="{DynamicResource ok}" HorizontalAlignment="Center" Width="80" Height="35" Margin="10,0"
Background="#4DA3FF" Foreground="White" FontSize="14"
BorderBrush="Transparent" Click="Skip_Click" />
</StackPanel>
<Path Data="{StaticResource CloseGeometry}"
Fill="Azure"
Stroke="Black"
StrokeThickness="1"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="335,7,0,0"
Width="30" />
</Grid>
</Border>
</Window>

@ -1,62 +0,0 @@
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
namespace SparkClient.Views.Dialog
{
/// <summary>
/// MsgDialog.xaml 的交互逻辑
/// </summary>
public partial class MsgDialog : Window
{
public MsgDialog()
{
InitializeComponent();
this.Loaded += (s, e) => ApplyCornerRadiusClip();
this.SizeChanged += (s, e) => ApplyCornerRadiusClip();
}
/// <summary>
/// 关闭按钮点击事件
/// </summary>
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
/// <summary>
/// 跳过按钮点击事件
/// </summary>
private void Skip_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
/// <summary>
/// 窗口圆角裁剪
/// </summary>
private void ApplyCornerRadiusClip()
{
if (this.ActualWidth > 0 && this.ActualHeight > 0)
{
this.Clip = new RectangleGeometry
{
Rect = new Rect(0, 0, this.ActualWidth, this.ActualHeight),
RadiusX = 20,
RadiusY = 20
};
}
}
/// <summary>
/// 支持窗口拖动
/// </summary>
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
this.DragMove();
}
}
}
}

@ -1,85 +0,0 @@
<Window x:Class="SparkClient.Views.Dialog.SaveDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SparkClient.Views.Dialog"
xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d"
d:DesignHeight="222" d:DesignWidth="562"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
WindowStyle="None" AllowsTransparency="True" Background="Transparent">
<Border CornerRadius="15" Background="White" x:Name="Border" >
<Grid ClipToBounds="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<!-- 模拟顶部标题栏 -->
<Grid Grid.Row="0" Background="#795C2A" Height="40">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- 关闭按钮 -->
<Border Grid.Column="2"
Width="40" Height="30"
Margin=" 0 0 10 0"
HorizontalAlignment="Right" VerticalAlignment="Center"
Background="Transparent"
MouseEnter="Border_Close_MouseEnter"
MouseLeave="Border_MouseLeave">
<Button Background="Transparent" BorderBrush="Transparent" Click="Close_Click">
<Viewbox Stretch="Uniform">
<Path Data="{StaticResource CloseGeometry}"
Fill="Azure"
Stroke="Azure"
StrokeThickness="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="20 0 0 0"
Width="30" />
</Viewbox>
</Button>
</Border>
</Grid>
<StackPanel Grid.Row="1" VerticalAlignment="Center" >
<Grid Height="30" Margin="0 10 0 10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="5*" />
<ColumnDefinition Width="9*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="1" HorizontalAlignment="Center" Content="{DynamicResource UpdateDiamondCode}" Background="Transparent"
BorderBrush="Transparent"
FontSize="16" FontFamily="AlibabaPuHui-regular" />
<TextBox TextWrapping="Wrap" Name ="DiamondCode" Grid.Column="2" Text="{Binding InputText}" />
<TextBlock Text="{DynamicResource Please enter}" Grid.Column="2" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Text, ElementName=Id}" Value="">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="2" Content="{DynamicResource ok}" HorizontalAlignment="Center" Click="Ok_Click" />
<Button Grid.Column="3" Content="{DynamicResource Cancel}" HorizontalAlignment="Center" Click="Close_Click" />
</Grid>
</StackPanel>
</Grid>
</Border>
</Window>

@ -1,90 +0,0 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace SparkClient.Views.Dialog
{
/// <summary>
/// StartDialog.xaml 的交互逻辑
/// </summary>
public partial class SaveDialog
{
public SaveDialog()
{
WindowStartupLocation = WindowStartupLocation.CenterScreen;
InitializeComponent();
// 动态设置圆角裁剪
this.Loaded += (s, e) => ApplyCornerRadiusClip();
this.SizeChanged += (s, e) => ApplyCornerRadiusClip(); // 保证在大小改变时也裁剪
this.Width = 562;
this.Height = 222;
}
#region 重写窗体操作按钮
private void Border_Minimize_MouseEnter(object sender, MouseEventArgs e)
{
// 鼠标进入时更改背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Color.FromArgb(50, 255, 255, 255));
}
}
private void Border_Close_MouseEnter(object sender, MouseEventArgs e)
{
// 鼠标进入时更改背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Color.FromArgb(50, 255, 0, 0));
}
}
private void Border_MouseLeave(object sender, MouseEventArgs e)
{
// 鼠标离开时恢复背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Colors.Transparent);
}
}
private void Minimize_Click(object sender, MouseButtonEventArgs e)
{
this.WindowState = WindowState.Minimized;
}
private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
try
{
this.DragMove();
}
catch (InvalidOperationException ex)
{
}
}
}
#endregion
private void Close_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Ok_Click(object sender, RoutedEventArgs e)
{
if(DiamondCode.Text.Trim().Length>0) { this.Close(); }
}
private void ApplyCornerRadiusClip()
{
// 使用矩形几何生成圆角裁剪
this.Border.Clip = new RectangleGeometry
{
Rect = new Rect(0, 0, this.Border.ActualWidth, this.Border.ActualHeight),
RadiusX = this.Border.CornerRadius.TopLeft, // 使用 Border 的 CornerRadius
RadiusY = this.Border.CornerRadius.TopLeft
};
}
}
}

@ -1,85 +0,0 @@
<Window x:Class="SparkClient.Views.Dialog.StartDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SparkClient.Views.Dialog"
xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d"
d:DesignHeight="222" d:DesignWidth="562"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
WindowStyle="None" AllowsTransparency="True" Background="Transparent">
<Border CornerRadius="15" Background="White" x:Name="Border" >
<Grid ClipToBounds="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<!-- 模拟顶部标题栏 -->
<Grid Grid.Row="0" Background="#795C2A" Height="40">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- 关闭按钮 -->
<Border Grid.Column="2"
Width="40" Height="30"
Margin=" 0 0 10 0"
HorizontalAlignment="Right" VerticalAlignment="Center"
Background="Transparent"
MouseEnter="Border_Close_MouseEnter"
MouseLeave="Border_MouseLeave">
<Button Background="Transparent" BorderBrush="Transparent" Click="Close_Click">
<Viewbox Stretch="Uniform">
<Path Data="{StaticResource CloseGeometry}"
Fill="Azure"
Stroke="Azure"
StrokeThickness="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="20 0 0 0"
Width="30" />
</Viewbox>
</Button>
</Border>
</Grid>
<StackPanel Grid.Row="1" VerticalAlignment="Center" >
<Grid Height="30" Margin="0 10 0 10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="5*" />
<ColumnDefinition Width="9*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="1" HorizontalAlignment="Center" Content="{DynamicResource UpdateDiamondCode}" Background="Transparent"
BorderBrush="Transparent"
FontSize="16" FontFamily="AlibabaPuHui-regular" />
<TextBox TextWrapping="Wrap" Name ="Id" Grid.Column="2" Text="{Binding InputText}" />
<TextBlock Text="{DynamicResource Please enter}" Grid.Column="2" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Text, ElementName=Id}" Value="">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="2" Content="{DynamicResource ok}" HorizontalAlignment="Center" Command="{Binding OkCommand}" Click="Ok_Click" />
<Button Grid.Column="3" Content="{DynamicResource Skip}" HorizontalAlignment="Center" Command="{Binding SkipCommand}" Click="Close_Click" />
</Grid>
</StackPanel>
</Grid>
</Border>
</Window>

@ -1,97 +0,0 @@
using HandyControl.Controls;
using SparkClient.Model.Helper;
using SparkClient.ViewModel;
using SparkClient.ViewModel.Dialog;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace SparkClient.Views.Dialog
{
/// <summary>
/// StartDialog.xaml 的交互逻辑
/// </summary>
public partial class StartDialog
{
public BaseViewModel ViewModel = null;
public StartDialog()
{
WindowStartupLocation = WindowStartupLocation.CenterScreen;
InitializeComponent();
// 动态设置圆角裁剪
this.Loaded += (s, e) => ApplyCornerRadiusClip();
this.SizeChanged += (s, e) => ApplyCornerRadiusClip(); // 保证在大小改变时也裁剪
this.Width = 562;
this.Height = 222;
this.ViewModel = new StartDialogVM();
this.DataContext = this.ViewModel;
}
#region 重写窗体操作按钮
private void Border_Minimize_MouseEnter(object sender, MouseEventArgs e)
{
// 鼠标进入时更改背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Color.FromArgb(50, 255, 255, 255));
}
}
private void Border_Close_MouseEnter(object sender, MouseEventArgs e)
{
// 鼠标进入时更改背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Color.FromArgb(50, 255, 0, 0));
}
}
private void Border_MouseLeave(object sender, MouseEventArgs e)
{
// 鼠标离开时恢复背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Colors.Transparent);
}
}
private void Minimize_Click(object sender, MouseButtonEventArgs e)
{
this.WindowState = WindowState.Minimized;
}
private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
try
{
this.DragMove();
}
catch (InvalidOperationException ex)
{
}
}
}
#endregion
private void Close_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Ok_Click(object sender, RoutedEventArgs e)
{
if(Id.Text.Trim().Length>0) { this.Close(); }
}
private void ApplyCornerRadiusClip()
{
// 使用矩形几何生成圆角裁剪
this.Border.Clip = new RectangleGeometry
{
Rect = new Rect(0, 0, this.Border.ActualWidth, this.Border.ActualHeight),
RadiusX = this.Border.CornerRadius.TopLeft, // 使用 Border 的 CornerRadius
RadiusY = this.Border.CornerRadius.TopLeft
};
}
}
}
Loading…
Cancel
Save