grid-apps-cmms/src2/kiri/frame.js
2025-07-04 22:18:48 -04:00

129 lines
3.5 KiB
JavaScript

/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import { load } from '../load.js';
import { kiri } from './kiri.js';
import { moto } from '../moto.js';
import { api } from './api.js';
import { newWidget } from './widget.js';
import { conf, event, feature, platform, settings, show } from './api.js';
import { VIEWS } from './consts.js';
// add frame message api listener
window.addEventListener('message', msg => {
const { load, kiri, moto } = self;
const { api, newWidget } = kiri;
const { conf, event, feature, platform, settings, show } = api;
if (!feature.frame) return;
const { origin, source, target, data } = msg;
if (source.window === target.window) return;
const 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) {
const cb = data.callback ? (output) => {
send({event:`${data.function}.done`, data: output});
} : undefined;
api.function[data.function.toLowerCase()](cb);
}
if (data.event) {
event.on(data.event, (evd) => {
send({event: data.event, data: evd});
});
}
if (data.emit) {
event.emit(data.emit, data.message)
}
if (data.get) switch (data.get) {
case "mode": send({mode: settings.mode()}); break;
case "device": send({device: settings.dev()}); break;
case "process": send({process: settings.proc()}); break;
default: send({all: settings}); break;
}
if (data.features) {
Object.assign(feature, data.features);
api.show.controls(api.feature.controls);
}
if (data.device) {
Object.assign(settings.dev(), data.device);
conf.save();
}
if (data.process){
Object.assign(settings.proc(), data.process);
conf.save();
}
if (data.controller){
let ctrl = settings.ctrl();
Object.assign(ctrl, data.controller);
api.event.emit("set.threaded", ctrl.threaded);
conf.save();
}
if (data.parse) {
let bin = data.parse;
let widget;
switch ((data.type || 'stl').toLowerCase()) {
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) {
platform.load(data.load, (verts, widget) => {
send({event: "loaded", data: [ widget.id ]});
})
};
if (data.clear) {
platform.clear();
}
if (data.alert) {
show.alert(data.alert, data.time);
}
if (data.progress >= 0) {
show.progress(data.progress, data.message);
}
});
// No direct exports; sets up message listener