using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; using System.Windows.Forms; using Color = System.Drawing.Color; namespace Max2Babylon { public partial class ExporterForm : Form { private readonly BabylonExportActionItem babylonExportAction; private BabylonExporter exporter; TreeNode currentNode; int currentRank; public ExporterForm(BabylonExportActionItem babylonExportAction) { InitializeComponent(); this.babylonExportAction = babylonExportAction; } private void ExporterForm_Load(object sender, EventArgs e) { txtFilename.Text = Loader.Core.RootNode.GetLocalData(); Tools.PrepareCheckBox(chkManifest, Loader.Core.RootNode, "babylonjs_generatemanifest"); Tools.PrepareCheckBox(chkCopyTextures, Loader.Core.RootNode, "babylonjs_copytextures", 1); Tools.PrepareCheckBox(chkHidden, Loader.Core.RootNode, "babylonjs_exporthidden"); Tools.PrepareCheckBox(chkAutoSave, Loader.Core.RootNode, "babylonjs_autosave", 1); Tools.PrepareCheckBox(chkOnlySelected, Loader.Core.RootNode, "babylonjs_onlySelected"); Tools.PrepareCheckBox(chkBinary, Loader.Core.RootNode, "babylonjs_binary"); } private void butBrowse_Click(object sender, EventArgs e) { if (saveFileDialog.ShowDialog(this) == DialogResult.OK) { txtFilename.Text = saveFileDialog.FileName; } } private async void butExport_Click(object sender, EventArgs e) { await DoExport(); } private async Task DoExport() { Tools.UpdateCheckBox(chkManifest, Loader.Core.RootNode, "babylonjs_generatemanifest"); Tools.UpdateCheckBox(chkCopyTextures, Loader.Core.RootNode, "babylonjs_copytextures"); Tools.UpdateCheckBox(chkHidden, Loader.Core.RootNode, "babylonjs_exporthidden"); Tools.UpdateCheckBox(chkAutoSave, Loader.Core.RootNode, "babylonjs_autosave"); Tools.UpdateCheckBox(chkOnlySelected, Loader.Core.RootNode, "babylonjs_onlySelected"); Tools.UpdateCheckBox(chkBinary, Loader.Core.RootNode, "babylonjs_binary"); Loader.Core.RootNode.SetLocalData(txtFilename.Text); exporter = new BabylonExporter(); treeView.Nodes.Clear(); exporter.OnImportProgressChanged += progress => { progressBar.Value = progress; Application.DoEvents(); }; exporter.OnWarning += (warning, rank) => { try { currentNode = CreateTreeNode(rank, warning, Color.DarkOrange); currentNode.EnsureVisible(); } catch { } Application.DoEvents(); }; exporter.OnError += (error, rank) => { try { currentNode = CreateTreeNode(rank, error, Color.Red); currentNode.EnsureVisible(); } catch { } Application.DoEvents(); }; exporter.OnMessage += (message, color, rank, emphasis) => { try { currentNode = CreateTreeNode(rank, message, color); if (emphasis) { currentNode.EnsureVisible(); } } catch { } Application.DoEvents(); }; butExport.Enabled = false; butExportAndRun.Enabled = false; butCancel.Enabled = true; bool success = true; try { exporter.AutoSave3dsMaxFile = chkAutoSave.Checked; exporter.ExportHiddenObjects = chkHidden.Checked; exporter.CopyTexturesToOutput = chkCopyTextures.Checked; await exporter.ExportAsync(txtFilename.Text, chkManifest.Checked, chkOnlySelected.Checked, chkBinary.Checked, this); } catch (OperationCanceledException) { progressBar.Value = 0; success = false; } catch (Exception ex) { currentNode = CreateTreeNode(0, "Exportation cancelled: " + ex.Message, Color.Red); currentNode.EnsureVisible(); progressBar.Value = 0; success = false; } butCancel.Enabled = false; butExport.Enabled = true; butExportAndRun.Enabled = WebServer.IsSupported; BringToFront(); return success; } private TreeNode CreateTreeNode(int rank, string text, Color color) { TreeNode newNode = null; Invoke(new Action(() => { newNode = new TreeNode(text) {ForeColor = color}; if (rank == 0) { treeView.Nodes.Add(newNode); } else if (rank == currentRank + 1) { currentNode.Nodes.Add(newNode); } else { var parentNode = currentNode; while (currentRank != rank - 1) { parentNode = parentNode.Parent; currentRank--; } parentNode.Nodes.Add(newNode); } currentRank = rank; })); return newNode; } private void ExporterForm_FormClosed(object sender, FormClosedEventArgs e) { if (exporter != null) { exporter.IsCancelled = true; } babylonExportAction.Close(); } private void txtFilename_TextChanged(object sender, EventArgs e) { butExport.Enabled = !string.IsNullOrEmpty(txtFilename.Text.Trim()); butExportAndRun.Enabled = butExport.Enabled && WebServer.IsSupported; } private void butCancel_Click(object sender, EventArgs e) { exporter.IsCancelled = true; } private void ExporterForm_Activated(object sender, EventArgs e) { Loader.Global.DisableAccelerators(); } private void ExporterForm_Deactivate(object sender, EventArgs e) { Loader.Global.EnableAccelerators(); } private async void butExportAndRun_Click(object sender, EventArgs e) { if (await DoExport()) { WebServer.SceneFilename = Path.GetFileName(txtFilename.Text); WebServer.SceneFolder = Path.GetDirectoryName(txtFilename.Text); Process.Start("http://localhost:" + WebServer.Port); WindowState = FormWindowState.Minimized; } } private void butClose_Click(object sender, EventArgs e) { Close(); } } }