From 257d841b0af167c3b4de1e6fa910c0d042ad8e08 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Jul 2024 19:31:32 -0400 Subject: [PATCH] add sketch + sketch item snap move / scale --- src/mesh/api.js | 2 +- src/mesh/build.js | 1 + src/mesh/model.js | 4 ++-- src/mesh/sketch.js | 59 +++++++++++++++++++++++++++++++++++----------- src/mesh/util.js | 8 ++++++- 5 files changed, 56 insertions(+), 18 deletions(-) diff --git a/src/mesh/api.js b/src/mesh/api.js index 7b247b08..36f9be91 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -564,7 +564,7 @@ let add = { return log('select a sketch'); } api.modal.dialog({ - title: "gear generator", + title: "add circle", body: [ h.div({ class: "addgear" }, [ h.label('radius in mm'), h.input({ value: opt.radius || 10, size: 5, id: "_radius" }), diff --git a/src/mesh/build.js b/src/mesh/build.js index ad564945..7fbaa82b 100644 --- a/src/mesh/build.js +++ b/src/mesh/build.js @@ -1003,6 +1003,7 @@ function ui_build() { model_remove: defer_all, group_remove: defer_all, selection_update: defer_all, + selection_drag: defer_selection, selection_move: defer_selection, selection_scale: defer_selection, selection_rotate: defer_selection, diff --git a/src/mesh/model.js b/src/mesh/model.js index 706d4749..bbcae39c 100644 --- a/src/mesh/model.js +++ b/src/mesh/model.js @@ -136,8 +136,8 @@ mesh.model = class MeshModel extends mesh.object { if (start) { let mid = this.bounds.mid; this._save = { - pos: Object.assign({},mid), - start: Object.assign({},mid), + pos: Object.assign({}, mid), + start: Object.assign({}, mid), } } else if (end) { delete this._save; diff --git a/src/mesh/sketch.js b/src/mesh/sketch.js index 6e99ed16..1fabe62d 100644 --- a/src/mesh/sketch.js +++ b/src/mesh/sketch.js @@ -25,6 +25,7 @@ const { newPolygon } = base; const mapp = mesh; const worker = moto.client.fn; const POLYS = base.polygons; +const drag = {}; const material = { normal: new MeshBasicMaterial({ color: 0x888888, side: DoubleSide, transparent: true, opacity: 0.25 }), @@ -42,7 +43,7 @@ mesh.sketch = class MeshSketch extends mesh.object { super(opt.id); this.file = opt.file || this.id; - this.scale = opt.scale || { x: 10, y: 10, z: 0 }; + this.scale = opt.scale || { x: 50, y: 50, z: 0 }; this.center = opt.center || { x: 0, y: 0, z: 0 }; this.normal = opt.normal || { x: 0, y: 0, z: 1 }; this.items = opt.items || []; @@ -307,13 +308,14 @@ mesh.sketch = class MeshSketch extends mesh.object { } move(x, y, z = 0) { - const { group, center, scale, plane, handles, dragging } = this; - const handle = handles.indexOf(dragging); - if (dragging === plane) { + const { target } = drag; + const { center, scale, plane, handles } = this; + const handle = handles.indexOf(target); + if (target === plane) { center.x += x; center.y += y; center.z += z; - this.update(); + this.render(); } else if (handle >= 0) { const sf = [ [-1, 1, 1], @@ -327,9 +329,9 @@ mesh.sketch = class MeshSketch extends mesh.object { scale.x += x * sf[0]; scale.y += y * sf[1]; scale.z += z * sf[2]; - this.update(); - } else if (Array.isArray(dragging)) { - for (let item of dragging) { + this.render(); + } else if (Array.isArray(target)) { + for (let item of target) { let { center } = item; center.x += x; center.y += y; @@ -338,7 +340,7 @@ mesh.sketch = class MeshSketch extends mesh.object { this.render(); } else { this.center = {x, y, z}; - this.update(); + this.render(); } } @@ -351,16 +353,45 @@ mesh.sketch = class MeshSketch extends mesh.object { } drag(opt = {}) { - let { items } = this; - let { start, delta, end } = opt; + let { items, center, handles } = this; + let { start, delta, offset, end } = opt; if (start) { let selected = items.filter(i => i.selected); - this.dragging = start.sketch_item ? selected : start; - // } else if (offset) { + let target = start.sketch_item ? selected : start; + let item = Array.isArray(target) ? target[0] : undefined; + let handle = this.handles.indexOf(target); + drag.handle = handle >= 0 ? handles[handle] : undefined; + drag.item = item; + drag.target = target; + drag.start = Object.assign({}, drag.handle ? + util.extract(util.bounds(drag.handle).mid, { map: true }) : + item?.center ?? center); + } else if (offset) { + let { start, item, handle } = drag; + let { snap, snapon } = api.prefs.map.space; + let pos = handle ? + util.extract(util.bounds(handle).mid, { map: true }) : + item?.center ?? center; + let end = { + x: start.x + offset.x, + y: start.y + offset.y, + z: start.z + offset.z + }; + if (snap && snapon) { + end.x = Math.round(end.x / snap) * snap; + end.y = Math.round(end.y / snap) * snap; + end.z = Math.round(end.z / snap) * snap; + } + delta = { + x: end.x - pos.x, + y: end.y - pos.y, + z: end.z - pos.z + }; + this.move(delta.x, delta.y, delta.z); } else if (delta) { this.move(delta.x, delta.y, delta.z); } else if (end) { - this.dragging = undefined; + drag.target = undefined; } else { console.log({ invalid_sketch_drag: opt }); } diff --git a/src/mesh/util.js b/src/mesh/util.js index 69580366..67322776 100644 --- a/src/mesh/util.js +++ b/src/mesh/util.js @@ -158,7 +158,13 @@ const util = exports({ if (opt.fixed !== undefined) v = v.toFixed(opt.fixed); array.push(v); } - return array; + return opt.map ? + { + [field[0]] : array[0], + [field[1]] : array[1], + [field[2]] : array[2], + } : + array; }, // for an array of maps, return the average of all named fields in a new map