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(); } }