From 1bc47cfa085031a6d6d9b81f41d463b497287989 Mon Sep 17 00:00:00 2001 From: Viktor Kovacs Date: Sun, 25 Apr 2021 16:03:17 +0200 Subject: [PATCH] Aynchronous export. --- source/export/exporter.js | 23 +- source/export/exporterbase.js | 9 +- source/export/exportergltf.js | 3 +- source/export/exporterobj.js | 5 +- source/export/exporteroff.js | 3 +- source/export/exporterply.js | 3 +- source/export/exporterstl.js | 3 +- test/tests/exporter_test.js | 576 ++++++++++++++++++---------------- website/o3dv/exportdialog.js | 28 +- 9 files changed, 350 insertions(+), 303 deletions(-) diff --git a/source/export/exporter.js b/source/export/exporter.js index dd27fec..9479972 100644 --- a/source/export/exporter.js +++ b/source/export/exporter.js @@ -11,16 +11,27 @@ OV.Exporter = class ]; } - Export (model, format, extension) + Export (model, format, extension, callbacks) { - let files = []; + let exporter = null; for (let i = 0; i < this.exporters.length; i++) { - let exporter = this.exporters[i]; - if (exporter.CanExport (format, extension)) { - exporter.Export (model, format, files); + let currentExporter = this.exporters[i]; + if (currentExporter.CanExport (format, extension)) { + exporter = currentExporter; break; } } - return files; + if (exporter === null) { + callbacks.onError (); + return; + } + + exporter.Export (model, format, function (files) { + if (files.length === 0) { + callbacks.onError (); + } else { + callbacks.onSuccess (files); + } + }); } }; diff --git a/source/export/exporterbase.js b/source/export/exporterbase.js index 27d3d34..889505e 100644 --- a/source/export/exporterbase.js +++ b/source/export/exporterbase.js @@ -39,12 +39,15 @@ OV.ExporterBase = class return false; } - Export (model, format, files) + Export (model, format, onFinish) { - this.ExportContent (model, format, files); + let files = []; + this.ExportContent (model, format, files, function () { + onFinish (files); + }); } - ExportContent (model, format, files) + ExportContent (model, format, files, onFinish) { } diff --git a/source/export/exportergltf.js b/source/export/exportergltf.js index b931487..d041926 100644 --- a/source/export/exportergltf.js +++ b/source/export/exportergltf.js @@ -20,13 +20,14 @@ OV.ExporterGltf = class extends OV.ExporterBase return (format === OV.FileFormat.Text && extension === 'gltf') || (format === OV.FileFormat.Binary && extension === 'glb'); } - ExportContent (model, format, files) + ExportContent (model, format, files, onFinish) { if (format === OV.FileFormat.Text) { this.ExportAsciiContent (model, files); } else if (format === OV.FileFormat.Binary) { this.ExportBinaryContent (model, files); } + onFinish (); } ExportAsciiContent (model, files) diff --git a/source/export/exporterobj.js b/source/export/exporterobj.js index eb98e17..be56287 100644 --- a/source/export/exporterobj.js +++ b/source/export/exporterobj.js @@ -10,7 +10,7 @@ OV.ExporterObj = class extends OV.ExporterBase return format === OV.FileFormat.Text && extension === 'obj'; } - ExportContent (model, format, files) + ExportContent (model, format, files, onFinish) { function WriteTexture (mtlWriter, keyword, texture, files) { @@ -105,7 +105,8 @@ OV.ExporterObj = class extends OV.ExporterBase uvOffset += mesh.TextureUVCount (); } - objFile.SetContent (objWriter.GetText ()); + objFile.SetContent (objWriter.GetText ()); + onFinish (); } GetHeaderText () diff --git a/source/export/exporteroff.js b/source/export/exporteroff.js index f6187d6..38348fe 100644 --- a/source/export/exporteroff.js +++ b/source/export/exporteroff.js @@ -10,7 +10,7 @@ OV.ExporterOff = class extends OV.ExporterBase return format === OV.FileFormat.Text && extension === 'off'; } - ExportContent (model, format, files) + ExportContent (model, format, files, onFinish) { let offFile = new OV.ExportedFile ('model.off'); files.push (offFile); @@ -29,5 +29,6 @@ OV.ExporterOff = class extends OV.ExporterBase }); offFile.SetContent (offWriter.GetText ()); + onFinish (); } }; diff --git a/source/export/exporterply.js b/source/export/exporterply.js index c150fab..52fde7d 100644 --- a/source/export/exporterply.js +++ b/source/export/exporterply.js @@ -10,13 +10,14 @@ OV.ExporterPly = class extends OV.ExporterBase return (format === OV.FileFormat.Text || format === OV.FileFormat.Binary) && extension === 'ply'; } - ExportContent (model, format, files) + ExportContent (model, format, files, onFinish) { if (format === OV.FileFormat.Text) { this.ExportText (model, files); } else { this.ExportBinary (model, files); } + onFinish (); } ExportText (model, files) diff --git a/source/export/exporterstl.js b/source/export/exporterstl.js index 8d4665e..fde7c86 100644 --- a/source/export/exporterstl.js +++ b/source/export/exporterstl.js @@ -10,13 +10,14 @@ OV.ExporterStl = class extends OV.ExporterBase return (format === OV.FileFormat.Text || format === OV.FileFormat.Binary) && extension === 'stl'; } - ExportContent (model, format, files) + ExportContent (model, format, files, onFinish) { if (format === OV.FileFormat.Text) { this.ExportText (model, files); } else { this.ExportBinary (model, files); } + onFinish (); } ExportText (model, files) diff --git a/test/tests/exporter_test.js b/test/tests/exporter_test.js index 62801d4..96350e7 100644 --- a/test/tests/exporter_test.js +++ b/test/tests/exporter_test.js @@ -62,318 +62,340 @@ function CreateTestModel () return model; } +function Export (model, format, extension, onReady) +{ + let exporter = new OV.Exporter (); + exporter.Export (model, format, extension, { + onSuccess : function (files) { + onReady (files); + } + }); +} + describe ('Exporter', function () { - it ('Obj Export', function () { + it ('Exporter Error', function (done) { let model = CreateTestModel (); let exporter = new OV.Exporter (); - - let result = exporter.Export (model, OV.FileFormat.Text, 'obj'); - assert.strictEqual (result.length, 5); - - let mtlFile = result[0]; - assert.strictEqual (mtlFile.GetName (), 'model.mtl'); - assert.strictEqual (mtlFile.GetContent (), - [ - '# exported by https://3dviewer.net', - 'newmtl TestMaterial1', - 'Ka 0 0 0', - 'Kd 1 0 0', - 'Ks 0.2 0.2 0.2', - 'Ns 0', - 'd 1', - 'map_Kd texture1.png', - 'map_Ks texture2.png', - 'bump texture3.png', - 'newmtl TestMaterial2', - 'Ka 0 0 0', - 'Kd 0 1 0', - 'Ks 0.2 0.2 0.2', - 'Ns 0', - 'd 1', - '' - ].join ('\n')); - let objFile = result[1]; - assert.strictEqual (objFile.GetName (), 'model.obj'); - assert.strictEqual (objFile.GetContent (), - [ - '# exported by https://3dviewer.net', - 'mtllib model.mtl', - 'g TestMesh1', - 'v 0 0 1', - 'v 1 0 1', - 'v 0 1 1', - 'vn 0 0 1', - 'usemtl TestMaterial1', - 'f 1//1 2//1 3//1', - 'g TestMesh2', - 'v 0 0 0', - 'v 1 0 0', - 'v 0 1 0', - 'v -1 0 0', - 'v 0 0 1', - 'vn 0 0 1', - 'vn 0 0 1', - 'vn -1 0 0', - 'f 4//2 5//2 6//2', - 'usemtl TestMaterial2', - 'f 4//3 6//3 7//3', - 'f 4//4 8//4 6//4', - '' - ].join ('\n')); - - let textureFile1 = result[2]; - assert.strictEqual (textureFile1.GetName (), 'texture1.png'); - assert.strictEqual (textureFile1.GetContent ().byteLength, 1); - - let textureFile2 = result[3]; - assert.strictEqual (textureFile2.GetName (), 'texture2.png'); - assert.strictEqual (textureFile2.GetContent ().byteLength, 2); - - let textureFile3 = result[4]; - assert.strictEqual (textureFile3.GetName (), 'texture3.png'); - assert.strictEqual (textureFile3.GetContent ().byteLength, 3); + exporter.Export (model, OV.FileFormat.Text, 'ext', { + onError : function () { + done (); + } + }); }); - it ('Stl Export', function () { + it ('Obj Export', function (done) { let model = CreateTestModel (); - let exporter = new OV.Exporter (); + Export (model, OV.FileFormat.Text, 'obj', function (result) { + assert.strictEqual (result.length, 5); - let result = exporter.Export (model, OV.FileFormat.Text, 'stl'); - assert.strictEqual (result.length, 1); + let mtlFile = result[0]; + assert.strictEqual (mtlFile.GetName (), 'model.mtl'); + assert.strictEqual (mtlFile.GetContent (), + [ + '# exported by https://3dviewer.net', + 'newmtl TestMaterial1', + 'Ka 0 0 0', + 'Kd 1 0 0', + 'Ks 0.2 0.2 0.2', + 'Ns 0', + 'd 1', + 'map_Kd texture1.png', + 'map_Ks texture2.png', + 'bump texture3.png', + 'newmtl TestMaterial2', + 'Ka 0 0 0', + 'Kd 0 1 0', + 'Ks 0.2 0.2 0.2', + 'Ns 0', + 'd 1', + '' + ].join ('\n')); + let objFile = result[1]; + assert.strictEqual (objFile.GetName (), 'model.obj'); + assert.strictEqual (objFile.GetContent (), + [ + '# exported by https://3dviewer.net', + 'mtllib model.mtl', + 'g TestMesh1', + 'v 0 0 1', + 'v 1 0 1', + 'v 0 1 1', + 'vn 0 0 1', + 'usemtl TestMaterial1', + 'f 1//1 2//1 3//1', + 'g TestMesh2', + 'v 0 0 0', + 'v 1 0 0', + 'v 0 1 0', + 'v -1 0 0', + 'v 0 0 1', + 'vn 0 0 1', + 'vn 0 0 1', + 'vn -1 0 0', + 'f 4//2 5//2 6//2', + 'usemtl TestMaterial2', + 'f 4//3 6//3 7//3', + 'f 4//4 8//4 6//4', + '' + ].join ('\n')); + + let textureFile1 = result[2]; + assert.strictEqual (textureFile1.GetName (), 'texture1.png'); + assert.strictEqual (textureFile1.GetContent ().byteLength, 1); + + let textureFile2 = result[3]; + assert.strictEqual (textureFile2.GetName (), 'texture2.png'); + assert.strictEqual (textureFile2.GetContent ().byteLength, 2); + + let textureFile3 = result[4]; + assert.strictEqual (textureFile3.GetName (), 'texture3.png'); + assert.strictEqual (textureFile3.GetContent ().byteLength, 3); + + done (); + }); + }); - let stlFile = result[0]; - assert.strictEqual (stlFile.GetName (), 'model.stl'); - assert.strictEqual (stlFile.GetContent (), - [ - 'solid Model', - 'facet normal 0 0 1', - ' outer loop', - ' vertex 0 0 1', - ' vertex 1 0 1', - ' vertex 0 1 1', - ' endloop', - 'endfacet', - 'facet normal 0 0 1', - ' outer loop', - ' vertex 0 0 0', - ' vertex 1 0 0', - ' vertex 0 1 0', - ' endloop', - 'endfacet', - 'facet normal 0 0 1', - ' outer loop', - ' vertex 0 0 0', - ' vertex 0 1 0', - ' vertex -1 0 0', - ' endloop', - 'endfacet', - 'facet normal -1 0 0', - ' outer loop', - ' vertex 0 0 0', - ' vertex 0 0 1', - ' vertex 0 1 0', - ' endloop', - 'endfacet', - 'endsolid Model', - '' - ].join ('\n')); + it ('Stl Export', function (done) { + let model = CreateTestModel (); + Export (model, OV.FileFormat.Text, 'stl', function (result) { + assert.strictEqual (result.length, 1); + + let stlFile = result[0]; + assert.strictEqual (stlFile.GetName (), 'model.stl'); + assert.strictEqual (stlFile.GetContent (), + [ + 'solid Model', + 'facet normal 0 0 1', + ' outer loop', + ' vertex 0 0 1', + ' vertex 1 0 1', + ' vertex 0 1 1', + ' endloop', + 'endfacet', + 'facet normal 0 0 1', + ' outer loop', + ' vertex 0 0 0', + ' vertex 1 0 0', + ' vertex 0 1 0', + ' endloop', + 'endfacet', + 'facet normal 0 0 1', + ' outer loop', + ' vertex 0 0 0', + ' vertex 0 1 0', + ' vertex -1 0 0', + ' endloop', + 'endfacet', + 'facet normal -1 0 0', + ' outer loop', + ' vertex 0 0 0', + ' vertex 0 0 1', + ' vertex 0 1 0', + ' endloop', + 'endfacet', + 'endsolid Model', + '' + ].join ('\n')); + + done (); + }); }); it ('Stl Binary Export', function (done) { let model = CreateTestModel (); - let exporter = new OV.Exporter (); + Export (model, OV.FileFormat.Binary, 'stl', function (result) { + assert.strictEqual (result.length, 1); - let result = exporter.Export (model, OV.FileFormat.Binary, 'stl'); - assert.strictEqual (result.length, 1); - - let stlFile = result[0]; - assert.strictEqual (stlFile.GetName (), 'model.stl'); - assert.strictEqual (stlFile.GetContent ().byteLength, 284); - - let contentBuffer = stlFile.GetContent (); - let importer = new OV.ImporterStl (); - importer.Import (contentBuffer, 'stl', { - getDefaultMaterial () { - return new OV.Material (); - }, - onSuccess () { - let importedModel = importer.GetModel (); - assert.strictEqual (importedModel.VertexCount (), 12); - assert.strictEqual (importedModel.TriangleCount (), 4); - done (); - } + let stlFile = result[0]; + assert.strictEqual (stlFile.GetName (), 'model.stl'); + assert.strictEqual (stlFile.GetContent ().byteLength, 284); + + let contentBuffer = stlFile.GetContent (); + let importer = new OV.ImporterStl (); + importer.Import (contentBuffer, 'stl', { + getDefaultMaterial () { + return new OV.Material (); + }, + onSuccess () { + let importedModel = importer.GetModel (); + assert.strictEqual (importedModel.VertexCount (), 12); + assert.strictEqual (importedModel.TriangleCount (), 4); + done (); + } + }); + + done (); }); }); - it ('Off Export', function () { + it ('Off Export', function (done) { let model = CreateTestModel (); - let exporter = new OV.Exporter (); + Export (model, OV.FileFormat.Text, 'off', function (result) { + assert.strictEqual (result.length, 1); - let result = exporter.Export (model, OV.FileFormat.Text, 'off'); - assert.strictEqual (result.length, 1); - - let offFile = result[0]; - assert.strictEqual (offFile.GetName (), 'model.off'); - assert.strictEqual (offFile.GetContent (), - [ - 'OFF', - '8 4 0', - '0 0 1', - '1 0 1', - '0 1 1', - '0 0 0', - '1 0 0', - '0 1 0', - '-1 0 0', - '0 0 1', - '3 0 1 2', - '3 3 4 5', - '3 3 5 6', - '3 3 7 5', - '' - ].join ('\n')); + let offFile = result[0]; + assert.strictEqual (offFile.GetName (), 'model.off'); + assert.strictEqual (offFile.GetContent (), + [ + 'OFF', + '8 4 0', + '0 0 1', + '1 0 1', + '0 1 1', + '0 0 0', + '1 0 0', + '0 1 0', + '-1 0 0', + '0 0 1', + '3 0 1 2', + '3 3 4 5', + '3 3 5 6', + '3 3 7 5', + '' + ].join ('\n')); + + done (); + }); }); - it ('Ply Export', function () { + it ('Ply Export', function (done) { let model = CreateTestModel (); - let exporter = new OV.Exporter (); + Export (model, OV.FileFormat.Text, 'ply', function (result) { + assert.strictEqual (result.length, 1); - let result = exporter.Export (model, OV.FileFormat.Text, 'ply'); - assert.strictEqual (result.length, 1); - - let plyFile = result[0]; - assert.strictEqual (plyFile.GetName (), 'model.ply'); - assert.strictEqual (plyFile.GetContent (), - [ - 'ply', - 'format ascii 1.0', - 'element vertex 8', - 'property float x', - 'property float y', - 'property float z', - 'element face 4', - 'property list uchar int vertex_index', - 'end_header', - '0 0 1', - '1 0 1', - '0 1 1', - '0 0 0', - '1 0 0', - '0 1 0', - '-1 0 0', - '0 0 1', - '3 0 1 2', - '3 3 4 5', - '3 3 5 6', - '3 3 7 5', - '' - ].join ('\n')); + let plyFile = result[0]; + assert.strictEqual (plyFile.GetName (), 'model.ply'); + assert.strictEqual (plyFile.GetContent (), + [ + 'ply', + 'format ascii 1.0', + 'element vertex 8', + 'property float x', + 'property float y', + 'property float z', + 'element face 4', + 'property list uchar int vertex_index', + 'end_header', + '0 0 1', + '1 0 1', + '0 1 1', + '0 0 0', + '1 0 0', + '0 1 0', + '-1 0 0', + '0 0 1', + '3 0 1 2', + '3 3 4 5', + '3 3 5 6', + '3 3 7 5', + '' + ].join ('\n')); + + done (); + }); }); it ('Ply Binary Export', function (done) { let model = CreateTestModel (); - let exporter = new OV.Exporter (); + Export (model, OV.FileFormat.Binary, 'ply', function (result) { + assert.strictEqual (result.length, 1); - let result = exporter.Export (model, OV.FileFormat.Binary, 'ply'); - assert.strictEqual (result.length, 1); - - let plyFile = result[0]; - assert.strictEqual (plyFile.GetName (), 'model.ply'); - assert.strictEqual (plyFile.GetContent ().byteLength, 315); - - let contentBuffer = plyFile.GetContent (); - let importer = new OV.ImporterPly (); - importer.Import (contentBuffer, 'ply', { - getDefaultMaterial () { - return new OV.Material (); - }, - onSuccess () { - let importedModel = importer.GetModel (); - assert.strictEqual (importedModel.VertexCount (), 8); - assert.strictEqual (importedModel.TriangleCount (), 4); - done (); - } - }); + let plyFile = result[0]; + assert.strictEqual (plyFile.GetName (), 'model.ply'); + assert.strictEqual (plyFile.GetContent ().byteLength, 315); + + let contentBuffer = plyFile.GetContent (); + let importer = new OV.ImporterPly (); + importer.Import (contentBuffer, 'ply', { + getDefaultMaterial () { + return new OV.Material (); + }, + onSuccess () { + let importedModel = importer.GetModel (); + assert.strictEqual (importedModel.VertexCount (), 8); + assert.strictEqual (importedModel.TriangleCount (), 4); + done (); + } + }); + }); }); it ('Gltf Ascii Export', function (done) { let model = CreateTestModel (); - let exporter = new OV.Exporter (); + Export (model, OV.FileFormat.Text, 'gltf', function (result) { + assert.strictEqual (result.length, 3); - let result = exporter.Export (model, OV.FileFormat.Text, 'gltf'); - assert.strictEqual (result.length, 3); - - let gltfFile = result[0]; - let binFile = result[1]; - let textureFile = result[2]; - assert.strictEqual (gltfFile.GetName (), 'model.gltf'); - assert.strictEqual (binFile.GetName (), 'model.bin'); - - assert.strictEqual (textureFile.GetName (), 'texture1.png'); - assert.strictEqual (textureFile.GetContent ().byteLength, 1); - - let contentBuffer = gltfFile.GetContent (); - let importer = new OV.ImporterGltf (); - importer.Import (contentBuffer, 'gltf', { - getDefaultMaterial () { - return new OV.Material (); - }, - getFileBuffer (filePath) { - if (filePath == 'model.bin') { - return binFile.GetContent (); + let gltfFile = result[0]; + let binFile = result[1]; + let textureFile = result[2]; + assert.strictEqual (gltfFile.GetName (), 'model.gltf'); + assert.strictEqual (binFile.GetName (), 'model.bin'); + + assert.strictEqual (textureFile.GetName (), 'texture1.png'); + assert.strictEqual (textureFile.GetContent ().byteLength, 1); + + let contentBuffer = gltfFile.GetContent (); + let importer = new OV.ImporterGltf (); + importer.Import (contentBuffer, 'gltf', { + getDefaultMaterial () { + return new OV.Material (); + }, + getFileBuffer (filePath) { + if (filePath == 'model.bin') { + return binFile.GetContent (); + } + return null; + }, + getTextureBuffer (filePath) { + return null; + }, + onSuccess () { + let importedModel = importer.GetModel (); + assert (OV.CheckModel (importedModel)); + assert.strictEqual (importedModel.MaterialCount (), 2); + assert.strictEqual (importedModel.MeshCount (), 2); + assert.strictEqual (importedModel.GetMesh (0).GetName (), 'TestMesh1'); + assert.strictEqual (importedModel.GetMesh (1).GetName (), 'TestMesh2'); + assert.strictEqual (importedModel.VertexCount (), 12); + assert.strictEqual (importedModel.TriangleCount (), 4); + done (); } - return null; - }, - getTextureBuffer (filePath) { - return null; - }, - onSuccess () { - let importedModel = importer.GetModel (); - assert (OV.CheckModel (importedModel)); - assert.strictEqual (importedModel.MaterialCount (), 2); - assert.strictEqual (importedModel.MeshCount (), 2); - assert.strictEqual (importedModel.GetMesh (0).GetName (), 'TestMesh1'); - assert.strictEqual (importedModel.GetMesh (1).GetName (), 'TestMesh2'); - assert.strictEqual (importedModel.VertexCount (), 12); - assert.strictEqual (importedModel.TriangleCount (), 4); - done (); - } + }); }); - }); + }); - it ('Gltf Binary Export', function (done) { - let model = CreateTestModel (); - let exporter = new OV.Exporter (); + it ('Gltf Binary Export', function (done) { + let model = CreateTestModel (); + Export (model, OV.FileFormat.Binary, 'glb', function (result) { + assert.strictEqual (result.length, 1); - let result = exporter.Export (model, OV.FileFormat.Binary, 'glb'); - assert.strictEqual (result.length, 1); + let glbFile = result[0]; + assert.strictEqual (glbFile.GetName (), 'model.glb'); - let glbFile = result[0]; - assert.strictEqual (glbFile.GetName (), 'model.glb'); - - let contentBuffer = glbFile.GetContent (); - let importer = new OV.ImporterGltf (); - importer.Import (contentBuffer, 'glb', { - getDefaultMaterial () { - return new OV.Material (); - }, - getFileBuffer (filePath) { - return null; - }, - getTextureBuffer (filePath) { - return null; - }, - onSuccess () { - let importedModel = importer.GetModel (); - assert (OV.CheckModel (importedModel)); - assert.strictEqual (importedModel.MaterialCount (), 2); - assert.strictEqual (importedModel.MeshCount (), 2); - assert.strictEqual (importedModel.GetMesh (0).GetName (), 'TestMesh1'); - assert.strictEqual (importedModel.GetMesh (1).GetName (), 'TestMesh2'); - assert.strictEqual (importedModel.VertexCount (), 12); - assert.strictEqual (importedModel.TriangleCount (), 4); - done (); - } - }); - }); + let contentBuffer = glbFile.GetContent (); + let importer = new OV.ImporterGltf (); + importer.Import (contentBuffer, 'glb', { + getDefaultMaterial () { + return new OV.Material (); + }, + getFileBuffer (filePath) { + return null; + }, + getTextureBuffer (filePath) { + return null; + }, + onSuccess () { + let importedModel = importer.GetModel (); + assert (OV.CheckModel (importedModel)); + assert.strictEqual (importedModel.MaterialCount (), 2); + assert.strictEqual (importedModel.MeshCount (), 2); + assert.strictEqual (importedModel.GetMesh (0).GetName (), 'TestMesh1'); + assert.strictEqual (importedModel.GetMesh (1).GetName (), 'TestMesh2'); + assert.strictEqual (importedModel.VertexCount (), 12); + assert.strictEqual (importedModel.TriangleCount (), 4); + done (); + } + }); + }); + }); }); diff --git a/website/o3dv/exportdialog.js b/website/o3dv/exportdialog.js index a586a10..62c6acc 100644 --- a/website/o3dv/exportdialog.js +++ b/website/o3dv/exportdialog.js @@ -157,17 +157,23 @@ OV.ExportDialog = class progressDialog.Show ('Exporting Model'); OV.RunTaskAsync (function () { let exporter = new OV.Exporter (); - let files = exporter.Export (model, selectedFormat.format, selectedFormat.extension); - if (files.length === 0) { - progressDialog.Hide (); - } else if (files.length === 1) { - progressDialog.Hide (); - let file = files[0]; - OV.DownloadArrayBufferAsFile (file.GetContent (), file.GetName ()); - } else if (files.length > 1) { - progressDialog.Hide (); - obj.ShowExportedFiles (files); - } + exporter.Export (model, selectedFormat.format, selectedFormat.extension, { + onError : function () { + progressDialog.Hide (); + }, + onSuccess : function (files) { + if (files.length === 0) { + progressDialog.Hide (); + } else if (files.length === 1) { + progressDialog.Hide (); + let file = files[0]; + OV.DownloadArrayBufferAsFile (file.GetContent (), file.GetName ()); + } else if (files.length > 1) { + progressDialog.Hide (); + obj.ShowExportedFiles (files); + } + } + }); }); } else if (selectedFormat.type === OV.ExportType.Image) { let url = null;