F1 in Schools · Development Class · jig design 4 fixtures · 1 datum

One datum, four fixtures

A balsa model block is a foam brick with one accurate feature: a 6 × 6 mm tether groove moulded down its whole length. Every fixture here grips that and nothing else — no outer face, no corner, no assumption that a block is square. Four designs, from 5 printed parts to a rotary carrier that indexes the block through 180° without ever taking it off the rail.

fixtures4one datum, four mechanisms
the guide478,737 B21 sections, offline, self-contained
interference0.000 mm³37-pose sweep, every part pair
block compliance9 / 9official dimensions, exact
mass298 g → 2.0 kgprinted PLA at one end, 6061 at the other
rail sag0.61 mmprinted, against 0.01 mm for bought ground bar
The ask, in his words
“any method is fine as long as it's functional and machinable” — and then, later, “can you make the guide be more detailed and includes all the jigs we have made”, and “is there assembly guide”.

What this is

The F1 in Schools model block is 223 × 65 × 50 mm of balsa with a 6 × 6 mm slot down the underside, a ⌀18 × 52 mm CO₂ chamber and a no-go zone that must survive in one piece. To machine it you have to hold it — and every commercial jig I could find clamps the outer faces, which are the two surfaces the rules do not control. A block that measures 65.4 mm across is legal and will sit in a 65.0 mm vice either sprung or crooked.

The groove is different. It is moulded, it runs the full 223 mm, and it is 6.00 mm on every block. So the fixture is built around a 6 mm rail: the block hangs on the rail, the rail's top face is the Z datum, and the two operations are the same setup with the block flipped over. Everything else in four designs is a different answer to “how do I flip it, and how do I stop it sliding”.

The datum chain, which never changes

featurevalue (mm)what hangs off itwhere it is proven
groove ceiling — the seat74.000the block's bottom face in OP 1socket_floor_z / seat_z, identical in all four reports
rail top face80.000Z0 for the cutter, in both operationsrail_top_z_actual = 80.0 in all four
mirror plane77.000where OP 2's machined face landsmirror_plane_z = 77.0 in all four
X stop223.000the block's front facestop_x = 223.0; jaw reaches 203 / 213 / 223
groove width6.000the rail: 5.900 printed, 6.000 boughtslot_w 6.0 / 6.0 in the compliance check

These five numbers are identical in the printed, machined, zero-hardware and rotary reports. That is the point of building four: the fixture is disposable, the datum is not. A toolpath written against this chain runs on any of them, which is why the CAM formula in the guide is one formula and not four.

The four answers

SLOTRAIL-223−M machined−ZH zero hardware−X rotary carrier
parts5 printed7 machined + 1 bought bar5 printed10 printed / 11 pieces
hardware11 screws + 8 T-nuts18 fasteners + 6 × 6 barnone9 fasteners
the fliplift off the rail, put it backlift off the barlift off, 11.5 mm clearlever through 180°, indexed
block length223 only223 only223 only203 – 223 (jaw travels 20)
mass298 g PLA2.0 kg 6061439 g PLA448 g PLA
largest part153 mm285 mm base188 mm179 mm rail / 175 mm base
support in the slicer94 mm²none — it is metal49 mm²429 mm²
print time12 – 20 h—18 – 24 h18 – 24 h

How it was built

No Fusion 360, no sketching by hand: parametric code (build123d), geometry as boolean algebra over boxes and prisms in absolute coordinates. The block is modelled first, from the official dimensions, and then every fixture is built around it — so the block's slot is the fixture's rail, and a fixture that does not clear the block is a boolean intersection that returns a number instead of a surprise on the machine.

