# 3D printing

Make a personalized, printable object without CAD: a keychain, an event badge holder, a
labeled Gridfinity bin or a phone stand. Every object is a parametric file built in
manifold-3d. The CLI and `/make/print` run the same build, so the same parameters give the
same file. Only make physical objects from this catalog; do not hand-write STL.

## Workflow

1. `makeables print list` returns every object with its parameters (name, type, range,
   default, options) and asset slots. Never guess a parameter: read it from the list.
2. Build with a preview and look at it before reporting anything:

```bash
makeables print keychain --param text=Hunter --param font=borel \
  --out hunter.stl --preview hunter.png
```

3. Open the preview image (top, three-quarter and front views) and check that the text
   reads, nothing touches an edge and the logo is the right way round.
4. Read `check` and `printability` in the JSON result before handing the file over.

## Parameters and assets

- `--param name=value`, repeated. Numbers must fall in the listed range and whole-number
  parameters (cells, height units) take integers.
- An asset slot such as `logo` takes a file path: `--param logo=mark.svg`. Logos must be
  `<path>` elements without group transforms. Convert shapes and apply transforms first.
- `--brand <slug|brand.json>` takes the brand's logo and, unless `text` is set, its name.
  Curated slugs: `sla`, `paisanos`. A brand.json from `makeables brand new` and
  `brand add-logo` works the same way and uses its first SVG logo.
- Fonts: `plex-mono` (default), `borel` (script) and `silkscreen` (pixel). A character
  the font lacks fails with a message that names it.

## Two colours

`--out file.3mf` writes a two-colour print: the body, and a label made of the raised text
or an inlay filling each engraving flush. Colours come from `--colors "#body,#label"`, else
the brand's paper and ink, else `#f4f1eb,#141414`. The file is one object with two
volumes on extruders 1 and 2, the way PrusaSlicer saves projects. It was verified in
PrusaSlicer. Other slicers should load it as one object, but tell the user to check
filament assignment there.

## What the result guarantees

- `check: { unpaired: 0, solids: 1 }`: one closed, manifold solid. The CLI refuses to
  write anything else, so there is nothing for a slicer to repair.
- `printability.baseMm2`: area on the bed. `ceilingMm2`: area of faces pointing straight
  down above the bed, printed over air (bridges or cantilevers). It is measured, not
  judged. The badge holder's lips are about 475 mm². `fits`: which of the Bambu Lab
  A1 mini, Prusa MK4S and Bambu Lab P1S beds hold it.
- No real print has set thresholds for walls or overhangs yet. Do not promise that a part
  prints without supports beyond what `ceilingMm2` says.

## Objects

| Object | What to know |
|---|---|
| `keychain` | Name in relief or engraved, optional engraved logo, 40 to 100 mm long. |
| `badge-holder` | Makeables 2:3 badge (60 × 90 mm) or CR80 card (54 × 86 mm). The badge drops in from the top behind 2 mm side and bottom lips. The event name goes on the band below. |
| `gridfinity-bin` | 1 to 4 by 1 to 4 cells, 3 to 10 height units, with spec feet. The label shelf has a 45° underside and an engraved label. No stacking lip. |
| `phone-stand` | Lean of 50 to 80°, a slot for the phone with its case (6 to 16 mm), and the name on the front ledge. Prints upright with nothing over air. |

For an event kit, use the event's brand so the object matches the cards, badges and stickers:
`makeables print badge-holder --brand <slug> --param text="<event>" --out holder.3mf`.
