戰(zhàn):從自然語言到 STEP/STL 三維模型生成全鏈路解析)
1. 從一句話到三維模型text-to-cad 到底在解決什么問題第一次聽到 text-to-cad 這個(gè)詞我腦子里蹦出來的畫面是對(duì)著電腦敲一句“給我畫一個(gè) 80×60×10mm、四角帶 M4 沉頭孔的安裝板”然后軟件自己把模型建好、導(dǎo)出 STEP 文件丟給我。這個(gè)畫面在幾年前還屬于科幻范疇但現(xiàn)在已經(jīng)有一批工具能把它跑通個(gè)七八成。所謂 text-to-cad直譯就是“文本轉(zhuǎn) CAD”核心邏輯是用自然語言描述幾何意圖由程序解析語義、生成參數(shù)化建模腳本最終輸出標(biāo)準(zhǔn) CAD 格式文件——常見的就是STEP、GLB、STL這幾種。它解決的問題很具體傳統(tǒng) CAD 建模的門檻不在“想不想得到”而在“手會(huì)不會(huì)畫”。一個(gè)非機(jī)械背景的產(chǎn)品經(jīng)理、一個(gè)做概念設(shè)計(jì)的工業(yè)設(shè)計(jì)師、一個(gè)需要快速驗(yàn)證裝配空間的硬件創(chuàng)業(yè)者他們腦子里有清晰的幾何需求但打開 SolidWorks 或 Fusion 360 之后光是草圖約束、基準(zhǔn)面選擇、拉伸切除這一套流程就夠勸退的。text-to-cad 把這段“翻譯”工作交給模型和代碼人只需要把需求說清楚。適合看這篇內(nèi)容的人大概分三類一是想快速驗(yàn)證結(jié)構(gòu)方案的硬件從業(yè)者二是對(duì)參數(shù)化建模感興趣但不想啃 API 文檔的工程師三是做 AI 輔助設(shè)計(jì)工具的產(chǎn)品或研發(fā)。我會(huì)把整個(gè)鏈路拆開講——從文本解析到幾何生成從格式選擇到實(shí)際踩坑盡量讓沒接觸過 CAD 二次開發(fā)的人也能看懂門道。2. 核心鏈路拆解文本是怎么變成三維實(shí)體的2.1 文本解析層把“人話”翻譯成結(jié)構(gòu)化參數(shù)text-to-cad 的第一步不是畫圖是理解。用戶輸入“一個(gè)長(zhǎng) 100mm、寬 50mm、厚 5mm 的板中間挖一個(gè)直徑 20mm 的圓孔”這句話里包含了幾何類型板、孔、尺寸參數(shù)100、50、5、20、位置關(guān)系中間、拓?fù)洳僮魍?。解析層要做的就是把這些信息抽成結(jié)構(gòu)化數(shù)據(jù)通常是一個(gè) JSON 或類似格式的中間表示。這一步現(xiàn)在主流有兩種做法。一種是基于規(guī)則的正則匹配加關(guān)鍵詞詞典適合領(lǐng)域窄、句式固定的場(chǎng)景比如只處理“板孔槽”這類簡(jiǎn)單零件準(zhǔn)確率高但泛化差。另一種是用大語言模型做語義解析把自然語言直接映射成建模腳本或參數(shù)對(duì)象泛化能力強(qiáng)但需要處理幻覺問題——模型可能會(huì)“腦補(bǔ)”出你沒說的尺寸。我實(shí)測(cè)下來比較穩(wěn)的方案是混合式先用 LLM 做意圖識(shí)別和參數(shù)抽取再用規(guī)則校驗(yàn)器檢查參數(shù)是否完整、是否在合理范圍內(nèi)。比如用戶說“挖個(gè)孔”但沒給直徑規(guī)則層就追問或填默認(rèn)值用戶說“厚 5 米”規(guī)則層直接攔截并提示單位異常。這個(gè)校驗(yàn)環(huán)節(jié)看著不起眼但少了它后面幾何生成階段會(huì)炸得莫名其妙。2.2 幾何生成層參數(shù)化建模內(nèi)核的選擇拿到結(jié)構(gòu)化參數(shù)之后下一步是真正生成三維幾何。這里的選擇直接決定了輸出質(zhì)量和格式兼容性。目前 text-to-cad 類工具背后常用的幾何內(nèi)核大概有三種路線。第一種是調(diào)用商業(yè) CAD 的 API比如 SolidWorks 的 COM 接口、Fusion 360 的 Python API、中望 CAD 的二次開發(fā)接口。好處是幾何精度高、特征樹完整、直接能導(dǎo)出 STEP。壞處是依賴宿主軟件、授權(quán)成本高、跨平臺(tái)差。我試過用 Python 批量對(duì) CAD 修改走的就是這條路腳本跑起來穩(wěn)但部署到?jīng)]有裝 CAD 的機(jī)器上就廢了。第二種是用開源幾何內(nèi)核典型的是 OpenCASCADE。它支持 B-Rep 表示能生成 STEP 和 IGES精度夠工業(yè)用。Python 生態(tài)里有 pythonocc 這個(gè)綁定寫起來不算太痛苦。缺點(diǎn)是文檔稀碎、報(bào)錯(cuò)信息晦澀一個(gè)布爾運(yùn)算失敗能讓你查半天。但勝在自由度高、可嵌入服務(wù)端適合做在線 text-to-cad 工具。第三種是走網(wǎng)格路線用 trimesh、numpy-stl 這類庫直接生成 STL 或 GLB。速度快、依賴輕但輸出的是三角網(wǎng)格沒有特征歷史后續(xù)改參數(shù)得重新生成。適合做預(yù)覽、3D 打印、可視化展示不適合需要精確工程圖的場(chǎng)景。選哪條路取決于你的輸出格式要求。要 STEP 就走前兩條要 STL/GLB 且不追求特征樹第三條最省事。2.3 格式輸出層STEP、GLB、STL 各自什么場(chǎng)合用很多人卡在格式選擇上其實(shí)搞清楚三者的定位就不糾結(jié)了。STEP是工程交換格式存的是 B-Rep 邊界表示有精確的曲面和實(shí)體信息能保留特征樹如果導(dǎo)出時(shí)帶的話。SolidWorks、中望 CAD、FreeCAD 都能打開適合后續(xù)做工程圖、裝配、CNC 加工。缺點(diǎn)是文件大、解析慢、不同軟件之間轉(zhuǎn)換偶爾丟面。STL是 3D 打印和快速預(yù)覽的老朋友只存三角面片沒有單位、沒有顏色、沒有特征。優(yōu)點(diǎn)是幾乎所有切片軟件和查看器都認(rèn)缺點(diǎn)是精度靠面片密度堆改一個(gè)尺寸得重新生成整個(gè)網(wǎng)格。熱詞里“sw 中 stl 轉(zhuǎn) stp”之所以被頻繁搜索就是因?yàn)?STL 轉(zhuǎn) STEP 是個(gè)逆向重建過程不是簡(jiǎn)單改后綴。GLB是 glTF 的二進(jìn)制版本主打 Web 展示和實(shí)時(shí)渲染。帶材質(zhì)、帶層級(jí)、文件小適合在瀏覽器里做交互預(yù)覽。但它是為可視化設(shè)計(jì)的不是為制造設(shè)計(jì)的尺寸精度和公差信息基本沒有。我的建議是text-to-cad 工具至少支持 STEP 和 STL 雙輸出。STEP 給工程師做后續(xù)處理STL 給 3D 打印和快速驗(yàn)證。GLB 作為可選項(xiàng)用于網(wǎng)頁端預(yù)覽。3. 實(shí)操落地從零搭一個(gè)最小可用的 text-to-cad 流程3.1 環(huán)境準(zhǔn)備與依賴選型假設(shè)你要自己搭一個(gè)最小可用的 text-to-cad 原型我推薦的技術(shù)棧是 Python OpenCASCADEpythonocc-core 一個(gè)大語言模型 API。為什么選 Python因?yàn)閹缀翁幚?、LLM 調(diào)用、Web 服務(wù)這三塊的生態(tài)都最成熟膠水代碼少。安裝 pythonocc-core 是個(gè)小坑。官方推薦用 conda 裝pip 裝經(jīng)常編譯失敗。命令大概是conda install -c conda-forge pythonocc-core裝完之后驗(yàn)證一下from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox box BRepPrimAPI_MakeBox(100, 50, 5).Shape() print(box)能打印出對(duì)象就說明內(nèi)核通了。如果報(bào)找不到 DLL 或 so 文件大概率是環(huán)境變量沒配好Windows 上把 conda 環(huán)境的 Library/bin 加到 PATH 里。LLM 這塊用哪個(gè)模型不是關(guān)鍵關(guān)鍵是提示詞設(shè)計(jì)。你需要讓模型輸出固定格式的 JSON而不是自由文本。我一般會(huì)在 system prompt 里寫死 schema比如{ shape_type: box_with_hole, length: 100, width: 50, thickness: 5, hole_diameter: 20, hole_position: center }然后要求模型只輸出 JSON不要解釋。實(shí)測(cè)下來加上“只輸出 JSON”和 few-shot 示例之后格式合規(guī)率能到 95% 以上。3.2 從 JSON 到 STEP 的完整代碼路徑拿到 JSON 之后幾何生成就是按部就班的布爾運(yùn)算。以“帶中心孔的板”為例核心步驟是先建一個(gè) Box再建一個(gè) Cylinder然后做 Cut 布爾減。from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox, BRepPrimAPI_MakeCylinder from OCC.Core.BRepAlgoAPI import BRepAlgoAPI_Cut from OCC.Core.gp import gp_Pnt, gp_Ax2, gp_Dir from OCC.Core.STEPControl import STEPControl_Writer, STEPControl_AsIs # 建板 plate BRepPrimAPI_MakeBox(100, 50, 5).Shape() # 建孔位置在板中心軸向沿 Z center gp_Pnt(50, 25, 0) axis gp_Ax2(center, gp_Dir(0, 0, 1)) hole BRepPrimAPI_MakeCylinder(axis, 10, 5).Shape() # 布爾減 result BRepAlgoAPI_Cut(plate, hole).Shape() # 導(dǎo)出 STEP writer STEPControl_Writer() writer.Transfer(result, STEPControl_AsIs) writer.Write(plate_with_hole.step)這段代碼跑通之后你就有了一個(gè)最基礎(chǔ)的 text-to-cad 內(nèi)核。剩下的工作是把 LLM 解析層接上去再加一個(gè) Web 界面或 CLI 入口。注意布爾運(yùn)算失敗是家常便飯常見原因是兩個(gè)實(shí)體沒有真正相交、法線方向反了、或者公差設(shè)置不合理。排查的時(shí)候先把兩個(gè)實(shí)體分別導(dǎo)出 STL 看一眼確認(rèn)位置關(guān)系再查內(nèi)核參數(shù)。3.3 參數(shù)校驗(yàn)與單位處理單位問題是 text-to-cad 里最容易被忽視、又最容易出大事的地方。用戶說“長(zhǎng) 100”到底是毫米還是厘米LLM 可能會(huì)默認(rèn)成米然后你導(dǎo)出的 STEP 在 CAD 里打開發(fā)現(xiàn)是個(gè) 100 米長(zhǎng)的巨物。我的做法是在解析層強(qiáng)制要求單位如果用戶沒寫默認(rèn)按毫米處理并在返回結(jié)果里標(biāo)注“已按毫米解析”。同時(shí)加一個(gè)合理性檢查如果某個(gè)尺寸超過 10000mm 或小于 0.1mm就觸發(fā)警告讓用戶確認(rèn)。這個(gè)閾值可以根據(jù)你的應(yīng)用場(chǎng)景調(diào)整做消費(fèi)級(jí)產(chǎn)品的話 1000mm 以上就該警惕了。另外STEP 文件本身是無單位的單位信息存在文件頭里。導(dǎo)出時(shí)最好顯式設(shè)置單位避免下游軟件按英寸打開。4. 常見問題與排查技巧實(shí)錄4.1 幾何生成失敗的典型原因text-to-cad 跑不通八成問題出在幾何生成階段。我整理了一個(gè)速查表覆蓋最常見的幾種情況。現(xiàn)象可能原因排查方法解決思路布爾運(yùn)算返回空實(shí)體不相交或法線反向分別導(dǎo)出兩個(gè)實(shí)體看位置調(diào)整位置參數(shù)或反轉(zhuǎn)法線STEP 導(dǎo)出后打不開內(nèi)核版本不兼容或文件損壞用 FreeCAD 試開換導(dǎo)出參數(shù)或降級(jí)內(nèi)核孔的位置偏了坐標(biāo)系定義不一致打印實(shí)體包圍盒統(tǒng)一用全局坐標(biāo)圓角失敗半徑大于相鄰邊長(zhǎng)度檢查圓角半徑與邊長(zhǎng)關(guān)系減小半徑或改順序STL 面片數(shù)爆炸網(wǎng)格精度設(shè)太高查看文件大小降低線性偏差和角度偏差這張表里的每一條都是我實(shí)際踩過的。特別是“布爾運(yùn)算返回空”這一條新手最容易懵——代碼不報(bào)錯(cuò)但結(jié)果是個(gè)空殼。后來我養(yǎng)成了一個(gè)習(xí)慣每次布爾運(yùn)算之后檢查結(jié)果的體積是否大于零小于零或等于零就直接拋異常別讓它靜默通過。4.2 LLM 解析層的幻覺與兜底用 LLM 做文本解析最大的風(fēng)險(xiǎn)是它“自作主張”。你明明沒說孔的位置它給你編一個(gè)“center”你說了“厚 5”它理解成“半徑 5”。這些幻覺在文本層面看不出來到了幾何層面就是災(zāi)難。我的兜底策略分三層。第一層是 schema 校驗(yàn)用 JSON Schema 檢查必填字段和類型缺字段就追問。第二層是范圍校驗(yàn)尺寸、角度、數(shù)量這些數(shù)值型參數(shù)都設(shè)上下限。第三層是幾何可行性校驗(yàn)比如“孔徑大于板厚”這種在建模時(shí)可能不報(bào)錯(cuò)但實(shí)際不合理的組合提前攔截。還有一個(gè)小技巧讓 LLM 在輸出 JSON 的同時(shí)輸出一個(gè)“置信度”字段和“假設(shè)說明”字段。置信度低于閾值的請(qǐng)求轉(zhuǎn)人工確認(rèn)假設(shè)說明里寫清楚它補(bǔ)了哪些默認(rèn)值。這樣用戶至少知道模型替他做了哪些決定。4.3 格式轉(zhuǎn)換的坑STL 轉(zhuǎn) STEP 為什么這么難熱詞里“sw 中 stl 轉(zhuǎn) stp”被搜了很多次說明這是很多人的痛點(diǎn)。這里必須說清楚STL 轉(zhuǎn) STEP 不是格式轉(zhuǎn)換是逆向重建。STL 只有三角面片沒有曲面信息轉(zhuǎn)成 STEP 需要先做面片擬合、再重建 B-Rep這個(gè)過程叫“逆向工程”不是一鍵操作。SolidWorks 里有個(gè) ScanTo3D 功能可以做這件事但效果取決于模型復(fù)雜度。簡(jiǎn)單規(guī)則零件還行復(fù)雜曲面基本重建出來沒法用。所以如果你的 text-to-cad 工具輸出的是 STL而用戶想要 STEP正確的做法不是轉(zhuǎn)格式而是從源頭就用 B-Rep 內(nèi)核生成。這也是我前面推薦 pythonocc 而不是純 trimesh 的原因。5. 工具選型與場(chǎng)景適配建議5.1 不同場(chǎng)景下的技術(shù)路線選擇text-to-cad 不是一個(gè)單一工具是一類能力的統(tǒng)稱。選型的時(shí)候先問自己三個(gè)問題輸出要什么格式用戶是誰部署在哪里如果是給工程師用的內(nèi)部工具輸出 STEP、部署在裝了 CAD 的工作站上那直接調(diào) SolidWorks API 或中望 CAD 的二次開發(fā)接口最省事幾何質(zhì)量有保障。如果是給外部用戶用的在線服務(wù)輸出 STL/GLB 做預(yù)覽那 OpenCASCADE 或 trimesh 加個(gè) Web 前端就夠了。如果是做 3D 打印社區(qū)的工具輸出 STL 為主重點(diǎn)優(yōu)化網(wǎng)格質(zhì)量和打印可行性檢查。我個(gè)人的偏好是 OpenCASCADE 打底STEP 和 STL 雙輸出LLM 解析層用 API 調(diào)用而不是本地部署。這樣一套下來開發(fā)成本可控部署靈活精度也夠用。5.2 與現(xiàn)有 CAD 工作流的銜接text-to-cad 生成的東西最終要回到 CAD 工作流里。這里有幾個(gè)銜接點(diǎn)要注意。第一是坐標(biāo)系和基準(zhǔn)面。生成的模型最好以原點(diǎn)為中心或至少以某個(gè)明確基準(zhǔn)對(duì)齊否則導(dǎo)入裝配體之后還得手動(dòng)挪。第二是命名和圖層STEP 里可以帶名稱信息導(dǎo)出時(shí)把零件名、特征名寫進(jìn)去下游打開一目了然。第三是版本兼容STEP 有 AP203、AP214、AP242 幾個(gè)版本AP242 支持顏色和 PMI但老軟件可能不認(rèn)。保險(xiǎn)起見導(dǎo)出 AP214。如果你用的是中望 CAD 這類國(guó)產(chǎn)軟件它的 API 和文件兼容性跟 SolidWorks 有差異測(cè)試的時(shí)候要覆蓋到。我遇到過 STEP 在 SolidWorks 里正常、在中望里丟面的情況后來發(fā)現(xiàn)是曲面精度設(shè)置不一致調(diào)高導(dǎo)出精度就好了。5.3 性能與精度的平衡text-to-cad 做在線服務(wù)的話性能是個(gè)繞不開的問題。OpenCASCADE 的布爾運(yùn)算在復(fù)雜模型上可能跑幾秒到幾十秒用戶等不了。我的做法是分級(jí)處理簡(jiǎn)單零件同步生成復(fù)雜零件異步加進(jìn)度提示。同時(shí)給 STL 預(yù)覽設(shè)一個(gè)低精度快速生成STEP 高精度后臺(tái)慢慢跑。精度方面STEP 導(dǎo)出時(shí)的線性偏差和角度偏差參數(shù)直接影響文件大小和后續(xù)可用性。默認(rèn)值通常夠用但如果你的零件有細(xì)小特征比如 0.5mm 的槽默認(rèn)精度可能把它簡(jiǎn)化掉。這時(shí)候要把線性偏差調(diào)到 0.01mm 級(jí)別。代價(jià)是文件變大、生成變慢所以按需調(diào)整別一刀切。6. 我踩過的坑與實(shí)操心得6.1 那些文檔里不會(huì)寫的細(xì)節(jié)第一個(gè)坑是 pythonocc 的布爾運(yùn)算順序。先做哪個(gè)、后做哪個(gè)結(jié)果可能不一樣。特別是多個(gè)特征疊加的時(shí)候順序錯(cuò)了會(huì)出現(xiàn)意想不到的幾何。我的經(jīng)驗(yàn)是先加后減先大后小先主體后細(xì)節(jié)。第二個(gè)坑是 STEP 導(dǎo)出的單位。pythonocc 默認(rèn)不寫單位有些 CAD 打開會(huì)按英寸解釋。解決辦法是在導(dǎo)出前設(shè)置單位上下文或者在文件名里標(biāo)注單位。我現(xiàn)在的習(xí)慣是文件名帶_mm后綴比如plate_100x50x5_mm.step雖然土但管用。第三個(gè)坑是 LLM 的 token 限制。復(fù)雜零件的描述可能很長(zhǎng)加上 few-shot 示例很容易超。解決辦法是把 schema 精簡(jiǎn)到最小必要字段示例用最簡(jiǎn)形式長(zhǎng)描述分段解析再合并。6.2 給想入坑的人幾條實(shí)在建議如果你只是想快速驗(yàn)證一個(gè)想法別自己搭先用現(xiàn)成工具跑一遍感受一下 text-to-cad 的能力邊界?,F(xiàn)在有一些在線工具支持文本生成 STL雖然精度一般但足夠讓你判斷這條路適不適合你的場(chǎng)景。如果你決定自己搭從最簡(jiǎn)單的零件類型開始比如板、圓柱、孔、槽這四種。把這四種的組合跑通覆蓋 80% 的常見需求。別一上來就搞曲面、倒角、陣列那些是后期的事。最后測(cè)試用例要攢。每次遇到解析錯(cuò)誤或幾何失敗把輸入文本和期望結(jié)果存下來做成回歸測(cè)試集。這個(gè)習(xí)慣我堅(jiān)持了半年現(xiàn)在我的解析層準(zhǔn)確率從最初的 60% 提到了 90% 以上靠的就是這套不斷增長(zhǎng)的測(cè)試集。6.3 后續(xù)可以擴(kuò)展的方向text-to-cad 目前能處理的大多是規(guī)則幾何體曲面和自由形狀還是難點(diǎn)。一個(gè)可行的擴(kuò)展方向是引入草圖約束求解讓用戶用文本描述約束關(guān)系比如“這條邊和那條邊平行且等長(zhǎng)”然后求解器算出具體坐標(biāo)。另一個(gè)方向是結(jié)合圖生 3D用戶畫個(gè)草圖或拍張照模型提取輪廓再生成 CAD文本作為補(bǔ)充說明。這兩個(gè)方向都有開源項(xiàng)目在探索感興趣可以順著 OpenCASCADE 和約束求解器這條線往下挖。我在實(shí)際項(xiàng)目里最大的體會(huì)是text-to-cad 的價(jià)值不在于完全替代手工建模而在于把“想法到可驗(yàn)證模型”的周期從小時(shí)級(jí)壓縮到分鐘級(jí)。它適合做前期概念驗(yàn)證和快速迭代精細(xì)調(diào)整還是得回到傳統(tǒng) CAD。把這個(gè)定位搞清楚工具選型和期望管理都會(huì)順很多。