official dimensions → block solid (703,489.6 mm³, 9/9 exact)
        │
        ├─ groove = datum ──→ rail 6.000 ──→ four fixture designs
        │                                        │
        │                                        ├─ printed      5 parts, 298 g
        │                                        ├─ machined     7 parts, 2.0 kg
        │                                        ├─ zero-hardware 5 parts, 439 g
        │                                        └─ rotary      10 parts, 448 g
        │
        └─ every design writes report.json
                 │
                 ├─ interference · tool envelope · rail contact · hex-key corridors
                 ├─ print audit: support mm², bridge mm², overhang angles, tallest part
                 └─ guide_extra.py reads those reports → the guide's tables

         no number in the guide is typed by hand

The three subsystems worth reading

1 · The groove, not the faces

The compliance check is nine official features against the model: block length, width, height, slot width, slot depth, chamber diameter, chamber depth, chamber height, and the solid's bounding box. Nine out of nine exact, and the volume agrees to −0.0 %. That is not decoration — it is the reason a groove depth read off a caliper can be trusted as a Z offset, and the guide spends a whole section on measuring it twice instead of assuming 6.00.

2 · The flip, which is where the tolerance dies

On the first three fixtures you lift the block off the rail, roll it, and put it back. That works, and it is why they all clamp the rail: the rail's height is the only thing that has to repeat. The rotary variant refuses to lift at all — the rail becomes an axle, the block stays on it, and a lever throws it through 180° into a detent. A pin of 5.00 mm in a 5.05 mm hole gives 0.169° of lever slop, which is 0.191 mm across a 65 mm face, against a 1.0 mm rulebook tolerance.

Because the part rotates, it could not be checked at two poses. The axle group and the block are rolled against every static part at 37 angles from 0° to 180°, and the worst intersection is 0.000 mm³ — at 0°, where there is the most material on both sides. A fixture that clears at two endpoints and hits at 90° is exactly the failure a two-pose check would have shipped.

3 · A table cannot disagree with the model

The guide's fourteen cross-variant tables are generated by a module that reads the four report.json files at build time. It exists because hand-typed tables had already drifted: the rotary BOM said its base was 170 mm wide while the solid measured 174, and a mass row read 0.0 kg because a cm³ volume met a g/mm³ density. Both are now impossible by construction, which is worth more than the two fixes.

Fasteners, all of them

variantfastenerqtyinto what
−223M4 × 8 socket cap2the rail clamps — self-tapping into a ⌀3.3 pilot
−223M4 × 16 socket cap1the collar
−223M6 × 20 + T-nut8the table's T-slot
−MM6 × 45 T-bolt + T-nut8the table, through the base's eight T-slots
−MM6 × 25 socket cap4up from under the base into the saddle's tapped M6
−MM5 × 12 socket cap4the clamp caps, two each
−MM4 × 10 socket cap2the collar cap
−XM4 × 12 socket cap4the cradle caps, two each
−XM4 × 8 grub2the lever clamp on the left hub
−XM6 × 60 grub2the jaw clamp through the left stand
−X5 mm dowel × 301the detent pin
−ZHnothing0the dovetail, the wedge and 40 N of thumb

What goes wrong, and what to do

symptomcausewhat to do
the block rattles on the railyour groove is deeper than the rail by more than 0.1 mmone turn of masking tape on the rail — allowed to stay, it is a shim not a bodge
OP 2 leaves a step you can feel with a fingernailyou assumed the groove depth equals the rail heightmeasure both with calipers and use Z = (s − h) − zb; 0.2 mm of groove error is 0.4 mm of step
the first turn of an M4 is stiff and the second is easythe pilot is ⌀3.3 because the screw cuts its own threadkeep turning. Do not drill it to 3.6 — that removes the clamp
the jaw binds and jumps instead of slidingthe two M6 grubs are at different depths and the jaw is being cockedback both out two turns, push the jaw home by hand, bring them in a quarter turn at a time
the hub will not spin after the caps go onthe caps are torqued unevenly and have pinched the cradlesnug one, then the other, then torque in pairs — the test is a finger, not a wrench
the detent pin stops at the mouth of its holea burr in the ⌀5.05 hole5.0 mm drill through by hand, no press
the wedge creeps back under loaddust on the 10° inclinewipe both faces, rub pencil graphite on the ramp
the dovetail will not drop togetherelephant's foot — a printed vertical wall is 0.1–0.2 mm fat at the bottom240 grit on the tongue's two flanks, four or five strokes

