Skip to content

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

  1. CNC cut all panels from a single sheet of 0.46" plywood
  2. Drill shelf pin holes and caster bolt holes as marked (HOLES layer)
  3. Slide side panels onto back panel — beveled fingers self-align and wedge tight
  4. Fit top panel — slide back finger joints down into back panel slots, side slots onto side panel center fingers
  5. Fit bottom panel — same as top
  6. Mount caster wheels on bottom panel with M5 bolts (4 corners, 1.5" × 1.5" pattern)
  7. 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 $INSUNITS in 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