Files
solvecraft/tools/oracle-analytic
jyviko 68a217d980 Reference tests: the loft case is analytic, SolidCraft's correspondence with its closed form
17-loft's expected values were FreeCAD's (OpenCASCADE's Part.makeLoft), which runs each side of
the square to its quarter of the circle at uniform angle (arc length). That correspondence has
no exact rational B-spline form, and SolidCraft keeps its surfaces exact: its ruled loft runs
each side to one rational quarter of the circle's B-spline by their own parameters, 35080.7251
mm^3, 0.13% less (the oracle failed on volume and the second moments). The owner chose this
correspondence. The case is now worked out in tools/oracle-analytic/cases_basic.py: the section
area is quadratic in t with the loops' mixed area, so volume and centroid are closed forms of it
(the mixed area and the wall area by Gauss-Legendre on the exact rational arcs); its note says
why it differs from OpenCASCADE and gives that volume, and its `compare` leaves out the surface
check against OpenCASCADE's reference.stl. All its checks pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 12:16:22 -04:00
..

Analytic reference values

Closed-form expected values for the cases in tests/oracle/ whose shape has one: prisms, cylinders, cones and frustums, spheres and caps, tori and solids of revolution (Pappus), fillets on straight edges (a constant radius, or one varying along the edge), shells, patterns of these, and folded sheet metal (flats plus bends as annular sectors). Each script is plain Python 3 (standard library only) with one function per case. Running a script from the repository root rewrites the expected.json of its cases with "source": "analytic" and a method string giving the formulas:

python3 tools/oracle-analytic/cases_basic.py        # 01-29, 82: boxes, holes, revolves, sketches, thin walls
python3 tools/oracle-analytic/cases_features.py     # 32-66: fillets, shells, sweeps, patterns
python3 tools/oracle-analytic/cases_sheet_metal.py  # 67-76: sheet metal
python3 tools/oracle-analytic/cases_fillets.py      # 77-81: variable, chord-length, tapered and spline fillets
python3 tools/oracle-analytic/cases_surfaces.py     # 83: boundary surfaces

Where a value depends on a SolidCraft convention rather than on geometry alone (a shell's sharp inner corner, a sheet-metal corner relief, where a flange height is measured), method or note says which convention is used. Never change a value to match SolidCraft's output: if they disagree, find out which one is wrong.