Honest limits

None of these has been printed or cut. Everything above is measured on the solid model, which is a real and repeatable claim — it is not the same claim as “a part exists”. The first print is the first physical test, and the settling tests are named in the guide: rail in the real groove, straightness of the glued 277 mm rail, whether the 0.19 mm index is a measurement or arithmetic, and whether the fixture survives a season.

0.1 mm of print tolerance decides the fit. The rails are 5.9 mm in a nominally 6.0 mm groove; a printer running ±0.2 mm can make that a rattle or a press fit. The guide's answer is a turn of masking tape, not a redesign — and if you buy the 6.00 mm ground bar, the socket has to be widened to 6.2.

The rotary version indexes to 0° and 180° only. At 90° the block hangs sideways off the rail with 0.96° of droop, which is 0.83 mm across the face. It is a two-position fixture pretending to be a fourth axis, and the guide says so.

Four fixtures is three more than anyone needs. The printed one works; the others exist because each one deletes a specific failure — creep, hardware, the lift — and because comparing them is how you find out which failure actually bites.

Evidence

claimvaluehow it was produced
the guide is one file478,737 bytes · sha256 7398372aaa8c5235…make_guide.py inlines every figure as base64; opens with the Wi-Fi off
the published copy is the artifactbyte-identicalsha256 of guide.html equals sha256 of demos/f1-jig-mirror/index.html
the block is the official blockbbox 223 × 65 × 50 · 9/9 exactsolid volume 703,489.6 mm³ against 703,489.6 expected, error −0.0 %
no variant can hit the block0.000 mm³boolean intersection, fixture ∩ block, both operations, all four
the rotary variant clears itself through the whole flip0.000 mm³ at 37 poses, 0° → 180°axle group + block rolled against every static part at 5° steps; worst case at 0°
the index is inside the rulebook0.191 mm across the face5.00 pin in a 5.05 hole → 0.169° of lever slop; the rule allows 1.0 mm
every part is a legal 3-axis part0 sloped facesface-normal audit across all seven machined solids, 12–86 faces each
the guide's own layout is soundmissing [] · overflow [] · ragged [] · wide 0 · 45,521 pxverify_guide.py — anchors, column widths, table raggedness, horizontal overflow
it builds from scratch8/8 scripts · 3/3 print checksfull rebuild of all four fixtures plus three slicer audits, exit 0

Where the files are

~/Desktop/f1-jig — twenty-eight STL files (twenty printed, eight machined), four STEP directories, four report files plus three slicer audits, and guide.html. make_guide.py and guide_extra.py build the guide; verify_guide.py checks it. Rebuild everything with one loop over the eight scripts — the guide is downstream of the reports, so it cannot be built before them.

Open the guide (byte-identical mirror) → Build spec

Method

Read the official dimensions and the class rules first (Development Class, 2024-25), modelled the block, then designed against the groove as datum. Every fixture is parametric code; every fixture writes a report; the report is the only source for the guide's numbers. Checks are adversarial — interference between every pair of parts, the cutter's envelope, hex-key corridors, print overhang angles, and a full rotational sweep for the one part that moves.

Honesty notes

The guide says “four fixtures” and means four designs, not four finished objects: one of them (the machined version) also needs a mill and a 6 × 6 mm ground bar you have to buy. Photographs are renders of the solid model, not of printed parts. Where the model and the hardware would disagree, the page says which one wins — the 5.9 mm rail is a deliberate 0.1 mm undersize, and the 0.4 mm gap at the rail's blind end is a designed clearance, not a mistake.

artifact 478,737 bytes · sha256 7398372aaa8c52350b26c95c9ed311091d5730a7cf39df724106d3f4e070a41f · mirror byte-identical