Use a separate model class for export.

This commit is contained in:
kovacsv 2021-12-26 00:40:06 +01:00
parent 233cc2c2d7
commit fe8012e657
22 changed files with 132 additions and 76 deletions

View File

@ -56,6 +56,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -56,6 +56,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -56,6 +56,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -56,6 +56,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -56,6 +56,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -55,6 +55,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -56,6 +56,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -56,6 +56,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -55,6 +55,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -55,6 +55,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -11,23 +11,23 @@ OV.Exporter3dm = class extends OV.ExporterBase
return format === OV.FileFormat.Binary && extension === '3dm'; return format === OV.FileFormat.Binary && extension === '3dm';
} }
ExportContent (model, format, files, onFinish) ExportContent (exporterModel, format, files, onFinish)
{ {
if (this.rhino === null) { if (this.rhino === null) {
OV.LoadExternalLibrary ('loaders/rhino3dm.min.js').then (() => { OV.LoadExternalLibrary ('loaders/rhino3dm.min.js').then (() => {
rhino3dm ().then ((rhino) => { rhino3dm ().then ((rhino) => {
this.rhino = rhino; this.rhino = rhino;
this.ExportRhinoContent (model, files, onFinish); this.ExportRhinoContent (exporterModel, files, onFinish);
}); });
}).catch (() => { }).catch (() => {
onFinish (); onFinish ();
}); });
} else { } else {
this.ExportRhinoContent (model, files, onFinish); this.ExportRhinoContent (exporterModel, files, onFinish);
} }
} }
ExportRhinoContent (model, files, onFinish) ExportRhinoContent (exporterModel, files, onFinish)
{ {
function ColorToRhinoColor (color) function ColorToRhinoColor (color)
{ {
@ -43,7 +43,7 @@ OV.Exporter3dm = class extends OV.ExporterBase
files.push (rhinoFile); files.push (rhinoFile);
let rhinoDoc = new this.rhino.File3dm (); let rhinoDoc = new this.rhino.File3dm ();
model.EnumerateTransformedMeshes ((mesh) => { exporterModel.EnumerateTransformedMeshes ((mesh) => {
let meshBuffer = OV.ConvertMeshToMeshBuffer (mesh); let meshBuffer = OV.ConvertMeshToMeshBuffer (mesh);
for (let primitiveIndex = 0; primitiveIndex < meshBuffer.PrimitiveCount (); primitiveIndex++) { for (let primitiveIndex = 0; primitiveIndex < meshBuffer.PrimitiveCount (); primitiveIndex++) {
let primitive = meshBuffer.GetPrimitive (primitiveIndex); let primitive = meshBuffer.GetPrimitive (primitiveIndex);
@ -68,7 +68,7 @@ OV.Exporter3dm = class extends OV.ExporterBase
} }
}; };
let material = model.GetMaterial (primitive.material); let material = exporterModel.GetMaterial (primitive.material);
let rhinoMaterial = new this.rhino.Material (); let rhinoMaterial = new this.rhino.Material ();
rhinoMaterial.name = this.GetExportedMaterialName (material.name); rhinoMaterial.name = this.GetExportedMaterialName (material.name);
if (material.type === OV.MaterialType.Phong) { if (material.type === OV.MaterialType.Phong) {

View File

@ -54,12 +54,13 @@ OV.ExporterBase = class
Export (model, format, onFinish) Export (model, format, onFinish)
{ {
let files = []; let files = [];
this.ExportContent (model, format, files, () => { let exporterModel = new OV.ExporterModel (model);
this.ExportContent (exporterModel, format, files, () => {
onFinish (files); onFinish (files);
}); });
} }
ExportContent (model, format, files, onFinish) ExportContent (exporterModel, format, files, onFinish)
{ {
} }

View File

@ -20,24 +20,24 @@ OV.ExporterGltf = class extends OV.ExporterBase
return (format === OV.FileFormat.Text && extension === 'gltf') || (format === OV.FileFormat.Binary && extension === 'glb'); return (format === OV.FileFormat.Text && extension === 'gltf') || (format === OV.FileFormat.Binary && extension === 'glb');
} }
ExportContent (model, format, files, onFinish) ExportContent (exporterModel, format, files, onFinish)
{ {
if (format === OV.FileFormat.Text) { if (format === OV.FileFormat.Text) {
this.ExportAsciiContent (model, files); this.ExportAsciiContent (exporterModel, files);
} else if (format === OV.FileFormat.Binary) { } else if (format === OV.FileFormat.Binary) {
this.ExportBinaryContent (model, files); this.ExportBinaryContent (exporterModel, files);
} }
onFinish (); onFinish ();
} }
ExportAsciiContent (model, files) ExportAsciiContent (exporterModel, files)
{ {
let gltfFile = new OV.ExportedFile ('model.gltf'); let gltfFile = new OV.ExportedFile ('model.gltf');
let binFile = new OV.ExportedFile ('model.bin'); let binFile = new OV.ExportedFile ('model.bin');
files.push (gltfFile); files.push (gltfFile);
files.push (binFile); files.push (binFile);
let meshDataArr = this.GetMeshData (model); let meshDataArr = this.GetMeshData (exporterModel);
let mainBuffer = this.GetMainBuffer (meshDataArr); let mainBuffer = this.GetMainBuffer (meshDataArr);
let mainJson = this.GetMainJson (meshDataArr); let mainJson = this.GetMainJson (meshDataArr);
mainJson.buffers.push ({ mainJson.buffers.push ({
@ -46,7 +46,7 @@ OV.ExporterGltf = class extends OV.ExporterBase
}); });
let fileNameToIndex = new Map (); let fileNameToIndex = new Map ();
this.ExportMaterials (model, mainJson, (texture) => { this.ExportMaterials (exporterModel, mainJson, (texture) => {
let fileName = OV.GetFileName (texture.name); let fileName = OV.GetFileName (texture.name);
if (fileNameToIndex.has (fileName)) { if (fileNameToIndex.has (fileName)) {
return fileNameToIndex.get (fileName); return fileNameToIndex.get (fileName);
@ -74,7 +74,7 @@ OV.ExporterGltf = class extends OV.ExporterBase
binFile.SetBufferContent (mainBuffer); binFile.SetBufferContent (mainBuffer);
} }
ExportBinaryContent (model, files) ExportBinaryContent (exporterModel, files)
{ {
function AlignToBoundary (size) function AlignToBoundary (size)
{ {
@ -95,7 +95,7 @@ OV.ExporterGltf = class extends OV.ExporterBase
let glbFile = new OV.ExportedFile ('model.glb'); let glbFile = new OV.ExportedFile ('model.glb');
files.push (glbFile); files.push (glbFile);
let meshDataArr = this.GetMeshData (model); let meshDataArr = this.GetMeshData (exporterModel);
let mainBuffer = this.GetMainBuffer (meshDataArr); let mainBuffer = this.GetMainBuffer (meshDataArr);
let mainJson = this.GetMainJson (meshDataArr); let mainJson = this.GetMainJson (meshDataArr);
@ -103,7 +103,7 @@ OV.ExporterGltf = class extends OV.ExporterBase
let textureOffset = mainBuffer.byteLength; let textureOffset = mainBuffer.byteLength;
let fileNameToIndex = new Map (); let fileNameToIndex = new Map ();
this.ExportMaterials (model, mainJson, (texture) => { this.ExportMaterials (exporterModel, mainJson, (texture) => {
let fileName = OV.GetFileName (texture.name); let fileName = OV.GetFileName (texture.name);
let extension = OV.GetFileExtension (texture.name); let extension = OV.GetFileExtension (texture.name);
if (fileNameToIndex.has (fileName)) { if (fileNameToIndex.has (fileName)) {
@ -172,11 +172,11 @@ OV.ExporterGltf = class extends OV.ExporterBase
glbFile.SetBufferContent (glbWriter.GetBuffer ()); glbFile.SetBufferContent (glbWriter.GetBuffer ());
} }
GetMeshData (model) GetMeshData (exporterModel)
{ {
let meshDataArr = []; let meshDataArr = [];
model.EnumerateTransformedMeshes ((mesh) => { exporterModel.EnumerateTransformedMeshes ((mesh) => {
let buffer = OV.ConvertMeshToMeshBuffer (mesh); let buffer = OV.ConvertMeshToMeshBuffer (mesh);
meshDataArr.push ({ meshDataArr.push ({
name : mesh.GetName (), name : mesh.GetName (),
@ -343,7 +343,7 @@ OV.ExporterGltf = class extends OV.ExporterBase
return mainJson; return mainJson;
} }
ExportMaterials (model, mainJson, addTexture) ExportMaterials (exporterModel, mainJson, addTexture)
{ {
function ExportMaterial (obj, mainJson, material, addTexture) function ExportMaterial (obj, mainJson, material, addTexture)
{ {
@ -447,8 +447,8 @@ OV.ExporterGltf = class extends OV.ExporterBase
mainJson.materials.push (jsonMaterial); mainJson.materials.push (jsonMaterial);
} }
for (let materialIndex = 0; materialIndex < model.MaterialCount (); materialIndex++) { for (let materialIndex = 0; materialIndex < exporterModel.MaterialCount (); materialIndex++) {
let material = model.GetMaterial (materialIndex); let material = exporterModel.GetMaterial (materialIndex);
ExportMaterial (this, mainJson, material, addTexture); ExportMaterial (this, mainJson, material, addTexture);
} }
} }

View File

@ -0,0 +1,66 @@
OV.ExporterModel = class
{
constructor (model)
{
this.model = model;
}
MaterialCount ()
{
return this.model.MaterialCount ();
}
VertexCount ()
{
return this.model.VertexCount ();
}
TriangleCount ()
{
return this.model.TriangleCount ();
}
GetMaterial (index)
{
return this.model.GetMaterial (index);
}
EnumerateMeshInstances (onMeshInstance)
{
this.model.EnumerateMeshInstances (onMeshInstance);
}
EnumerateTransformedMeshes (onMesh)
{
this.EnumerateMeshInstances ((meshInstance) => {
const transformed = meshInstance.GetTransformedMesh ();
onMesh (transformed);
});
}
EnumerateVerticesAndTriangles (callbacks)
{
this.EnumerateMeshInstances ((meshInstance) => {
meshInstance.EnumerateVertices ((vertex) => {
callbacks.onVertex (vertex.x, vertex.y, vertex.z);
});
});
let vertexOffset = 0;
this.model.EnumerateMeshInstances ((meshInstance) => {
meshInstance.EnumerateTriangleVertexIndices ((v0, v1, v2) => {
callbacks.onTriangle (v0 + vertexOffset, v1 + vertexOffset, v2 + vertexOffset);
});
vertexOffset += meshInstance.VertexCount ();
});
}
EnumerateTrianglesWithNormals (onTriangle)
{
this.EnumerateMeshInstances ((meshInstance) => {
meshInstance.EnumerateTriangleVertices ((v0, v1, v2) => {
let normal = OV.CalculateTriangleNormal (v0, v1, v2);
onTriangle (v0, v1, v2, normal);
});
});
}
};

View File

@ -10,7 +10,7 @@ OV.ExporterObj = class extends OV.ExporterBase
return format === OV.FileFormat.Text && extension === 'obj'; return format === OV.FileFormat.Text && extension === 'obj';
} }
ExportContent (model, format, files, onFinish) ExportContent (exporterModel, format, files, onFinish)
{ {
function WriteTexture (mtlWriter, keyword, texture, files) function WriteTexture (mtlWriter, keyword, texture, files)
{ {
@ -38,8 +38,8 @@ OV.ExporterObj = class extends OV.ExporterBase
let mtlWriter = new OV.TextWriter (); let mtlWriter = new OV.TextWriter ();
mtlWriter.WriteLine (this.GetHeaderText ()); mtlWriter.WriteLine (this.GetHeaderText ());
for (let materialIndex = 0; materialIndex < model.MaterialCount (); materialIndex++) { for (let materialIndex = 0; materialIndex < exporterModel.MaterialCount (); materialIndex++) {
let material = model.GetMaterial (materialIndex); let material = exporterModel.GetMaterial (materialIndex);
mtlWriter.WriteArrayLine (['newmtl', this.GetExportedMaterialName (material.name)]); mtlWriter.WriteArrayLine (['newmtl', this.GetExportedMaterialName (material.name)]);
mtlWriter.WriteArrayLine (['Kd', material.color.r / 255.0, material.color.g / 255.0, material.color.b / 255.0]); mtlWriter.WriteArrayLine (['Kd', material.color.r / 255.0, material.color.g / 255.0, material.color.b / 255.0]);
mtlWriter.WriteArrayLine (['d', material.opacity]); mtlWriter.WriteArrayLine (['d', material.opacity]);
@ -63,7 +63,7 @@ OV.ExporterObj = class extends OV.ExporterBase
let normalOffset = 0; let normalOffset = 0;
let uvOffset = 0; let uvOffset = 0;
let usedMaterialName = null; let usedMaterialName = null;
model.EnumerateTransformedMeshes ((mesh) => { exporterModel.EnumerateTransformedMeshes ((mesh) => {
objWriter.WriteArrayLine (['g', this.GetExportedMeshName (mesh.GetName ())]); objWriter.WriteArrayLine (['g', this.GetExportedMeshName (mesh.GetName ())]);
for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) { for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) {
let vertex = mesh.GetVertex (vertexIndex); let vertex = mesh.GetVertex (vertexIndex);
@ -86,7 +86,7 @@ OV.ExporterObj = class extends OV.ExporterBase
let n1 = triangle.n1 + normalOffset + 1; let n1 = triangle.n1 + normalOffset + 1;
let n2 = triangle.n2 + normalOffset + 1; let n2 = triangle.n2 + normalOffset + 1;
if (triangle.mat !== null) { if (triangle.mat !== null) {
let material = model.GetMaterial (triangle.mat); let material = exporterModel.GetMaterial (triangle.mat);
let materialName = this.GetExportedMaterialName (material.name); let materialName = this.GetExportedMaterialName (material.name);
if (materialName !== usedMaterialName) { if (materialName !== usedMaterialName) {
objWriter.WriteArrayLine (['usemtl', materialName]); objWriter.WriteArrayLine (['usemtl', materialName]);

View File

@ -10,16 +10,16 @@ OV.ExporterOff = class extends OV.ExporterBase
return format === OV.FileFormat.Text && extension === 'off'; return format === OV.FileFormat.Text && extension === 'off';
} }
ExportContent (model, format, files, onFinish) ExportContent (exporterModel, format, files, onFinish)
{ {
let offFile = new OV.ExportedFile ('model.off'); let offFile = new OV.ExportedFile ('model.off');
files.push (offFile); files.push (offFile);
let offWriter = new OV.TextWriter (); let offWriter = new OV.TextWriter ();
offWriter.WriteLine ('OFF'); offWriter.WriteLine ('OFF');
offWriter.WriteArrayLine ([model.VertexCount (), model.TriangleCount (), 0]); offWriter.WriteArrayLine ([exporterModel.VertexCount (), exporterModel.TriangleCount (), 0]);
OV.EnumerateModelVerticesAndTriangles (model, { exporterModel.EnumerateVerticesAndTriangles ({
onVertex : function (x, y, z) { onVertex : function (x, y, z) {
offWriter.WriteArrayLine ([x, y, z]); offWriter.WriteArrayLine ([x, y, z]);
}, },

View File

@ -10,29 +10,29 @@ OV.ExporterPly = class extends OV.ExporterBase
return (format === OV.FileFormat.Text || format === OV.FileFormat.Binary) && extension === 'ply'; return (format === OV.FileFormat.Text || format === OV.FileFormat.Binary) && extension === 'ply';
} }
ExportContent (model, format, files, onFinish) ExportContent (exporterModel, format, files, onFinish)
{ {
if (format === OV.FileFormat.Text) { if (format === OV.FileFormat.Text) {
this.ExportText (model, files); this.ExportText (exporterModel, files);
} else { } else {
this.ExportBinary (model, files); this.ExportBinary (exporterModel, files);
} }
onFinish (); onFinish ();
} }
ExportText (model, files) ExportText (exporterModel, files)
{ {
let plyFile = new OV.ExportedFile ('model.ply'); let plyFile = new OV.ExportedFile ('model.ply');
files.push (plyFile); files.push (plyFile);
let plyWriter = new OV.TextWriter (); let plyWriter = new OV.TextWriter ();
let vertexCount = model.VertexCount (); let vertexCount = exporterModel.VertexCount ();
let triangleCount = model.TriangleCount (); let triangleCount = exporterModel.TriangleCount ();
let headerText = this.GetHeaderText ('ascii', vertexCount, triangleCount); let headerText = this.GetHeaderText ('ascii', vertexCount, triangleCount);
plyWriter.Write (headerText); plyWriter.Write (headerText);
OV.EnumerateModelVerticesAndTriangles (model, { exporterModel.EnumerateVerticesAndTriangles ({
onVertex : function (x, y, z) { onVertex : function (x, y, z) {
plyWriter.WriteArrayLine ([x, y, z]); plyWriter.WriteArrayLine ([x, y, z]);
}, },
@ -44,13 +44,13 @@ OV.ExporterPly = class extends OV.ExporterBase
plyFile.SetTextContent (plyWriter.GetText ()); plyFile.SetTextContent (plyWriter.GetText ());
} }
ExportBinary (model, files) ExportBinary (exporterModel, files)
{ {
let plyFile = new OV.ExportedFile ('model.ply'); let plyFile = new OV.ExportedFile ('model.ply');
files.push (plyFile); files.push (plyFile);
let vertexCount = model.VertexCount (); let vertexCount = exporterModel.VertexCount ();
let triangleCount = model.TriangleCount (); let triangleCount = exporterModel.TriangleCount ();
let headerText = this.GetHeaderText ('binary_little_endian', vertexCount, triangleCount); let headerText = this.GetHeaderText ('binary_little_endian', vertexCount, triangleCount);
let fullByteLength = headerText.length + vertexCount * 3 * 4 + triangleCount * (1 + 3 * 4); let fullByteLength = headerText.length + vertexCount * 3 * 4 + triangleCount * (1 + 3 * 4);
@ -60,7 +60,7 @@ OV.ExporterPly = class extends OV.ExporterBase
plyWriter.WriteUnsignedCharacter8 (headerText.charCodeAt (i)); plyWriter.WriteUnsignedCharacter8 (headerText.charCodeAt (i));
} }
OV.EnumerateModelVerticesAndTriangles (model, { exporterModel.EnumerateVerticesAndTriangles ({
onVertex : function (x, y, z) { onVertex : function (x, y, z) {
plyWriter.WriteFloat32 (x); plyWriter.WriteFloat32 (x);
plyWriter.WriteFloat32 (y); plyWriter.WriteFloat32 (y);

View File

@ -10,24 +10,24 @@ OV.ExporterStl = class extends OV.ExporterBase
return (format === OV.FileFormat.Text || format === OV.FileFormat.Binary) && extension === 'stl'; return (format === OV.FileFormat.Text || format === OV.FileFormat.Binary) && extension === 'stl';
} }
ExportContent (model, format, files, onFinish) ExportContent (exporterModel, format, files, onFinish)
{ {
if (format === OV.FileFormat.Text) { if (format === OV.FileFormat.Text) {
this.ExportText (model, files); this.ExportText (exporterModel, files);
} else { } else {
this.ExportBinary (model, files); this.ExportBinary (exporterModel, files);
} }
onFinish (); onFinish ();
} }
ExportText (model, files) ExportText (exporterModel, files)
{ {
let stlFile = new OV.ExportedFile ('model.stl'); let stlFile = new OV.ExportedFile ('model.stl');
files.push (stlFile); files.push (stlFile);
let stlWriter = new OV.TextWriter (); let stlWriter = new OV.TextWriter ();
stlWriter.WriteLine ('solid Model'); stlWriter.WriteLine ('solid Model');
OV.EnumerateTrianglesWithNormals (model, (v0, v1, v2, normal) => { exporterModel.EnumerateTrianglesWithNormals ((v0, v1, v2, normal) => {
stlWriter.WriteArrayLine (['facet', 'normal', normal.x, normal.y, normal.z]); stlWriter.WriteArrayLine (['facet', 'normal', normal.x, normal.y, normal.z]);
stlWriter.Indent (1); stlWriter.Indent (1);
stlWriter.WriteLine ('outer loop'); stlWriter.WriteLine ('outer loop');
@ -45,12 +45,12 @@ OV.ExporterStl = class extends OV.ExporterBase
stlFile.SetTextContent (stlWriter.GetText ()); stlFile.SetTextContent (stlWriter.GetText ());
} }
ExportBinary (model, files) ExportBinary (exporterModel, files)
{ {
let stlFile = new OV.ExportedFile ('model.stl'); let stlFile = new OV.ExportedFile ('model.stl');
files.push (stlFile); files.push (stlFile);
let triangleCount = model.TriangleCount (); let triangleCount = exporterModel.TriangleCount ();
let headerSize = 80; let headerSize = 80;
let fullByteLength = headerSize + 4 + triangleCount * 50; let fullByteLength = headerSize + 4 + triangleCount * 50;
let stlWriter = new OV.BinaryWriter (fullByteLength, true); let stlWriter = new OV.BinaryWriter (fullByteLength, true);
@ -60,7 +60,7 @@ OV.ExporterStl = class extends OV.ExporterBase
} }
stlWriter.WriteUnsignedInteger32 (triangleCount); stlWriter.WriteUnsignedInteger32 (triangleCount);
OV.EnumerateTrianglesWithNormals (model, (v0, v1, v2, normal) => { exporterModel.EnumerateTrianglesWithNormals ((v0, v1, v2, normal) => {
stlWriter.WriteFloat32 (normal.x); stlWriter.WriteFloat32 (normal.x);
stlWriter.WriteFloat32 (normal.y); stlWriter.WriteFloat32 (normal.y);
stlWriter.WriteFloat32 (normal.z); stlWriter.WriteFloat32 (normal.z);

View File

@ -85,30 +85,6 @@ OV.CloneMesh = function (mesh)
return cloned; return cloned;
}; };
OV.EnumerateModelVerticesAndTriangles = function (model, callbacks)
{
model.EnumerateMeshInstances ((meshInstance) => {
meshInstance.EnumerateVertices ((vertex) => {
callbacks.onVertex (vertex.x, vertex.y, vertex.z);
});
});
let vertexOffset = 0;
model.EnumerateMeshInstances ((meshInstance) => {
meshInstance.EnumerateTriangleVertexIndices ((v0, v1, v2) => {
callbacks.onTriangle (v0 + vertexOffset, v1 + vertexOffset, v2 + vertexOffset);
});
vertexOffset += meshInstance.VertexCount ();
});
};
OV.EnumerateTrianglesWithNormals = function (object3D, onTriangle)
{
object3D.EnumerateTriangleVertices ((v0, v1, v2) => {
let normal = OV.CalculateTriangleNormal (v0, v1, v2);
onTriangle (v0, v1, v2, normal);
});
};
OV.GetBoundingBox = function (object3D) OV.GetBoundingBox = function (object3D)
{ {
let calculator = new OV.BoundingBoxCalculator3D (); let calculator = new OV.BoundingBoxCalculator3D ();

View File

@ -46,6 +46,7 @@
"source/import/importerifc.js", "source/import/importerifc.js",
"source/import/filelist.js", "source/import/filelist.js",
"source/import/importer.js", "source/import/importer.js",
"source/export/exportermodel.js",
"source/export/exporterbase.js", "source/export/exporterbase.js",
"source/export/exporterobj.js", "source/export/exporterobj.js",
"source/export/exporterstl.js", "source/export/exporterstl.js",

View File

@ -62,6 +62,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>

View File

@ -64,6 +64,7 @@
<script type="text/javascript" src="../source/import/importerifc.js"></script> <script type="text/javascript" src="../source/import/importerifc.js"></script>
<script type="text/javascript" src="../source/import/filelist.js"></script> <script type="text/javascript" src="../source/import/filelist.js"></script>
<script type="text/javascript" src="../source/import/importer.js"></script> <script type="text/javascript" src="../source/import/importer.js"></script>
<script type="text/javascript" src="../source/export/exportermodel.js"></script>
<script type="text/javascript" src="../source/export/exporterbase.js"></script> <script type="text/javascript" src="../source/export/exporterbase.js"></script>
<script type="text/javascript" src="../source/export/exporterobj.js"></script> <script type="text/javascript" src="../source/export/exporterobj.js"></script>
<script type="text/javascript" src="../source/export/exporterstl.js"></script> <script type="text/javascript" src="../source/export/exporterstl.js"></script>