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