ExporterForm.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using System.Windows.Forms;
  5. using MaxCustomControls;
  6. using MaxSharp;
  7. using Color = System.Drawing.Color;
  8. namespace Max2Babylon
  9. {
  10. public partial class ExporterForm : MaxForm
  11. {
  12. private readonly BabylonExportActionItem babylonExportAction;
  13. private CancellationTokenSource cancellationToken;
  14. public ExporterForm(BabylonExportActionItem babylonExportAction)
  15. {
  16. InitializeComponent();
  17. this.babylonExportAction = babylonExportAction;
  18. }
  19. private void ExporterForm_Load(object sender, EventArgs e)
  20. {
  21. txtFilename.Text = Kernel.Scene.RootNode.GetLocalData();
  22. }
  23. private void butBrowse_Click(object sender, EventArgs e)
  24. {
  25. if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
  26. {
  27. txtFilename.Text = saveFileDialog.FileName;
  28. }
  29. }
  30. private async void butExport_Click(object sender, EventArgs e)
  31. {
  32. Kernel.Scene.RootNode.SetLocalData(txtFilename.Text);
  33. var exporter = new BabylonExporter();
  34. TreeNode currentNode = null;
  35. TreeNode previousNode = null;
  36. treeView.Nodes.Clear();
  37. exporter.OnImportProgressChanged += progress => BeginInvoke(new Action(() =>
  38. {
  39. progressBar.Value = progress;
  40. }));
  41. exporter.OnWarning += (warning, asChild) => BeginInvoke(new Action(() =>
  42. {
  43. previousNode = new TreeNode(warning) { ForeColor = Color.Orange };
  44. currentNode = CreateTreeNode(asChild, currentNode, previousNode);
  45. previousNode.EnsureVisible();
  46. }));
  47. exporter.OnError += (error, asChild) => BeginInvoke(new Action(() =>
  48. {
  49. previousNode = new TreeNode(error) { ForeColor = Color.Red };
  50. currentNode = CreateTreeNode(asChild, currentNode, previousNode);
  51. previousNode.EnsureVisible();
  52. }));
  53. exporter.OnMessage += (message, asChild, emphasis, embed, color) => BeginInvoke(new Action(() =>
  54. {
  55. var oldPrevious = previousNode;
  56. previousNode = new TreeNode(message);
  57. previousNode.ForeColor = color;
  58. if (emphasis)
  59. {
  60. previousNode.ForeColor = Color.Green;
  61. }
  62. currentNode = CreateTreeNode(asChild || embed, embed ? oldPrevious : currentNode, previousNode);
  63. if (emphasis)
  64. {
  65. previousNode.EnsureVisible();
  66. }
  67. }));
  68. butExport.Enabled = false;
  69. butCancel.Enabled = true;
  70. cancellationToken = new CancellationTokenSource();
  71. var token = cancellationToken.Token;
  72. try
  73. {
  74. await Task.Run(() => exporter.Export(txtFilename.Text, token), token);
  75. }
  76. catch
  77. {
  78. previousNode = new TreeNode("Exportation cancelled") { ForeColor = Color.Red };
  79. currentNode = CreateTreeNode(false, currentNode, previousNode);
  80. previousNode.EnsureVisible();
  81. progressBar.Value = 0;
  82. }
  83. butCancel.Enabled = false;
  84. butExport.Enabled = true;
  85. }
  86. private TreeNode CreateTreeNode(bool asChild, TreeNode currentNode, TreeNode treeNode)
  87. {
  88. if (asChild)
  89. {
  90. currentNode.Nodes.Add(treeNode);
  91. }
  92. else
  93. {
  94. treeView.Nodes.Add(treeNode);
  95. }
  96. if (!asChild)
  97. {
  98. currentNode = treeNode;
  99. }
  100. return currentNode;
  101. }
  102. private void ExporterForm_FormClosed(object sender, FormClosedEventArgs e)
  103. {
  104. babylonExportAction.Close();
  105. }
  106. private void txtFilename_TextChanged(object sender, EventArgs e)
  107. {
  108. butExport.Enabled = !string.IsNullOrEmpty(txtFilename.Text.Trim());
  109. }
  110. private void butCancel_Click(object sender, EventArgs e)
  111. {
  112. cancellationToken.Cancel();
  113. }
  114. }
  115. }