feat: add structured placement properties

This commit is contained in:
2026-08-03 00:00:42 -04:00
parent a8f902ceb5
commit 293cff6c36
10 changed files with 95 additions and 10 deletions

View File

@@ -871,6 +871,23 @@ 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('Placement properties are deeply cloned, validated, undoable and persisted', async () => {
const facade = createMockFacade()
const placement = { position: { x: 10, y: -2, z: 4 }, rotation: { axis: { x: 0, y: 1, z: 0 }, angle: 45 } }
facade.app.document.setProperty({ objectId: 'pad', propertyName: 'Placement', value: placement })
placement.position.x = 999
const stored = facade.app.document.getObject('pad')?.properties.find((property) => property.name === 'Placement')?.value
assert.deepEqual(stored, { position: { x: 10, y: -2, z: 4 }, rotation: { axis: { x: 0, y: 1, z: 0 }, angle: 45 } })
assert.throws(() => facade.app.document.setProperty({ objectId: 'pad', propertyName: 'Placement', value: { position: { x: 0, y: 0, z: 0 }, rotation: { axis: { x: 0, y: 0, z: 0 }, angle: 0 } } }), /axis cannot be zero/)
facade.history.undo()
assert.deepEqual(facade.app.document.getObject('pad')?.properties.find((property) => property.name === 'Placement')?.value, { position: { x: 0, y: 0, z: 0 }, rotation: { axis: { x: 0, y: 0, z: 1 }, angle: 0 } })
facade.history.redo()
const persistence = createSqliteProjectPersistence()
await persistence.save(facade.app.document.getActive())
assert.deepEqual((await persistence.load('doc-pump-housing'))?.objects.find((object) => object.id === 'pad')?.properties.find((property) => property.name === 'Placement')?.value, stored)
await persistence.dispose()
})
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] }