feat: model advanced sketch curves

This commit is contained in:
2026-08-02 23:52:06 -04:00
parent e0b4817ec0
commit 6786261f16
5 changed files with 49 additions and 12 deletions

View File

@@ -9,7 +9,7 @@ import { evaluateQuantityExpression, quantityFromNumber } from '../src/facade/un
import { createEdgeSubshapeRefs, createSubshapeRefs, createVertexSubshapeRefs, matchSubshapes, signatureForEdge, signatureForFace, signatureForVertex } from '../src/facade/topologyNaming'
import { createPersistedTopoRef, migrateTopoRefs, parseTopoRef, resolveTopoRef, serializeTopoRef } from '../src/facade/topologyReferences'
import { captureSignatureTopologyHistory } from '../src/facade/topologyHistory'
import { createSketch, solveSketch } from '../src/facade/sketcher'
import { cloneSketch, createSketch, solveSketch } from '../src/facade/sketcher'
import { BasicSketchSolverProvider, SKETCH_SOLVER_PROTOCOL_VERSION, SketchSolverCoordinator, SketchSolverUnavailableError, UnavailablePlanegcsProvider, runSketchSolverReplay, type SketchSolverProvider, type SketchSolverRequest } from '../src/facade/sketchSolverProtocol'
import { createFacadeGeometryRecomputeExecutor, executeFacadeRecomputeNode, RecomputeCoordinator, type RecomputeGeometryRuntime } from '../src/facade/recomputeEngine'
import { inspectFcstdArchive } from '../src/facade/fcstd'
@@ -255,6 +255,25 @@ test('Sketcher solver supports diameter, symmetric and tangent constraints at th
assert.equal((result.snapshot.geometry.find((geometry) => geometry.id === 'circle-1') as Extract<typeof result.snapshot.geometry[number], { type: 'circle' }>).center.y, 2)
})
test('Sketcher model round-trips ellipse and B-spline data without claiming solver support', () => {
const source = createSketch('advanced-curves', [
{ id: 'ellipse-1', type: 'ellipse', center: { x: 1, y: 2 }, majorRadius: 8, minorRadius: 3, rotation: 0.25 },
{ id: 'bspline-1', type: 'bspline', degree: 3, controlPoints: [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 2 }, { x: 8, y: 0 }], weights: [1, 0.8, 0.8, 1], knots: [0, 0, 0, 0, 1, 1, 1, 1] },
], [{ id: 'block-ellipse', type: 'block', geometryId: 'ellipse-1' }])
const cloned = cloneSketch(source)
const ellipse = cloned.geometry[0]
const spline = cloned.geometry[1]
assert.equal(ellipse.type, 'ellipse')
assert.equal(spline.type, 'bspline')
if (ellipse.type === 'ellipse') ellipse.center.x = 99
if (spline.type === 'bspline') { spline.controlPoints[0].x = 99; spline.weights![0] = 2; spline.knots![0] = 3 }
assert.deepEqual(source.geometry[0], { id: 'ellipse-1', type: 'ellipse', center: { x: 1, y: 2 }, majorRadius: 8, minorRadius: 3, rotation: 0.25 })
assert.deepEqual(source.geometry[1], { id: 'bspline-1', type: 'bspline', degree: 3, controlPoints: [{ x: 0, y: 0 }, { x: 2, y: 4 }, { x: 6, y: 2 }, { x: 8, y: 0 }], weights: [1, 0.8, 0.8, 1], knots: [0, 0, 0, 0, 1, 1, 1, 1] })
const result = solveSketch(source)
assert.equal(result.status, 'invalid')
assert.deepEqual(result.diagnostics.map((diagnostic) => diagnostic.code), ['UNSUPPORTED_GEOMETRY', 'UNSUPPORTED_GEOMETRY'])
})
test('sketch solver protocol exposes honest capabilities and deterministic replay', async () => {
const provider = new BasicSketchSolverProvider()
assert.deepEqual(provider.capabilities().engine, 'typescript-basic')