Meshy 3D Printing
Prepare and send Meshy-generated 3D models to a slicer for 3D printing. Supports white model (single-color) and multicolor printing workflows with automatic slicer detection.
Prerequisite: This skill reuses the utility functions (create_task, poll_task, download, get_project_dir, etc.) and environment setup from meshy-3d-generation. However, when the user wants to 3D print, this skill controls the entire workflow — including generation, format selection, downloading, and slicer integration. Do NOT run meshy-3d-generation's workflow first and then hand off here — this skill must control parameters from the start (e.g. target_formats with "3mf" for multicolor).
Intent Detection
Proactively suggest 3D printing when these keywords appear in the user's request:
- Direct: print, 3d print, slicer, slice, bambu, orca, prusa, cura, multicolor, multi-color, 3mf
- Implied: figurine, miniature, statue, physical model, desk toy, phone stand
When detected, guide the user through the appropriate print pipeline below.
Decision Tree: White Model vs Multicolor
IMPORTANT: When the user wants to 3D print, follow this flow:
- Detect installed slicers first (see Slicer Detection Script below)
- Ask the user: "Do you want a single-color (white) print or multicolor?"
- If white model → follow White Model Pipeline
- If multicolor: a. Check if a multicolor-capable slicer is installed b. Supported multicolor slicers: OrcaSlicer, Bambu Studio, Creality Print, Elegoo Slicer, Anycubic Slicer Next c. If no multicolor slicer detected, warn the user and suggest installing one d. Ask: "How many colors? (default: 4, max: 16)" and "Segmentation depth? (3=coarse, 6=fine, default: 4)" e. Confirm cost: generation (20) + texture (10) + multicolor (10) = 40 credits total (+10 if repair is needed) f. Follow Multicolor Pipeline
- (Recommended) Insert a printability analysis step (
POST /openapi/v1/print/analyze, FREE) after generation in either pipeline. RunPOST /openapi/v1/print/repair(10 credits) only if analyze flags errors.
Slicer Detection Script
Append this to the reusable script template from meshy-3d-generation:
import subprocess, shutil, platform, os, glob as glob_mod
SLICER_MAP = {
"OrcaSlicer": {"mac_app": "OrcaSlicer", "win_exe": "orca-slicer.exe", "win_dir": "OrcaSlicer", "linux_exe": "orca-slicer"},
"Bambu Studio": {"mac_app": "BambuStudio", "win_exe": "bambu-studio.exe", "win_dir": "BambuStudio", "linux_exe": "bambu-studio"},
"Creality Print": {"mac_app": "Creality Print", "win_exe": "CrealityPrint.exe", "win_dir": "Creality Print*", "linux_exe": None},
"Elegoo Slicer": {"mac_app": "ElegooSlicer", "win_exe": "elegoo-slicer.exe", "win_dir": "ElegooSlicer", "linux_exe": None},
"Anycubic Slicer Next": {"mac_app": "AnycubicSlicerNext", "win_exe": "AnycubicSlicerNext.exe", "win_dir": "AnycubicSlicerNext", "linux_exe": None},
"PrusaSlicer": {"mac_app": "PrusaSlicer", "win_exe": "prusa-slicer.exe", "win_dir": "PrusaSlicer", "linux_exe": "prusa-slicer"},
"UltiMaker Cura": {"mac_app": "UltiMaker Cura", "win_exe": "UltiMaker-Cura.exe", "win_dir": "UltiMaker Cura*", "linux_exe": None},
}
MULTICOLOR_SLICERS = {"OrcaSlicer", "Bambu Studio", "Creality Print", "Elegoo Slicer", "Anycubic Slicer Next"}
def detect_slicers():
"""Detect installed slicer software. Returns list of {name, path, multicolor}."""
found = []
system = platform.system()
for name, info in SLICER_MAP.items():
path = None
if system == "Darwin":
app = info.get("mac_app")
if app and os.path.exists(f"/Applications/{app}.app"):
path = f"/Applications/{app}.app"
elif system == "Windows":
win_dir = info.get("win_dir", "")
win_exe = info.get("win_exe", "")
for base in [os.environ.get("ProgramFiles", r"C:\Program Files"),
os.environ.get("ProgramFiles(x86)", r"C:\Program Files (x86)")]:
if "*" in win_dir:
matches = glob_mod.glob(os.path.join(base, win_dir, win_exe))
if matches:
path = matches[0]
break
else:
candidate = os.path.join(base, win_dir, win_exe)
if os.path.exists(candidate):
path = candidate
break
else: # Linux
exe = info.get("linux_exe")
if exe:
path = shutil.which(exe)
if path:
found.append({"name": name, "path": path, "multicolor": name in MULTICOLOR_SLICERS})
return found
def open_in_slicer(file_path, slicer_name):
"""Open a model file in the specified slicer."""
info = SLICER_MAP.get(slicer_name, {})
system = platform.system()
abs_path = os.path.abspath(file_path)
if system == "Darwin":
app = info.get("mac_app", slicer_name)
subprocess.run(["open", "-a", app, abs_path])
elif system == "Windows":
exe = info.get("win_exe")
exe_path = shutil.which(exe) if exe else None
if exe_path:
subprocess.Popen([exe_path, abs_path])
else:
os.startfile(abs_path)
else:
exe = info.get("linux_exe")
exe_path = shutil.which(exe) if exe else None
if exe_path:
subprocess.Popen([exe_path, abs_path])
else:
subprocess.run(["xdg-open", abs_path])
print(f"Opened {abs_path} in {slicer_name}")
# --- Detect slicers ---
slicers = detect_slicers()
if slicers:
print("Installed slicers:")
for s in slicers:
mc = " [multicolor]" if s["multicolor"] else ""
print(f" - {s['name']}{mc}: {s['path']}")
else:
print("No slicer software detected. Install one of: OrcaSlicer, Bambu Studio, PrusaSlicer, etc.")
Printability Analysis & Repair (FREE → optional 10-credit fix)
Before downloading and printing, run the automated printability check to decide whether the mesh needs repair. The analyze step is FREE (0 credits), so there's no reason to skip it for production prints.
Analyze Script
# Run after the generation/refine/retexture step that produced your printable mesh
INPUT_TASK_ID = refine_id # or whatever produced the textured / final mesh
# IMPORTANT: input_task_id MUST refer to a task that used Meshy 6 or any Preview model.
# For Meshy 4/5 outputs, pass `model_url` (the GLB download URL) instead.
analyze_id = create_task("/openapi/v1/print/analyze", {
"input_task_id": INPUT_TASK_ID,
# OR: "model_url": "https://example.com/model.glb"
})
analyze_task = poll_task("/openapi/v1/print/analyze", analyze_id)
p = analyze_task.get("printability") or {}
metrics = p.get("metrics", {})
status = p.get("status", "unknown")
print(f"Printability: {status} (issues: {p.get('issue_count', 0)} = "
f"errors {p.get('error_count', 0)} + warnings {p.get('warning_count', 0)})")
print(f" watertight={metrics.get('is_watertight')}, "
f"volume={metrics.get('volume')} m³, "
f"non_manifold_edges={metrics.get('non_manifold_edges')}, "
f"degenerate_faces={metrics.get('degenerate_faces')}, "
f"holes={metrics.get('holes')}")
needs_repair = status == "error" # warning is optional; error means won't print well
Status meanings:
healthy— print as-is.warning— degenerate faces or holes present. Repair is OPTIONAL but recommended for thin-feature prints.error— non-watertight, non-positive volume, or non-manifold edges. Recommend repair before printing.unknown— analyze couldn't process the model. Inspect manually or retry.