Skip to main content

print3d

Model a part in Blender from an idea, a photo of an object, or the shop listing of something you would otherwise buy, slice it for the Bambu X2D, and iterate until it prints clean and matches the photo.

Source facts

Repository
mfranzon/print3d
Last source activity
October 25, 2026 at 11:14
Detected SKILL.md language
English
Stars
411
Forks
36

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
5 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
print3d
description
Model a part in Blender from an idea, a photo of an object, or the shop listing of something you would otherwise buy, slice it for the Bambu X2D, and iterate until it prints clean and matches the photo.
argument-hint
[what to make, a photo of the object, or a shop link]
disable-model-invocation
true
# /print3d — idea to a printable X2D part `print3d` below is the print3d command line. When you have the print3d MCP tools, use those of the same names instead: they return the plate preview and overlays as images, and the host can ask the user before each one that writes. A job's files live in the report's `job_dir`, written below as `jobs/<slug>`. ``` idea / photo / text → model.py (Blender) → mesh → DFM + printability │ ↑ + likeness to the photo spec.json └──────── advice: what to fix ───┘ │ slice → .3mf → user prints from Studio ``` Nothing here reaches the printer. The last step is a sentence handing the user a `.3mf`. Printing is theirs to do in Studio, with the plate in front of them. ## 1. Read the brief Size, text, colour, what the part has to do. Ask at most one question, and only when a missing number makes the part unprintable. **From a photo of an object:** scaffold (step 2) for the slug, then work through `references/from-photo.md` before writing the model. It turns the photo into a `spec.json` of measured, given and assumed dimensions, and adds the `likeness` check that compares the model with the photo. **To replace something sold in a shop** (a listing URL or a product name): also work through `references/from-listing.md`. The listing's stated dimensions scale its product photos, and the hand-off weighs the print against the price. **More than one part, more than one colour, or parts that fit together** (a box and lid, a case in halves, a name in a second colour, a pin in a hole): read `references/parts-and-fits.md` before writing the model. ## 2. Scaffold ```bash print3d make "<prompt>" ``` With no model yet this writes `jobs/<slug>/model.py` and stops, naming the path. Take the slug from that path. ## 3. Write the model Replace the scaffold's body with the real part. The contract: - Plain bpy. **1 Blender unit == 1 mm.** - `params` is in scope: `prompt`, `slug`, `text`, `intent`, `size_mm`, `color`, `material`, `dims` (name -> mm from `spec.json`) and `fit` (this printer's clearance per side for `press`, `snug`, `slide`, `free`). Size every mating feature from `params["fit"]`, never from a guessed number. - Several parts: model each where it sits when assembled and name it with `part(objects, name, color=, group=, rotate=, plate=, settings=)`; declare how two parts mate with `fit(a, b, kind)`. Without `part()` every mesh is joined into one part. - Leave the geometry as mesh objects. The harness joins them, removes doubles, fills holes, recalculates normals, triangulates, centres the part, drops it on the bed and exports. - **Orientation is yours.** Studio's auto-orient is off, so what you model is what prints. `examples/nameplate.py` is the worked reference. `references/modelling.md` has the bpy recipes, the gotchas that cost an iteration, and the move each check asks for. ## 4. Run the loop until it goes green ```bash print3d make "<prompt>" ``` Models, DFM-checks, slices with the pinned X2D presets, and reports. The run is **red** when `severity` is `error` — exit code 1, `status: needs_work`. While red: read `advice`, apply the `fix` each note carries to `model.py`, run again. Each note is phrased as a change to the model, because that is where the fix lives. `jobs/<slug>/history.jsonl` accumulates what each iteration changed. Hand over only once it is green. ## 5. Look at the plate Read the PNG at `plate_png` (each `plates[].png` for several plates), and each `likeness[].overlay` when there is one. The numbers go green on parts that are printable and still wrong — mirrored text, a hole in the wrong face, letters too shallow to read. Look before you hand it over. `viewer` is `jobs/<slug>/view.html`: the model in 3D, to rotate, zoom, hide parts and pull them apart. When you have a preview pane (Hermes desktop's `desktop_preview`, action `open`, with that path as the url), open it there so the user can turn the part around beside the chat. Otherwise give the path to open in a browser. `print3d view <slug>` rebuilds it for an older job. ## 6. Hand off ```bash print3d handoff <slug> ``` writes `jobs/<slug>/handoff/`: a print sheet the user can send on, renders of the part assembled (and exploded, for several parts), the `.3mf` and an STL per part. Look at the renders: a colour that does not show, or a part in the wrong place, is plain there. Report time, grams and layers, and for several parts the colours and how each declared fit measured. From a photo, also list which dimensions were measured, given, listed or assumed, and the unknowns. From a listing, put the grams and time beside the listing's price. Then give the path: ``` jobs/<slug>/slice/<slug>.3mf ``` That is the project file. The `.gcode.3mf` beside it is a sliced job and Studio's Prepare tab rejects it as having no geometry. Tell the user to open the `.3mf`, check the preview, and print from Studio — and offer another iteration if the preview is not what they wanted. ## Done when `print3d make` exits 0, no note is at `error`, you have looked at the plate PNGs, any likeness overlays and the hand-off renders, and the user has the `.3mf` path and the print sheet. ## The machine X2D, 0.4 mm nozzle, 256 × 256 × 260 mm bed, 0.20 mm layers, Bambu PLA Basic, textured PEI plate. **The pinned process has supports off** — that is why an overhang note is a real defect and not a setting to flip. Two nozzles: two colours print without a filament change.
View on GitHub