void update boundary provenance

This commit is contained in:
Stewart Allen 2026-03-02 18:53:44 -05:00
commit e2e36aca03
3 changed files with 46 additions and 9 deletions

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
},