From e2e36aca039d78dfcbf99c260d51373888681696 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 2 Mar 2026 18:53:44 -0500 Subject: [PATCH] void update boundary provenance --- src/void/api/solids.js | 14 +++++++++++++- src/void/solid/rebuild.js | 22 ++++++++++++++++------ src/void/toolbar.js | 19 +++++++++++++++++-- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/void/api/solids.js b/src/void/api/solids.js index 70a1c235..35f19c5c 100644 --- a/src/void/api/solids.js +++ b/src/void/api/solids.js @@ -67,6 +67,18 @@ function createSolidsApi(getApi) { return null; } + function normalizeProfileLoops(loops) { + if (!Array.isArray(loops) || !loops.length) return null; + const out = loops + .filter(loop => Array.isArray(loop) && loop.length >= 3) + .map(loop => loop.map(p => ({ x: Number(p?.x || 0), y: Number(p?.y || 0) }))); + return out.length ? out : null; + } + + function profileLoopsFromTarget(profileTarget = {}) { + return normalizeProfileLoops(profileTarget?.loops); + } + function buildRebuildSnapshot(api) { const builtFeatures = api.features.listBuilt(); const sketchPlanes = {}; @@ -82,7 +94,7 @@ function createSolidsApi(getApi) { for (const profileTarget of profiles) { const { sketchId, profileId, key } = resolveProfileTargetRef(profileTarget); if (!sketchId || !profileId) continue; - const loops = profileLoopsFromRuntime(api, profileTarget); + const loops = profileLoopsFromTarget(profileTarget) || profileLoopsFromRuntime(api, profileTarget); if (!loops?.length) continue; profileLoops[key] = loops; } diff --git a/src/void/solid/rebuild.js b/src/void/solid/rebuild.js index 6fdb8fa8..4736ae3e 100644 --- a/src/void/solid/rebuild.js +++ b/src/void/solid/rebuild.js @@ -31,15 +31,25 @@ function profileLoopsFromRuntime(api, profileTarget) { return null; } +function normalizeProfileLoops(loops) { + if (!Array.isArray(loops) || !loops.length) return null; + const out = loops + .filter(loop => Array.isArray(loop) && loop.length >= 3) + .map(loop => loop.map(p => ({ x: Number(p?.x || 0), y: Number(p?.y || 0) }))); + return out.length ? out : null; +} + +function profileLoopsFromTarget(profileTarget = {}) { + return normalizeProfileLoops(profileTarget?.loops); +} + function profileLoopsFromSnapshot(snapshot, profileTarget) { + const direct = profileLoopsFromTarget(profileTarget); + if (direct?.length) return direct; const { sketchId, profileId, key } = resolveProfileTargetRef(profileTarget); if (!key || !sketchId || !profileId) return null; const map = snapshot?.profileLoops || {}; - const loops = map[key]; - if (!Array.isArray(loops) || !loops.length) return null; - return loops - .filter(loop => Array.isArray(loop) && loop.length >= 3) - .map(loop => loop.map(p => ({ x: Number(p?.x || 0), y: Number(p?.y || 0) }))); + return normalizeProfileLoops(map[key]); } function makeBodyId(featureId, index) { @@ -556,7 +566,7 @@ async function rebuildGeneratedSolids(api, options = {}) { for (const profileTarget of profiles) { const { sketchId, profileId, key } = resolveProfileTargetRef(profileTarget); if (!sketchId || !profileId) continue; - const loops = profileLoopsFromRuntime(api, profileTarget); + const loops = profileLoopsFromTarget(profileTarget) || profileLoopsFromRuntime(api, profileTarget); if (!loops?.length) continue; profileLoops[key] = loops; } diff --git a/src/void/toolbar.js b/src/void/toolbar.js index 0555c772..001f679c 100644 --- a/src/void/toolbar.js +++ b/src/void/toolbar.js @@ -373,9 +373,24 @@ const toolbar = { if (!sketchId || !profileId) continue; const sketch = api.features.findById(sketchId); if (!sketch || sketch.type !== 'sketch') continue; - out.push({ + const target = { region_id: `profile:${sketchId}:${profileId}` - }); + }; + const rec = api.sketchRuntime?.getRecord?.(sketchId); + const view = rec?.entityViews?.get?.(profileId); + const rawLoops = view?.object?.userData?.sketchProfileLoops + || (view?.object?.userData?.sketchProfileLoop ? [view.object.userData.sketchProfileLoop] : null) + || view?.entity?.loops + || (view?.entity?.loop ? [view.entity.loop] : null); + const loops = Array.isArray(rawLoops) + ? rawLoops + .filter(loop => Array.isArray(loop) && loop.length >= 3) + .map(loop => loop.map(p => ({ x: Number(p?.x || 0), y: Number(p?.y || 0) }))) + : []; + if (loops.length) { + target.loops = loops; + } + out.push(target); } return out; },