feat: 心箭图

master
tongg 5 months ago
parent 6e7946b3aa
commit 1a46ecb4f8
  1. 2
      Views/UserControl/Viewport3D.xaml.cs
  2. 151
      Views/UserControl/ViewportData/Helper/UnityHelper.cs

@ -218,7 +218,7 @@ public partial class Viewport3D
ViewportManager.DoubleClickSelect = !false;
break;
case "BtnShow3DView":
UnityHelper.GenerateRender(ViewportManager.ViewportTriangle.First().TriangleCode, "123");
break;
}

@ -1,18 +1,163 @@
namespace SparkClient.Views.UserControl.ViewportData.Helper;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows.Forms;
public class UnityHelper
{
private static string _image_path = AppDomain.CurrentDomain.BaseDirectory + "/temp/image/";
//unity渲染结果(运行前清理)
private static string _image_path = AppDomain.CurrentDomain.BaseDirectory + @"Unity\image\";
//unity渲染模型缓存(运行前清理)
private static string _stl_path = AppDomain.CurrentDomain.BaseDirectory + @"Unity\stl\";
//用于存放unity渲染插件(版本发布独立更新)
private static string _unity_path = AppDomain.CurrentDomain.BaseDirectory + @"Unity\core\";
/***
* 1stl文件名ViewportHelperPro.ExportModelsToStl(null, path+filename)
* 2STL文件是否存在 7
* 3 temp下imagestl两个目录
* 3 Unityimagestl两个目录
* 4stl文件paramA
* 5 xx.exe --model=_stl_path+paramA --output=_image_path --type=0/1 00.png 11.png
* 6
* 7 --->> --->>21
* 8
* 9
*
* 0.png1.png
*/
public static void GenerateRender(string modelInfo, string diamondCode)
{
string fileName = GenerateSignature(modelInfo, diamondCode) + ".stl";
string fullStlPath = Path.Combine(_stl_path, fileName);
// 1. 检查STL文件是否存在
if (File.Exists(fullStlPath))
{
if (ValidateImages())
{
ShowImages();
return;
}
}
// 2. 清理Unity相关目录
CleanDirectory(_image_path);
CleanDirectory(_stl_path);
// 3. 导出模型为STL
ExportModelsToStl(fullStlPath);
// 4. 执行Unity渲染命令两次
ExecuteUnityRendering(fileName, 0); // 渲染心图
ExecuteUnityRendering(fileName, 1); // 渲染箭图
// 5. 验证图片是否生成
if (ValidateImages())
{
ShowImages();
}
else
{
MessageBox.Show("生成失败,请重试。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private static string GenerateSignature(string modelInfo, string diamondCode)
{
// 模拟生成签名逻辑,可以自定义为更复杂的算法
return modelInfo.GetHashCode() + "_" + diamondCode.GetHashCode();
}
private static void CleanDirectory(string path)
{
if (Directory.Exists(path))
{
Directory.Delete(path, true);
}
Directory.CreateDirectory(path);
}
private static void ExportModelsToStl(string path)
{
// 模拟模型导出逻辑
// 调用ViewportHelperPro.ExportModelsToStl(null, path);
// Console.WriteLine("模型已导出为STL: " + path);
ViewportHelperPro.ExportModelsToStl(null, path);
}
private static void ExecuteUnityRendering(string fileName, int type)
{
string arguments = $"--model={_stl_path + fileName} --output={_image_path} --type={type}";
string exePath = Path.Combine(_unity_path, "RayTracing.exe");
if (!File.Exists(exePath))
{
throw new FileNotFoundException("Unity渲染插件未找到", exePath);
}
using (Process process = new Process())
{
process.StartInfo.FileName = exePath;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit();
if (process.ExitCode != 0)
{
throw new Exception("Unity渲染进程异常退出。");
}
}
}
private static bool ValidateImages()
{
string heartImage = Path.Combine(_image_path, "0.png");
string arrowImage = Path.Combine(_image_path, "1.png");
return File.Exists(heartImage) && File.Exists(arrowImage);
}
private static void ShowImages()
{
// 创建一个简单的图片展示窗口
Form form = new Form
{
Text = "心箭图模拟渲染",
Width = 800,
Height = 600
};
PictureBox heartBox = new PictureBox
{
ImageLocation = Path.Combine(_image_path, "0.png"),
SizeMode = PictureBoxSizeMode.Zoom,
Dock = DockStyle.Left,
Width = 400
};
PictureBox arrowBox = new PictureBox
{
ImageLocation = Path.Combine(_image_path, "1.png"),
SizeMode = PictureBoxSizeMode.Zoom,
Dock = DockStyle.Right,
Width = 400
};
form.Controls.Add(heartBox);
form.Controls.Add(arrowBox);
Label label = new Label
{
Text = "心箭图为模拟渲染,实际请以切工镜观测为准。",
Dock = DockStyle.Bottom,
Height = 30,
TextAlign = System.Drawing.ContentAlignment.MiddleCenter
};
form.Controls.Add(label);
form.ShowDialog();
}
}
Loading…
Cancel
Save