ExporterForm.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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 => Invoke(new Action(() =>
  38. {
  39. progressBar.Value = progress;
  40. }));
  41. exporter.OnWarning += (warning, asChild) => Invoke(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) => Invoke(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) => Invoke(new Action(() =>
  54. {
  55. var oldPrevious = previousNode;
  56. previousNode = new TreeNode(message);
  57. if (emphasis)
  58. {
  59. previousNode.ForeColor = Color.Green;
  60. }
  61. currentNode = CreateTreeNode(asChild || embed, embed ? oldPrevious : currentNode, previousNode);
  62. if (emphasis)
  63. {
  64. previousNode.EnsureVisible();
  65. }
  66. }));
  67. butExport.Enabled = false;
  68. butCancel.Enabled = true;
  69. cancellationToken = new CancellationTokenSource();
  70. var token = cancellationToken.Token;
  71. try
  72. {
  73. await Task.Run(() => exporter.Export(txtFilename.Text, token), token);
  74. }
  75. catch
  76. {
  77. previousNode = new TreeNode("Exportation cancelled") { ForeColor = Color.Red };
  78. currentNode = CreateTreeNode(false, currentNode, previousNode);
  79. previousNode.EnsureVisible();
  80. progressBar.Value = 0;
  81. }
  82. butCancel.Enabled = false;
  83. butExport.Enabled = true;
  84. }
  85. private TreeNode CreateTreeNode(bool asChild, TreeNode currentNode, TreeNode treeNode)
  86. {
  87. if (asChild)
  88. {
  89. currentNode.Nodes.Add(treeNode);
  90. }
  91. else
  92. {
  93. treeView.Nodes.Add(treeNode);
  94. }
  95. if (!asChild)
  96. {
  97. currentNode = treeNode;
  98. }
  99. return currentNode;
  100. }
  101. private void ExporterForm_FormClosed(object sender, FormClosedEventArgs e)
  102. {
  103. babylonExportAction.Close();
  104. }
  105. private void txtFilename_TextChanged(object sender, EventArgs e)
  106. {
  107. butExport.Enabled = !string.IsNullOrEmpty(txtFilename.Text.Trim());
  108. }
  109. private void butCancel_Click(object sender, EventArgs e)
  110. {
  111. cancellationToken.Cancel();
  112. }
  113. }
  114. }