From 61cf538043a64bbef6d813215ab09d0ea0b06349 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 1 Jan 2021 11:43:35 -0500 Subject: [PATCH] add simple promises-based wrapper to the slicer --- app.js | 1 + src/kiri/engine.js | 128 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/kiri/engine.js diff --git a/app.js b/app.js index ac68d85b..33a09352 100644 --- a/app.js +++ b/app.js @@ -366,6 +366,7 @@ const script = { "kiri/layers", "kiri/widget", "kiri/codec", + "kiri/engine" ].map(p => `src/${p}.js`), meta : [ "ext/three", diff --git a/src/kiri/engine.js b/src/kiri/engine.js new file mode 100644 index 00000000..db058ee5 --- /dev/null +++ b/src/kiri/engine.js @@ -0,0 +1,128 @@ +/** Copyright Stewart Allen -- All Rights Reserved */ + +"use strict"; + +(function() { + +let KIRI = self.kiri = self.kiri || {}; +KIRI.newEngine = ()=> { return new Engine ()}; + +class Engine { + constructor() { + this.widget = KIRI.newWidget(); + this.settings = { + mode: "FDM", + controller: {}, + filter: { FDM: "internal" }, + device: KIRI.conf.defaults.fdm.d, // device profile + process: KIRI.conf.defaults.fdm.p, // slicing settings + widget: { [ this.widget.id ]: {} } + }; + this.listener = () => {}; + } + + load(url) { + return new Promise((accept, reject) => { + try { + new moto.STL().load(url, vertices => { + this.widget.loadVertices(vertices) + accept(this); + }); + } catch (error) { + reject(error); + } + }); + } + + parse(data) { + return new Promise((accept, reject) => { + try { + new moto.STL().parse(data, vertices => { + this.widget.loadVertices(vertices) + accept(this); + }); + } catch (error) { + reject(error); + } + }); + } + + setListener(listener) { + this.listener = listener; + } + + setMode(mode) { + this.settings.mode = mode; + return this; + } + + setDevice(device) { + Object.assign(this.settings.device, device); + return this; + } + + setProcess(process) { + Object.assign(this.settings.process, process); + return this; + } + + moveTo(x, y, z) { + this.widget.move(x, y, z, true); + return this; + } + + move(x, y, z) { + this.widget.move(x, y, z); + return this; + } + + scale(x, y, z) { + this.widget.scale(x, y, z); + return this; + } + + rotate(x, y, z) { + this.widget.rotate(x, y, z); + return this; + } + + slice() { + return new Promise((accept, reject) => { + KIRI.client.slice(this.settings, this.widget, msg => { + this.listener({slice:msg}); + if (msg.error) { + reject(msg.error); + } + if (msg.done) { + accept(this); + } + }); + }); + } + + prepare() { + return new Promise((accept, reject) => { + KIRI.client.prepare(this.settings, update => { + this.listener({prepare:{update}}); + }, done => { + this.listener({prepare:{done:true}}); + accept(this); + }); + }); + } + + export() { + return new Promise((accept, reject) => { + let output = []; + KIRI.client.export(this.settings, segment => { + this.listener({export:{segment}}); + output.push(segment); + }, done => { + this.listener({export:{done}}); + accept(output.join('\r\n')); + }); + }); + } +} + +})();