diff --git a/src/kiri/core/frame.js b/src/kiri/core/frame.js index 601f5cf63..317c82ee3 100644 --- a/src/kiri/core/frame.js +++ b/src/kiri/core/frame.js @@ -76,12 +76,19 @@ window.addEventListener('message', msg => { let bin = data.parse; let widget; switch ((data.type || 'stl').toLowerCase()) { + case 'ast': //FreeCAD saves STL as ASCII when usint .ast extension case 'stl': + //in case stl is ASCII, this fails: 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 ]}); - }); + //and we must not continue without any data at all, so revert: + if(bin.byteLength == 0) { + bin = data.parse; + } + //arrow function is never called. Traditional works just fine: + let vertices = new load.STL().parse(bin); + platform.add(widget = newWidget().loadVertices(vertices)); + send({event: "parsed", data: [ widget.id ]}); + break; case 'obj': // todo @@ -101,6 +108,34 @@ window.addEventListener('message', msg => { } } + + //uses data.widget_id to update widget from STL + if (data.update) { + + let bin = data.update; + let widget; + switch ((data.type || 'stl').toLowerCase()) { + case 'ast': //FreeCAD saves STL as ASCII when usint .ast extension + case 'stl': + //in case stl is ASCII, this fails: + if (!bin.buffer) bin = new Float32Array(bin).buffer; + //and we must not continue without any data at all, so revert: + if(bin.byteLength == 0) { + bin = data.update; + } + let widget = api.widgets.map()[data.widget_id]; + let vertices = new load.STL().parse(bin); + api.widgets.replace(vertices, widget); + //center the widget otherwise it will have odd movement limits: + widget.center(); + send({event: "updated", data: [ widget.id ]}); + break; + } + } + + + + if (data.load) { platform.load(data.load, (verts, widget) => { send({event: "loaded", data: [ widget.id ]}); diff --git a/src/kiri/core/selection.js b/src/kiri/core/selection.js index f5fb2a91d..415877de8 100644 --- a/src/kiri/core/selection.js +++ b/src/kiri/core/selection.js @@ -138,8 +138,8 @@ function duplicate() { const bb = mesh.getBoundingBox(); const ow = widget; const nw = api.widgets.new().loadGeometry(mesh.geometry.clone()); - nw.meta.file = ow.meta.file; - nw.meta.vertices = ow.meta.vertices; + //meta should be cloned entirely to also copy additional data attached here: + nw.meta = ow.meta; nw.anno = ow.annotations(); nw.move(bb.max.x - bb.min.x + 1, 0, 0); api.platform.add(nw, true); diff --git a/src/kiri/run/frame.js b/src/kiri/run/frame.js index 9830b4369..7cdb8c2ea 100644 --- a/src/kiri/run/frame.js +++ b/src/kiri/run/frame.js @@ -26,6 +26,13 @@ } } + function dispatchMessage(msg) { + let { origin, source, target, data } = msg; + if (source.window === cwin) { + recv(msg); + } + } + let API = KIRI.frame = { setFrame: (io, target) => { let type = typeof(io); @@ -35,12 +42,12 @@ 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); - } - }); + + //changed eventListener to a named function here: + //adding eventListeners with anonymous functions is bad practice + //as it is impossible to prevent them from being more than once! + window.removeEventListener('message', dispatchMessage); + window.addEventListener('message', dispatchMessage); }, send: send, @@ -51,6 +58,9 @@ parse: (data, type) => { send({ parse: data, type })}, + //update widget with id widget_id from STL data: + update: (data, type, widget_id) => { send({ update: data, type, widget_id })}, + get: (scope) => { send({ get: scope })}, setMode: (mode) => { send({ mode }) },