From 9433cbf09a7fcd4b85caf7c06bdf9b8ef89d6d94 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 10 Mar 2026 23:49:30 -0400 Subject: [PATCH] fix sketch hover latch. add pattern warning if no anchor point selected --- src/void/interact.js | 3 +++ src/void/sketch/pointer.js | 3 +-- src/void/sketch/tools.js | 29 +++++++++++++++++++++++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/void/interact.js b/src/void/interact.js index 57d3690e..886080d3 100644 --- a/src/void/interact.js +++ b/src/void/interact.js @@ -310,6 +310,9 @@ const interact = { } }, () => { this.handleHover(); + if (this.isSketchEditing()) { + this.handleSketchHover(null, []); + } }); space.mouse.onDrag((delta, offset, isDone, intersections) => { diff --git a/src/void/sketch/pointer.js b/src/void/sketch/pointer.js index f2dd7350..7bafbf46 100644 --- a/src/void/sketch/pointer.js +++ b/src/void/sketch/pointer.js @@ -343,8 +343,7 @@ function handleSketchMouseUp(event, intersections) { const upHit = this.resolveSketchHit(event, intersections, feature); const hit = upHit || (pointerDown?.hitId ? { id: pointerDown.hitId, type: pointerDown?.hitType || null } : null) - || (pointerDown?.hoveredHitId ? { id: pointerDown.hoveredHitId, type: pointerDown?.hoveredHitType || null } : null) - || (this.hoveredSketchEntityId ? { id: this.hoveredSketchEntityId } : null); + || (pointerDown?.hoveredHitId ? { id: pointerDown.hoveredHitId, type: pointerDown?.hoveredHitType || null } : null); if (hit?.id) { if (dist > SKETCH_DRAG_START_PX && pointerDown?.hitId) { // Intended drag gesture that failed to initialize; do not toggle select on mouse-up. diff --git a/src/void/sketch/tools.js b/src/void/sketch/tools.js index 02232851..c014d8dd 100644 --- a/src/void/sketch/tools.js +++ b/src/void/sketch/tools.js @@ -173,7 +173,10 @@ function startSketchCircularPatternMode() { const feature = this.getEditingSketchFeature(); if (!feature) return false; const centerRef = this.getSelectedSketchPatternCenter(feature); - if (!centerRef) return false; + if (!centerRef) { + window.alert('Circular pattern requires exactly one anchor point selected.'); + return false; + } this.sketchCircularPatternMode = true; this.sketchCircularPatternCenterRef = centerRef; this.stopSketchMirrorMode?.(); @@ -206,7 +209,29 @@ function startSketchGridPatternMode() { const feature = this.getEditingSketchFeature(); if (!feature) return false; const centerPointId = this.getSelectedSketchGridAnchor(feature); - if (!centerPointId) return false; + if (!centerPointId) { + window.alert('Grid pattern requires exactly one anchor point selected.'); + return false; + } + + // If line/arc sources are already selected, apply immediately. + const entities = Array.isArray(feature?.entities) ? feature.entities : []; + const byId = new Map(entities.filter(entity => entity?.id).map(entity => [entity.id, entity])); + const sourceIds = Array.from(this.selectedSketchEntities || []) + .filter(id => typeof id === 'string' && id && id !== centerPointId && !id.startsWith('arc-center:')) + .filter(id => { + const ent = byId.get(id); + return ent?.type === 'line' || ent?.type === 'arc'; + }); + if (sourceIds.length) { + const applied = this.gridPatternSelectedSketchGeometry?.({ + centerRef: centerPointId, + sourceIds, + keepResultSelected: false + }); + if (applied) return true; + } + this.sketchGridPatternMode = true; this.sketchGridPatternCenterRef = centerPointId; this.stopSketchMirrorMode?.();