From e0d449af50efa2218467fe99a2b366ce3735a8a8 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Jul 2024 18:41:32 -0400 Subject: [PATCH] add sketch item/group flip h/v and centering --- src/geo/bounds.js | 2 +- src/geo/polygon.js | 10 ++++++++++ src/mesh/api.js | 43 +++++++++++++++++++++++++++++++++++++++++++ src/mesh/build.js | 5 +++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/geo/bounds.js b/src/geo/bounds.js index 2212f53e..3af6ef10 100644 --- a/src/geo/bounds.js +++ b/src/geo/bounds.js @@ -120,7 +120,7 @@ class Bounds { return this.maxy - this.miny; } - center(z) { + center(z = 0) { return base.newPoint(this.centerx(), this.centery(), z); } diff --git a/src/geo/polygon.js b/src/geo/polygon.js index c2583f6e..c6988b17 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -567,6 +567,16 @@ class Polygon { return this.points[this.length - 1]; } + flip(axis) { + for (let p of this.points) { + p[axis] = -p[axis]; + } + for (let i of this.inner || []) { + i.flip(axis); + } + return this; + } + swap(x, y) { this._bounds = undefined; if (x) { diff --git a/src/mesh/api.js b/src/mesh/api.js index d61e3afb..bb002718 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -480,6 +480,12 @@ let sketch = { }, arrange: { + ifcan(fn, count = 1) { + let one = sketch.selection.one; + let items = one?.items.filter(i => i.selected); + (items.length >= count) && fn(one, items); + }, + group() { let one = sketch.selection.one; let items = one?.items.filter(i => i.selected); @@ -490,6 +496,25 @@ let sketch = { } }, + center() { + sketch.arrange.ifcan((sketch, items) => { + let bounds; + let recs = []; + items.filter(i => i.type === 'polygon').forEach(item => { + let poly = newPolygon().fromObject(item); + let bnds = poly.bounds; + bounds = (bounds ? bounds.merge(bnds) : bnds); + recs.push({ item, poly }); + }); + let center = bounds.center(0); + for (let rec of recs) { + rec.poly.move({ x: -center.x, y: -center.y, z:0 }); + Object.assign(rec.item, rec.poly.toObject()); + } + sketch.render(); + }); + }, + ungroup() { let one = sketch.selection.one; let items = one?.items.filter(i => i.selected) @@ -497,6 +522,24 @@ let sketch = { items.forEach(i => delete i.group); log('ungrouped', items.length, 'sketch items'); } + }, + + fliph() { + sketch.arrange.ifcan((sketch, items) => { + items.filter(i => i.type === 'polygon').forEach(item => { + Object.assign(item, newPolygon().fromObject(item).flip('x').toObject()); + }); + sketch.render(); + }); + }, + + flipv() { + sketch.arrange.ifcan((sketch, items) => { + items.filter(i => i.type === 'polygon').forEach(item => { + Object.assign(item, newPolygon().fromObject(item).flip('y').toObject()); + }); + sketch.render(); + }); } }, diff --git a/src/mesh/build.js b/src/mesh/build.js index 351f8bbb..a35967a3 100644 --- a/src/mesh/build.js +++ b/src/mesh/build.js @@ -460,6 +460,11 @@ function ui_build() { h.div({ class: "pop"}, [ h.button({ _: 'group', onclick: sketch.arrange.group }), h.button({ _: 'ungroup', onclick: sketch.arrange.ungroup }), + h.hr(), + h.button({ _: 'center', onclick: sketch.arrange.center }), + h.hr(), + h.button({ _: 'flip-h', onclick: sketch.arrange.fliph }), + h.button({ _: 'flip-v', onclick: sketch.arrange.flipv }), ]) ]), h.div({ class: "sketch-on" }, [