Merge remote-tracking branch 'origin/master'

# Conflicts:
#	ViewModel/BaseWindow/HomeWindowVM.cs
master
sunhonglei 8 months ago
commit 05e34420c0
  1. 4
      .gitignore
  2. 0
      Libs/AlgorithmServer.dll
  3. 20
      MainWindow.xaml
  4. 1
      MainWindow.xaml.cs
  5. 15
      Model/Entity/ApiEntity/ImageCollectionResult.cs
  6. 32
      Model/Entity/ApiEntity/StatusCodes.cs
  7. 50
      Model/Services/AlgorithmServer.cs
  8. 174
      Model/Services/SOCClientService.cs
  9. 310
      Resource/DimDemo.txt
  10. 7
      Resource/Document/log.txt
  11. 156
      Resource/Document/开发规范.md
  12. 8
      SparkClient.csproj
  13. 2
      SparkClient.sln.DotSettings.user
  14. 50
      ViewModel/BaseWindow/HomeWindowVM.cs
  15. 6
      Views/BaseWindow/HomeWindow.xaml

4
.gitignore vendored

@ -0,0 +1,4 @@
.vs
.idea
bin/
obj/

@ -97,16 +97,16 @@
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- 中文 -->
<Button Grid.Column="0" Width="50" Background="Transparent" BorderBrush="Transparent" Command="{Binding SetZhcnLanguage}" >
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
Text="中" Foreground="Azure" FontSize="18" />
</Button>
<!-- 英文 -->
<Button Grid.Column="1" Width="50" Background="Transparent" BorderBrush="Transparent" Command="{Binding SetEnLanguage}" >
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
Text="EN" Foreground="Azure" FontSize="18"/>
</Button>
<!-- ~1~ 中文 @1@ -->
<!-- <Button Grid.Column="0" Width="50" Background="Transparent" BorderBrush="Transparent" Command="{Binding SetZhcnLanguage}" > -->
<!-- <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" -->
<!-- Text="中" Foreground="Azure" FontSize="18" /> -->
<!-- </Button> -->
<!-- ~1~ 英文 @1@ -->
<!-- <Button Grid.Column="1" Width="50" Background="Transparent" BorderBrush="Transparent" Command="{Binding SetEnLanguage}" > -->
<!-- <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" -->
<!-- Text="EN" Foreground="Azure" FontSize="18"/> -->
<!-- </Button> -->
<!-- 最小化 -->

@ -86,6 +86,7 @@ public partial class MainWindow
{
DataBaseHelper.CloseConnection();
this.Close();
Application.Current.Shutdown();
}
}

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

@ -0,0 +1,32 @@
namespace SparkClient.Model.Common
{
/// <summary>
/// 存储状态码及其描述信息的常量类。
/// </summary>
public static class StatusCodes
{
// 成功
public const string Success = "S000";
// 采图正在进行中
public const string InProgress = "S001";
// 缓存图片被清理(读取不够及时)
public const string CacheCleared = "S002";
// 无法向单片机发送指令
public const string CannotSendCommand = "S003";
// 单片机访问超时
public const string MicrocontrollerTimeout = "S004";
// 单片机返回错误码
public const string MicrocontrollerError = "S005";
// 未找到切工仪
public const string DeviceNotFound = "P001";
// 算法调用失败
public const string AlgorithmFailed = "P002";
}
}

