You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
5.8 KiB

using System.Drawing;
using System.Text;
using SparkClient.Model.Helper;
namespace SparkClient.Views.UserControl.ViewportData.Helper;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows.Forms;
public class RayHelper
{
//unity渲染结果(运行前清理)
private static string _image_path = AppDomain.CurrentDomain.BaseDirectory + @"Ray\Image\";
//unity渲染模型缓存(运行前清理)
private static string _obj_path = AppDomain.CurrentDomain.BaseDirectory + @"Ray\Obj";
//用于存放unity渲染插件(版本发布独立更新)
private static string _unity_path = AppDomain.CurrentDomain.BaseDirectory + @"Ray\Core\";
public static void GenerateRender(string modelInfo, string diamondCode)
{
string fileName = GenerateSignature(modelInfo, diamondCode);
string fullStlPath = Path.Combine(_obj_path, fileName);
// 1. 检查STL文件是否存在
if (File.Exists(fullStlPath))
{
if (ValidateImages())
{
ShowImages();
return;
}
}
// 2. 清理Unity相关目录
CleanDirectory(_image_path);
CleanDirectory(_obj_path);
// 3. 导出模型为STL
ObjExporter.ExportToObj2(ViewportManager.ViewportTriangle, fullStlPath + ".obj");
// 4. 执行Unity渲染命令两次
ExecuteUnityRendering(fileName, 0); // 渲染心图
ExecuteUnityRendering(fileName, 1); // 渲染箭图
// 5. 验证图片是否生成
if (ValidateImages())
{
ShowImages();
}
else
{
throw new Exception(MultilingualHelper.getString("RayTracingGenError"));
}
}
private static string GenerateSignature(string modelInfo, string diamondCode)
{
// 模拟生成签名逻辑,可以自定义为更复杂的算法
return modelInfo;
}
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);
}
private static void ExecuteUnityRendering(string fileName, int type)
{
string arguments = $@"--obj {_obj_path + @"\" + fileName + ".obj"} --output {_image_path}{type}.jpg --mode {type}";
string exePath = Path.Combine(_unity_path, "hart.exe");
if (!File.Exists(exePath))
{
throw new FileNotFoundException(MultilingualHelper.getString("RayTracingNoPlugin"), exePath);
}
using (Process process = new Process())
{
process.StartInfo.FileName = exePath;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
// 使用StringBuilder来捕获输出和错误信息
StringBuilder outputBuilder = new StringBuilder();
StringBuilder errorBuilder = new StringBuilder();
process.OutputDataReceived += (sender, e) =>
{
if (e.Data != null)
outputBuilder.AppendLine(e.Data);
};
process.ErrorDataReceived += (sender, e) =>
{
if (e.Data != null)
errorBuilder.AppendLine(e.Data);
};
process.Start();
// 开始异步读取输出和错误流
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
// 获取完整的输出和错误信息
string outputMsg = outputBuilder.ToString();
string errorMsg = errorBuilder.ToString();
errorMsg = string.IsNullOrWhiteSpace(errorMsg)?outputMsg:errorMsg;
if (process.ExitCode != 0)
{
throw new Exception($"{MultilingualHelper.getString("RayTracingFail")}{errorMsg}");
}
}
}
private static bool ValidateImages()
{
string heartImage = Path.Combine(_image_path, "0.jpg");
string arrowImage = Path.Combine(_image_path, "1.jpg");
return File.Exists(heartImage) && File.Exists(arrowImage);
}
private static void ShowImages()
{
// 创建一个简单的图片展示窗口
Form form = new Form
{
Text = MultilingualHelper.getString("RayTracingFormTitle"),
Width = 800,
Height = 450,
MaximizeBox = false,
MinimizeBox = false,
BackColor = Color.Black,
StartPosition = FormStartPosition.CenterScreen,
};
PictureBox heartBox = new PictureBox
{
ImageLocation = Path.Combine(_image_path, "0.jpg"),
SizeMode = PictureBoxSizeMode.Zoom,
Dock = DockStyle.Left,
Width = 400
};
PictureBox arrowBox = new PictureBox
{
ImageLocation = Path.Combine(_image_path, "1.jpg"),
SizeMode = PictureBoxSizeMode.Zoom,
Dock = DockStyle.Right,
Width = 400
};
form.Controls.Add(heartBox);
form.Controls.Add(arrowBox);
Label label = new Label
{
Text = MultilingualHelper.getString("RayTracingFormMessage"),
Dock = DockStyle.Bottom,
Height = 30,
TextAlign = System.Drawing.ContentAlignment.MiddleCenter,
ForeColor = Color.WhiteSmoke,
};
form.Controls.Add(label);
form.ShowDialog();
}
}