Disclosure: I work at AcrylicDis, a UK company that makes acrylic display cases. This post is about the maths and materials behind them, not a product pitch.
Building an enclosure for a scale model looks trivial: five sheets of clear plastic and a base. In practice, the difference between a case that looks professional and one that looks home-made comes down to a few numbers: clearance, panel thickness, kerf and how the cover meets the base. Here is how we reason about them, with a small Python script you can adapt for your own maker projects.
1. Start with the object's bounding box
Measure the model at its extremes: tip of the front wing to the back of the rear wing, mirror to mirror, base to the highest point (often an airbox, aerial or rear wing). Measure with callipers or a steel rule, not a tape, and round up to the nearest millimetre.
For a large 1:8 F1 car like the RB20, length dominates. For LEGO Technic supercars, height is the one people get wrong.
2. Add clearance
Clearance does two jobs: aesthetics (the model needs visual "breathing room") and practicality (you have to lower the cover over it without clipping a mirror).
The rule of thumb we use:
- Sides and ends: 5–8% of the dimension, minimum 20 mm.
- Top: 8–10% of height, minimum 30 mm.
Percentages scale nicely: a 1:43 car does not need 30 mm per side, and a 60 cm model looks cramped with only 20 mm.
3. Choose panel thickness from the longest span
Acrylic deflects under its own weight and from handling. The longer the unsupported panel, the thicker it needs to be. Rough guidance for a five-sided box with bonded edges:
| Longest panel span | Suggested thickness |
|---|---|
| up to 300 mm | 3 mm |
| 300–600 mm | 4–5 mm |
| 600–900 mm | 5–6 mm |
| over 900 mm | 8 mm+ or add a frame |
Deflection scales with the cube of the span and the inverse cube of thickness, so doubling the span without changing thickness gives roughly eight times the sag. That is why long, low F1 cases benefit from a step up in sheet thickness.
Use cast acrylic rather than extruded if you can. Cast sheet has fewer internal stresses, so it is less prone to crazing at bonded joints and polishes better on laser-cut edges.
4. Account for kerf and joint geometry
A CO₂ laser removes a strip of material, the kerf, typically 0.1–0.3 mm depending on lens, power and thickness. If you draw parts at nominal size, every piece will be slightly small and a five-sided box can end up 0.5 mm out at the corners.
Two practical rules:
- Offset cut paths outward by half the kerf (most CAM software can do this for you).
- Decide which panels overlap which. On a typical cover, the side panels sit inside the front and back panels, and the top sits over everything. The external size is then internal size plus 2 × thickness.
Tolerance between the cover and the base matters too. We aim for about 0.5–1 mm total gap around a recessed groove. Tighter than that and seasonal expansion makes the cover stick. Acrylic's thermal expansion is around 70 × 10⁻⁶ /°C, roughly eight times that of glass. Looser and dust gets in.
5. The script
from dataclasses import dataclass
import math
@dataclass
class Model:
length_mm: float
width_mm: float
height_mm: float
def clearance(dim, pct, minimum):
return max(dim * pct, minimum)
THICKNESS_TABLE = [(300, 3), (600, 5), (900, 6), (math.inf, 8)]
def thickness_for(span_mm):
for limit, t in THICKNESS_TABLE:
if span_mm <= limit:
return t
def size_case(m: Model, kerf=0.2):
inner_l = m.length_mm + 2 * clearance(m.length_mm, 0.06, 20)
inner_w = m.width_mm + 2 * clearance(m.width_mm, 0.06, 20)
inner_h = m.height_mm + clearance(m.height_mm, 0.09, 30)
inner = [math.ceil(x) for x in (inner_l, inner_w, inner_h)]
t = thickness_for(max(inner[0], inner[2]))
outer = (inner[0] + 2 * t, inner[1] + 2 * t, inner[2] + t)
panels = {
"top": (outer[0], outer[1]),
"front": (outer[0], inner[2]),
"back": (outer[0], inner[2]),
"left": (inner[1], inner[2]),
"right": (inner[1], inner[2]),
}
# Offset by half kerf on every edge for cutting
cut = {k: (a + kerf, b + kerf) for k, (a, b) in panels.items()}
return inner, outer, t, cut
if __name__ == "__main__":
f1_1to8 = Model(length_mm=700, width_mm=250, height_mm=140)
inner, outer, t, cut = size_case(f1_1to8)
print(f"Inner: {inner} mm, outer: {outer} mm, sheet: {t} mm")
for name, (a, b) in cut.items():
print(f"{name:>6}: {a:.1f} x {b:.1f} mm")
For a model measuring 700 × 250 × 140 mm, this gives an internal size of 784 × 290 × 170 mm and recommends 6 mm sheet. You can feed the panel list straight into your nesting tool.
6. UV: what acrylic does and does not block
Standard clear PMMA absorbs most UV-B but lets a fair share of UV-A (315–400 nm) through, and UV-A is what fades red paint and yellows white ABS. Options, from cheapest to most effective:
- Placement: keep the case out of direct sun. This beats everything else.
- LED lighting: negligible UV and little heat compared with halogen.
- UV-filtering acrylic grades: these block most radiation below about 380–400 nm, for a modest price premium.
7. Finishing details that matter
- Flame-polish or diamond-polish edges only after cutting; laser-cut edges on cast acrylic are already glossy.
- Use solvent cement (capillary type) for invisible joints; cyanoacrylate fogs acrylic.
- Peel the protective film only at assembly, and keep alcohol-based cleaners away from bonded joints to avoid stress cracking.
Wrapping up
Treat an enclosure like any other small engineering problem: measure the envelope, add proportional clearance, choose thickness from the span, compensate for kerf, and design the cover-to-base interface with thermal movement in mind. The script above is a decent starting point for any clear-box project, from model cars to electronics showcases.
If you want to see how these principles turn into finished cases for F1, supercar and LEGO Technic models, here is where I work: acrylicdis.co.uk.
Top comments (0)