@ -1,34 +1,27 @@
using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using HandyControl.Controls;
using HandyControl.Tools;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using MessageBox = HandyControl.Controls.MessageBox;
namespace SparkClient.Model.Services
{
public class AlgorithmServer
{
// 使用 P/Invoke 声明 C++ 函数
[DllImport("D:/workspace/dayuAI/SparkClient/Libs/AlgorithmServer.dll", CallingConvention = CallingConvention.Cdecl)]
[DllImport("../../../Libs/AlgorithmServer.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern double Add(double a, double b);
[DllImport("D:D:/workspace/dayuAI/SparkClient/Libs/AlgorithmServer.dll", CallingConvention = CallingConvention.Cdecl)]
[DllImport("../../../Libs/AlgorithmServer.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern double Multiply(double a, double b);
// 导入 C++ DLL 中的 ParseJsonAndReturnActions 函数
[DllImport("D:/workspace/dayuAI/SparkClient/Libs/AlgorithmServer.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
[DllImport("../../../Libs/AlgorithmServer.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr ParseJsonAndReturnActions(byte[] jsonData);
public AlgorithmServer()
// 添加公共方法供外部调用
public string CallParseJsonAndReturnActions(JObject jsonData)
{
string jsonDataString = jsonData.ToString();
byte[] jsonDataBytes = System.Text.Encoding.UTF8.GetBytes(jsonDataString);
// 调用 C++ 函数进行加法运算
double resultAdd = Add(3.5, 4.5);
@ -38,37 +31,16 @@ namespace SparkClient.Model.Services
double resultMultiply = Multiply(3.5, 4.5);
MessageBox.Show($"Multiply(3.5, 4.5) = {resultMultiply}");
// 测试 JSON 数据
// 定义并初始化 JObject
JObject jsonData = new JObject(
new JProperty("dataAttributes", new JArray(
new JObject(new JProperty("name", "你好")),
new JObject(new JProperty("name", "hello")),
new JObject(new JProperty("name", "666")),
new JObject(new JProperty("name", "是的")),
new JObject(new JProperty("name", "确认"))
))
);
// 将 JObject 序列化为字符串
string jsonDataString = jsonData.ToString();
// 将 JSON 字符串转换为字节数组
byte[] jsonDataBytes = System.Text.Encoding.UTF8.GetBytes(jsonDataString);
// 调用 C++ DLL 函数解析 JSON
IntPtr resultPtr = ParseJsonAndReturnActions(jsonDataBytes);
// 检查返回的指针是否为空
if (resultPtr != IntPtr.Zero)
{
string? result = Marshal.PtrToStringAnsi(resultPtr);
MessageBox.Show(result, "解析结果", MessageBoxButton.OK, MessageBoxImage.Information);
return Marshal.PtrToStringAnsi(resultPtr) ?? "解析结果为空";
}
else
{
MessageBox.Show("解析结果为空", "解析结果", MessageBoxButton.OK, MessageBoxImage.Warning);
return "解析结果为空";
}
}
}

@ -1,23 +1,61 @@
using Newtonsoft.Json;
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using HandyControl.Tools.Extension;
using SparkClient.Model.Common;
namespace SparkClient.Model.Services
{
/// <summary>
/// SOC 客户端服务类,用于与远程服务器进行交互,包括启动图片收集任务、获取图片、获取采集状态等操作。
/// </summary>
public class SOCClientService
{
// Log地址
private const string LogFilePath = @"..\..\..\Resource\Document\log.txt";
private static readonly Dictionary<string, string> StatusDescriptions = new Dictionary<string, string>
{
{ "S000", "成功" },
{ "S001", "采图正在进行中" },
{ "S002", "缓存图片被清理(读取不够及时)" },
{ "S003", "无法向单片机发送指令" },
{ "S004", "单片机访问超时" },
{ "S005", "单片机返回错误码" },
{ "P001", "未找到切工仪" },
{ "P002", "算法调用失败" }
};
/// <summary>
/// 基础URL,用于构建完整的API请求地址。
/// </summary>
private readonly string _baseUrl;
/// <summary>
/// 认证令牌,用于HTTP请求的认证。
/// </summary>
private readonly string _authToken;
/// <summary>
/// 构造函数,初始化基础URL和认证令牌。
/// </summary>
/// <param name="baseUrl">基础URL</param>
/// <param name="authToken">认证令牌</param>
public SOCClientService(string baseUrl, string authToken)
{
_baseUrl = baseUrl;
_authToken = authToken;
}
// 通用GET请求方法
/// <summary>
/// 发送GET请求的通用方法。
/// </summary>
/// <param name="url">请求的完整URL</param>
/// <returns>HTTP响应</returns>
private async Task<HttpResponseMessage> SendGetRequestAsync(string url)
{
using (var client = new HttpClient())
@ -27,7 +65,11 @@ namespace SparkClient.Model.Services
}
}
// 1. 启动图片收集任务
/// <summary>
/// 启动图片收集任务。
/// </summary>
/// <param name="lightLevel">光照级别</param>
/// <returns>任务状态</returns>
public async Task<string> CollectImagesAsync(int lightLevel)
{
string url = $"{_baseUrl}/collect_images?light_level={lightLevel}";
@ -41,27 +83,55 @@ namespace SparkClient.Model.Services
}
else
{
return "Error: " + response.StatusCode;
return "collect_images_Error: " + (int)response.StatusCode;
}
}
// 2. 获取图片
public async Task<byte[]> RetrieveImageAsync(int index)
/// <summary>
/// 获取指定索引的图片。
/// </summary>
/// <param name="index">图片索引</param>
/// <returns>图片的字节数组</returns>
public async Task<List<string>> RetrieveImageAsync(string savePath)
{
List<string> imageNames = new List<string>();
// 读取图片接口
int imageIndex = 0;
while (true)
{
string url = $"{_baseUrl}/retrieve_image/{index}";
string url = $"{_baseUrl}/retrieve_image/{imageIndex}";
var response = await SendGetRequestAsync(url);
int status = (int)response.StatusCode;
if (response.IsSuccessStatusCode)
if (status == 200)
{
return await response.Content.ReadAsByteArrayAsync();
byte[] imageBytes = await response.Content.ReadAsByteArrayAsync();
string fileName = Path.Combine(savePath, $"image_{imageIndex}.bmp");
// 图片名称List
imageNames.Add(Path.GetFileName(fileName));
// 保存图片
await File.WriteAllBytesAsync(fileName, imageBytes);
imageIndex++;
}
else
else if (status == 425)
{
throw new Exception("Error retrieving image: " + response.StatusCode);
await Task.Delay(1000);
}
else if (status == 410)
{
imageIndex++;
}
else if (status == 404)
{
return imageNames;
}
}
}
// 3. 获取采集状态
/// <summary>
/// 获取图片采集状态。
/// </summary>
/// <returns>采集状态</returns>
public async Task<string> CollectStatusAsync()
{
string url = $"{_baseUrl}/collect_status";
@ -75,14 +145,94 @@ namespace SparkClient.Model.Services
}
else
{
return "Error: " + response.StatusCode;
return "collect_status_Error: " + (int)response.StatusCode;
}
}
/// <summary>
/// 处理图片收集、保存和状态检查。
/// </summary>
/// <param name="lightLevel">光照级别</param>
/// <param name="savePath">图片保存路径</param>
/// <returns>操作结果</returns>
public async Task<ImageCollectionResult> ProcessImageCollectionAsync(int lightLevel, string savePath)
{
try
{
// 清理 savePath 文件夹
if (Directory.Exists(savePath))
{
Directory.Delete(savePath, true);
}
Directory.CreateDirectory(savePath);
// 启动任务接口
string startStatus = await CollectImagesAsync(lightLevel);
// 成功
if (startStatus != StatusCodes.Success)
{
// 启动任务失败
return new ImageCollectionResult { Status = startStatus, Images = new List<string>() };
}
// 读取图片接口
List<string> imageNames = await RetrieveImageAsync(savePath);
if (imageNames.Count != 0)
{
// 采集状态接口
string acquisitionStatus = await CollectStatusAsync();
// 成功
if (acquisitionStatus != StatusCodes.Success)
{
// 采集状态失败
return new ImageCollectionResult { Status = acquisitionStatus, Images = new List<string>() };
}
}
// 按下载时间排序图片名称
return new ImageCollectionResult { Status = StatusCodes.Success, Images = imageNames };
}
catch (Exception e)
{
// 日志记录
// logger.Error(e, "发生异常");
string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 发生异常: {e.Message}{Environment.NewLine}";
File.AppendAllText(LogFilePath, logMessage);
return new ImageCollectionResult { Status = StatusCodes.DeviceNotFound, Images = new List<string>() };
}
}
/// <summary>
/// 根据状态码获取相应的描述信息。
/// 如果状态码在预定义的状态字典中存在,则返回对应的描述信息;
/// 否则返回“未知状态: [状态码]”。
/// </summary>
/// <param name="status">状态码。</param>
/// <returns>状态描述信息。</returns>
private string GetDescription(string status)
{
if (StatusDescriptions.TryGetValue(status, out string description))
{
return description;
}
return "未知状态: " + status;
}
}
/// <summary>
/// 响应状态类,用于解析服务器返回的状态信息。
/// </summary>
public class ResponseStatus
{
/// <summary>
/// 状态码
/// </summary>
public string Status { get; set; }
/// <summary>
/// 状态消息
/// </summary>
public string Message { get; set; }
}
}

@ -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

@ -0,0 +1,7 @@
[2024-12-05 16:21:22.627] 发生异常: 由于目标计算机积极拒绝,无法连接。 (localhost:5000)
[2024-12-05 16:42:38.854] 发生异常: 由于目标计算机积极拒绝,无法连接。 (localhost:5000)
[2024-12-05 16:42:49.827] 发生异常: 由于目标计算机积极拒绝,无法连接。 (localhost:5000)
[2024-12-05 16:50:48.304] 发生异常: 由于目标计算机积极拒绝,无法连接。 (localhost:5000)
[2024-12-05 16:50:56.037] 发生异常: 由于目标计算机积极拒绝,无法连接。 (localhost:5000)
[2024-12-05 16:51:04.013] 发生异常: 由于目标计算机积极拒绝,无法连接。 (localhost:5000)
[2024-12-05 16:58:31.184] 发生异常: 由于目标计算机积极拒绝,无法连接。 (localhost:5000)

@ -1,4 +1,4 @@
# 开发规
# 开发规
## 一、总体架构与设计原则
### (一)MVVM 架构概述
在软件开发中,为实现良好代码结构、可维护性与可扩展性,应分离视图逻辑与业务逻辑,MVVM 设计模式是有效的解决方案。
@ -9,21 +9,22 @@ Model(模型层):处理数据和业务逻辑,包括数据获取、存储
## 二、具体实现细节
### (一)ViewModel
### 1. 命令定义与实现
#### (1)命名规范
#### 1. 命令定义与实现
##### (1)命名规范
ViewModel 中的命令应采用 “动词 + 名词 + Command” 格式命名,清晰表明功能。对应的执行方法命名与命令中的动词一致,便于理解命令与执行逻辑的关联。
#### (2)代码位置
##### (2)代码位置
与视图交互的命令在对应的 ViewModel 类中定义和实现,ViewModel 类放在 “ViewModels” 文件夹下。大型项目中,按功能模块细分该文件夹,如 3D 模型相关的 ViewModel 放在 “ViewModels/3DModelViewModels” 文件夹。
#### (3)实现方式
##### (3)实现方式
使用合适的命令类实现:建议用实现 ICommand 接口的命令类,如自定义的 “RelayCommand”。它要处理执行逻辑和可执行状态判断,依据条件(如数据准备情况、用户权限)决定命令是否可执行。
命令初始化与方法绑定:在 ViewModel 构造函数中初始化命令并与执行方法绑定,如 “LoadModelCommand = new RelayCommand (LoadModel);”,确保命令触发时调用正确执行方法。
参数处理:命令执行需传递参数时,命令类要能正确处理参数传递和接收。修改命令类构造函数或执行方法以接受参数,在视图层绑定命令时设置参数值。
### 2. 数据绑定属性
#### (1)命名规范
#### 2. 数据绑定属性
##### (1)命名规范
数据绑定属性名称用驼峰命名法,清晰反映绑定的数据内容,如 “DisplayName” 绑定文本框显示文本,“DataList” 绑定列表数据。
#### (2)数据类型选择
##### (2)数据类型选择
根据绑定控件需求和数据性质选择合适数据类型。简单文本显示控件用 “string” 类型;列表控件用 “ObservableCollection<T>” 等集合类型,实现数据更新自动刷新。
#### (3)通知机制
##### (3)通知机制
数据绑定属性值变化时,用合适机制通知视图更新。在支持数据绑定的框架(如 WPF)中,可利用相关接口(如 WPF 的 “INotifyPropertyChanged” 接口)。示例如下:
```csharp
private string _displayName;
@ -38,20 +39,21 @@ public string DisplayName
}
```
属性 “set” 方法调用时,通过 “OnPropertyChanged” 方法通知视图层属性值变化,促使控件更新显示内容。
### 3. 事件处理与通知
#### (1)事件命名
#### 3. 事件处理与通知
##### (1)事件命名
ViewModel 中通知视图的事件命名采用 “名词 + 过去分词” 形式,表明动作完成或状态改变,如 “ModelLoaded” 表示模型加载完成,便于理解事件含义和业务逻辑状态。
#### (2)事件参数类型
##### (2)事件参数类型
事件参数类型准确反映事件携带的信息。如 “ModelLoaded” 事件传递加载后的模型对象,参数类型为 “Model3D”。若事件需传递多个信息,创建自定义事件参数类封装信息。
#### (3)事件触发
##### (3)事件触发
业务逻辑完成后(如模型加载成功、数据保存完成),在合适位置触发事件,用标准事件触发机制,如 “ModelLoaded?.Invoke (model);”。触发前确保事件初始化和订阅正确,避免空引用等问题。
## (二)View
### 1. XAML 结构与布局
#### (1)命名空间引用
### (二)View
#### 1. XAML 结构与布局
##### (1)命名空间引用
XAML 文件开头只引入实际使用的命名空间,按字母顺序排序,减少复杂性、提高编译速度,如:
.xaml
```csharp
<Window x:Class="YourNamespace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
@ -59,29 +61,33 @@ XAML 文件开头只引入实际使用的命名空间,按字母顺序排序,
xmlns:HelixToolkit="clr - namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf"
Title="3D Model Viewer" Height="450" Width="800">
```
#### (2)布局设计原则
##### (2)布局设计原则
选择合适的布局容器:优先用合适布局容器实现灵活可维护布局。简单水平或垂直排列控件用 “StackPanel”,通过 “Orientation” 属性控制排列方向。需精确行列布局用 “Grid”,通过定义行和列定位控件。
避免绝对坐标定位:尽量不用绝对坐标定位控件,以免界面在不同分辨率和窗口大小下适应性差。使用布局容器可实现自适应,保证良好显示效果。
#### (3)控件命名
##### (3)控件命名
为重要控件命名,采用驼峰命名法且以控件类型开头,如 “btnLoadModel”(加载模型按钮)、“txtInputFileName”(输入文件名文本框),提高代码可读性。复杂界面可分组控件并命名,方便在代码 - behind 中访问和操作,如 “LoginControls” 包含登录相关控件。
### 2. 数据绑定与命令绑定
#### (1)绑定表达式规范
#### 2. 数据绑定与命令绑定
##### (1)绑定表达式规范
数据绑定表达式:数据绑定用 “{Binding Path=PropertyName}” 格式,“Path” 可省略(绑定当前数据上下文直接属性时)。绑定深层属性需指定 “Path” 值,如:
.xaml
```csharp
<TextBlock Text="{Binding DisplayName}" />
<TextBlock Text="{Binding UserInfo.Age}" />
```
命令绑定表达式:命令绑定用 “{Binding CommandName}” 格式,确保命令在 ViewModel 数据上下文中存在,如:
.xaml
```csharp
<Button Content="Load Model" Command="{Binding LoadModelCommand}" />
```
#### (2)绑定源设置
##### (2)绑定源设置
在视图根元素(“Window”、“UserControl” 等)设置数据上下文,用 “DataContext” 属性绑定到 ViewModel 实例。可在 XAML 或代码 - behind 中设置。
XAML 中实例化 ViewModel:如:
.xaml
```csharp
<Window.DataContext>
<local:MyViewModel />
@ -98,37 +104,38 @@ public partial class MainWindow : Window
}
}
```
### 3. 代码 - behind 使用规范
#### (1)减少逻辑复杂度
#### 3. 代码 - behind 使用规范
##### (1)减少逻辑复杂度
代码 - behind 文件(如 “MainWindow.xaml.cs”)主要处理视图特定初始化和事件订阅等与视图相关操作,避免放复杂业务逻辑或数据处理代码。将业务逻辑和数据处理放 ViewModel 层和模型层,保持视图层简洁,降低耦合度,便于维护和扩展。
#### (2)事件处理方法命名
##### (2)事件处理方法命名
代码 - behind 中处理视图事件的方法命名遵循 “控件名称 + 事件名称” 格式,如 “btnLoadModel_Click”,清晰反映事件来源和处理逻辑,提高代码可读性。
#### (3)资源释放与清理
##### (3)资源释放与清理
视图关闭或不再使用时,在代码 - behind 中释放相关资源,如关闭文件流、取消定时器。妥善处理可能导致内存泄漏的对象(如事件订阅),可在合适事件处理方法(如 “Window_Closing”)中添加资源释放代码。
## 三、代码组织与项目结构
## (一)项目文件夹结构
### 1. 根目录
### (一)项目文件夹结构
#### 1. 根目录
项目文件:包含解决方案文件(.sln)管理项目文件和关系,项目配置文件(.csproj 等)描述项目设置(如引用、编译选项、目标框架)。
README 文件:简要介绍项目,包括功能、构建和运行步骤、主要依赖项(第三方库、框架版本及来源),方便其他开发人员了解项目。
LICENSE 文件:若项目开源或有特定授权许可,放相应许可证文件,明确使用权限和限制。
### 2. ViewModels 文件夹
#### 2. ViewModels 文件夹
存放所有 ViewModel 类,按功能模块细分子文件夹。每个子文件夹的 ViewModel 类功能围绕所属模块,提高内聚性和可维护性。
### 3. Views 文件夹
#### 3. Views 文件夹
存放所有 XAML 视图文件,按功能模块或界面部分划分子文件夹,如 “MainViews” 放主窗口视图文件,“SettingsViews” 放设置界面视图文件,便于修改相关界面时定位视图文件。
### 4. Models 文件夹
#### 4. Models 文件夹
存放所有模型类,按模型类型细分文件夹。如 “DatabaseModels” 放与数据库相关模型类(用数据库技术处理数据存储和检索),“InputModels” 放处理用户输入数据的模型类(封装、验证和处理用户输入),提高代码可读性和可维护性。
### 5. Services 文件夹
#### 5. Services 文件夹
存放与外部服务交互的类,为模型层或视图模型层提供服务。如网络服务调用类处理网络通信,文件系统操作服务类处理文件操作,使外部交互逻辑清晰,便于维护和扩展。
### 6. Helpers 文件夹
#### 6. Helpers 文件夹
放复用的辅助类和工具函数,如数据转换类、字符串处理工具类、通用数学计算类。避免代码重复,提高复用性和可维护性。
### 7. Resources 文件夹
#### 7. Resources 文件夹
存放项目资源文件,按类型细分文件夹。如 “Images” 放图片资源(用于界面装饰、图标显示),“Styles” 放样式文件(定义界面风格),若支持多语言,“Localization” 放本地化资源文件(实现国际化和本地化),方便管理和使用资源。
### 8. Language 文件夹
#### 8. Language 文件夹
存放语言国际化资源文件,可分为en_US.resx、zh_CN.resx 等,用于实现国际化和本地化。
## (二)代码文件结构
### 1. 每个类的结构
### (二)代码文件结构
#### 1. 每个类的结构
- **命名空间声明**:代码文件开头声明类所属命名空间,反映类在项目中的位置和功能,如 “YourNamespace.ViewModels”、“YourNamespace.Models.DatabaseModels”,避免类名冲突,使代码结构清晰。
- **类的组织**:类成员按功能和访问权限分组。先公共属性(按功能相关性排列),再公共方法(按功能逻辑排列),接着私有属性和私有方法(也按功能分组)。事件可放在方法后或根据与特定方法关联程度安排,便于理解成员关系和逻辑。
- **注释与文档**:为类、方法、属性和重要代码块添加注释,解释功能、目的、参数和返回值(若有)。公共成员用 XML 文档注释格式,方便生成文档,
@ -157,7 +164,7 @@ public UserData LoadUserData(int userID)
//...
}
```
### 2. 代码依赖管理
#### 2. 代码依赖管理
尽量减少循环依赖:避免类之间的循环依赖(类 A 依赖类 B,类 B 又依赖类 A),这种情况会增加逻辑复杂性,导致编译和运行问题。出现循环依赖时,重新设计类结构或提取公共接口打破循环,如创建新抽象层或接口提取共同依赖部分。
依赖注入(如果适用):使用依赖注入框架时,遵循最佳实践管理对象依赖关系。在合适位置(如 ViewModel 构造函数)注入依赖对象,提高可测试性和可维护性。
例如:
@ -170,3 +177,78 @@ public MyViewModel(IDataService dataService)
}
```
在测试 ViewModel 时可模拟数据服务类进行单元测试,修改数据服务类实现时不影响 ViewModel 代码(保持接口一致)。使用依赖注入框架时,正确配置和管理依赖关系(注册依赖项、解析依赖对象等)。
## 四、其他开发要点
### (一)命名规范
#### 1. 参数命名
采用驼峰命名法,应具有明确表意性,反映参数含义与用途。例如,代表用户 ID 的参数可命名为 “userID”,表示文件路径的参数命名为 “filePath”。
#### 2. 变量命名
遵循驼峰命名法,依据变量存储的数据特性命名。如存储用户名的变量为 “userName”,用于计数的变量可叫 “count”,布尔类型变量依其代表的逻辑状态取名,如 “isVisible” 表示是否可见。
#### 3. 方法命名
采用动词开头的驼峰命名法,清晰传达方法功能。如 “CalculateSum” 用于计算总和,“LoadDataFromFile” 表示从文件加载数据,“ValidateUserInput” 用于验证用户输入。
### (二)全局异常捕获
在应用程序启动点(如 App.xaml.cs 中的启动方法)设置全局异常捕获机制,使用 try-catch 块包裹关键代码区域。
例如:
```csharp
try
{
// 启动应用程序的核心代码,如初始化主窗口、加载配置等
this.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
}
catch (Exception ex)
{
// 记录异常信息至日志文件,可使用日志处理模块(参考 MainWindow 中的用法)
Logger.LogError($"全局异常捕获:{ex.Message}", ex);
// 可根据异常类型进行友好提示或采取恢复措施,如显示错误对话框告知用户
MessageBox.Show($"应用程序出现错误:{ex.Message}");
}
```
此机制能捕获未在局部处理的异常,防止程序崩溃,提升稳定性与用户体验,同时利于通过日志排查问题根源。
### (三)国际化调用传参变量方案
当前国际化借助 “MultilingualHelper.getKey” 方法实现文本资源获取,为增强灵活性,可扩展其传参机制。例如,对于动态文本元素(如依用户选择显示不同语言的提示信息),
除现有键值参数外,新增参数用于传递动态数据占位符及对应替换值。像 “MultilingualHelper.getKey ("dynamicMessage", new {name = "John", action = "login"});”,
其中 “dynamicMessage” 为资源键,键对应文本含 “{name} 执行了 {action} 操作” 格式占位符,传入对象实现精准文本替换与国际化展示,提升多语言场景下文本呈现的精准度与动态适应性。
### (四)日志处理
在项目中统一日志处理方式,如参考 MainWindow 中的用法,创建日志记录工具类 “Logger”。在关键业务逻辑点(如数据读写、外部服务调用、重要操作执行前后)记录日志,依操作类型与重要性分级别(DEBUG、INFO、WARN、ERROR)。
例如:
```csharp
public static void LogInfo(string message)
{
// 使用日志框架(如 NLog、log4net)记录 INFO 级别日志,含时间戳、日志级别、消息内容
// 配置日志输出目标(文件、控制台等)与格式,如文件按日期命名滚动存储
}
public static void LogError(string message, Exception ex)
{
// 记录 ERROR 级别日志,除消息外附加异常堆栈信息,助于故障排查与问题追踪
}
```
### (五)代码分析警告清除
定期用代码分析工具(如 Visual Studio 内置分析器)检查项目,依警告类型处理。对于未使用变量或导入命名空间,精准判断必要性后清理;可空性警告依实际业务逻辑处理,通过空值检查、设置默认值或调整类型解决;
代码风格类警告依既定规范统一格式(如大括号换行、缩进空格数),确保代码一致性与可读性,规避潜在问题,提升代码质量与可维护性。
### (六)初始化 DB(SQLite)
在项目启动流程中(例如在 App.xaml.cs 的启动阶段)嵌入 SQLite 数据库初始化逻辑。首先,引入 SQLite 相关命名空间:using System.Data.SQLite;。接着,在启动方法内构建数据库连接字符串,
假设数据库文件存于项目根目录下名为 “myDatabase.db”,则连接字符串示例为string connectionString = "Data Source=myDatabase.db;Version=3;";。随后,使用该连接字符串创建数据库连接并打开:
```csharp
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
// 在此处执行数据库初始化操作,如创建表结构
string createTableQuery = "CREATE TABLE IF NOT EXISTS MyTable (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT)";
using (SQLiteCommand command = new SQLiteCommand(createTableQuery, connection))
{
command.ExecuteNonQuery();
}
// 若有初始化种子数据需求,可在此处插入数据,如下示例插入一条记录
string insertSeedDataQuery = "INSERT INTO MyTable (Name) VALUES ('Initial Data')";
using (SQLiteCommand command = new SQLiteCommand(insertSeedDataQuery, connection))
{
command.ExecuteNonQuery();
}
}
```
通过上述步骤,确保 SQLite 数据库在应用启动时完成初始化,创建必要表结构并填充初始数据,为数据访问层提供坚实基础,保障数据操作流畅性与应用功能完整性。
### (七)页面自适应
为实现页面在不同设备与分辨率下的自适应,布局设计遵循响应式原则。在布局容器运用上,除前文提及的 “StackPanel” 与 “Grid”,对于 “Grid” 布局,除设置列宽为 “”(按比例分配空间)、“Auto”(自动适应内容)组合外,还可搭配 “MinWidth” 和 “MaxWidth” 属性,精准限定列宽范围,确保内容合理展示且布局稳定。如重要信息列可设 “MinWidth” 保障可读性,弹性列用 “” 分配剩余空间,防止极端尺寸下布局错乱。
针对文本类控件,“TextBlock” 的 “TextWrapping” 设为 “Wrap” 实现自动换行,“MaxWidth” 依父容器或屏幕宽度动态调整,确保长文本不溢出、排版美观。图像类控件 “Image” 的 “Stretch” 属性依场景设为 “Uniform”(等比缩放填满)、“Fill”(拉伸填满)或 “None”(保持原始尺寸),配合 “MaxWidth”“MaxHeight” 于不同分辨率下维持图像质量与布局平衡。
运用尺寸自适应触发器,依屏幕宽度阈值切换布局样式或隐藏 / 显示控件。如窗口宽度小于 600px 时,将两列 “Grid” 布局切换为单列 “StackPanel”,重新排列控件顺序、调整间距与字体大小,提升移动设备或小屏幕浏览体验,实现全场景优质交互与视觉呈现。

@ -82,9 +82,6 @@
<None Remove="Resource\Other\Json-Mode-Default.xshd" />
<EmbeddedResource Include="Resource\Other\Json-Mode-Default.xshd" />
<None Remove="Resource\DimDemo.txt" />
<Content Include="Resource\DimDemo.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="Resource\Images\Temp\DimDemo.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
@ -123,4 +120,9 @@
<Compile Remove="Resource\Images\Temp\**" />
</ItemGroup>
<ItemGroup>
<Folder Include="Libs\" />
<Folder Include="Resource\SOCImages\" />
</ItemGroup>
</Project>

@ -7,6 +7,8 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADependencyObject_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F60b63c019ead4a238340b47a1c0010d5226910_003Fca_003F09e9dbc0_003FDependencyObject_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEventToCommand_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F436b6c3e323d68842c9e251322f5d42b47569f7c925e63aa245dc65465d2843_003FEventToCommand_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEventTriggerBase_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffdc001c928464b80ad45ffa09b838a3a15e200_003Faf_003F9abbeb44_003FEventTriggerBase_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExecutionContext_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003F35_003F053c62c1_003FExecutionContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFile_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003F00_003Fb0994fb0_003FFile_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFrameworkElement_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6412d4331611499aab4eb63809a2a83bf60910_003F07_003Fdab5922a_003FFrameworkElement_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGuid_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003Faa_003Fa49e75b9_003FGuid_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AILog_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6f4e00a876324444bc5ae4e52ed22ade46200_003F49_003Fe673ccfc_003FILog_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>

@ -1,11 +1,14 @@
using System.Windows;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using HandyControl.Controls;
using SparkClient.Model.Helper;
using SparkClient.Model.Services;
using SparkClient.ViewModel.Configuration;
using SparkClient.ViewModel.Dialog;
using SparkClient.ViewModel.Grading;
using MessageBox = System.Windows.MessageBox;
using SparkClient.Views.Dialog;
using SparkClient.Views.Grading;
@ -13,6 +16,8 @@ namespace SparkClient.ViewModel.BaseWindow;
public class HomeWindowVM : BaseViewModel
{
private SOCClientService _socClientService;
public ICommand ShowHelperPageCommand { get; }
public ICommand ShowConfigPageCommand { get; }
@ -23,6 +28,9 @@ public class HomeWindowVM : BaseViewModel
ShowHelperPageCommand = new RelayCommand(ShowHelperPage);
ShowConfigPageCommand = new RelayCommand(ShowConfigPage);
ShowDiamondSelPageCommand = new RelayCommand(ShowDiamlondSelPage);
// 初始化SOC客户端服务,传入SOC端的地址和认证Token
_socClientService = new SOCClientService("http://localhost:5000/api/SoC", "your_basic_auth_token");
}
public void ShowHelperPage(object parameter)
@ -39,9 +47,43 @@ public class HomeWindowVM : BaseViewModel
WindowManager.openContent.Add(vm);
}
public void ShowDiamlondSelPage(object parameter)
public async void ShowDiamlondSelPage(object parameter)
{
try
{
// string savePath = @"..\..\..\Resource\SOCImages";
// string result = await _socClientService.ProcessImageCollectionAsync(100, savePath);
//
// ShowMessage(result);
//
// if (result == "成功")
// {
// BaseControlVM vm = new BaseControlVM(new GradingResultVM(null), MultilingualHelper.getString("DetectionResult"));
// WindowManager.mainViewModel.Content = vm;
// WindowManager.openContent.Add(vm);
// }
BaseControlVM vm = new BaseControlVM(new GradingResultVM(null), MultilingualHelper.getString("DetectionResult"));
WindowManager.mainViewModel.Content = vm;
WindowManager.openContent.Add(vm);
}
catch (Exception e)
{
// 记录日志
LogError(e);
ShowMessage("错误: " + e.Message);
}
}
private void ShowMessage(string message)
{
MessageBox.Show(message);
}
private void LogError(Exception e)
{
StartDialog dialog = new StartDialog();
dialog.ShowDialog();
// 实现日志记录逻辑,例如写入文件或数据库
Console.WriteLine($"Error: {e.Message}\n{e.StackTrace}");
}
}

@ -33,7 +33,7 @@
<!-- 第一排按钮 -->
<Button Grid.Row="0" Height="500"
Background="Transparent" BorderBrush="Transparent" Command="{Binding ShowDiamondSelPageCommand}">
<Border BorderBrush="Silver" BorderThickness="1" CornerRadius="20" MouseLeave="UIElement_OnMouseLeave" MouseEnter="UIElement_OnMouseEnter">
<Border BorderBrush="Transparent" BorderThickness="1" CornerRadius="20" MouseLeave="UIElement_OnMouseLeave" MouseEnter="UIElement_OnMouseEnter">
<Border.Background>
<RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
<!-- 内部颜色 -->
@ -65,7 +65,7 @@
<!-- 第二排第一个按钮 -->
<Button Grid.Column="0" Command="{Binding ShowConfigPageCommand}" Background="Transparent" BorderBrush="Transparent" Height="300" >
<Border BorderBrush="Silver" BorderThickness="1" CornerRadius="20" MouseLeave="UIElement_OnMouseLeave" MouseEnter="UIElement_OnMouseEnter">
<Border BorderBrush="Transparent" BorderThickness="1" CornerRadius="20" MouseLeave="UIElement_OnMouseLeave" MouseEnter="UIElement_OnMouseEnter">
<Border.Background>
<RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
<!-- 内部颜色 -->
@ -89,7 +89,7 @@
<Button Grid.Column="1" Command="{Binding ShowHelperPageCommand}" Background="Transparent" BorderBrush="Transparent" Height="300" >
<Border BorderBrush="Silver" BorderThickness="1" CornerRadius="20" MouseLeave="UIElement_OnMouseLeave" MouseEnter="UIElement_OnMouseEnter">
<Border BorderBrush="Transparent" BorderThickness="1" CornerRadius="20" MouseLeave="UIElement_OnMouseLeave" MouseEnter="UIElement_OnMouseEnter">
<Border.Background>
<RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
<!-- 内部颜色 -->

Loading…
Cancel
Save