feat: persist LinkSub topology references

This commit is contained in:
2026-08-02 23:41:16 -04:00
parent 9def4708ea
commit d3d88b297b
11 changed files with 69 additions and 26 deletions

View File

@@ -760,6 +760,26 @@ test('typed properties are validated, versioned and undoable through the documen
assert.equal(facade.app.document.getObject('pad')?.properties.find((property) => property.name === 'Length')?.value, 50)
})
test('LinkSub properties preserve versioned TopoRefs and create topology dependencies', async () => {
const facade = createMockFacade()
const face = { vertexCoord: [0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 2, 0], normalCoord: [], triIndexes: [0, 1, 2, 0, 2, 3] }
const topology = createSubshapeRefs('pad-shape', 18, [face])
const topoRef = createPersistedTopoRef('pad', topology.refs[0], 4)
facade.app.document.setProperty({ objectId: 'pocket', propertyName: 'UpToFace', value: topoRef })
const stored = facade.app.document.getObject('pocket')?.properties.find((property) => property.name === 'UpToFace')?.value
assert.deepEqual(stored, topoRef)
assert.notEqual(stored, topoRef)
const dependency = facade.app.document.getDependencies().find((edge) => edge.sourceId === 'pocket' && edge.relation === 'topo-ref')
assert.equal(dependency?.targetId, 'pad')
assert.equal(dependency?.reference, topoRef.persistentId)
assert.throws(() => facade.app.document.setProperty({ objectId: 'pocket', propertyName: 'UpToFace', value: { ...topoRef, faceIndex: 1 } as never }), /must not persist transient faceIndex/)
assert.throws(() => facade.app.document.setProperty({ objectId: 'pocket', propertyName: 'UpToFace', value: { ...topoRef, objectId: 'missing' } }), /target does not exist/)
await facade.project.save()
const loaded = await facade.project.load('doc-pump-housing')
assert.deepEqual(loaded?.objects.find((object) => object.id === 'pocket')?.properties.find((property) => property.name === 'UpToFace')?.value, topoRef)
})
test('expressions are evaluated in the facade and create document dependencies', () => {
const facade = createMockFacade()
facade.app.document.setExpression({ objectId: 'pad', propertyName: 'Length', expression: '1 in + 2 mm' })