195 lines
4.6 KiB
JavaScript
195 lines
4.6 KiB
JavaScript
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
|
|
|
"use strict";
|
|
|
|
// dep: moto.license
|
|
// dep: load.stl
|
|
// dep: kiri.conf
|
|
// dep: kiri.client
|
|
// dep: kiri.widget
|
|
// use: add.three
|
|
// use: add.array
|
|
gapp.register("kiri-run.engine", [], (root, exports) => {
|
|
|
|
const { kiri } = root;
|
|
|
|
class Engine {
|
|
constructor() {
|
|
this.widget = kiri.newWidget();
|
|
this.settings = {
|
|
mode: "FDM",
|
|
controller: {},
|
|
render: false,
|
|
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 load.STL().load(url, vertices => {
|
|
this.listener({loaded: url, vertices});
|
|
this.widget.loadVertices(vertices).center();
|
|
accept(this);
|
|
});
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
});
|
|
}
|
|
|
|
clear() {
|
|
kiri.api.platform.clear();
|
|
}
|
|
|
|
parse(data) {
|
|
return new Promise((accept, reject) => {
|
|
try {
|
|
let vertices = new load.STL().parse(data);
|
|
this.listener({parsed: data, vertices});
|
|
this.widget.loadVertices(vertices).center();
|
|
accept(this);
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
});
|
|
}
|
|
|
|
setListener(listener) {
|
|
this.listener = listener;
|
|
return this;
|
|
}
|
|
|
|
setRender(bool) {
|
|
this.settings.render = bool;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the mode of the engine. Valid modes are:
|
|
* @param {"FDM"|"CAM"|"LASER"|"SLA"} mode - the mode to set
|
|
* @returns {Engine} this
|
|
*/
|
|
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;
|
|
}
|
|
|
|
setController(controller) {
|
|
let ctrl = this.settings.controller;
|
|
Object.assign(ctrl, controller);
|
|
if (ctrl.threaded) {
|
|
kiri.client.pool.start();
|
|
} else {
|
|
kiri.client.pool.stop();
|
|
}
|
|
return this;
|
|
}
|
|
|
|
setTools(tools) {
|
|
this.settings.tools = tools;
|
|
return this;
|
|
}
|
|
|
|
setStock(stock) {
|
|
let { settings } = this;
|
|
let { process } = settings;
|
|
settings.stock = stock;
|
|
process.camStockX = stock.x;
|
|
process.camStockY = stock.y;
|
|
process.camStockZ = stock.z;
|
|
return this;
|
|
}
|
|
|
|
setOrigin(x, y, z) {
|
|
this.settings.origin = { x, y, z };
|
|
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.clear();
|
|
kiri.client.sync([ this.widget ]);
|
|
kiri.client.rotate(this.settings);
|
|
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 => {
|
|
if (typeof segment === 'string') {
|
|
this.listener({export:{segment}});
|
|
output.push(segment);
|
|
}
|
|
}, done => {
|
|
this.listener({export:{done}});
|
|
accept(output.join('\r\n'));
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
function newEngine() {
|
|
return new Engine();
|
|
}
|
|
|
|
gapp.overlay(kiri, {
|
|
newEngine
|
|
});
|
|
|
|
});
|