max-model: 想法 -> 經過驗證、可列印的零件
需求: 使用者在 /max-model 後輸入的任何內容(或他們描述的事物)。
FORGE = 此技能的目錄(例如 ~/.claude/skills/max-model);以下每個路徑都是相對於此目錄。一個 CLI 指令: $FORGE/bin/forge <cmd>(底部有清單)。
環境(請參閱 README):CAD 虛擬環境 $FORGE/.venv-cad(包含 build123d, trimesh, manifold3d, usd-core, opencv, sdf;可透過 FORGE_CAD_PY 覆蓋),可選的 AI 虛擬環境 $FORGE/.venv-ai(包含 torch, diffusers, CLIP;可透過 FORGE_AI_PY 覆蓋)用於 text3d 和 looks 功能。
印表機:knowledge/printer.json(列印床、噴嘴、層高;範例在 knowledge/printers/ 目錄中)。切片是使用者選擇的切片軟體:forge 的最終產出是經過驗證的 STL 檔案加上預飛安檢報告(是否需支撐材)。可選的 slicer_cmd 掛鉤讓 forge 能回報列印時間和耗材克數。
2026-10-17 基準測試顯示 (knowledge/benchmark-2026-10-17.md): 對於完全指定的零件,與真實 STEP 檔案的體素 IoU 可達 0.96,但在細節需猜測的部分僅有 0.41-0.82;列印即用機構在首次構建時通過了運動掃描,且無任何熔合間隙(尚未在作者的印表機上以真實列印驗證);用手工建模的標誌性/有機物體的外觀是弱點(手工建模的頭盔最後看起來像一顆蛋)。text3d / looks / remix 流程的存在就是為了用工具而非毅力來彌補這個弱點:參考圖片比對 + 外觀評分、用於有機角色的本地文字轉 3D、在雕刻模型上套用 flexify、搜尋並修改標誌性道具。
永不妥協的規則
- 數字優先,圖片第二。 除非幾何資訊來自工具輸出(verify/selftest/preflight/grade JSON)或你在此次迭代中讀取的渲染圖,否則不得對幾何形狀做出任何聲明。絕對不要憑記憶描述 STL 檔案。
- 訂製零件先規格再建模: 先建立
spec.md+spec.json並包含數值化的成功標準。 - 每次迭代只做一個變更,保留每個
iter_NN/目錄,每個階段最多 6 次迭代,然後重新規劃。 - 任何會動的零件必須附帶通過的自檢(掃描無碰撞 + 必卡控制 + 測量間隙)。沒有例外;這是本技能在機構設計上強而有力的原因。
- 每次列印前都必須執行
forge preflight,其結果決定是否使用支撐材。NO-GO = 先修正幾何/方向。列印即用 / 多本體零件也需執行forge export <stl>,然後交給使用者 3MF 檔案,而非 STL:切片軟體的自動支撐會填充間隙並焊接零件(CYCLO-11 的首次列印就是這樣失敗的),而且 STL 無法承載「關閉支撐材」的資訊。 - 環境: Blender、OpenSCAD 和 GPU torch (text3d, looks) 可能會在某些隱藏 GPU 的代理沙箱中崩潰(Blender 退出碼 139)。如果某步驟發生段錯誤,請在沙箱外執行。純 Python (build123d, manifold3d, trimesh) 則可在任何地方執行。
- 簡短回報里程碑(選擇的路線、首次渲染、可列印狀態含時間/克數/安檢報告、阻礙):每個一行,說明使用者需做出的決定。當頻道支援檔案時,傳送關鍵圖片 (sheet.png, poster.png) 和 AR 檔案。
- 未經使用者明確許可,切勿開始列印或花費金錢。下載的模型:尊重其授權條款(CC BY-NC = 不得販售)。
工作階段開始 (30 秒)
ls $FORGE/knowledge/; cat $FORGE/knowledge/{fit-log.md,lessons.md,printer.json}; $FORGE/bin/forge fit show
$FORGE/bin/forge doctor # 紅字 -> 在建模前修正或回報
如果 forge fit show 顯示 pip_gap 仍為 [R](研究預設值,未在此印表機上量測):提醒使用者一次,Fit Card(forge mech build fitcard,約需 1 小時,~16 g)可校準所有活動零件的間隙,並提議列印它。
階段 0 — 路線規劃 (選擇流程,而非工具)
優先比對第一個符合的選項。用一行告訴使用者路線。
| 使用者想要 | 路線 | 工具 |
|---|---|---|
| 修改一個下載的模型:在上面加名字/文字、鑰匙圈環、磁鐵、加厚牆壁、縮放到頭部尺寸、平底、鏡像 | REMIX (先下載,再升級) | `forge remix text |
| 根據使用者提供的尺寸做一個實用物品:盒子(滑蓋/按壓蓋)、姓名鑰匙圈、標誌、手機架、物品收納盒、光浮雕 | MAKE (生成器;間隙來自 fit.json;盒子會經運動檢查) | `forge make box |
| 在單次列印中製作多個副本 / 整個專案(用於販售) | PLATE (裝滿列印床,計算單個成本) | `forge plate <stl...> --fill |
| 一個知名的現有物品(電影頭盔、道具、熱門玩具、熱門裝置的保護殼) | FIND (自行搜尋模型網站如 Printables/Thingiverse),然後 REMIX (縮放、分割、加磁鐵、調整) | 網路搜尋, forge split, forge preflight --orient |
| 一個原創可穿戴頭盔(「一個別人從未有過的頭盔」) | TEXT3D --helmet:頸部切口、根據你指定的頭部尺寸(預設 160x190 + 襯墊)、3 mm 外殼、面罩 + 4 個磁鐵座、沿接縫分割的切片 | forge text3d "<風格> helmet" --helmet |
| 某種會動的東西(指尖陀螺、鉸鏈、齒輪、陀螺儀、蝴蝶刀、貫通件、按壓器) | MECHKIT 如果模組吻合,否則使用 Mech API 建模 | forge mech list/build, lib/mechkit/core.py |
| 一個柔性動物 | 設計一個 SDF 本體 (lib/sculpt.py) 或取得一個雕刻模型(模型網站/text3d)-> FLEXIFY | forge flexify, forge sculpt |
| 一個人偶 / 吉祥物 / 生物 / 雕像 | TEXT3D (本地、免費、約需 3.5 分鐘) 或搜尋;提供兩種選擇 | forge text3d "<點子>" [--base NAME] |
| 一個訂製的、需要密合的功能性零件(支架、固定座、轉接器、針對使用者物品的保護殼) | MODEL (下方的階段 1-6) | build123d 路線, forge run, forge parts-find |
| 整理抽屜 / 為某物品製作收納盒 | GRIDFINITY (+ PHOTOFIT 用於精確凹槽) | forge gridfinity, forge photofit |
| 超過列印床尺寸 | SPLIT 包含定位銷和接縫標籤 | forge split |
| 「這個能列印嗎 / 為什麼失敗了」 | PREFLIGHT (+ 熱力圖) | forge preflight, forge heat |
| 展示 / 販售它 | SHOWCASE + AR | forge showcase, forge ar |
關於路線規劃的誠實品質備註(作者於 2026-10-17 量測):text3d 生成的人物可清楚辨識(蠑螈、龍、鬼魂吉祥物、鯊魚),但在 60 mm 大小下細節模糊且需要支撐材;透過浮雕法從文字生成的柔性模型看起來很笨重(細腿融合在一起)-> 對於柔性模型,建議使用 SDF 設計的本體或人工雕刻模型;手工建模的有機形狀看起來仍然像團塊 -> 絕不要手工建模頭盔/角色,請使用 FIND+REMIX 或 TEXT3D。
階段 1 — 簡報 (訂製零件): 帶有數字的規格
- 使用者已經告訴你的關於該物體的任何資訊(裝置型號、測量值、照片)。 1b. 對於任何有名字的物體進行參考圖片比對:搜尋 6-9 張該真實物體的參考圖片 / 最高評價的設計,仔細觀察它們;在 spec.md 中寫下「## 外觀」章節(比例、2-3 個特徵、屬於哪個變體)。跳過此步驟曾導致蝴蝶刀像根扁平棍子,螺旋指尖陀螺變成錯誤的玩具。
- 尺寸:查詢它們,切勿憑記憶(基準測試:憑記憶回憶的滑輪 IoU 僅 0.41)。使用
forge parts-find "<零件>" [--download]+forge step2stl;透過網路獲取資料表;搜尋參考圖片。在 spec.md 中註明來源。對於使用者擁有的、無法查詢的物體:PHOTOFIT (forge photofit mat-> 以 100% 列印校準墊 -> 拍照 -> 輪廓辨識,精度約 0.3 mm) 比要求使用游標卡尺更好。 - 只詢問無法查到的資訊:一次訊息,最多 4 個問題,每個附帶預設值。
- 寫下
out/<名稱>/spec.md+spec.json(使用 templates/ 目錄中的範本)。對於配合面的尺寸估計,需標記為estimate。 - 發送「規格就緒:<一行描述> -- 可以開始建構嗎?」;如果風險低且使用者未回應,則使用陳述的預設值繼續。
階段 2 — 路線選擇 + 計劃
| 路線 | 用途 |
|---|---|
| b123d (預設) | 功能性 / 有尺寸要求的 / 需密合的零件、外殼、MechKit 模組 |
| scad | 簡單零件或單一 BOSL2 圖元(螺紋) |
sdf (lib/sculpt.py) | 你自己設計的有機本體:平滑結合、平坦底部、始終水密(壁虎配方) |
mesh (lib/meshkit.py, manifold3d) | 編輯下載的模型/AI 產生的網格、大型布林運算、flexify、分割(OCC 無法處理 10 萬個三角面的雕刻模型) |
| bpy | 渲染、體素網格重建、文字密集的藝術品 |
在零件檔案頂部的註解中規劃:將功能寫成函數,參數區塊使用公釐為單位,間隙從 fit.get("pip_gap"/"slide_gap"/...) 讀取(絕不要硬編碼 0.3),原點位於 Z=0 的底部中心,設計時考慮列印方向(最大平坦面朝下、懸垂 <= 45 度、橋接 < 18 公釐、牆壁厚度 >= 2.0 公釐),建構順序,斷言檢查列表。
階段 3 — 逐步構建
每次迭代:一個變更 -> forge run part.py --lane <路線> --spec spec.json --name <名稱> -> 讀取 verify.json/REPORT.md(體積/包圍盒的變化是否與預期變更相符?無變化 = 布林運算失敗) -> 讀取 sheet.png 一次 -> 批判性審視 -> 下一個變更。
- 活動零件 = 使用 Mech API (
lib/mechkit/core.py):Mech(名稱, 零件列表, 固定零件列表, [Motion(名稱, 驅動零件, [Move...], control=[...])])->selftest()掃描所有姿勢,沿其整個路徑執行必卡控制,精確測量間隙。透過設計來保證無碰撞優於事後檢查:以樞軸為中心的圓弧/球面可保持間隙恆定(陀螺儀、柔性關節);將每個活動件的掃掠體保持在平面的同一側(蝴蝶刀樞軸)。齒輪:lib/gears.py。量測而非宣告:forge mech ratio <名稱> [--motion M --driven 零件 --driver 零件]使機構處於特定姿勢,釋放輸出端並進行二分法以找到無接觸區間 -> 量測到的減速比 + 背隙(輸出ratio.json,若與宣告的減速比不一致則退出碼為 3)。擺線減速器:forge mech build cyclo11(lib/cycloid.py精確輪廓 + 根切檢查)。工作室渲染:forge showcase <目錄> --style studio --still hero|cutaway|exploded,--ghost,--annotate。 - 在迴圈中進行預飛安檢:對於任何有懸垂結構的零件:
forge preflight out/<名稱>/<名稱>.stl。 - 具名物體:外觀評分:在力學驗證完成後執行:
forge looks out/<名稱>/<名稱>.stl --target "<物體>"(基於乾淨渲染圖的 CLIP 評分;已驗證:它能正確區分蝴蝶刀的人類設計版 > v2 > v1)。< 30% = 迭代「外觀」(比例、特徵),而不是力學。用它來比較 v1 和 v2,而不是瞎猜。 - 硬性規則:絕不從單一視圖判斷;重疊切割器 0.05 mm(共面表面會產生零厚度的外皮,會焊接定位銷:量測到的間隙為 0.0 而非 0.3);相同失敗兩次 -> 列印子零件編號並重新診斷;每個階段上限為 6 次迭代,然後重新規劃或轉向 FIND 路線。
當 verify 通過所有規格鍵、selftest 通過(活動件)、preflight 結果為 GO/GO+SUPPORTS、視覺檢查清單全部為「是」時完成。
階段 4 — 密合度
- 首先進行校準: 列印即用間隙來自
fit.json。在 pip_gap 被驗證為[V]之前,每個 PIP 設計都帶有 preflight 的 CAUTION 警告。Fit Card 在一次列印中量測 pip_gap(旋轉件 .15-.40)和 pip_vgap(鉸鏈 .25-.45):完成後,詢問「在用力扭一下後,能自由旋轉的最小數字是多少?」->forge fit set pip_gap <n> --from "fitcard <日期>"(以及 pip_vgap)。每個 MechKit/flexify/gridfinity 構建都會自動讀取它。 - 配合零件 / 圍繞使用者物體的零件:組合姿勢檢查
bin/verify --assembly a.stl b.stl --clearance <fit值> --move-b=x,y,z;透過 photofit/parts-find 建立物體的假模型。 - 僅針對 Fit Card 未涵蓋的介面類型(螺紋、卡扣、壓配)或估計的尺寸進行測試件列印:<= 10 分鐘,3 個變體,帶有凸起的標籤。
階段 5 — 列印準備 + 交接
forge preflight <stl> [--slice]-> 安檢報告 + 支撐材決定。有機/傾斜零件:forge preflight <stl> --orient(嘗試多種傾斜角度;某個頭盔需要約 20 度)。forge heat <stl>產生紅/黃色支撐熱力圖來展示給使用者看。- 支撐材 = 聽從 preflight 的決定:GO -> 關閉;GO+SUPPORTS -> 開啟/自動;NO-GO -> 先修正(刀刃狀接觸、熔合間隙、不合 ->
forge split)。「支撐材:關閉 (必要)」= 自動支撐陷阱(一個與水平面夾角小於 30 度的平坦底面,懸在另一個不同本體上方不到 2 mm 處;support_angle/support_trap_gap在印表機設定檔中):支撐材必須保持關閉,否則會焊接間隙。 2b. 始終,在將列印即用 / 多本體檔案交給使用者之前:執行forge preflight <stl>然後執行forge export <stl>(自動遵循安檢報告;檔名結尾為_SUPPORTS-OFF.3mf/_SUPPORTS-ON.3mf)。給他們 3MF 檔案並告知:開啟此檔案,檢查支撐材設定是否與檔名相符,不要更改其他任何設定。如果 preflight 為 NO-GO,因為它需要支撐材但支撐材又會焊接,請在導出前先修正幾何形狀(將平坦底面導 45 度角、重新定向)。 - 在你選擇的切片軟體中,使用步驟 2 的支撐材決定和你的一般設定檔,對匯出的 3MF(或單一本體零件的 STL)進行切片;forge 僅透過 3MF 設定支撐材的核取方塊。(可選:在
knowledge/printer.json中設定slicer_cmd,以便preflight --slice/plate --slice能回報時間和耗材克數。) - 向使用者展示:sheet 或 showcase 海報 + 時間/克數(如果已設定鉤子)+ 安檢報告 + 單行配方。當尺寸/密合度是個問題時,提供
forge ar <stl>(USDZ:可在 iPhone/Vision Pro 上以真實尺寸預覽;GLB 用於 Quest)。 - 未經使用者許可,切勿開始列印:「列印床空了嗎?開始列印 <名稱>,約需 <時間>, 克。」
- 回報「<名稱> 已可列印:<時間>, 克,<安檢報告>。」用於販售?
forge showcase <目錄>會寫出 mp4/gif + listing.md(成本、建議售價、授權提醒)。
階段 6 — 回饋 + 學習
- 列印完成後發送一行訊息:「哪裡有問題?(密合度 / 外觀 / 強度 / 列印品質 / 都沒問題)」。檢視任何回傳的照片。
- 間隙 ->
forge fit set ...(同時在 fit-log.md 中新增一行)。其他數值 -> 記錄在 fit-log.md / print-tolerances.md 中並標記為[V]。 - 在
knowledge/lessons.md中寫下 1-3 行(日期 · 專案 · 學到的教訓 · 所屬階段)。新技巧 ->knowledge/<主題>.md(<= 40 行,包含可執行的程式碼片段)。 - 保留
part.py+ spec 使其可重新執行。提供一個相關的衍伸想法(腦力激盪),但不要開始執行。 - 任何技能/工具變更 -> 執行
tests/run_suite.sh(已知答案檢查),對於能力聲明,執行基準測試(forge grade,forge looks)——證明它確實變得更好了。