Files
OneCAD/tests/oracle/README.md
T
e12758ff91 Public reference tests: analytic and FreeCAD expected values (#310)
The oracle no longer uses Fusion measurements. tests/oracle/<case>/ now holds the 76 recipes
(our own format, with recorded measurements and tool-specific fields removed) and an
expected.json per case:

- 55 analytic cases: closed-form values from tools/oracle-analytic/ (stdlib Python, formulas
  in each case's "method").
- 21 FreeCAD cases: the same recipe built with FreeCAD's public scripting API by
  tools/freecad-oracle/ (an external program, not a dependency), with a reference.stl for 20.

solvecraft-cli oracle compares body count, volume, area, centre of mass, bbox, face counts
where the geometry fixes them, and, against reference.stl, the sampled Hausdorff distance and
the principal moments (spatial.rs from #301). cargo xtask oracle reads tests/oracle, writes
docs/oracle.md with the source of each value, and supports known_failure marks for tracked
bugs. CI runs it on every PR; a manual workflow regenerates the FreeCAD values. step-corpus,
seam normalisation and the through-all emulation, which only existed to compare with Fusion,
are removed.

75/76 pass; 75-sm-bracket-holes is a known failure (#296).


Claude-Session: https://claude.ai/code/session_01RjGw4gA5ZvKrU8MQP6sBgT

Co-authored-by: bherbruck <bherbruck@herbrucks.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 10:43:43 -04:00

43 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Reference tests (the oracle)
Each directory is one case:
- `recipe.json`: the part, written in SolidCraft's recipe format (sketches in sketch-local
coordinates, features with their parameters, faces and edges picked by a world-space point).
`cargo xtask oracle` replays it through SolidCraft's command engine.
- `expected.json`: what the part must measure, and where those numbers come from.
- `reference.stl` (optional): a fine triangulation of the expected part, used to check the
shape itself (surface distance), not only its totals.
Run every case with `cargo xtask oracle`; it writes `docs/oracle.md`.
## expected.json
```json
{
"source": "analytic",
"method": "box 40 x 30 x 20: V = abc, A = 2(ab + bc + ca)",
"body_count": 1,
"volume_mm3": 24000.0,
"area_mm2": 5200.0,
"center_of_mass": [20.0, 15.0, 10.0],
"bbox": { "min": [0.0, 0.0, 0.0], "max": [40.0, 30.0, 20.0] },
"faces": 6
}
```
| Field | Meaning |
|---|---|
| `source` | `"analytic"` (closed-form geometry, worked out by hand; `method` gives the formulas) or `"freecad <version>"` (built from the same recipe by `tools/freecad-oracle/`). |
| `method` | How the numbers were obtained: formulas for analytic cases, the construction for FreeCAD ones. |
| `body_count` | Number of solid bodies. |
| `volume_mm3`, `area_mm2` | Totals over all bodies. |
| `center_of_mass` | Volume-weighted centroid of all bodies (uniform density). |
| `bbox` | Axis-aligned bounding box of all bodies. |
| `faces` | Optional. Only where the geometry fixes the count: a face is a maximal smooth patch of one surface (a full cylinder side is one face; coplanar neighbours are one face). |
| `compare` | Optional. Restricts the comparison to these keys (for example `["volume_mm3", "area_mm2"]` where kernels legitimately build different corner patches); `note` says why. |
| `tolerance` | Optional overrides: `rel` (volume, area; default 1e-3), `abs_mm` (centre of mass and bbox, default 1e-3 × the bbox diagonal), `surface_mm` (STL surface distance). |
| `note` | Optional remarks. |
No value here was measured in, or exported from, any commercial CAD product.