feat: persist stable sketch external geometry

This commit is contained in:
2026-08-02 23:54:56 -04:00
parent 6786261f16
commit a8f902ceb5
7 changed files with 61 additions and 15 deletions

View File

@@ -336,6 +336,28 @@ test('sketcher operations are facade transactions and survive the project fallba
assert.equal(loaded?.objects.find((object) => object.id === 'sketch')?.sketch?.constraints[0].id, 'horizontal-1')
})
test('external sketch geometry persists stable topology references and dependency edges', async () => {
const facade = createMockFacade()
const reference = createPersistedTopoRef('pad', { shapeId: 'pad', kind: 'edge', persistentId: 'edge:profile:1', topologyVersion: 2, status: 'stable', signature: 'line:10' }, 4)
facade.app.sketcher.addExternalGeometry('sketch', {
id: 'external-1',
source: reference,
projection: { id: 'projected-line', type: 'line', start: { x: 0, y: 0 }, end: { x: 10, y: 0 } },
construction: true,
})
const sketch = facade.app.sketcher.get('sketch')
assert.equal(sketch?.externalGeometry.length, 1)
assert.deepEqual(facade.app.document.getDependencies().find((edge) => edge.propertyName === 'ExternalGeometry:external-1'), {
sourceId: 'sketch', targetId: 'pad', relation: 'topo-ref', propertyName: 'ExternalGeometry:external-1', reference: 'edge:profile:1',
})
const persistence = createSqliteProjectPersistence()
await persistence.save(facade.app.document.getActive())
const loaded = await persistence.load('doc-pump-housing')
assert.deepEqual(loaded?.objects.find((object) => object.id === 'sketch')?.sketch?.externalGeometry, sketch?.externalGeometry)
assert.throws(() => facade.app.sketcher.addExternalGeometry('sketch', { id: 'self', source: { ...reference, objectId: 'sketch' }, projection: { id: 'self-line', type: 'line', start: { x: 0, y: 0 }, end: { x: 1, y: 0 } }, construction: true }), /cannot import external geometry from itself/)
await persistence.dispose()
})
test('Sketcher solve command is selection-aware and emits the standard command lifecycle', () => {
const facade = createMockFacade()
facade.gui.workbench.setActive('Sketcher')