bump rev 3.0.D18 -- add basic 3MF support
This commit is contained in:
parent
94b85351c2
commit
c37c627622
6 changed files with 119 additions and 4 deletions
2
app.js
2
app.js
|
|
@ -221,6 +221,7 @@ const script = {
|
||||||
"kiri",
|
"kiri",
|
||||||
"ext/three",
|
"ext/three",
|
||||||
"ext/three-bgu",
|
"ext/three-bgu",
|
||||||
|
"ext/jszip",
|
||||||
"license",
|
"license",
|
||||||
"ext/clip2", // work.test
|
"ext/clip2", // work.test
|
||||||
"ext/tween",
|
"ext/tween",
|
||||||
|
|
@ -244,6 +245,7 @@ const script = {
|
||||||
"moto/ctrl",
|
"moto/ctrl",
|
||||||
"moto/pack",
|
"moto/pack",
|
||||||
"moto/space",
|
"moto/space",
|
||||||
|
"moto/load-3mf",
|
||||||
"moto/load-obj",
|
"moto/load-obj",
|
||||||
"moto/load-stl",
|
"moto/load-stl",
|
||||||
"moto/db",
|
"moto/db",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "grid-apps",
|
"name": "grid-apps",
|
||||||
"version": "3.0.17D",
|
"version": "3.0.18D",
|
||||||
"description": "grid.space 3d slice & modeling tools",
|
"description": "grid.space 3d slice & modeling tools",
|
||||||
"author": "Stewart Allen <sa@grid.space>",
|
"author": "Stewart Allen <sa@grid.space>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
if (!self.kiri) {
|
if (!self.kiri) {
|
||||||
self.kiri = {
|
self.kiri = {
|
||||||
beta: 3017,
|
beta: 3018,
|
||||||
driver: {}, // driver modules
|
driver: {}, // driver modules
|
||||||
loader: [] // module loading: array of functions
|
loader: [] // module loading: array of functions
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2433,6 +2433,7 @@ console.log/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
||||||
israw = lower.indexOf(".raw") > 0 || lower.indexOf('.') < 0,
|
israw = lower.indexOf(".raw") > 0 || lower.indexOf('.') < 0,
|
||||||
isstl = lower.indexOf(".stl") > 0,
|
isstl = lower.indexOf(".stl") > 0,
|
||||||
isobj = lower.indexOf(".obj") > 0,
|
isobj = lower.indexOf(".obj") > 0,
|
||||||
|
is3mf = lower.indexOf(".3mf") > 0,
|
||||||
issvg = lower.indexOf(".svg") > 0,
|
issvg = lower.indexOf(".svg") > 0,
|
||||||
ispng = lower.indexOf(".png") > 0,
|
ispng = lower.indexOf(".png") > 0,
|
||||||
isjpg = lower.indexOf(".jpg") > 0,
|
isjpg = lower.indexOf(".jpg") > 0,
|
||||||
|
|
@ -2454,7 +2455,8 @@ console.log/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
||||||
.saveToCatalog(e.target.file.name)
|
.saveToCatalog(e.target.file.name)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if (isobj) {
|
}
|
||||||
|
else if (isobj) {
|
||||||
let objs = MOTO.OBJ.parse(e.target.result);
|
let objs = MOTO.OBJ.parse(e.target.result);
|
||||||
let odon = function() {
|
let odon = function() {
|
||||||
for (let obj of objs) {
|
for (let obj of objs) {
|
||||||
|
|
@ -2480,6 +2482,18 @@ console.log/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
||||||
odon();
|
odon();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (is3mf) {
|
||||||
|
MOTO.TMF.parse(e.target.result).then(models => {
|
||||||
|
console.log({models});
|
||||||
|
for (let model of models) {
|
||||||
|
platform.add(
|
||||||
|
newWidget(undefined,group)
|
||||||
|
.loadVertices(model.faces.toFloat32())
|
||||||
|
.saveToCatalog(name)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
else if (isgcode) loadCode(e.target.result, 'gcode');
|
else if (isgcode) loadCode(e.target.result, 'gcode');
|
||||||
else if (issvg) loadCode(e.target.result, 'svg');
|
else if (issvg) loadCode(e.target.result, 'svg');
|
||||||
else if (isset) settingsImport(e.target.result, true);
|
else if (isset) settingsImport(e.target.result, true);
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
let terms = {
|
let terms = {
|
||||||
COPYRIGHT: "Copyright (C) Stewart Allen <sa@grid.space> - All Rights Reserved",
|
COPYRIGHT: "Copyright (C) Stewart Allen <sa@grid.space> - All Rights Reserved",
|
||||||
LICENSE: "See the license.md file included with the source distribution",
|
LICENSE: "See the license.md file included with the source distribution",
|
||||||
VERSION: "3.0.D17"
|
VERSION: "3.0.D18"
|
||||||
};
|
};
|
||||||
|
|
||||||
if (typeof(module) === 'object') {
|
if (typeof(module) === 'object') {
|
||||||
|
|
|
||||||
99
src/moto/load-3mf.js
Normal file
99
src/moto/load-3mf.js
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
if (!self.moto) self.moto = {};
|
||||||
|
if (self.moto.OBJ) return;
|
||||||
|
|
||||||
|
self.moto.TMF = {
|
||||||
|
parse : parse
|
||||||
|
};
|
||||||
|
|
||||||
|
function query(node, path, fn) {
|
||||||
|
let collect = false;
|
||||||
|
let match = path[0];
|
||||||
|
if (match[0] === '+') {
|
||||||
|
match = match.slice(1);
|
||||||
|
collect = true;
|
||||||
|
}
|
||||||
|
for (let child of [...node.childNodes]) {
|
||||||
|
if (child.tagName === match) {
|
||||||
|
if (collect) {
|
||||||
|
fn(match, child);
|
||||||
|
}
|
||||||
|
if (path.length > 1) {
|
||||||
|
query(child, path.slice(1), fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadModel(doc) {
|
||||||
|
let models = [];
|
||||||
|
|
||||||
|
function emitModel(model, faces) {
|
||||||
|
models.push({model, faces});
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let model;
|
||||||
|
let faces;
|
||||||
|
|
||||||
|
query(doc, ["+model","resources","object","+mesh"], (type, node) => {
|
||||||
|
console.log({type, node});
|
||||||
|
switch (type) {
|
||||||
|
case "model":
|
||||||
|
if (model) {
|
||||||
|
emitModel(mode, faces);
|
||||||
|
}
|
||||||
|
model = node;
|
||||||
|
faces = [];
|
||||||
|
break;
|
||||||
|
case "mesh":
|
||||||
|
let vertices = [];
|
||||||
|
query(node, ["vertices","+vertex"], (type, vertex) => {
|
||||||
|
vertices.push([
|
||||||
|
parseFloat(vertex.getAttribute("x")),
|
||||||
|
parseFloat(vertex.getAttribute("y")),
|
||||||
|
parseFloat(vertex.getAttribute("z"))
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
query(node, ["triangles","+triangle"], (type, triangle) => {
|
||||||
|
let v1 = parseInt(triangle.getAttribute("v1"));
|
||||||
|
let v2 = parseInt(triangle.getAttribute("v2"));
|
||||||
|
let v3 = parseInt(triangle.getAttribute("v3"));
|
||||||
|
faces.appendAll(vertices[v1]);
|
||||||
|
faces.appendAll(vertices[v2]);
|
||||||
|
faces.appendAll(vertices[v3]);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (model) {
|
||||||
|
emitModel(model, faces);
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(models);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} data binary file
|
||||||
|
* @returns {Array} vertex face array
|
||||||
|
*/
|
||||||
|
function parse(data) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
JSZip.loadAsync(data).then(zip => {
|
||||||
|
for (let [key,value] of Object.entries(zip.files)) {
|
||||||
|
if (key.indexOf(".model") > 0) {
|
||||||
|
value.async("string").then(xml => {
|
||||||
|
resolve(loadModel(new DOMParser().parseFromString(xml, "text/xml")));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
||||||
Loading…
Reference in a new issue