Four flip-jigs for machining the 223 × 65 × 50 mm model block — one printed and screwed, one machined from 6061, one with no hardware at all, and one that turns the block on a lever. All four use the block's own tether-line groove as the datum, so the top and the underside meet on the mid-line instead of meeting somewhere near it.
The block is 223 × 65 × 50 mm of polyurethane tooling board. Every dimension on it carries a 1–2 % tolerance — up to half a millimetre on the thickness. A rigid pocket that grips one block will not accept the next, and a set of shims falls out the moment you pick the block up.
But the block does arrive with one feature you can trust: a 6.00 × 6.00 mm groove down the centre of its underside — the tether-line channel — machined straight and parallel over the full 223 mm.
So the groove becomes the datum. A 6 mm square rail sits in it, and the block rests on that rail by the ceiling of the groove, inside the groove, where nothing else can touch it.
Flip the block 180° about the rail and the groove goes back over the same rail. Its height above the machine table now differs by exactly the rail's height — 6.00 mm you can measure with calipers — and not by the foam's thickness, which you cannot. That single fact is why the two halves line up.
| direction | located by | repeatability |
|---|---|---|
| X | fixed stop face + rail collar | ±0.05 |
| Y | groove walls on the rail | ±0.05 |
| Z — OP 1 | groove ceiling on the rail's top face | ±0.05 |
| Z — OP 2 | groove ceiling on the rail's bottom face | ±0.05 |
| roll · yaw · pitch | 223 mm of groove on 277 mm of rail | ±0.05 |
| file | part | qty | print size (mm) | orientation |
|---|---|---|---|---|
bed_left.stl | Left bed half — foot + tower + rail socket | 1 | 150 × 110 × 92.3 | as exported, foot on the bed |
bed_right.stl | Right bed half — foot + tower + fixed stop face | 1 | 135 × 110 × 92.3 | as exported, foot on the bed |
rail_a.stl | Rail, left half (lower lap) | 1 | 144 × 5.9 × 6.0 | flat, 5.9 wide × 6.0 tall |
rail_b.stl | Rail, right half (upper lap) | 1 | 153 × 5.9 × 6.0 | flipped 180° about X — lap on the bed |
collar.stl | Split collar — X clamp on the rail | 1 | 26 × 22 × 12 | as exported, bore vertical |
h in three places and use the average.rail_h in
jig.py to your measured bar.rail_a from the inner end before anything is glued. Slide it on
and leave it loose.rail_a's outer end into the left
tower's socket until it bottoms out, and rail_b into the right
tower's socket the same way. They meet in the middle over a 20 mm half-lap.Bolt the bed to the table through the eight counterbored slots. Once it is clamped it does not move again — the whole point is that both operations run on the same clamped fixture.
X: the right tower's inner face is the stop. Push the block against it.
Z: touch off on the rail's top face. That is Z0, in both operations.
Then measure two things with calipers and write them down:
| with Z0 on the rail's top face | OP 1 | OP 2 |
|---|---|---|
| block bottom face sits at Z = | −s | s − h |
| block top face sits at Z = | −s + 50 | s − h − 50 |
| typical (s = h = 6.00) | −6.00 / +44.00 | 0.00 / −50.00 |
| rail top face | 0.00 | 0.00 |
Block in its shipping orientation, groove down, sitting on the rail.
Machine the nose, cockpit, halo bosses and wing mounts — everything above
zb ≈ 26.
The block's bottom face hangs 6 mm below the rail's top face, 62 mm above the bed plate, so nothing under the work gets in the way. The only obstacles are the two towers, standing 12 mm above the rail's top face.
Loosen the collar, lift the block straight up off the rail, turn it 180° about its long axis, drop it back on the rail, push it against the stop, slide the collar to the end face and tighten.
The underside now faces up. Machine everything except the middle: the rail is still sitting in the groove.
Use a Ø3 mm ball nose for the fine detail and keep at least 14 mm of tool stickout (18 mm gives full clearance) so the collet nut clears the towers when you machine within 10 mm of either end.
| rule | why |
|---|---|
| Length ≤ 203 mm, car kept ≥ 10 mm inside each end of the block | the end bands are the only stock the fixture is allowed to touch — and the regulations cap the body at 203 mm of the 223 mm block anyway |
| Keep the 6 mm channel along the whole underbody, centred, ceiling flush with the block's bottom face | it is the datum and it is what the rail sits in during OP 2 — and the no-go zone includes it, so cutting its walls fails scrutineering as well as the fixture |
Nothing below zb = 0 |
the block's bottom face is the OP 2 datum and has to stay a single plane |
| Axle holes 11 mm above the body's bottom face, drilled from machined faces after OP 2 | the halo notch has to sit 34.0 ±1.0 mm above the track, which is what the 11 mm axle height buys you — and the bottom face is a fixture datum, so it is the one height you can measure honestly |
Inside those four numbers you can machine whatever the rules allow. The fixture has no opinion about your car.
The fixture is not a scrutineered part — the technical regulations say nothing about how you hold the block. But several regulated features live on the same faces this fixture and your CAM touch, so they are worth stating once, in order.
| regulation (2024-25 Development Class) | what it means for you |
|---|---|
| D1.4 / Appendix ii — block 223.00 × 65.00 × 50.00, tether slot 6.00 × 6.00, chamber Ø18.00 × 52.00 deep at 29.00 above the bottom face | the fixture is built to these numbers exactly; there is nothing here to design around. The slot is cut into the 50 mm, not added below it. |
| D1.6 / Appendix iv — two Ø6 halo holes, 40.00 apart, through the halo platform, drilled with the printed jig that sits in the tether slot | Drill these first, with the slot empty. The holes land at
y = ±20, 17 mm clear of the rail, so the fixture never argues
with them — but it cannot drill them, because its rail is occupying the slot
the official jig needs. |
| D4.2 — the no-go zone must be preserved as one continuous piece of model block; the only permitted modification is the two axle holes | start your CAD from the official no-go-zone part, not from a bare block. It includes the 6.00 sub-floor channel, which is why the channel survives OP 2: it is a rule, not a preference. |
| D3.1.3 — an official holographic sticker from the model block, one per car | a piece of the block's original surface has to end up on the car. The fixture touches only the ends and the inside of the slot, so a sticker on a side face survives both operations — check where yours is before you cut. |
| D9 — two tether line guides, one on or within 15.0 mm of the front, both closed loops | added parts, not machined from the block. The fixture does not touch them, but leave room at the nose: a guide bonded on the centreline needs the channel's ceiling intact under it. |
Every figure below comes from the solid model in jig.py, which
rebuilds and re-runs these checks on every run (report.json).
Every STL was re-opened and every triangle measured against the build plate. A face needs support when it points downward and lies flatter than 45°. Across all five parts that total is 95 mm² — and none of it is an overhang you would actually support. The three parts that carry the tolerances come out at zero.
| part | finished size mm | first layer | needs support | of that, bridging | PLA |
|---|---|---|---|---|---|
| left bed half | 150 × 110 × 92.3 | 15 812 mm² | 0 mm² | 0 mm² | 146 g |
| right bed half | 135 × 110 × 92.3 | 14 162 mm² | 40 mm² | 40 mm² | 138 g |
| rail a | 144 × 5.9 × 6.0 | 850 mm² | 0 mm² | 0 mm² | 5 g |
| rail b | 153 × 5.9 × 6.0 | 903 mm² | 0 mm² | 0 mm² | 5 g |
| collar | 26 × 22 × 12 | 456 mm² | 55 mm² | 13 mm² | 4 g |
| total | 674 cm³ of part | 32 183 mm² | 95 mm² | 53 mm² | 298 g |
It was drawn at 43° to the plate — three degrees under the support threshold, so every slicer would paint it, and you would have printed a 205 mm² ceiling with support scars where the rail has to seat. The ridge is now at Z 83.5, a 49.4° roof. It clears the threshold, and it still leaves 4.5 mm of thread above it for the M4 that presses the rail down.
The half-lap joint keeps the upper half of the section on rail b, so as exported
its 20 mm of lap hung over air: a 118 mm² bridge, which sags, and a sagged lap makes a
kinked rail. It is now printed flipped 180° about X — the lap sits on the bed and
the number is 0 mm². The STL in stl/ is already in that orientation; load it
and print it, do not re-orient it.
What this section is not. It is a measurement of the geometry, not a photograph of a finished part: no physical print of the current model exists yet. What is proved is that no surface exceeds the support threshold, that every part fits a 180 mm bed with its lowest face flat on the plate, and that the thinnest feature in the set is the 1.6 mm slit — four extrusion widths. The rest is your printer's calibration.
You cannot hand the printed parts to a machinist and expect them back as drawn. Three features are print-only: the V-shaped socket roof lives inside the tower where no end mill can reach it from above; the collar's 1.6 mm slit is a saw cut; and each bed half is a 92.3 mm block with a tunnel along X, which is a fourth-axis part. So the machined version is a different set of parts that arrives at the same datum chain — seat 74.000, mirror 77.000, stop 223.000 — so a car cut on either jig comes out the same.
| part | qty | finished | stock | setups | what it does |
|---|---|---|---|---|---|
| base plate | 1 | 285 × 110 × 12 | 288 × 113 × 15 | 2 | ties the saddles together; its eight T-slots hold the fixture to the table |
| saddle | 2 | 24 × 110 × 67.5 | 27 × 113 × 70.5 | 2 | carries the rail at 74.000; the right one is the X stop |
| clamp cap | 2 | 24 × 110 × 8 | 27 × 113 × 11 | 1 | two M5s pull it onto the bar — the machined version of the printed clamp screw |
| collar body | 1 | 12 × 22 × 12 | 15 × 25 × 15 | 1 | clamps the bar and presses the block's end face at x = 0 |
| collar cap | 1 | 12 × 22 × 6 | 15 × 25 × 9 | 1 | closes the collar; two M4s |
| rail | 1 | 6 × 6 × 279 | 6 × 6 ground key stock | bought | the datum itself. Ground stock is straighter than anything you will mill |
Every face on the seven machined parts is either vertical or horizontal — measured, not intended: 0 sloped faces across all seven solids, against 18–86 faces each. That is the definition of 2.5D work. Every pocket is a plunge from one side, every wall is a side cut, and the only thing that changes between setups is which face is up. No part needs a fourth axis, a fixture plate or a sine table.
| part | setup 1 | setup 2 |
|---|---|---|
| base plate | +Z: face to 12.000, two locator shoulders 0.500 deep, eight table slots and their pockets | −Z: four ⌀7 through, four ⌀12 × 6.300 counterbores — heads 0.3 inside the underside |
| saddle ×2 | +Z: face to 67.500 so the top lands at 79.000, rail pocket 6.2 × 5.0, two M5 tapped 12 deep, machine the stop face | −Z: face to 11.500, two M6 tapped 15 deep |
| clamp cap ×2 | +Z: two ⌀5.5 through, two ⌀9 × 5.300 counterbores. Underside left flat | — |
| collar body | +Z: pocket 10.0 × 5.0 open at the top, two M4 tapped 7 deep | — |
| collar cap | +Z: two ⌀4.5 through, two ⌀7.5 × 4.300 counterbores | — |
What this section is not. There is no CAM file here and no machined part has been cut yet: what is proved is that the geometry can be cut by a 3-axis machine — every face axis-aligned, every pocket reachable from +Z in its own setup, two setups maximum per part, standard cutters, no undercuts. The toolpaths, feeds and workholding are still yours to set: clamp the base plate on parallels, hold the saddles in a vice on the 110 mm face, and leave 0.3 mm on the pocket floor until you have indicated the vice flat.
Both versions above depend on hardware: eleven screws and eight T-nuts in the printed one, cap screws and a bought 6 × 6 mm ground bar in the machined one. This version does the same job with zero purchased parts and zero fasteners — and it keeps all three datum numbers: seat 74.000, mirror 77.000, stop 223.000. A car cut on any of the three jigs comes out the same.
| the screwed version needs | this one uses instead |
|---|---|
| 2 × M4 × 8 rail clamps, self-tapped into the towers | a pusher running on a 10° self-locking incline — hand-set, hand-released |
| 1 × M4 × 16 collar screw + the split collar | the same pusher. It bears on the same end face at x = 0 in both ops |
| 8 × M6 × 20 + T-nuts to bolt the bed to the table | the machine vice, gripping the bed's 110 mm width |
| 2 × Ø8 dowels (or printed notches + glue) to join the halves | a plan-view dovetail at plate level: the right half drops over the left's tongue |
| the rail, glued at a 20 mm half-lap | the same two rails, pressed together — no glue needed |
| 11 screw sites | 0 — zh/report.json has
fastener_sites: 0 and an empty hardware list |
Z — the same trick. The 6 × 6 groove nests over the rail. In OP 1 the groove ceiling rests on the rail's top face; in OP 2 the block is rolled 180° about the rail and hangs from its underside. Nothing new here, and that is the point.
X — a wedge you push with your thumb. The right tower is a fixed stop at x = 223. The pusher's back face runs on a 10° incline cut into the left tower, so pushing it down walks it towards the block. 10° is under the friction angle of PLA on PLA (19.3°), so it is self-locking: the block cannot push it back, and lifting it 11.52 mm releases the block. A 40 N push becomes 76 N of clamp force; the two prongs bear on 665 mm² of the block's end face, i.e. 0.114 MPa even at that worst-case push. You should not need it: the clamp only has to beat a couple of newtons of cutter load, and it brings 27 N of friction to do it. Push until it stops moving, no harder. The take-up is 2.0 mm over a 225.0 mm loading gap, so a block anywhere in the official ±0.2 mm on length loads freely and still gets clamped.
The two halves — a dovetail that carries tension. The pusher pushes the left half away from the right half; that load has to go somewhere. A plan-view dovetail at plate level takes it: 38 mm of engagement, a 11.89° undercut, 0.15 mm of clearance. It is checked the only way that proves anything — move the right half 1 mm and measure the interference. Separating them costs 86.7 mm³ of solid collision, so the joint cannot pull apart; lifting the right half costs 0 mm³, so it drops on in seconds. The dovetail carries load only. It never sets a datum — the wedge absorbs any slack.
OP 2 — the improvement, honestly. In the screwed version the flipped block hangs from a 6 × 6 mm printed bar spanning 236 mm, and beam theory says that bar deflects about 0.4 mm under a 50 g foam block (simply supported, E = 3 GPa, I = 108 mm⁴ — calculated, not measured). In OP 1 the block rests on the bar's high ends near the sockets, which is nominal; in OP 2 it hangs from the bar's underside and therefore finds the bar's lowest point at mid-span. The two operations would sit about 0.4 mm apart in Z. That is a real flaw in the screwed version, and it is the one thing this variant fixes: the block rests on plate ribs at Z = 30 mm, so in OP 2 the rail carries none of the block's weight and only ever touches the groove ceiling near its supported ends, where its height is nominal. The pocket floors between the ribs are the same 4 mm plate the model already has.
| file | what it is | qty | size | PLA | support |
|---|---|---|---|---|---|
bed_left.stl | foot, tower, socket, pusher guide, dovetail tongue | 1 | 188 × 110 × 100 | 233 g | none |
bed_right.stl | foot, tower, stop face, dovetail socket | 1 | 135 × 110 × 100 | 181 g | none |
pusher.stl | the clamp: two prongs on a 10° wedge back | 1 | 25 × 60 × 30 | 15 g | 49 mm² bridge |
rail_a.stl | rail, lower half of the lap | 1 | 144 × 5.9 × 6.0 | 5 g | none |
rail_b.stl | rail, upper half — printed flipped 180° about X | 1 | 153 × 5.9 × 6.0 | 5 g | none |
439 g of PLA, about 18–24 h, tallest part 100 mm, largest 188 mm — still inside a 180 mm bed. Total unsupported area across all five parts: 49.1 mm², and it is one 7.1 mm bridge over the slot the rail passes through, which FDM spans without support. Print the pusher as exported — rolling it upright was measured at 476 mm² of unsupported face and rejected.
zero.py rebuilds and re-checks it on every run
(zh/report.json). The first print is the first real test.Every version above asks the same thing of you: pick the block up, turn it over, and put it back on the rail. That lift is the biggest error in the whole process — bigger than any tolerance in the fixture, because it is unmeasured and unrepeatable. This version never lets go of the rail. The rail is the axle. Turn the lever 180°, drop a pin, and you are in OP 2 with the rail still sitting in the same two bearings it started in. Same datum chain: seat 74.000, mirror 77.000, stop 223.000 — a car cut on any of the four jigs comes out the same.
| SLOTRAIL-223-ZH | SLOTRAIL-223-X | |
|---|---|---|
| the flip | lift the block off the rail, turn it, seat it again by hand | a lever throw with a 5 mm detent pin; the block never leaves the rail |
| X clamp | a wedge driven by your thumb, self-locking on friction | 2 × M6 grub screws — set by torque, not by feel |
| block length | 223 mm only | 203–223 mm: the full block down to the shortest legal car, by screwing the jaw in 20 mm |
| the rail | printed, 5.9 mm, one length glued | printed or a bought 6 × 6 mm ground bar — and the sag numbers below say buy the bar |
| deck | plain | tool-setting steps (3 and 6 mm), a Z 80 reference ledge, a hex-key holster, two bolt trays |
| printed mass | 439 g | 448 g |
| hardware | none | 9 pieces, about HK$90 |
| check | result | how it was measured |
|---|---|---|
| the flip, all the way through | 0.000 mm³ | 37 poses from 0° to 180°, axle + block rolled about the rail axis against every static part. Zero at every angle, so the block clears the stands, the caps, the jaw and the deck for the whole arc. |
| part against part, assembled | none | every pair of the ten parts intersected |
| block, both poses | 0.000 mm³ | fixture against the 223 × 65 × 50 block in OP 1 and after the roll |
| capacity | 203–223 mm | jaw at 0, 10 and 20 mm of travel: pad gap 0.000 mm, stop gap 0.000 mm, no block contact |
| index repeatability | 0.19 mm | 5 mm dowel in a 5.05 hole at R17 → 0.17° of index error → the two machined faces meet 0.19 mm out of parallel across the 65 mm width, against a 1.00 mm rules tolerance. Five-to-one inside it. |
| rail sag in OP 2 | 0.61 mm printed 0.01 mm steel |
the block hangs from the rail in OP 2, so the rail's own deflection lands straight in the seam between the two ops. Beam theory over a 291 mm span, 45 g block: PLA droops 0.61 mm, a 6 × 6 steel bar 0.01 mm. This is why the BOM says buy the bar. |
| the bed joint | 14.0 mm³ | the dovetail from 12 inherited unchanged: pull the halves 1 mm apart and they collide, lift them 1 mm and they come free (0 mm³) |
| 448 g | 1058 cm³ of part, 429 mm² needing support, 18–24 h at 2 perimeters and 15 % infill | |
| Appendix ii compliance | 9 / 9 | block bbox 223 × 65 × 50, volume 703,490 mm³ against 703,490 predicted |
index.py rebuilds and re-checks all of it on every run
(index/report.json). The first print is the first real test.All four hold the block by the same 6.00 × 6.00 mm tether groove, put the bottom face at Z 74.000, the mirror plane at Z 77.000 and the X stop at 223.000. A car cut on any of them comes out the same, so choose on cost and on the one error you are most likely to make — not on accuracy.
| SLOTRAIL-223 printed, screwed | -223-M machined | -223-ZH zero hardware | -223-X over-engineered | |
|---|---|---|---|---|
| what you need | a printer | a 3-axis mill + 6061 | a printer | a printer + the bar |
| parts you make | 5 printed | 7 machined + 1 bought bar | 5 printed | 10 printed (11 pieces) |
| what you buy | 11 screws, 8 T-nuts, 2 dowels, CA | 18 fasteners, 6 × 6 ground bar, T-nuts | nothing at all | 9 fasteners, 6 × 6 ground bar |
| tools you use | 3 / 4 mm hex, 3.3 drill | mill, 3.3/4.2/5.0 drills, M4–M6 taps, 4/5 mm hex | thumb, calipers | 4 / 5 mm hex, 5 mm reamer |
| how the block turns | lift it off, turn it, drop it back on | lift it off, turn it, drop it back on | lift it off, turn it, drop it on the ribs | lever + detent pin — the block never leaves the rail |
| how the block is held in X | sliding collar, M4 | sliding collar, 2 × M4 | 10° self-locking wedge, hand push | travelling jaw, 2 × M6 grubs, set by torque |
| capacity | any block up to 223 | any block up to 223 | any block up to 223 | 203 – 223 mm, set by the jaw |
| everything you make | 298 g PLA | 2.0 kg of 6061 | 439 g PLA | 448 g PLA |
| time on the machine | 12 – 20 h printing | 9 setups, no estimate given | 18 – 24 h printing | 18 – 24 h printing |
| largest single part | 153 mm → any 180 mm bed | 288 mm of stock → 300 mm of X travel | 188 mm → needs a 220 mm bed | 179 mm → any 180 mm bed |
| support in the slicer | 94 mm², none of it load bearing | none — it is metal | 49 mm², one 3 mm bridge | 429 mm², 93 mm² of it the detent pin's head |
| the error it deletes | the foam's own thickness, from the flip | printed-plastic creep and how hard you turned the screw | screw torque and every stripped boss you would have had | the lift itself: OP 2 sits 0.19 mm from OP 1, measured on the index |
| what it cannot do | no fine length adjustment; foam-only | cannot be made at home without a mill | no screws means no fine clamp pressure — the wedge is a hand push | 0°/180° only; heaviest; no machined version |
Then the three exceptions, in the order they usually apply:
These are the complete lists. The printed parts have no hidden extras: if it is not on the list, the fixture does not need it. Quantities come from the same models that export the STLs, and every screw site is one the model probed for a head clearance of 0.3 mm.
| item | qty | spec | goes where |
|---|---|---|---|
| bed_left | 1 | 150 × 110 × 92.3 print | left half, carries the rail socket |
| bed_right | 1 | 135 × 110 × 92.3 print | right half, is the X stop |
| rail_a / rail_b | 1 + 1 | 144 / 153 × 5.9 × 6.0 print | glued into one 277 mm bar at a 20 mm half-lap |
| collar | 1 | 26 × 22 × 12 print | slides on the rail, pushes the end face at x = 0 |
| M4 × 8 socket cap | 2 | self-tapping into a 3.3 pilot | one over each rail socket — presses the rail onto its floor |
| M4 × 16 socket cap | 1 | self-tapping into a 3.3 pilot | closes the collar |
| M6 × 20 + T-nuts | 8 | for the table's T-slot | eight counterbored slots, 4 per bed half |
| Ø8 × 25 wooden dowel | 2 | or printed pins | the bed joint — the only thing holding the halves |
| CA glue | 1 | medium | dowels + the rail lap |
| item | qty | finished | stock | note |
|---|---|---|---|---|
| base plate | 1 | 285 × 110 × 12 | 288 × 113 × 15 | 2 setups |
| saddle ×2 | 2 | 24 × 110 × 67.5 | 27 × 113 × 70.5 | 2 setups |
| clamp cap ×2 | 2 | 24 × 110 × 8 | 27 × 113 × 11 | 1 setup |
| collar body | 1 | 12 × 22 × 12 | 15 × 25 × 15 | 1 setup |
| collar cap | 1 | 12 × 22 × 6 | 15 × 25 × 9 | 1 setup |
| 6 × 6 ground key steel | 1 | 279 mm | 282 mm of stock | bought — do not mill this, check it with a micrometer |
| M6 × 45 T-bolt + T-nut | 8 | table | — | through the base plate's eight T-slots |
| M6 × 25 socket cap | 4 | saddles | — | up from under the base into the saddle's tapped M6 |
| M5 × 12 socket cap | 4 | cap clamps | — | two per clamp cap |
| M4 × 10 socket cap | 2 | collar | — | through the collar cap into the body |
| Ø3.3 / 4.2 / 5.0 drill | — | tapping | — | M4, M5, M6 respectively |
Finished sizes are what the model exported; stock is the smallest convenient oversize. The collar is a two-part split clamp — thread it onto the bar before the bar goes near the saddles, because its bore is closed.
| item | qty | note |
|---|---|---|
| bed_left | 1 | 188 × 110 × 100 — needs a 220 mm bed |
| bed_right | 1 | 135 × 110 × 100 — carries the dovetail hooks |
| pusher | 1 | 25 × 60 × 30 — the sliding wedge, printed rolled 90° |
| rail_a / rail_b | 1 + 1 | 144 / 153 × 5.9 × 6.0 — press together at the 20 mm lap |
| everything else | 0 | no screws, no T-nuts, no bought bar, no glue. The dovetail and the wedge are printed in. |
| item | qty | spec |
|---|---|---|
| base left | 1 | 174 × 110 × 100 |
| base right | 1 | 175 × 110 × 122 |
| hub | 2 | 46 × 46 × 18 |
| cap left | 1 | 42 × 92 × 12 |
| cap right | 1 | 20 × 92 × 12 |
| lever | 1 | 34 × 72 × 16 |
| jaw | 1 | 92 × 100 × 30 |
| detent pin | 1 | 12 × 12 × 30 (5 mm spigot) |
| rail a | 1 | 164 × 5.9 × 6 |
| rail b | 1 | 179 × 5.9 × 6 |
| 6 × 6 ground key steel | 1 off | 325 mm |
| M6 grub | 2 off | 60 mm |
| M4 grub | 2 off | 8 mm |
| M4x12 cap | 4 off | — |
| 5 mm dowel | 1 off | 30 mm |
Printed rail sags 0.6 mm in op2; steel sags 0.01 mm.
| thread | pilot / tap | counterbore | head recess | where | how tight |
|---|---|---|---|---|---|
| M4 | 3.3 mm pilot, self-tapping in PLA (measured 3.28) | ⌀7.4 – 7.5, 4.3 deep | 0.3 mm inside | rail clamps, collar, lever, X caps | snug plus an eighth turn — stop at the first creak |
| M5 | 4.2 mm tap drill, M5 tap | ⌀9.0, 5.3 deep | 0.3 mm inside | the two clamp caps on -M | normal machine torque, it is in aluminium |
| M6 | 5.0 mm tap drill, M6 tap | ⌀10.5 (print) / ⌀12.0 (−M), 6.3 deep | 0.3 mm inside | eight bed clamps / four table bolts | bed only — it holds the fixture, not the block |
| M6 grub | 5.0 pilot | — | none — headless | the X jaw | 1.5 N·m is plenty; it is pushing foam |
Three of the four fixtures are printed. This is the complete set: what each part measures,
what it weighs at 15 % infill, and where the slicer will put support. Sizes are bounding boxes
of the exported, print-oriented solids — the same files that are in each stl/
folder — so they are what your slicer will report, not what the design intended.
| part | size (mm) | cm³ | PLA g | support mm² | bridge mm² | how to print it |
|---|---|---|---|---|---|---|
| bed left | 150 × 110 × 92.3 | 338.7 | 146 | 0.0 | 0.0 | as exported, foot on the bed |
| bed right | 135 × 110 × 92.3 | 320.5 | 138 | 40.0 | 40.0 | as exported, foot on the bed |
| rail a | 144 × 5.9 × 6 | 4.7 | 5 | 0.0 | 0.0 | flat, 5.9 across × 6.0 tall — the 6.0 is the datum |
| rail b | 153 × 5.9 × 6 | 5.1 | 5 | 0.0 | 0.0 | flipped 180° about X — lap on the bed, do not re-orient |
| collar | 26 × 22 × 12 | 5.2 | 4 | 54.1 | 12.5 | bore vertical, prints with no support |
| total | 674.1 | 298 | 94.1 | 52.5 |
| part | size (mm) | cm³ | PLA g | support mm² | bridge mm² | how to print it |
|---|---|---|---|---|---|---|
| bed left | 188 × 110 × 100 | 636.6 | 233 | 0.0 | 0.0 | 188 mm — needs a 220 mm bed. Hooks down |
| bed right | 135 × 110 × 100 | 491.4 | 181 | 0.0 | 0.0 | as exported — tongue up, no support under the dovetail |
| pusher | 25.04 × 60 × 30 | 29.0 | 15 | 49.1 | 49.1 | rolled 90° as exported — the 3 mm leg bridges 7 lines |
| rail a | 144 × 5.9 × 6 | 4.7 | 5 | 0.0 | 0.0 | flat, same as 223's rail |
| rail b | 153 × 5.9 × 6 | 5.1 | 5 | 0.0 | 0.0 | flat, lap on the other side |
| total | 1166.8 | 439 | 49.1 | 49.1 |
| part | size (mm) | cm³ | PLA g | support mm² | bridge mm² | how to print it |
|---|---|---|---|---|---|---|
| base left | 174 × 110 × 100 | 366.8 | 148 | 0.0 | 0.0 | as exported — U-cradle up |
| base right | 175 × 110 × 122 | 443.8 | 175 | 72.0 | 16.6 | as exported — cradle and stop up |
| hub | 45.96 × 45.98 × 18 | 29.2 | 13 | 0.0 | 0.0 | on its flat face, bore vertical |
| cap left | 42 × 92 × 12 | 26.6 | 15 | 68.7 | 68.7 | as exported, detent arm up (69 mm² of bridge inside the bore) |
| cap right | 20 × 92 × 12 | 21.6 | 12 | 68.7 | 68.7 | as exported |
| lever | 34 × 72 × 16 | 23.2 | 13 | 126.3 | 23.3 | on its side — 126 mm² of support, the most of any part here |
| jaw | 92 × 100 × 30 | 134.1 | 59 | 0.0 | 0.0 | as exported, pad down |
| detent pin | 11.99 × 11.99 × 30 | 1.0 | 1 | 93.2 | 93.2 | print lying down — upright its head needs 93 mm² of support |
| rail a | 164 × 5.9 × 6 | 5.4 | 6 | 0.0 | 0.0 | flat — or buy the bar and print neither |
| rail b | 179 × 5.9 × 6 | 5.9 | 6 | 0.0 | 0.0 | flat — or buy the bar |
| total | 1057.6 | 448 | 428.9 | 270.5 |
rail 5.90 x 6.00 mm - printed lying down, 6 mm in Z (the datum face)pocket floor 4.00 mm - 10 lines at 0.4, printed as the part's basedovetail flanks are vertical walls - no support, no undercut in Zsocket roof ridge at 49 deg - self supporting by designrail_b is exported flipped; re-orient it and the half-lap hangs over air.
2. The ZH pusher is exported rolled 90°; stand it up and the 10° face becomes a 100 mm
overhang. 3. Every screw pocket is a blind hole that a coarse layer height will bridge
over — check them in the slicer's section view before you commit 20 hours.Start with the comparison: each column is a complete build, and the row you are on is the same decision in all four. Then the numbered sequence for the fixture you are actually building — 04 has the printed version's in full, with the exploded view, and the other three are below it on this page.
| step | SLOTRAIL-223 | −M machined | −ZH zero hardware | −X rotary carrier |
|---|---|---|---|---|
| 1 · bench | Deburr the sockets; check the rail halves roll flat on a table | Stone every edge; check the bar with a micrometer | Snap the two rail halves together at the 20 mm lap | Press a hub onto each end of the joined rail |
| 2 · the bed | CA the two Ø8 dowels, press the halves together, clamp flat while it sets | Base plate on the table, four M6s loose; saddles onto their locator shoulders | Drop the right half's dovetail hooks over the left half's tongue from above | Join the two deck halves the same way — hooks over tongue, straight down |
| 3 · the rail | rail_a into the left socket, rail_b into the right, CA the lap, sight it straight | Bar into the left saddle pocket, right saddle over it, two M5 caps on, 1 mm proud | Slide the rail into the right tower until it butts the blind end, then lay it into the left socket | Lay the rail into both U-cradles; the hubs sit in the cradles, not the deck |
| 4 · the clamp | Collar threaded onto rail_a before the lap is glued | Collar threaded onto the bar end with the block removed — closed bore | Nothing to thread: the wedge is already in the tower's guide channel | Two M4 caps over each cradle, and the lever clamped onto the left hub with its M4 grubs |
| 5 · the block | Groove over the rail, pushed against the right tower's stop face | Groove over the bar, against the right saddle's machined stop face | Groove over the rail, then push the wedge down by the block's rear face | Groove over the rail, jaw behind it, two M6 grubs to the pad |
| 6 · measure | s = groove depth, h = rail height, both with calipers | h = bar height with a micrometer — this is the mirror plane | s and h as 223, plus the rail's blind-end gap (0.4 mm) | s and h, plus the detent's seat: pin should drop 8 mm into the lever |
| 7 · OP 1 → OP 2 | Loosen the collar, lift the block off, turn it 180°, drop it on, re-clamp | Loosen the collar, lift, turn, drop, re-clamp | Lift the wedge, lift the block clear of the towers, roll 180°, lower onto the rail and the ribs, push the wedge down | Back the clamp off two turns, throw the lever, drop the pin, two turns in — the block never leaves the rail |
| 8 · never again | The bed joint, the rail lap, the tower spacing | The base-to-saddle interface once indicated at 74.000 | The dovetail — it lives assembled, it is meant to come apart only to store | The cradle alignment and the lever's hub clamp |
Eight steps is enough to compare, not enough to build from. Each fixture's own section carries the reasoning and the figures; below is the same order written for the bench — parts listed first, then one numbered sequence with the check that catches that step going wrong written into it. The printed version's full sequence with the exploded view is 04. If you skip the checks you are not building a jig, you are guessing at the datum with extra steps.
You need: base, 2 saddles, 2 clamp caps, collar body + cap, one 6 × 6 × 325 mm ground bar, 8 × M6 T-bolts + T-nuts (table), 4 × M6 × 25 (saddles), 4 × M5 × 12, 2 × M4 × 10. Figure: 11.
You need: 2 bed halves, pusher, 2 rail halves. No fasteners, no bar, no glue. Figure: 12.
You need: 2 bases, 2 hubs, 2 caps, lever, jaw, detent pin, 2 rail halves (or one bought 6 × 6 × 325 bar), 4 × M4 × 12 caps, 2 × M4 × 8 grubs, 2 × M6 × 60 grubs, 5 mm dowel. Figure: 13.
This is the table to keep open at the machine. The first four rows are the datum chain and they are the same in all four fixtures — that is the whole point of building four of them. Where a row differs, the difference is a design decision, not a tolerance.
| quantity | SLOTRAIL-223 | −M machined | −ZH zero hardware | −X rotary carrier |
|---|---|---|---|---|
| seat (rail bottom face) | 74.000 | 74.000 | 74.000 | 74.000 |
| rail top face | 80.000 | 80.000 | 80.000 | 80.000 |
| mirror plane | 77.000 | 77.000 | 77.000 | 77.000 |
| X stop | 223.000 | 223.000 | 223.000 | 223.000 |
| block, OP 1 (world Z) | 74 – 124 | 74 – 124 | 74 – 124 | 74 – 124 |
| block, OP 2 (world Z) | 30 – 80 | 30 – 80 | 30 – 80 | 30 – 80 |
| what holds the block in OP 2 | the rail alone | the bar alone | the rail locates, seven ribs at Z 30 carry it | the rail alone — which is why it wants steel |
| overall length, X | 285 | 285 | 285 | 301 |
| overall width, Y | 110 | 110 | 110 | 110 |
| height above the table | 92.3 | 88 | 100 | 124 |
| clamp travel / capacity | collar, unlimited up to 223 | collar, unlimited up to 223 | wedge, 2 mm of push | jaw, 20 mm → 203 – 223 |
| parts to make | 5 printed | 7 machined + 1 bought | 5 printed | 10 printed / 11 pieces |
| mass | 298 g PLA | 2.0 kg 6061 | 439 g PLA | 448 g PLA |
| fixture | X zero | Z zero | the number you must measure first |
|---|---|---|---|
| 223 | right tower's stop face at 223.000 | rail top face, both operations | rail height h, at three places |
| −M | right saddle's machined stop face | bar top face — the bar sits 1.0 mm proud, so it is reachable with a probe | bar height with a micrometer: ground stock is 5.95–6.00, and the mirror plane moves with it |
| −ZH | right tower's stop face | rail top face | rail height, plus the 0.4 mm blind-end gap so the rail cannot creep in X |
| −X | right deck's stop face at 223.000, with the jaw set to your block length | rail top face — the same face in both index positions | rail height, and whether your block is short: the jaw covers 20 mm of it |
Every row is produced by a script that raises and exports nothing if the check fails, so a STL in these folders is a STL whose numbers passed. The last column says where to look if you want to argue with one.
| claim | which | measured value | passes if | where it is proved |
|---|---|---|---|---|
| block model vs Appendix ii | all four | 9 / 9 exact, bbox 223 × 65 × 50 | every official dimension within 0.01 | each report: compliance_block |
| block volume vs predicted | all four | 703,490 mm³ vs 703,490 | error under 0.1 % | index/report.json · compliance |
| fixture ∩ block, OP 1 / OP 2 | all four | 0.000 / 0.000 mm³ | exactly zero | interf_op1/op2_mm3 on every part |
| fixture ∩ tool envelope | all four | 0.000 / 0.000 mm³ | nothing in the cutter's way | tool_op1/op2_mm3 |
| part against part | all four | none intersect | no pair overlaps | pairs empty |
| groove ceiling on the rail | 223 · −ZH · −X | 0.000 / 0.000 mm | contact, not a gap | op1/op2_groove_gap |
| the flip, all the way through | −X only | 0.000 mm³ over 37 poses | zero at every angle from 0° to 180° | index/report.json · sweep |
| block drop corridor | −ZH | 0.000 mm³ with the pusher retracted 2 mm | the block lowers on without touching | drop_path_op1/op2_mm3 |
| capacity 203 / 213 / 223 | −X | pad gap 0.000, stop gap 0.000, no block contact | jaws touch without interfering | capacity |
| index error after a flip | −X | 0.17° → 0.19 mm | inside the 1.00 mm rules tolerance | detent.parallelism_err_mm |
| hex key reaches every screw | 223 · −X | 11 / 11 sites · 0.000 mm³ corridor with a 59.5 mm key | no blocked fastener | stress.py · index hexkey |
| screw heads inside the outer face | 223 · −M · −X | 11 · 10 · 4 sites, 0.3 mm each | 0.3 mm minimum, probed tightened | screws[].recess_mm |
| the pilot is a pilot | 223 · −X | 3.28 mm measured, target 3.3 ± 0.2 | the screw bites, it does not spin | screw_pilot_dia_mm |
| printable | 223 · −ZH · −X | 94 · 49 · 429 mm² of support | no part needs a raft or a redesign | print_report.json |
| fits a printer | 223 · −X | largest part 153 / 179 mm | inside a 180 mm bed | fits_180_bed |
| fits a printer | −ZH | 188 mm — does not | needs a 220 mm bed | fits_180_bed: false |
| 3-axis machinable | −M | 172 faces, 0 sloped | every face horizontal or vertical | planar_2_5d |
| cutter and depth | −M | deepest pocket 5.0 mm = 1.7 × ⌀3, min radius 1.65 mm | no tool smaller than ⌀3, no 4th axis | plan.planar_2_5d |
| the bed joint cannot pull apart | −ZH · −X | 86.7 · 14.0 mm³ on 1 mm separation | locks sideways, free vertically | joint_check |
| the wedge holds without a screw | −ZH | 10.0° wedge < 19.29° friction → holds 76 N, 26.6 N of friction | friction exceeds the 20 N cutter load | pusher_wedge |
| rail sag in OP 2 | −X | 0.61 mm printed, 0.01 mm steel | under 0.05 mm for a good seam | rail_sag |
| why not 90° | −X | 0.95° droop → 0.83 mm | would need a clevis with no play | why_not_90 |
| open question | why the model cannot answer it | the test that settles it |
|---|---|---|
| does the rail fit the real groove? | the block's groove is 6.00 ± 0.20 and the printed rail is 5.9; 0.1 mm of clearance lives inside the printer's own error | print the two rails, measure the 5.9 face, slide a block on. If it rattles, print again at your measured groove width − 0.1 |
| is the glued 277 mm rail straight? | straightness is a property of how you clamped the lap, not of the model | roll it on a granite plate or a glass table and sight it; 0.05 mm of bow over 277 mm is what the seam can absorb |
| does the flip repeat? | the 0.19 mm index number on −X is arithmetic on a 5.05 mm hole, not a measurement | machine a flat on both sides, flip, and indicate the first face: the reading is your real repeatability |
| does the fixture survive a season? | creep, wear and screw-boss fatigue are time-dependent | assemble and disassemble 20 times, then re-measure the seat. −M is the version to trust here |
| is any of it printable at all? | slicer behaviour differs from a support-area calculation | slice it and look at the section view around every screw pocket and the rail socket |
Nothing here is a one-off export: every STL is regenerated by a script that first re-proves the geometry. If you change a number, the checks re-run and a failure means nothing is exported — a broken fixture cannot silently reach your slicer.
| file | what it is | writes | run it if… |
|---|---|---|---|
jig.py | the printed fixture, parametric build123d | stl/, step/, report.json | you changed a block dimension or a rail width |
cnc.py | the machined fixture | cnc/stl, cnc/step, cnc_report.json | you are making the metal version |
zero.py | the zero-hardware fixture | zh/stl, zh/step, zh/report.json | you are printing ZH |
index.py | the rotary-carrier fixture | index/stl, index/step, index/report.json | you are printing X |
render.py · cnc_render.py · zero_render.py · index_render.py | the figures on this page | img/*.png | you moved a part and want the picture to agree |
stress.py | the adversarial pass: corridors, hex keys, screw bite | console output | you want to know whether a human can assemble it |
print_check.py | overhang, bridging, bed fit, filament estimate | print_report.json | after any geometry change |
make_guide.py | this document | guide.html | after any report changes |
verify_guide.py | measures the rendered page: anchors, overflow, ragged tables | console output | after editing this document |
| you want | change this | in | then run |
|---|---|---|---|
| a different block size | BLOCK_L / BLOCK_W / BLOCK_H, and STOP_X | the P block at the top of each script | all four scripts + make_guide.py |
| a bought 6 × 6 bar instead of printed rails | socket_w → 6.2, rail_w → your measured bar | jig.py / zero.py / index.py | the script, then print_check.py |
| to fit a block whose groove is tight | rail_w → measured groove − 0.1 | the same three scripts | the script |
| more X capacity | JAW_X travel (X) or the collar's slide (223 / −M) | the script's parameter block | the script — capacity checks re-run |
| a steel rail on the printed fixture | rail_h → your bar height, rail_w → 6.2 | jig.py | the script |
| a taller tower for a long tool | TOWER_TOP / STAND_TOP | the script's parameter block | the script — the clearance checks are geometry, so they follow |
make_guide.py reads
the six report files and builds every table from them, then inlines each figure as base64 so the
result is one 420 kB file you can email. verify_guide.py then measures the rendered
page in a headless browser: every nav link resolves, no element overflows, no table has ragged
columns, and the document is 1240 px wide with no horizontal scroll. Change a report, rebuild,
and the numbers here move with it.| symptom | cause | fix |
|---|---|---|
| block rattles or rocks on the rail | groove wider than the rail by more than 0.2 mm | one wrap of masking tape on the rail's top face, or print the rail
again at rail_w = your measured groove width − 0.1 |
| block slides along the rail while cutting | collar loose, or not touching the end face | push the block against the stop, slide the collar up to it, tighten |
| halves offset at the seam in X or Y | block not pushed against the stop the second time, or the rail is bowed | re-seat; check the rail with a straight edge — a glued lap that was clamped crooked is the usual culprit |
| seam step in Z of ~0.3 mm | s assumed to be 6.00 | measure s and h, use the table in 05 |
| tool or collet nut hits a tower | stickout under 12 mm, or the car runs into the end band | ≥ 14 mm stickout, car ≤ 203 mm |
| block drops during OP 2 | the groove's walls were machined away | re-design so the 6 mm channel survives; there is no second datum |
| a rail clamp screw turns freely and never bites | it is in a clearance hole, not a pilot | the tower is self-tapping: the hole must measure Ø3.3, and
jig.py now refuses to export unless it does. If you printed from an
older STL, drop a 3.3 mm drill through it |
| symptom | version | cause | fix |
|---|---|---|---|
| the detent pin will not drop into the lever | −X | the 5.05 hole was printed with a blob at its mouth, or the cap's arm is 0.2 mm off the lever's boss | run a 5.0 drill through by hand, then check the arm: with the pin out, the lever should rock against the cap's stop, not the arm |
| the jaw binds and jumps instead of sliding | −X | the two M6 grubs are at different depths, so the jaw is being cocked in its guide | back both out two turns, push the jaw home by hand, then bring the grubs in alternately a quarter turn at a time |
| the lever turns but feels notchy | −X | the cradle caps are pinching the hubs — the caps clamp the deck, and the hub should be a slip fit | back each cap screw an eighth of a turn; the hub should spin with a finger and have no visible play |
| the block scores on its end face after a few flips | −X | you flipped with the clamp on | two turns out, lever, pin, two turns in — see 13 |
| the two bed halves will not drop together | −ZH · −X | the dovetail's 11.9° flanks printed 0.2 mm fat, which is normal on a vertical wall with elephant's foot | sand the tongue's flanks with 240 grit until the halves drop on by their own weight, then check that lifting them 1 mm still frees them |
| the wedge slips back while cutting | −ZH | dust on the 10° face, or you pushed it down at an angle so only one flank is loaded | wipe both faces, rub a pencil on the incline (graphite is a dry lubricant that keeps the self-locking angle honest), and push straight down on the crown |
| the pusher's prongs hit the rail end | −ZH | the rail is not fully into the right tower's blind end | push the rail in until it butts — there is a 0.4 mm designed gap, and the prongs clear the rail by 0.45 mm only when it is home |
| the block still rocks after the wedge is down | −ZH | the wedge has taken up its 2 mm and your block is short | that is the designed limit: cut a 3 mm spacer from the same filament and put it behind the pusher, or use 223 / −X, which have 20 mm of travel |
| the machined bar is not 1.0 mm proud | −M | the pocket floor has R1.5 fillets from the ⌀3 cutter and the bar is sitting on them | relieve the bar's two bottom edges 1.5 × 45° — that is what the chamfer pass in 11 is for |
| the machined cap pulls the bar off centre | −M | one M5 was tightened before the other, so the cap tilted and walked the bar | snug both M5s, then torque in pairs, alternating sides |