grid-apps-cmms/src/kiri/run/engine.js

196 lines
4.8 KiB
JavaScript
Raw Normal View History

/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import '../../add/array.js';
import '../../add/class.js';
import '../../add/three.js';
import { api } from '../core/api.js';
import { conf } from '../core/conf.js';
import { client } from '../core/client.js';
import { load } from '../../load/file.js';
import { newWidget } from '../core/widget.js';
class Engine {
constructor() {
2025-07-09 01:18:29 -04:00
this.widget = newWidget();
this.settings = {
mode: "FDM",
controller: {},
2021-01-01 12:40:18 -05:00
render: false,
filter: { FDM: "internal" },
2025-07-09 01:18:29 -04:00
device: conf.defaults.fdm.d, // device profile
process: conf.defaults.fdm.p, // slicing settings
widget: { [this.widget.id]: {} }
};
2025-07-09 01:18:29 -04:00
this.listener = () => { };
client.start();
}
load(url) {
return new Promise((accept, reject) => {
try {
new load.STL().load(url, vertices => {
2025-07-09 01:18:29 -04:00
this.listener({ loaded: url, vertices });
2021-02-11 22:12:49 -05:00
this.widget.loadVertices(vertices).center();
accept(this);
});
} catch (error) {
reject(error);
}
});
}
clear() {
2025-07-09 01:18:29 -04:00
api.platform.clear();
}
parse(data) {
return new Promise((accept, reject) => {
try {
let vertices = new load.STL().parse(data);
2025-07-09 01:18:29 -04:00
this.listener({ parsed: data, vertices });
2021-03-10 10:01:49 -05:00
this.widget.loadVertices(vertices).center();
accept(this);
} catch (error) {
reject(error);
}
});
}
setThreading(bool) {
if (bool) {
client.pool.start();
} else {
client.pool.stop();
}
}
setListener(listener) {
this.listener = listener;
2021-01-01 15:50:07 -05:00
return this;
}
2021-01-01 12:40:18 -05:00
setRender(bool) {
this.settings.render = bool;
return this;
}
2025-05-16 10:08:22 -06:00
/**
* 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) {
2025-07-09 01:18:29 -04:00
client.pool.start();
} else {
2025-07-09 01:18:29 -04:00
client.pool.stop();
}
return this;
}
setTools(tools) {
this.settings.tools = tools;
return this;
}
setStock(stock) {
2025-06-24 13:40:31 -04:00
let { settings } = this;
let { process } = settings;
settings.stock = stock;
process.camStockX = stock.x;
process.camStockY = stock.y;
process.camStockZ = stock.z;
return this;
}
2025-06-24 13:40:31 -04:00
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) => {
2025-07-09 01:18:29 -04:00
client.clear();
client.sync([this.widget]);
client.rotate(this.settings);
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) => {
2025-07-09 01:18:29 -04:00
client.prepare(this.settings, update => {
this.listener({ prepare: { update } });
}, done => {
2025-07-09 01:18:29 -04:00
this.listener({ prepare: { done: true } });
accept(this);
});
});
}
export() {
return new Promise((accept, reject) => {
let output = [];
2025-07-09 01:18:29 -04:00
client.export(this.settings, segment => {
if (typeof segment === 'string') {
2025-07-09 01:18:29 -04:00
this.listener({ export: { segment } });
output.push(segment);
}
}, done => {
2025-07-09 01:18:29 -04:00
this.listener({ export: { done } });
accept(output.join('\r\n'));
});
});
}
}
2025-07-09 01:18:29 -04:00
export function newEngine() {
2022-02-22 11:32:35 -05:00
return new Engine();
}
export { Engine };