diff --git a/src/kiri/engine.js b/src/kiri/engine.js index cab57e7e..255aa7cd 100644 --- a/src/kiri/engine.js +++ b/src/kiri/engine.js @@ -44,6 +44,10 @@ class Engine { }); } + clear() { + KIRI.api.platform.clear(); + } + parse(data) { return new Promise((accept, reject) => { try { diff --git a/src/kiri/frame.js b/src/kiri/frame.js index daf21e2b..87b88293 100644 --- a/src/kiri/frame.js +++ b/src/kiri/frame.js @@ -23,7 +23,9 @@ if (efn) { efn(data.data, data.event); } - API.onmessage(data, msg); + if (API.onmessage) { + API.onmessage(data, msg); + } } let API = KIRI.frame = { @@ -46,7 +48,9 @@ load: (load) => { send({ load }) }, - parse: (data) => { send({ parse })}, + clear: () => { send({ clear: true }) }, + + parse: (data, type) => { send({ parse: data, type })}, get: (scope) => { send({ get: scope })}, @@ -58,11 +62,11 @@ setFeatures: (features) => { send({ features })}, - slice: () => { send({ function: "slice" }) }, + slice: () => { send({ function: "slice", callback: true }) }, - prepare: () => { send({ function: "prepare" }) }, + prepare: () => { send({ function: "prepare", callback: true }) }, - export: () => { send({ function: "export" }) }, + export: (cb) => { send({ function: "export", callback: cb ? true : false }) }, onmessage: () => { }, @@ -77,4 +81,6 @@ send({ event }); } }; + + API.on = API.onevent; })(); diff --git a/src/kiri/main.js b/src/kiri/main.js index acdda901..82428303 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -508,7 +508,12 @@ let send = source.window.postMessage; if (data.mode) { API.mode.set(data.mode.toUpperCase()) } if (data.view) { API.view.set(VIEWS[data.view.toUpperCase()]) } - if (data.function) { API.function[data.function.toLowerCase()]() } + if (data.function) { + let cb = data.callback ? (output) => { + send({event:`${data.function}.done`, data: output}); + } : undefined; + API.function[data.function.toLowerCase()](cb); + } if (data.event) { API.event.on(data.event, (evd) => { send({event: data.event, data: evd}); @@ -536,12 +541,39 @@ break; } if (data.parse) { - new load.STL().parse(data.parse, vertices => { - let widget = newWidget().loadVertices(vertices); - platform.add(widget); - }); + let type = (data.type || 'stl').toLowerCase(); + let bin = data.parse; + let widget; + switch (type) { + case 'stl': + if (!bin.buffer) bin = new Float32Array(bin).buffer; + new load.STL().parse(bin, vertices => { + platform.add(widget = newWidget().loadVertices(vertices)); + send({event: "parsed", data: [ widget.id ]}); + }); + break; + case 'obj': + // todo + break; + case '3mf': + // todo + break; + case 'svg': + let wid = []; + for (let svg of LOAD.SVG.parse(bin)) { + if (!(svg && svg.length)) continue; + platform.add(widget = newWidget().loadVertices(svg.toFloat32())); + wid.push(widget.id); + } + send({event: "parsed", data: wid}); + break; + } } - if (data.load) platformLoad(data.load); + if (data.load) { + platformLoad(data.load, (verts, widget) => { + send({event: "loaded", data: [ widget.id ]}); + }) + }; if (data.clear) platform.clear(); if (data.alert) alert2(data.alert, data.time); if (data.progress >= 0) setProgress(data.progress, data.message); diff --git a/web/kiri/frame.html b/web/kiri/frame.html index 88a3db58..80dd85ae 100644 --- a/web/kiri/frame.html +++ b/web/kiri/frame.html @@ -87,7 +87,17 @@ let defc = [ "let api = kiri.frame;", "api.setMode('FDM');", - "api.slice();" + "api.clear();", + "api.load('/obj/cube.stl');", + "api.on('loaded', () => {", + " api.slice();", + "});", + "api.on('slice.done', () => {", + " api.prepare();", + "});", + "api.on('prepare.done', () => {", + " api.export();", + "});" ].join('\n'); let msgs = []; let edit; @@ -135,15 +145,16 @@