diff --git a/source/export/exporter.js b/source/export/exporter.js index 4e30c11..3483608 100644 --- a/source/export/exporter.js +++ b/source/export/exporter.js @@ -17,7 +17,7 @@ OV.Exporter = class this.exporters.push (exporter); } - Export (exporterModel, format, extension, callbacks) + Export (model, settings, format, extension, callbacks) { let exporter = null; for (let i = 0; i < this.exporters.length; i++) { @@ -32,6 +32,7 @@ OV.Exporter = class return; } + let exporterModel = new OV.ExporterModel (model, settings); exporter.Export (exporterModel, format, (files) => { if (files.length === 0) { callbacks.onError (); diff --git a/source/export/exportermodel.js b/source/export/exportermodel.js index 127c237..94425fb 100644 --- a/source/export/exportermodel.js +++ b/source/export/exportermodel.js @@ -1,19 +1,25 @@ -OV.ExporterModel = class +OV.ExporterSettings = class { - constructor (model, parameters) + constructor (settings) { - this.model = model; - this.parameters = { - isMeshVisible : (meshInstanceId) => { - return true; - } + this.isMeshVisible = (meshInstanceId) => { + return true; }; - if (OV.IsDefined (parameters)) { - if (OV.IsDefined (parameters.isMeshVisible)) { - this.parameters.isMeshVisible = parameters.isMeshVisible; + if (OV.IsDefined (settings)) { + if (OV.IsDefined (settings.isMeshVisible)) { + this.isMeshVisible = settings.isMeshVisible; } } } +}; + +OV.ExporterModel = class +{ + constructor (model, settings) + { + this.model = model; + this.settings = settings; + } MaterialCount () { @@ -43,10 +49,19 @@ OV.ExporterModel = class return triangleCount; } + MeshInstanceCount () + { + let meshInstanceCount = 0; + this.EnumerateMeshInstances ((meshInstance) => { + meshInstanceCount += 1; + }); + return meshInstanceCount; + } + EnumerateMeshInstances (onMeshInstance) { this.model.EnumerateMeshInstances ((meshInstance) => { - if (this.parameters.isMeshVisible (meshInstance.GetId ())) { + if (this.settings.isMeshVisible (meshInstance.GetId ())) { onMeshInstance (meshInstance); } }); diff --git a/source/viewer/domutils.js b/source/viewer/domutils.js index 6943c27..eaedf77 100644 --- a/source/viewer/domutils.js +++ b/source/viewer/domutils.js @@ -123,10 +123,27 @@ OV.AddRadioButton = function (parentElement, name, id, text, onChange) radio.setAttribute ('id', id); radio.setAttribute ('name', name); OV.AddDomElement (label, 'span', null, text); - radio.addEventListener ('change', onChange); + if (onChange) { + radio.addEventListener ('change', onChange); + } return radio; }; +OV.AddCheckbox = function (parentElement, id, text, isChecked, onChange) +{ + let label = OV.AddDomElement (parentElement, 'label'); + label.setAttribute ('for', id); + let check = OV.AddDomElement (label, 'input', 'ov_checkbox'); + check.setAttribute ('type', 'checkbox'); + check.setAttribute ('checked', isChecked); + check.setAttribute ('id', id); + OV.AddDomElement (label, 'span', null, text); + if (onChange) { + check.addEventListener ('change', onChange); + } + return check; +}; + OV.AddRangeSlider = function (parentElement, min, max) { let slider = OV.AddDomElement (parentElement, 'input', 'ov_slider'); diff --git a/test/tests/exporter_test.js b/test/tests/exporter_test.js index 962cd01..7b8e2a8 100644 --- a/test/tests/exporter_test.js +++ b/test/tests/exporter_test.js @@ -65,8 +65,8 @@ function CreateTestModel () function Export (model, format, extension, onReady) { let exporter = new OV.Exporter (); - let exporterModel = new OV.ExporterModel (model); - exporter.Export (exporterModel, format, extension, { + let settings = new OV.ExporterSettings (); + exporter.Export (model, settings, format, extension, { onSuccess : function (files) { onReady (files); } @@ -76,7 +76,8 @@ function Export (model, format, extension, onReady) describe ('Exporter Model', function () { it ('No filter test', function (done) { let model = CreateTestModel (); - let exporterModel = new OV.ExporterModel (model); + let settings = new OV.ExporterSettings (); + let exporterModel = new OV.ExporterModel (model, settings); let meshInstances = []; exporterModel.EnumerateMeshInstances ((meshInstance) => { meshInstances.push (meshInstance); @@ -89,11 +90,12 @@ describe ('Exporter Model', function () { it ('Model filter test', function (done) { let model = CreateTestModel (); - let exporterModel = new OV.ExporterModel (model, { + let settings = new OV.ExporterSettings ({ isMeshVisible : (meshInstanceId) => { return meshInstanceId.IsEqual (new OV.MeshInstanceId (0, 1)); } }); + let exporterModel = new OV.ExporterModel (model, settings); let meshInstances = []; exporterModel.EnumerateMeshInstances ((meshInstance) => { meshInstances.push (meshInstance); @@ -109,8 +111,8 @@ describe ('Exporter', function () { it ('Exporter Error', function (done) { let model = CreateTestModel (); let exporter = new OV.Exporter (); - let exporterModel = new OV.ExporterModel (model); - exporter.Export (exporterModel, OV.FileFormat.Text, 'ext', { + let settings = new OV.ExporterSettings (); + exporter.Export (model, settings, OV.FileFormat.Text, 'ext', { onError : function () { done (); } diff --git a/test/tests/exportimport_test.js b/test/tests/exportimport_test.js index 90ebb03..fa04a72 100644 --- a/test/tests/exportimport_test.js +++ b/test/tests/exportimport_test.js @@ -109,8 +109,8 @@ function CreateTestModel () function ExportImport (model, format, extension, onReady) { let exporter = new OV.Exporter (); - let exporterModel = new OV.ExporterModel (model); - exporter.Export (exporterModel, format, extension, { + let settings = new OV.ExporterSettings (); + exporter.Export (model, settings, format, extension, { onSuccess : function (exportedFiles) { let importer = new OV.Importer (); let settings = new OV.ImportSettings (); diff --git a/website/o3dv/css/controls.css b/website/o3dv/css/controls.css index bb1b93b..bfb2618 100644 --- a/website/o3dv/css/controls.css +++ b/website/o3dv/css/controls.css @@ -132,6 +132,8 @@ select.ov_select { color: var(--ov_dialog_foreground_color); background: var(--ov_dialog_background_color); + font-family: Quicksand, Helvetica, sans-serif; + font-size: 16px; padding: 3px; border: 1px solid var(--ov_border_color); } diff --git a/website/o3dv/css/dialogs.css b/website/o3dv/css/dialogs.css index e38996e..7f77aed 100644 --- a/website/o3dv/css/dialogs.css +++ b/website/o3dv/css/dialogs.css @@ -160,13 +160,14 @@ div.ov_dialog div.ov_dialog_copyable_input div.ov_dialog_copyable_input_button div.ov_dialog div.ov_dialog_row { - padding: 2px 0px; + padding: 3px 0px; overflow: auto; } div.ov_dialog div.ov_dialog_row_name { width: 30%; + margin-top: 4px; float: left; } diff --git a/website/o3dv/js/exportdialog.js b/website/o3dv/js/exportdialog.js index b81405d..ba4006f 100644 --- a/website/o3dv/js/exportdialog.js +++ b/website/o3dv/js/exportdialog.js @@ -34,6 +34,7 @@ OV.ModelExporterUI = class extends OV.ExporterUI super (name); this.format = format; this.extension = extension; + this.visibleOnlyCheckbox = null; } GetType () @@ -41,21 +42,43 @@ OV.ModelExporterUI = class extends OV.ExporterUI return OV.ExportType.Model; } + GenerateParametersUI (parametersDiv) + { + let line = OV.AddDiv (parametersDiv, 'ov_dialog_row'); + this.visibleOnlyCheckbox = OV.AddCheckbox (line, 'export_visible_only', 'Export visible meshes only', true); + } + ExportModel (model, callbacks) { + let visibleOnly = this.visibleOnlyCheckbox.checked; + let settings = new OV.ExporterSettings ({ + isMeshVisible : (meshInstanceId) => { + if (visibleOnly) { + return callbacks.isMeshVisible (meshInstanceId); + } else { + return true; + } + } + }); + + // TODO + // if (exporterModel.MeshInstanceCount () === 0) { + // let errorDialog = OV.ShowMessageDialog ( + // 'Export Failed', + // 'The model doesn\'t contain any meshes.', + // null + // ); + // callbacks.onDialog (errorDialog); + // return; + // } + let progressDialog = new OV.ProgressDialog (); progressDialog.Init ('Exporting Model'); progressDialog.Show (); OV.RunTaskAsync (() => { let exporter = new OV.Exporter (); - let exporterModel = new OV.ExporterModel (model, { - isMeshVisible : (meshInstanceId) => { - // TODO return callbacks.isMeshVisible (meshInstanceId); - return true; - } - }); - exporter.Export (exporterModel, this.format, this.extension, { + exporter.Export (model, settings, this.format, this.extension, { onError : () => { progressDialog.Hide (); }, diff --git a/website/o3dv/js/sharingdialog.js b/website/o3dv/js/sharingdialog.js index e4c537b..50a5a08 100644 --- a/website/o3dv/js/sharingdialog.js +++ b/website/o3dv/js/sharingdialog.js @@ -3,15 +3,8 @@ OV.ShowSharingDialog = function (importer, settings, camera) function AddCheckboxLine (parentDiv, text, id, onChange) { let line = OV.AddDiv (parentDiv, 'ov_dialog_row'); - let label = OV.AddDomElement (line, 'label'); - label.setAttribute ('for', id); - let check = OV.AddDomElement (label, 'input', 'ov_checkbox'); - check.setAttribute ('type', 'checkbox'); - check.setAttribute ('checked', 'true'); - check.setAttribute ('id', id); - OV.AddDomElement (label, 'span', null, text); - check.addEventListener ('change', () => { - onChange (check.checked); + let checkbox = OV.AddCheckbox (line, id, text, true, () => { + onChange (checkbox.checked); }); }