text-to-cad G-code 技能以 dry-run 优先的切片器 CLI 编排实现网格到 G-code 的生成与静态校验【免费下载链接】text-to-cadA library of agent skills for CAD, CAE and CAM项目地址: https://gitcode.com/GitHub_Trending/tex/text-to-cadgcode是 text-to-cad 仓库中面向 Agent 的 CAM 技能它通过编排本机真实切片器 CLIOrcaSlicer、PrusaSlicer、CuraEngine把.stl、.obj、未切片.3mf、.ply、.glb、.gltf等网格文件转换为带打印机画像的纯 FDM.gcode。全文覆盖技能声明的完整工作流、wrapper profile 契约、后端发现机制、输入修复remediation策略与 G-code 静态校验规则并结合 gcode_tool.py 的源码实现讲清每个命令背后的调用链与容错边界帮助读者在本地搭建可复现的“网格 → G-code → 校验”流水线。技能定位只产纯 G-code不碰打印机技能定义见 SKILL.md其 frontmatter 明确声明了适用范围为 Codex 等 Agent 提供.stl、.obj、未切片.3mf、.ply、.glb、.gltf的切片能力支持本机切片后端发现、切片就绪检查、以及打印前 G-code 校验。两条核心边界贯穿整个技能打印机无关printer-agnostic技能只生成纯.gcode从不上传、启动或打包打印任务dry-run 优先任何真实切片执行前必须先输出并审阅将要执行的切片器命令。Agent 侧的技能元数据展示名 G-code、默认提示 Use $gcode to generate printer-profiled G-code from a mesh file.定义在 openai.yaml。运行时以本地安装的技能文件为准仓库只用于溯源与发布审查。标准工作流从发现后端到校验 G-codeSKILL.md 定义了七步工作流全部通过单一入口脚本 gcode_tool.py 的四个子命令完成discover、inspect、slice、validate。1. 确认输入并发现切片后端第一步是确认输入属于支持网格.stl、.obj、未切片.3mf、.ply、.glb、.gltf。当未知本机有哪些切片器时运行python scripts/gcode_tool.py discover从源码结构看discover输出的是一个 JSON 报告其核心逻辑在 discover_backends() 与 discovery_report()按orcaslicer→prusa-slicer→curaengine的偏好顺序逐一探测可执行文件报告包含preferred_order、backends、not_preferred三个字段。每个后端的探测遵循三级策略见 find_backend_executable()后端专属环境变量ORCASLICER_BIN、PRUSASLICER_BIN、CURAENGINE_BIN定义于 BACKEND_ENV_VARSPATH 查找候选名包括OrcaSlicer/orca-slicer/orcaslicer、prusa-slicer/PrusaSlicer/prusa-slicer-console、CuraEngine/curaengine见 BACKEND_EXECUTABLESmacOS 应用包位置扫描/Applications下OrcaSlicer*.app/Contents/MacOS/OrcaSlicer、PrusaSlicer*.app/...等 glob 模式见 BACKEND_APP_GLOBS 与 find_app_executable()。Bambu Studio 会被单独探测BAMBU_STUDIO_BIN环境变量、PATH、/Applications但始终标记preferred: false原因是其 CLI 导出路径在 macOS 上出现过导出.gcode.3mf时崩溃的不稳定表现详见 discover_bambu_studio() 中写入的reason字段。2. 检查输入是否切片就绪python scripts/gcode_tool.py inspect --input path/to/model.stl --jsoninspect_input() 对输入做三类判定返回InputInspection数据类状态status条件含义direct_to_slicer.stl/.obj/ 未切片.3mf直接交给切片器requires_stl_conversion.ply/.glb/.gltf执行时需经trimesh转临时 STLalready_sliced_bambu.3mf且内部含Metadata/plate_N.gcode已是切片产物拒绝再切片其中“是否已被切片”的判定很关键is_sliced_bambu_3mf() 把.3mf当 zip 打开用正则^Metadata/plate_(\d)\.gcode$匹配内部条目——命中即说明这是 Bambu 已生成的打印任务包build_slice_plan() 会直接抛出 “Refusing to re-slice it”。3. slice先 dry-run后 executeslice子命令要求显式传入 wrapper profile JSON禁止 Agent 凭空发明真实打印机画像。dry-run 与 execute 互斥slice_main() 会拒绝同时给出两者。先 dry-run审阅输出的 JSON 计划后端、可执行文件、完整命令、输入分类、输出路径、profile 快照python scripts/gcode_tool.py slice \ --input path/to/model.stl \ --output /tmp/model.gcode \ --profile path/to/profile.json \ --backend auto \ --dry-run确认命令与 profile 无误后再执行python scripts/gcode_tool.py slice \ --input path/to/model.stl \ --output /tmp/model.gcode \ --profile path/to/profile.json \ --backend auto \ --execute--backend取值为auto或三个受支持后端之一auto时以 profile 中声明的backend为准见 build_slice_plan()。执行路径 execute_slice() 有几个值得注意的工程细节需要转换的输入.ply/.glb/.gltf在临时目录gcode-slice-*中转成 STL切片器看到的是该临时文件切片器退出码为 0 但目标输出不存在时会在输出目录寻找“新生成的.gcode”候选优先{输入名}.gcode否则恰好一个新文件命中则原子性地改名到目标路径generated_gcode_candidate()以兼容只接受--outputdir的后端无论成败返回的 JSON 都附带returncode、stdout_tail、stderr_tail各截断至 80 行便于 Agent 诊断切片器失败原因。4. validate切片产物必须静态校验python scripts/gcode_tool.py validate \ --gcode /tmp/model.gcode \ --profile path/to/profile.json \ --json校验结果ok: true且无错误时进程返回 0否则返回 1profile 解析等预期错误统一走 main() 的错误通道输出{ok: false, error: ...}JSON 并返回 2。Profile 契约wrapper JSON 的字段与校验规则每次slice与validate都要求一个 wrapper profile JSON其职责是提供校验边界与后端选择而非复刻完整切片器画像——工艺、打印机、线材的详细行为仍由原生切片器 profile 决定。最小示例{ backend: orcaslicer, native_config: /absolute/path/to/native-slicer-profile, machine: { name: Example Printer, bed_size_mm: [180, 180], z_height_mm: 180, motion_bounds_mm: { x: [0, 180], y: [0, 180], z: [0, 180] } }, filament: { type: PLA, nozzle_temp_c: 220, bed_temp_c: 65 } }字段约束以 load_profile() 的实现为准字段必填约束源码依据backend是必须为orcaslicer/prusa-slicer/curaengine之一大小写不敏感native_config是绝对路径且文件必须存在require_absolute_file()native_settings否字符串或字符串列表逐项校验为存在的绝对路径缺省时退化为只传native_confignative_filaments否同上仅 OrcaSlicer 会实际使用传给--load-filamentsmachine.name是非空字符串machine.bed_size_mm是二元数值数组[width, depth]两项均须 0machine.z_height_mm是数值且 0machine.motion_bounds_mm否对象可含x/y/z各为[min, max]且min maxparse_axis_bounds()缺省时默认0..bed_size_mm[0]、0..bed_size_mm[1]、0..z_height_mmfilament.type是非空字符串filament.nozzle_temp_c/filament.bed_temp_c是数值且 0require_number()machine.motion_bounds_mm的存在意义部分打印机原生画像的开头/结尾 G-code 会故意移动到打印区之外的安全擦拭/排料位置。此时应依据真实打印机画像显式放宽对应轴边界而不是用它来掩盖未知 G-codegcode-validation.md 明确禁止这种做法。OrcaSlicer 多文件画像当真实 OrcaSlicer 画像拆分为机器、工艺、线材多份 JSON 时用native_settings与native_filaments{ backend: orcaslicer, native_config: /absolute/path/to/machine-or-process.json, native_settings: [ /absolute/path/to/machine.json, /absolute/path/to/process.json ], native_filaments: [ /absolute/path/to/filament.json ], machine: { name: Example Printer, bed_size_mm: [180, 180], z_height_mm: 180 }, filament: { type: PLA, nozzle_temp_c: 220, bed_temp_c: 65 } }native_config保留为指向主原生画像的绝对路径以维持兼容性。在命令构造侧build_backend_command() 将多份设置以分号拼接传给 OrcaSlicerOrcaSlicer --load-settings machine.json\;process.json --load-filaments filament.json --outputdir /tmp/out --slice 0 input.stl三个后端的完整命令形态详见 slicer-backends.md# OrcaSlicer OrcaSlicer --load-settings machine.json\;process.json --load-filaments filament.json --outputdir /tmp/out --slice 0 input.stl # PrusaSlicer prusa-slicer --load profile.ini --export-gcode --output output.gcode input.stl # CuraEngine CuraEngine slice -j profile.json -l input.stl -o output.gcode后端选择与输入处理策略偏好顺序与安装建议偏好顺序为orcaslicer→prusa-slicer→curaenginePREFERRED_BACKEND_ORDER。SKILL.md 的建议是若本机没有任何偏好后端优先安装 OrcaSlicer而不是把“缺切片器”当成用户侧阻塞项——macOS 上执行brew install --cask orcaslicer后重跑discover即可因为 helper 同时检查 PATH 与/Applications/OrcaSlicer.app的 cask 安装位置。网格直传与 trimesh 转换.stl、.obj、未切片.3mf直接传给切片器.ply、.glb、.gltf在--execute时经trimesh转成临时 STL。convert_mesh_to_stl() 会处理场景容器dump(concatenateTrue)合并多节点、拒绝空网格且trimesh不可用时抛出明确错误要求安装它或直接提供.stl/.obj/.3mf。dry-run 的 JSON 输出里会带conversion.note: Requires trimesh at execution time.提前提示。结构化 remediation拒绝即给出下一步.step、.stp、.dxf、.svg、.urdf、.sdf在 v1 中被显式拒绝。UNSUPPORTED_INPUT_REMEDIATION 为每种扩展名预置了结构化修复对象inspect与slice命中时都会以GCodeToolError携带details.remediation含extension、skill、reason、next_step输出——Agent 应直接遵循该对象而非自行猜测转换流程.step/.stp边界表示 CAD不是网格用$cad导出 STL 侧车——python scripts/step --kind part input --stl output.stl或针对生成器脚本python scripts/step model.step.py --stl output.stl然后回本技能切片该.stl.dxf/.svg二维图纸本工具链无 2D 转网格能力若是 FDM 打印用$cad的gen_step()建模并导出 STL 侧车再切片若实际是平面切割件而非打印件改走$sendcutsend技能.urdf/.sdf引用各连杆网格的机器人描述逐个切片其引用的.stl/.obj网格缺失或过期的网格先用$cad从 CAD 源重新生成机器人描述本身则交给$urdf/$sdf技能。静态校验检查项、边界策略与结果解读validate_gcode_file() 只做静态检查不模拟挤出物理、固件状态、加速度限制或切片器特有语义见 gcode-validation.md。失败条件errors文件为空无G0/G1/G2/G3移动指令无挤出移动G1且带E参数无喷嘴/床温度指令M104/M109/M140/M190绝对定位模式下解析出的X/Y/Z坐标超出 wrapper profile 的运动边界。警告条件warnings不修改、不删除命令遇到未知/不受支持的 G-code 命令白名单为 SUPPORTED_GCODE_COMMANDSG0/G1/G2/G3/G4/G21/G28/G29/G90/G91/G92 与 M18/M73/M82/M83/M84/M104/M106/M107/M109/M117/M118/M140/M190/M201/M203/M204/M205/M220/M221/M400/M500/M501/M900Tn换头命令单独豁免最多列出前 12 个样本及行号出现相对定位G91相对模式激活期间跳过 XYZ 边界检查。边界策略校验器假设 G-code 从开始就处于绝对定位G90语义遇到G91进入相对模式并暂停边界检查G90恢复后重新启用——这既避免了相对运动块造成的误报又能抓住明显的出板绝对移动。边界默认取X0..bed_size_mm[0]、Y0..bed_size_mm[1]、Z0..z_height_mm可按 profile 中machine.motion_bounds_mm逐轴覆盖。输出的 JSON 报告包含ok、path、profile快照、errors、warnings与stats总行数、非注释行数、移动/挤出/温度指令计数。ok: true只代表通过了静态检查不代表可安全打印交付打印机专属流程前仍需人工复核打印机/画像匹配、线材与温度设置、开头与结尾 G-code、床原点与坐标系以及任何未知命令警告。Bambu 边界校验后的 G-code 如何交接本技能与$bambu-labs的职责切分非常清晰bambu-labs/SKILL.mdgcode只产纯.gcode不创建 Bambu.gcode.3mf归档、不接触打印机打印上传/启动工作流整体交接给$bambu-labs由后者选择打印机专属的局域网交接方式例如 A1 Mini 模板项目template-project或显式启用的bambox项目包。典型的跨技能链路为$cad建模并导出网格$gcode切片并validate$bambu-labs对已校验的纯.gcode执行 dry-run 上传按需--execute --confirm-start-print启动打印。参考文件技能主文档skills/gcode/SKILL.md唯一实现脚本skills/gcode/scripts/gcode_tool.pydiscover/inspect/slice/validate四个子命令参数定义见 build_parser()后端行为与命令形态参考skills/gcode/references/slicer-backends.md校验语义与边界策略参考skills/gcode/references/gcode-validation.md技能元数据skills/gcode/agents/openai.yaml打印交接技能skills/bambu-labs/SKILL.md【免费下载链接】text-to-cadA library of agent skills for CAD, CAE and CAM项目地址: https://gitcode.com/GitHub_Trending/tex/text-to-cad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考