3d-print
Search-first 3D printing workflow — finds real specs before modeling, generates manifold-safe models for Bambu Studio / PrusaSlicer / Cura / Fusion 360
Source facts
- Repository
- EdwinjJ1/3d-print-skill
- Last source activity
- March 10, 2026 at 13:53
- Detected SKILL.md language
- English
- Stars
- 29
- Forks
- 1
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.
Showing SKILL.md
SKILL.md
Source instructions · Read-only preview- name
- 3d-print
- version
- 0.2.0
- description
- Search-first 3D printing workflow — finds real specs before modeling, generates manifold-safe models for Bambu Studio / PrusaSlicer / Cura / Fusion 360
- triggers
- ["3D print","create STL","generate model for printing","design for 3D printing","make a 3D printable","print this part","3d printable","slicer","FDM","print bracket","print mount","print enclosure"]
# 3D Print Skill
## Purpose
Generate physically accurate, print-ready 3D models without fabricating dimensions.
Always search for real specs first. Never guess measurements.
---
## Workflow
### Step 1 — Search for real specs
First, try the local search script:
```bash
python3 scripts/search_specs.py "Canon EF 40mm f2.8 lens outer diameter"
```
**If the script returns no concrete millimeter values** (status: `no_instant_answer` or vague text),
do NOT stop. Use your own `search_web` tool to query the product's official datasheet,
spec page, or Wikipedia. Extract the three key numbers: outer dimension, inner dimension, height.
Only proceed to Step 2 once you have real numbers with a source you can cite.
All results are cached to `specs_cache.json`. On a cache hit, read the cached result and
extract dimensions directly — no re-search needed.
### Step 2 — Decide: preset or custom script
**Check if the request matches a preset:**
```bash
python3 scripts/generate_model.py --preset cube # 20mm calibration cube
python3 scripts/generate_model.py --preset tube # hollow cylinder
python3 scripts/generate_model.py --preset bracket # box with through-hole
```
**If the request does NOT match a preset** (e.g. "lens cap with snap-fit tabs",
"hook with chamfer", "enclosure with lip", "multi-part assembly"), write a custom
Python script on the fly. Use the pattern:
```python
import sys
sys.path.insert(0, "scripts")
import manifold3d as m3d
from generate_model import export_3mf, export_stl
from pathlib import Path
# --- build geometry using manifold3d primitives ---
# See references/manifold-examples.md for API reference:
# extrusion, revolve, hull, chamfer, loft, snap-fit tabs, threads
body = m3d.Manifold.cylinder(height=8.0, radius_low=34.0, circular_segments=64)
inner = m3d.Manifold.cylinder(height=8.2, radius_low=33.0, circular_segments=64)
result = body - inner.translate([0, 0, -0.1])
# --- export ---
out = Path("output")
export_3mf(result, out / "lens_cap.3mf", name="lens_cap")
export_stl(result, out / "lens_cap.stl")
```
Save the script as `output/<name>_build.py`, run it, then proceed to Step 3.
The `export_3mf` and `export_stl` functions from `generate_model.py` handle all
file-format details — just call them with the final `Manifold` object.
### Step 3 — Validate the mesh
```bash
python3 scripts/validate_mesh.py output/lens_cap.stl
```
**If validation fails**, do NOT just run `--fix` and move on.
Read the specific failing checks, trace them back to the geometry construction,
and fix the root cause in the build script. Common fixes:
- `watertight: FAIL` → a boolean operation left an open edge; add a small Z-offset
(e.g. `translate([0, 0, -0.1])`) on the subtracted body so it protrudes past the face
- `positive_volume: FAIL` → normals are inverted; the outer shell may be smaller than
the inner — check radii
- `no_degenerate_faces: FAIL` → a zero-thickness wall from a tight boolean;
add at least 0.4mm clearance between faces
After fixing, re-run the build script and re-validate. Repeat until all critical checks pass.
### Step 4 — Slice
Import `.3mf` into Bambu Studio / PrusaSlicer / Cura.
Expected: 0 non-manifold errors, 0 open edges.
---
## Spec Extraction from Cache
When `specs_cache.json` already contains an entry for the target part, load and extract
dimensions directly instead of re-running search:
```python
import json
cache = json.load(open("specs_cache.json"))
# find the entry whose query matches your part
# read result["answer"] or result["abstract"]
# parse out numeric values (mm) using your own reasoning
# map to: outer_diameter, inner_diameter, height, wall_thickness, etc.
```
Use your reasoning to map prose descriptions ("67.5mm filter thread") to the correct
variable in the build script. Do not ask the user to do this mapping manually.
---
## Reference Files
| File | Contents |
|------|----------|
| `references/formats.md` | STL vs 3MF vs STEP — when to use each |
| `references/tolerances.md` | FDM accuracy, shrinkage, fit clearances |
| `references/design-rules.md` | Manifold rules, wall thickness, overhang limits |
| `references/manifold-examples.md` | manifold3d API: extrusion, revolve, hull, chamfer, snap-fit, threads |
---
## Key Constraints
- **No fabricated dimensions** — search first, use real numbers with a cited source
- **manifold3d for all geometry** — guarantees no non-manifold edges
- **Custom script when no preset fits** — `generate_model.py` is a reference, not a limit
- **3MF primary output** — ISO/IEC 25422:2025, manifold-safe, Bambu/Prusa/Cura compatible
- **Fix root cause on validation failure** — do not rely on `--fix` alone
---
## Common Errors
| Error | Cause | Fix |
|-------|-------|-----|
| "244 non-manifold edges" in Bambu | numpy-stl or bad boolean | Regenerate with `manifold3d` |
| Hole too tight | FDM shrinks holes | Add +0.1–0.2mm radius compensation (tolerances.md) |
| Part snaps during press fit | No interference margin | 0.1–0.3mm interference (tolerances.md) |
| Overhangs fail | >45° without supports | Redesign or add supports in slicer |
| `watertight: FAIL` | Subtracted body flush with face | Add Z-offset of 0.1mm on subtracted body |
| `search_specs.py` returns empty | DuckDuckGo Instant Answer has no entry | Use `search_web` tool on manufacturer datasheet |
---
## Install
```bash
ln -sf /path/to/3d-print-skill ~/.claude/skills/3d-print
```
## Dependencies
```bash
pip install manifold3d trimesh numpy requests
```
View on GitHub