From 5fe11ef05a7d256365d4eb9183bde28ece5ee841 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 4 Jan 2021 20:36:35 -0500 Subject: [PATCH] add frame message objec wrapper / helper that looks like engine api --- app.js | 4 +++ src/kiri/frame.js | 80 +++++++++++++++++++++++++++++++++++++++++++++ src/kiri/main.js | 15 +++++++-- web/kiri/frame.html | 37 ++++++++++++--------- 4 files changed, 118 insertions(+), 18 deletions(-) create mode 100644 src/kiri/frame.js diff --git a/app.js b/app.js index 33a09352..e746a517 100644 --- a/app.js +++ b/app.js @@ -368,6 +368,9 @@ const script = { "kiri/codec", "kiri/engine" ].map(p => `src/${p}.js`), + frame : [ + "kiri/frame" + ].map(p => `src/${p}.js`), meta : [ "ext/three", "license", @@ -709,6 +712,7 @@ function prepareScripts() { code.kiri = concatCode(script.kiri); code.worker = concatCode(script.worker); code.engine = concatCode(script.engine); + code.frame = concatCode(script.frame); } function concatCode(array) { diff --git a/src/kiri/frame.js b/src/kiri/frame.js new file mode 100644 index 00000000..daf21e2b --- /dev/null +++ b/src/kiri/frame.js @@ -0,0 +1,80 @@ +/** Copyright Stewart Allen -- All Rights Reserved */ + +"use strict"; + +(function() { + let KIRI = self.kiri = self.kiri || {}; + let frame, cwin, onevent = {}; + + function $(id) { return document.getElementById(id) } + + function setFrame(fo) { + frame = fo; + cwin = fo.contentWindow; + } + + function send(msg) { + cwin.postMessage(msg); + } + + function recv(msg) { + let { origin, source, target, data } = msg; + let efn = onevent[data.event]; + if (efn) { + efn(data.data, data.event); + } + API.onmessage(data, msg); + } + + let API = KIRI.frame = { + setFrame: (io) => { + let type = typeof(io); + switch (type) { + case 'string': setFrame($(io)); break; + case 'object': setFrame(io); break; + default: throw `invalid frame type ${type}`; + } + window.addEventListener('message', msg => { + let { origin, source, target, data } = msg; + if (source.window === cwin) { + recv(msg); + } + }); + }, + + send: send, + + load: (load) => { send({ load }) }, + + parse: (data) => { send({ parse })}, + + get: (scope) => { send({ get: scope })}, + + setMode: (mode) => { send({ mode }) }, + + setDevice: (device) => { send({ device })}, + + setProcess: (process) => { send({ process })}, + + setFeatures: (features) => { send({ features })}, + + slice: () => { send({ function: "slice" }) }, + + prepare: () => { send({ function: "prepare" }) }, + + export: () => { send({ function: "export" }) }, + + onmessage: () => { }, + + progress: (progress, message) => { send({ progress, message }) }, + + alert: (alert, time) => { send({ alert, time }) }, + + emit: (emit, message) => { send({ emit, message }) }, + + onevent: (event, fn) => { + onevent[event] = fn; + send({ event }); + } + }; +})(); diff --git a/src/kiri/main.js b/src/kiri/main.js index be098cdf..fcaac781 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -405,13 +405,14 @@ }); } if (data.emit) API.event.emit(data.emit, data.message) - switch (data.get) { - case "all": send({all: settings}); break; + if (data.get) switch (data.get) { case "mode": send({mode: settings.mode}); break; case "device": send({device: settings.device}); break; case "process": send({process: settings.process}); break; + default: send({all: settings}); break; + } - switch (data.set) { + if (data.set) switch (data.set) { case "features": Object.assign(feature, data.features); break; @@ -424,6 +425,14 @@ saveSettings(); break; } + if (data.parse) { + new moto.STL().parse(data.parse, vertices => { + let widget = newWidget().loadVertices(vertices); + platform.add(widget); + }); + } + if (data.load) platformLoad(data.load); + 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 a26014d7..d42cfa87 100644 --- a/web/kiri/frame.html +++ b/web/kiri/frame.html @@ -82,8 +82,13 @@ } - + @@ -115,9 +121,9 @@

Kiri:Moto Frame Message API

-
message
+
code
-
+
output
@@ -127,20 +133,21 @@
-

Message API

+

Frame Message API

  • - where URL points to an STL
  • - where data is a string or binary STL
  • +
  • - id or object of iframe with Kiri:Moto loaded
  • - FDM, CAM, LASER, SLA
  • -
  • - function to receive engine progress messages
  • - change default object parameters
  • - change default process parameters
  • -
  • - absolute move origin of loaded object
  • -
  • - relative move origin of loaded object
  • -
  • - scale axes of loaded object
  • -
  • - rotate axes of loaded object in radians
  • - async slice loaded object
  • - async path routing of slice data
  • - async gcode generation from path routing
  • +
  • - function to receive all messages
  • +
  • - function to receive named messages
  • +
  • - send named event with data
  • +
  • - show alert message with optional time in seconds
  • +
  • - set progress bar (0-1) with optional message