From 04d084368f4b281192610636d7c8a0bd37abd4c6 Mon Sep 17 00:00:00 2001 From: MarblemanQ Date: Thu, 30 Oct 2025 23:56:13 +0000 Subject: [PATCH 1/5] fixing STL parsing via frame --- src/kiri/core/frame.js | 41 +++++++++++++++++++++++++++++++++++++---- src/kiri/run/frame.js | 3 +++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/kiri/core/frame.js b/src/kiri/core/frame.js index 601f5cf63..46d8f231b 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,32 @@ 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.parse; + } + let widget = api.widgets.map()[data.widget_id]; + let vertices = new load.STL().parse(bin); + api.widgets.replace(vertices, widget); + 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/run/frame.js b/src/kiri/run/frame.js index 9830b4369..c0f9b4b99 100644 --- a/src/kiri/run/frame.js +++ b/src/kiri/run/frame.js @@ -51,6 +51,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 }) }, From acf36e9e84a5d30de9fcc1143171c98aaf617e2f Mon Sep 17 00:00:00 2001 From: MarblemanQ Date: Tue, 11 Nov 2025 20:24:08 +0000 Subject: [PATCH 2/5] Fixing issue in duplicate method not cloning full meta object --- src/kiri/core/selection.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); From d4a983a546e4e928c09e8c87a13837d726d77598 Mon Sep 17 00:00:00 2001 From: MarblemanQ Date: Tue, 11 Nov 2025 20:25:12 +0000 Subject: [PATCH 3/5] Fixing cut copy and paste code error --- src/kiri/core/frame.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/kiri/core/frame.js b/src/kiri/core/frame.js index 46d8f231b..57c63b6d5 100644 --- a/src/kiri/core/frame.js +++ b/src/kiri/core/frame.js @@ -121,11 +121,15 @@ window.addEventListener('message', msg => { 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.parse; + bin = data.update; } let widget = api.widgets.map()[data.widget_id]; let vertices = new load.STL().parse(bin); api.widgets.replace(vertices, widget); + //there is an issue with the position of the widget left: + //it jumps 50% to the right and its movement is restricted + //means it is not possible to freely move the widget in the workspace anymore + //duplicating the widget fixes this in a magic way send({event: "updated", data: [ widget.id ]}); break; } From 70732f3b7a05c580fb7f7da121dddba178d0ff10 Mon Sep 17 00:00:00 2001 From: MarblemanQ Date: Tue, 11 Nov 2025 20:39:22 +0000 Subject: [PATCH 4/5] calling widget.center() does the trick here --- src/kiri/core/frame.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/kiri/core/frame.js b/src/kiri/core/frame.js index 57c63b6d5..317c82ee3 100644 --- a/src/kiri/core/frame.js +++ b/src/kiri/core/frame.js @@ -126,10 +126,8 @@ window.addEventListener('message', msg => { let widget = api.widgets.map()[data.widget_id]; let vertices = new load.STL().parse(bin); api.widgets.replace(vertices, widget); - //there is an issue with the position of the widget left: - //it jumps 50% to the right and its movement is restricted - //means it is not possible to freely move the widget in the workspace anymore - //duplicating the widget fixes this in a magic way + //center the widget otherwise it will have odd movement limits: + widget.center(); send({event: "updated", data: [ widget.id ]}); break; } From 8bd3f40668c28dace6bc5ad6387460e7b7501254 Mon Sep 17 00:00:00 2001 From: MarblemanQ Date: Sat, 6 Dec 2025 23:46:45 +0000 Subject: [PATCH 5/5] Changed message eventListener to a named function to prevent it from being added more than once --- src/kiri/run/frame.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/kiri/run/frame.js b/src/kiri/run/frame.js index c0f9b4b99..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,