From d648c2948a45cc705f465e2113b0f2c532ed29f0 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 29 Nov 2021 20:11:27 -0500 Subject: [PATCH] lift widget duplicate into api and delegate annotations to mode client --- src/kiri/init.js | 20 +------------------- src/kiri/main.js | 16 ++++++++++++++++ src/mode/cam/client.js | 19 +++++++++++++++++++ src/mode/fdm/client.js | 13 +++++++++++++ 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index c88a6fcb..95094f8c 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -517,25 +517,7 @@ } function duplicateSelection() { - API.selection.for_widgets(function(widget) { - let mesh = widget.mesh; - let bb = mesh.getBoundingBox(); - let ow = widget; - let nw = API.widgets.new().loadGeometry(mesh.geometry.clone()); - nw.meta.file = ow.meta.file; - nw.meta.vertices = ow.meta.vertices; - nw.move(bb.max.x - bb.min.x + 1, 0, 0); - platform.add(nw,true); - let owa = API.widgets.annotate(ow.id); - let nwa = API.widgets.annotate(nw.id); - if (owa.tab) { - nwa.tab = Object.clone(owa.tab); - nwa.tab.forEach((tab,i) => { - tab.id = Date.now() + i - }); - } - KIRI.driver.CAM.restoreTabs([nw]); - }); + API.selection.duplicate(); } function mirrorSelection() { diff --git a/src/kiri/main.js b/src/kiri/main.js index f6ead6db..c82ff6bc 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -88,6 +88,7 @@ scale: scaleSelection, rotate: rotateSelection, mirror: mirrorSelection, + duplicate: duplicateSelection, meshes: function() { return selectedMeshes.slice() }, widgets: function(orall) { let sel = selectedMeshes.slice().map(m => m.widget); @@ -1643,6 +1644,21 @@ SPACE.update(); } + function duplicateSelection() { + API.selection.for_widgets(function(widget) { + let mesh = widget.mesh; + let bb = mesh.getBoundingBox(); + let ow = widget; + let nw = API.widgets.new().loadGeometry(mesh.geometry.clone()); + nw.meta.file = ow.meta.file; + nw.meta.vertices = ow.meta.vertices; + nw.move(bb.max.x - bb.min.x + 1, 0, 0); + platform.add(nw,true); + nw.anno = ow.annotations(); + API.event.emit("widget.duplicate", nw, ow); + }); + } + function mirrorSelection() { API.selection.for_widgets(function(widget) { widget.mirror(); diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 6febf216..ea3178b6 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -733,6 +733,25 @@ func.traceClear(); } }); + api.event.on("widget.duplicate", (widget, oldwidget) => { + if (!isCamMode) { + return; + } + if (traceOn) { + func.traceDone(); + } + unselectTraces(widget); + if (flipping) { + return; + } + let ann = API.widgets.annotate(widget.id); + if (ann.tab) { + ann.tab.forEach((tab,i) => { + tab.id = Date.now() + i; + }); + restoreTabs([widget]); + } + }); api.event.on("widget.mirror", widget => { if (!isCamMode) { return; diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index eeaecd92..9f82da83 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -322,6 +322,18 @@ return; } }); + api.event.on("widget.duplicate", (widget, oldwidget) => { + if (!isFdmMode) { + return; + } + let ann = API.widgets.annotate(widget.id); + if (ann.support) { + for (let supp of Object.values(ann.support)) { + supp.id = Math.abs(Math.random() * 0xffffffffffff); + } + restoreSupports([widget]); + } + }); api.event.on("widget.mirror", widget => { if (!isFdmMode) { return; @@ -670,5 +682,6 @@ FDM.delbox = delbox; FDM.addbox = addbox; + FDM.restoreSupports = restoreSupports; })();