Fab Academy — Week 07¶
Computer-Controlled Machining¶
Project: Parametric Flat-Pack Cabinet¶
March 2026
Overview¶
This week's assignment involved designing and generating CNC-ready files for a flat-pack cabinet. The process covered extensive research into joinery methods, multiple design iterations, parametric file generation using Python, and troubleshooting DXF compatibility with Fusion 360. The full design journey is documented below.
1. Starting Point — Living Hinge Research¶
The Goal¶
The initial concept was to cut the back panel and two side panels as a single flat piece of plywood, connected by living hinges that would fold 90° to form a U-shaped cabinet body.
FLAT LAYOUT:
[LEFT SIDE] ~~living hinge~~ [BACK PANEL] ~~living hinge~~ [RIGHT SIDE]
ASSEMBLED (top view):
[BACK]
[L] [R]
90°
Where to Find Living Hinge Files¶
Researched the following sources for pre-made living hinge DXF/SVG files:
- Thingiverse — search
"living hinge"for ready-made rectangular panels - Instructables — search
"living hinge laser cut"— often includes DXF files - Makercase.com — generates laser cut boxes with living hinge options, exports DXF
The best tool found was Boxes.py (https://boxes.py): - Free, browser-based - Generates living hinge patterns specifically for bending - Exports SVG/DXF ready to cut - Dimensions are fully configurable
Boxes.py Configuration¶
Found the "Box with living hinge and round corners" (FlexBox) generator and configured it with the cabinet dimensions:
| Parameter | Value | Notes |
|---|---|---|
| sx | 406mm | Width 16" |
| y | 95mm | Depth 3.75" |
| h | 787mm | Height 31" |
| outside | ✅ checked | Treat as outer dimensions |
| radius | 15mm | Default |
| thickness | 12.7mm | 0.5" plywood |
| burn | 0.15mm | Kerf compensation for CNC router |
| format | SVG/DXF | For Fusion 360 import |
Problem: Living Hinges Won't Work for 0.5" Plywood¶
After generating the file, the preview showed only 2 thin hinge strips — far too narrow for thick plywood to flex without cracking.
Why it fails — the math:
Minimum hinge width needed = bend radius × π/2
= 12.7mm × 1.57
≈ 20mm minimum hinge zone
Generated strips were approximately 5–10mm wide → will crack
Additionally, Boxes.py generates a fully closed box, not the fold-flat U-shape needed for this design. The living hinge sections were designed for decorative rounded corners on a lid, not for folding structural panels.
Conclusion: Living hinges are not suitable for 0.5" (12.7mm) plywood. They work reliably at 3mm (1/8") material maximum.
2. Redesign — Wooden Dowel Hinge Joints¶
Concept¶
Replace living hinges with wooden barrel-style dowel hinges — interlocking knuckles CNC-cut directly into the panel edges, with a wooden dowel rod passing through as the pivot pin.
The design was specified as follows:
| Decision | Choice | Reason |
|---|---|---|
| Hinge positions | Top, middle, bottom of each joint | Even load distribution |
| Fold range | Completely flat (180°) for storage | Flat-pack requirement |
| Dowel material | Wood dowel rod | No metal hardware |
| Top/bottom joints | Finger/box joints | Simple and strong |
| Caster wheels | 4 corners | Mobility |
| Caster bolt pattern | 1.5" × 1.5" standard | Industry standard |
Cabinet Dimensions¶
| Parameter | Imperial | Metric |
|---|---|---|
| Height | 31" | 787mm |
| Width | 16" | 406mm |
| Depth (shelf depth) | 3.75" | 95mm |
| Material thickness | 0.5" → measured 0.46" | 12.7mm → 11.68mm |
| Shelf width (inside) | 15.08" | 383mm |
Note: Material thickness was later measured at 0.46" (not the nominal 0.5") and all files were updated accordingly. This affects shelf width and joint depths throughout.
Dowel Hinge Specification¶
| Parameter | Value |
|---|---|
| Dowel rod diameter | 3/8" (9.5mm) |
| Hole diameter | 13/32" (10.5mm) — loose fit for pivot |
| Knuckle size | 1.5" × 1.5" (38mm × 38mm) |
| Positions per joint | 3 — 50mm from top, center, 50mm from bottom |
| Fold range | 0° (flat) to 90° (assembled) |
Flat Fold Geometry¶
For the cabinet to fold completely flat, the knuckles on each panel must interleave — the back panel has 2 knuckles with a gap between them, and the side panel has 1 knuckle that fits into that gap:
BACK panel edge: [knuckle] ─── gap ─── [knuckle]
SIDE panel edge: [knuckle]
↑
fits into gap, dowel through all 3
Shelf Pin Holes¶
| Parameter | Value |
|---|---|
| Hole diameter | 5mm standard shelf pin |
| Row spacing | 1" (25.4mm) increments |
| Columns per side panel | 2 (front and back inset) |
| Inset from edge | 3/4" (19mm) |
| Clear zone top/bottom | 2" (50mm) no-pin zone |
Caster Bolt Holes¶
| Parameter | Value |
|---|---|
| Quantity | 4 corners of bottom panel |
| Hole diameter | 5mm (M5 bolt) |
| Bolt pattern | 1.5" × 1.5" (38.1mm) |
| Inset from corner | 1" (25.4mm) |
3. Python DXF File Generation¶
Approach¶
Rather than using Boxes.py (limited to closed boxes), a custom parametric Python script was written to generate all panels as a CNC-ready DXF file. All key dimensions are defined at the top of the script — change the parameters and regenerate.
Parametric Parameters¶
T = 0.46 # material thickness (inches)
W = 16.0 # cabinet width
D = 3.75 # cabinet depth / shelf depth
H = 31.0 # cabinet height
NUM_SHELVES = 2 # number of shelf panels
SHELF_PIN_SPACING = 1.0 # shelf pin row spacing (inches)
All other dimensions (shelf width, finger counts, joint positions, caster offsets) calculate automatically from these values.
Panels Generated¶
| Panel | Size (inches) | Qty | Details |
|---|---|---|---|
| Back panel | 15.08" × 31" | 1 | Beveled joints on side edges, finger joints top/bottom |
| Left side panel | 3.75" × 31" | 1 | Beveled joint on joining edge, shelf pin holes |
| Right side panel | 3.75" × 31" | 1 | Beveled joint on joining edge, shelf pin holes |
| Top panel | 15.08" × 3.75" | 1 | Slots for back and side joints, plain front edge |
| Bottom panel | 15.08" × 3.75" | 1 | Slots + 4× caster bolt hole patterns |
| Shelf | 15.08" × 3.75" | 2 | Plain rectangle, rests on shelf pins |
DXF Format Notes¶
The file uses DXF R12 (AC1009) format — the most universally compatible version for Fusion 360 import. Earlier attempts with a minimal DXF format failed to import with the error "Fails to insert this DXF file!". Switching to R12 with proper HEADER, TABLES, LTYPE, BLOCKS, and ENTITIES sections resolved the issue.
To import into Fusion 360: 1. Insert → Insert DXF 2. Select a plane (XY plane) 3. Set units to inches 4. Click OK
4. Hinge Joint Iteration Problems¶
Multiple Failed Attempts¶
The dowel knuckle hinge geometry went through several iterations, all producing incorrect results in Fusion 360:
| Version | Problem |
|---|---|
| v1 | Semicircle arcs overlapping the panel body |
| v2 | Corrected arc centers — still misaligned in preview |
| v3 | Separate back/side edge functions written — both panels rendered identical knuckles |
| v4 | Explicit geometry rewrite — arcs still rendering incorrectly |
| v5 | Full rewrite with simple line+arc per knuckle — still not interlocking correctly |
The core issue was that DXF arc geometry (center point, radius, start/end angles) was consistently producing unexpected shapes in Fusion 360's DXF interpreter, even when mathematically correct.
Decision¶
Removed dowel hinges entirely. The arc-based geometry proved unreliable across DXF viewers. Replaced with beveled finger joints — simpler geometry using only straight lines, no arcs.
5. Final Joint Design — Beveled Finger Joints¶
Concept¶
Beveled (dovetail-style) finger joints on the vertical connecting edges between back and side panels. Each finger is wider at its base than its tip due to the bevel angle — when the panels are slid together the fingers wedge tight and lock without glue or hardware.
BACK panel edge: SIDE panel edge (inverse):
──┐ ──────
└──► finger out ┌──► slot (receives finger)
──┘ └──────
────── ──┐
slot finger──┘
────── ──┘
Beveled Joint Specification¶
| Parameter | Value |
|---|---|
| Fingers per edge | 9 (must be odd for symmetry) |
| Bevel angle | 15° per side |
| Finger depth | Equal to material thickness (0.46") |
| Back panel | Fingers on odd-indexed rows |
| Side panel | Fingers on even-indexed rows (inverse/matching) |
Top/Bottom Joint Specification¶
The top and bottom panels connect to the back and side panels using a specific finger pattern:
Back panel top/bottom edges:
| Parameter | Value |
|---|---|
| Number of fingers | 3 |
| Finger width | 1.25" each |
| Protrusion past panel edge | 0.5" |
| Spacing | Evenly distributed across 15.08" width |
Side panel top/bottom edges:
| Parameter | Value |
|---|---|
| Number of fingers | 3 |
| Center finger protrusion | 0.5" past panel edge |
| Outer 2 fingers | Flush — no protrusion |
Top/bottom panel receiving edges:
| Edge | Detail |
|---|---|
| Back edge | 3 slots × 1.25" wide × 0.5" deep (receives back panel fingers) |
| Side edges | 1 center slot × 0.5" deep each (receives side panel center finger) |
| Front edge | Plain straight line — open front |
| Width | 15.08" (SHELF_W) — matches back panel width |
DXF Layer Guide¶
| Layer | Color | CNC Action |
|---|---|---|
| CUTS | White | Cut — all panel outlines and joints |
| HOLES | Red | Drill — shelf pin holes and caster bolt holes |
6. Issues Found and Fixed During Development¶
Panel Closure Issue¶
Top and bottom panels were not closed — the left and right edge lines were missing due to incorrect argument order in the side_slot_edge() function (x and y coordinates were transposed). Fixed by rewriting the function with explicit vertical edge geometry.
Shelf Holes on Wrong Panel¶
Shelf pin holes were appearing on what appeared to be the top panel area in Fusion 360. This was a layout spacing issue — the top panel was being placed too close to the side panels. Fixed by adjusting layout Y offsets and confirming shelf holes are only generated inside the side_panel() function.
Units Mismatch¶
Initial DXF files were generated in mm. Fusion 360 was interpreting them as inches, making all panels appear ~25× too large. Regenerated all files in inches with $INSUNITS = 1 (inches) in the DXF header.
Material Thickness Correction¶
Nominal 0.5" plywood measured at 0.46" with calipers. Updated T = 0.46 in the script — all joint depths, shelf width, bevel calculations, and hole insets automatically updated.
7. Assembly Instructions¶
- CNC cut all panels from a single sheet of 0.46" plywood
- Drill shelf pin holes and caster bolt holes as marked (HOLES layer)
- Slide side panels onto back panel — beveled fingers self-align and wedge tight
- Fit top panel — slide back finger joints down into back panel slots, side slots onto side panel center fingers
- Fit bottom panel — same as top
- Mount caster wheels on bottom panel with M5 bolts (4 corners, 1.5" × 1.5" pattern)
- Insert shelf pins at desired heights and add shelves
8. Files¶
| File | Description |
|---|---|
cabinet_v9.dxf |
Final CNC-ready layout — all 7 panels, inches, R12 format |
generate_cabinet_v9.py |
Parametric Python script — edit top section to change any dimension |
cabinet_parametric.dxf |
Earlier mm version (reference only) |
9. Key Learnings¶
- Living hinges need thin material — 3mm (1/8") maximum. 0.5" plywood will crack at any reasonable hinge width
- Boxes.py generates closed boxes — not suitable for fold-flat open furniture; good for laser-cut boxes
- DXF arc geometry is unreliable across different CAD importers — when possible, approximate curves with short line segments
- DXF R12 (AC1009) is the safest format for Fusion 360 compatibility; minimal DXF files without TABLES and BLOCKS sections will fail to import
- Always set
$INSUNITSin the DXF header — without it, units are ambiguous and Fusion 360 may misinterpret scale - Measure your actual material — nominal 0.5" plywood measured 0.46". Parametric design made this a one-line fix
- Finger count must be odd for symmetrical finger joints
- Beveled/dovetail fingers lock without glue — the 15° bevel creates a mechanical wedge that tightens as the joint is pushed together
- Python is practical for parametric CNC file generation — faster iteration than CAD software for simple flat-panel designs
Fab Academy 2026 — Week 07 Computer-Controlled Machining Documentation