Export only the visible meshes #169
This commit is contained in:
parent
4e7d10b3b7
commit
93358e2cd0
@ -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 ();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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 ();
|
||||
}
|
||||
|
||||
@ -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 ();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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 ();
|
||||
},
|
||||
|
||||
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user