skills/lab-hardware-cad/references/optomechanics.md
Parts that bolt to an optical table, join a cage system, hold an optic or a sample in a beam path, or carry a camera or objective.
Verified dimensions are in assets/standards.json:
python scripts/check.py standards --show optical-breadboard-metric
python scripts/check.py standards --show cage-system-30mm
python scripts/check.py standards --show sm1-lens-tube-thread
Metric and imperial optical hardware are not interchangeable, and the difference is small enough to look like a rounding error and large enough to prevent assembly.
| Metric | Imperial | |
|---|---|---|
| Grid pitch | 25.0 mm | 25.4 mm (1 inch) |
| Tapped hole | M6 x 1.0 | 1/4-20 UNC |
| Typical border | 12.5 mm | 12.7 mm |
Over a four-hole span the grids differ by 1.6 mm — far more than any clearance hole absorbs. There is no way to infer which the user has from the request. Ask. If the answer is unavailable, model the mounting features as slots along the bolt line rather than round holes, which tolerates both, and say that is what you did and why.
Common conventions, which vary by vendor — confirm against the catalogue before use:
Beam height is a project-wide constant, not a per-part choice. Every mount on the table must
put its optic at the same height. Common conventions are 3 inches (76.2 mm) or 100 mm, but this is
a lab-by-lab choice. Ask for the number, define it once as beam_height_mm, and derive every
mount's optic centre from it.
The dominant convention for small free-space assemblies:
For a custom cage plate: place four bores on a 30 mm square, put the aperture at the centroid of those four bores, and bore them for a free-sliding fit at your process's clearance (fabrication-limits.md): about 6.2 mm CNC, 6.4 mm SLA, 6.8 mm FDM. 6.1 mm is a reamed-metal number — printed bores come out undersize, and four bores on a common square over-constrain each other, so tighter is not better here. A cage plate that binds on the rods is worse than useless because it transmits stress into the whole assembly.
Cage plates stack along the rods, so a custom plate's thickness directly consumes optical path length. Budget it.
SM1 is a 1.035 inch-40 thread, which holds Ø1 inch (25.4 mm) optics. That is a 0.635 mm pitch.
Do not print SM threads. A 0.635 mm pitch is at or below the practical resolution of FDM and marginal on desktop SLA; a printed SM1 thread will either not engage or will gall and shed particles into the beam path. Instead:
If the design truly requires a printed thread, say explicitly that it needs test printing and is likely to fail.
clear_aperture_mm as a named parameter and confirm in the snapshot that nothing
intrudes on it.Geometry is not the whole design here, and a STEP file cannot show any of this:
Flag these to the user; do not silently assume a printed enclosure is light-tight.
python scripts/gen.py mount_model.py --outdir out/
python scripts/check.py facts out/mount.step
python scripts/check.py interfaces out/mount.manifest.json
python scripts/snapshot.py out/mount.step --out out/mount.png
Declare the grid pitch, rod spacing, and bore diameters in the model's interfaces() against
optical-breadboard-metric, optical-breadboard-imperial, or cage-system-30mm, so the check
catches a 25.0-for-25.4 substitution rather than leaving it to a reader.
There is still no automatic bolt-pattern check — the interface check compares dimensions, not
hole positions. Compute the pattern in the model from a named grid_pitch_mm constant, and confirm
in the snapshot that: