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.
187 lines
6.2 KiB
187 lines
6.2 KiB
using System.Drawing; |
|
using System.Text; |
|
using SparkClient.Model.Helper; |
|
using SparkDotNetCore.ArrowAndHeart; |
|
using SparkDotNetCore.ArrowAndHeart.Entity; |
|
|
|
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"; |
|
|
|
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渲染命令两次 |
|
string fullObjPath = fullStlPath + ".obj"; |
|
string heartImagePath = _image_path + @"Heart.png"; |
|
string arrowImagePath = _image_path + @"Arrow.png"; |
|
RayTracingInput rayTracingInput = new RayTracingInput { |
|
Obj = fullObjPath, |
|
Arrow = arrowImagePath, |
|
Heart = heartImagePath, |
|
}; |
|
DiamondRayTracing diamondRayTracing = new DiamondRayTracing(rayTracingInput); |
|
RayTracingResult result = diamondRayTracing.Render(); |
|
if (result!= null && "OK".Equals(result.Status)) { |
|
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, @"Heart.png"); |
|
string arrowImage = Path.Combine(_image_path, @"Arrow.png"); |
|
|
|
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, "Heart.png"), |
|
SizeMode = PictureBoxSizeMode.Zoom, |
|
Dock = DockStyle.Left, |
|
Width = 400 |
|
}; |
|
|
|
PictureBox arrowBox = new PictureBox |
|
{ |
|
ImageLocation = Path.Combine(_image_path, "Arrow.png"), |
|
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(); |
|
} |
|
} |