解析與實操:用自然語言生成參數(shù)化CAD模型)
直接說結(jié)論text-to-cad 這個方向我盯著它已經(jīng)大半年了。從最早看到論文里“輸入一句話直接生成CAD模型”的演示到自己動手把開源方案跑通、踩坑、再調(diào)通我最大的感受是它確實還沒法替代工程師手頭的活兒但作為“從需求到模型”的第一公里價值比大多數(shù)人想象中要大得多。這篇文章不聊虛的。我把text-to-cad 的技術(shù)原理、主流實現(xiàn)路線、一套能直接復(fù)現(xiàn)的最小工作流以及我在實際運行中遇到的坑和解決辦法全部拆開。如果你是在校學(xué)生、機械/建筑方向的建模新人或者是想給3D打印、非標設(shè)計流程里塞一個“自動出圖”環(huán)節(jié)的從業(yè)者這篇文章應(yīng)該能幫你少走很多彎路。1. text-to-cad 到底在解決什么問題先把話說明白text-to-cad 不是一個軟件名它是一類技術(shù)的統(tǒng)稱。核心目標就是通過自然語言描述由算法直接生成可供CAD軟件打開、編輯和加工的幾何模型。換句話說讓“說人話”變成“出圖紙”。1.1 傳統(tǒng)CAD建模的痛點在哪里做機械設(shè)計或3D建模的人都有體會一個簡單零件從0開始建哪怕再熟練也得經(jīng)歷“拉伸、切除、倒角、打孔”這一套組合拳。工具本身不復(fù)雜復(fù)雜的是把腦子里那個“大概的樣子”翻譯成參數(shù)化特征。這個翻譯過程才是大部分新手的真實門檻。我見過不少剛?cè)胄械耐瑢W(xué)制圖課理論背得滾瓜爛熟真讓他畫一個“帶四個沉頭孔的方形法蘭盤”照樣要卡半天——不是不會用命令而是不知道這個零件該由哪些特征組成、特征順序怎么排。這其實就是“語義到幾何”的映射能力沒建立起來。text-to-cad 切入的正是這個環(huán)節(jié)。它嘗試把“四個沉頭孔的法蘭盤”這種自然語言直接映射成一組特征序列或幾何參數(shù)讓軟件替你完成特征建模的邏輯編排。1.2 text-to-cad 的定位與核心價值那它到底想做成什么我的理解是三層第一層替代重復(fù)性的草圖繪制和特征堆疊比如標準件、簡單支架、殼類零件。第二層把產(chǎn)品需求文檔、口頭描述、甚至技術(shù)方案里的文字描述自動轉(zhuǎn)成初步幾何模型作為設(shè)計評審的起點。第三層打通“自然語言—參數(shù)化模型—仿真/加工”的全鏈路讓非專業(yè)人員也能在早期階段介入設(shè)計。這是從“畫圖”到“設(shè)計意圖表達”的轉(zhuǎn)變。也就是說你不再需要糾結(jié)“第一步拉伸還是旋轉(zhuǎn)”而是把注意力放在“這個零件要承受什么力、有什么功能”上。網(wǎng)上關(guān)于cad下載、cad制圖初學(xué)入門的搜索熱度一直很高這恰恰說明一個問題大量用戶有出圖需求但卡在工具使用上。text-to-cad 類工具如今最大的現(xiàn)實意義就是把這一層“工具使用”的摩擦降下來。2. 主流的實現(xiàn)路線與工具選型text-to-cad 看著玄乎實際落地的技術(shù)路線無非三條。我分別跑過不同的方案下面按照工程實用度排序講清楚。2.1 路線一生成式模型直接輸出幾何體這條路以 Zoo 團隊的 Text2CAD 為代表整體思路是用 Transformer/擴散模型把自然語言編碼成隱變量再解碼為體素、點云、或者CSG構(gòu)造樹。輸出后處理成STEP、STL這類通用格式。我個人的評價是作為研究原型很有價值但工程化程度一般。原因在于直接生成點云/體素的方式在幾何精度上很難滿足機械加工要求。你拿到一個花瓶、一把椅子這類自由曲面沒問題但拿到一個配合公差0.05mm的軸孔結(jié)構(gòu)基本沒法用。CSG構(gòu)造樹路線相對更好一些。因為CSG本質(zhì)上是“布爾運算基本體素的組合”生成結(jié)果天然帶參數(shù)化屬性導(dǎo)出STEP后能被主流CAD識別。但它的表達范圍受限——復(fù)雜自由曲面、變半徑圓角、放樣類特征很難用純CSG表達。2.2 路線二LLM生成參數(shù)化建模代碼這條路線是我目前最看好的也是我實際項目中主要采用的。思路非常直接讓大語言模型生成CadQuery 或 build123d 這類參數(shù)化建模代碼然后由腳本執(zhí)行生成模型。類比一下CSG/點云路線是“AI直接畫圖”代碼生成路線是“AI寫圖紙的施工說明”再由“施工隊”CAD內(nèi)核把說明變成實體。后者看起來繞了一圈但每一步都可控、可修正。CadQuery 是用 Python 寫參數(shù)化模型底層基于 OpenCascade 內(nèi)核生成的STEP文件精度高、特征樹完整、可編輯。最關(guān)鍵的是它的代碼可讀性很強生成錯了你知道錯在哪一行而不是面對一團亂七八糟的點云干瞪眼。實際用下來LLM CadQuery 這條路線在“標準件、簡單殼體、規(guī)則板類零件”上成功率很高。我讓LLM生成過一個帶加強筋的鈑金支架一次通過導(dǎo)出的STEP在FreeCAD里打開特征和尺寸完全正常。2.3 路線三草圖識別與約束求解還有一類方案輸入文本后先通過NLP抽取關(guān)鍵尺寸和幾何關(guān)系然后在二維草圖層面自動生成輪廓再用約束求解器如SolveSpace的內(nèi)核轉(zhuǎn)化為三維特征。這種方案比較適合軸類、盤類、型材類零件。我試過一個基于開源約束求解器的實驗性項目對“直徑50mm、長度100mm的圓柱兩端各倒角2mm”這類描述處理得非常穩(wěn)定因為它本質(zhì)上是把文字抽成參數(shù)再套到預(yù)設(shè)模板里。但換個說法比如“一根一頭粗一頭細的棒子”它就懵了——因為模板庫里沒有“變徑”這個預(yù)設(shè)。所以這條路線更適合行業(yè)專用場景比如法蘭、軸、標準件這類“參數(shù)變、結(jié)構(gòu)不變”的零件。服裝CAD里的版片生成、鈑金CAD里的展開圖生成本質(zhì)都是這個思路。2.4 工具選型建議根據(jù)我的實操經(jīng)驗給出一個比較實用的選型建議場景推薦路線理由研究/學(xué)習(xí)原理生成式模型Text2CAD論文復(fù)現(xiàn)算法透明適合理解技術(shù)邊界規(guī)則機械零件LLM CadQuery/build123d精度高、可編輯、錯誤可追溯軸/盤/型材類草圖約束求解 模板匹配穩(wěn)定、可控、速度快自由曲面外觀件生成式模型 Mesh后處理能出復(fù)雜形狀但精度需手工修3D打印愛好者LLM CadQuery 輸出STL流程短迭代快記住一個原則能參數(shù)化的就別用純生成能代碼描述的就別依賴黑盒輸出。這不是保守是工程上對可維護性的要求。3. 實操搭一套文本轉(zhuǎn)CAD的最小可用流程這一節(jié)直接上可落地的方案。我會帶你從零跑通“一句話 → STEP文件 → CAD軟件打開”的完整流程。所有工具均為開源方案不需要額外授權(quán)。3.1 環(huán)境準備與核心依賴建議用 Python 3.10 以上版本我實測在 Windows 11 和 Ubuntu 22.04 下都能正常跑通。核心依賴就三個cadquery參數(shù)化建模的Python庫底層是OpenCascadetransformers 或 openai SDK用來調(diào)用LLM生成CadQuery代碼OCPOpenCascade Python綁定CadQuery的底層依賴安裝時自動帶上安裝命令如下pip install cadquery pip install transformers torch如果你用本地LLM比如跑一個Qwen或Llama的量化版只需要保證顯存夠用如果調(diào)用云API那更省事。我自己的環(huán)境是本地部署了一個7B參數(shù)量的模型生成CadQuery代碼完全夠用且不用把數(shù)據(jù)傳到外部。3.2 提示詞設(shè)計和約束條件用LLM生成CadQuery代碼最關(guān)鍵的不是模型聰明不聰明而是你怎么把需求“翻譯”成它聽得懂、而且沒有歧義的話。我踩過幾次坑之后總結(jié)出一套固定的提示詞結(jié)構(gòu)角色設(shè)定明確告訴模型“你是一名資深機械設(shè)計師熟悉CadQuery庫”輸出格式要求“只輸出Python代碼不要多余解釋代碼塊用純文本”幾何要求寫明單位毫米、坐標系方向、關(guān)鍵尺寸約束條件明確禁止生成STL網(wǎng)格類輸出只允許使用CadQuery的實體建模方法一段比較靠譜的提示詞模板如下你是一名資深機械設(shè)計工程師使用CadQuery庫編寫參數(shù)化建模代碼。請根據(jù)以下需求生成Python代碼 - 零件帶4個安裝孔的矩形底板 - 外形長200mm寬100mm厚10mm - 4個安裝孔分布在四角直徑8mm孔中心距邊沿15mm - 底板中央有一個直徑40mm的沉孔沉孔深度5mm通孔直徑20mm - 代碼中所有尺寸必須用變量定義單位默認為毫米 - 只輸出完整的Python代碼不要輸出解釋性文字注意我提到的“所有尺寸必須用變量定義”——這是我試過很多次后加的關(guān)鍵要求。原因很簡單變量化之后生成錯了你可以直接改變量數(shù)值重新跑一遍而不是回到LLM重新生成一大段代碼。這個細節(jié)在后續(xù)尺寸迭代時能救你命。3.3 生成流程實測從英文描述到CAD模型文件我的完整腳本邏輯如下你可以直接抄來改from cadquery import exporters import openai # 或者用本地模型接口 # 1. 構(gòu)造提示詞 prompt build_prompt(帶4個安裝孔的矩形底板) # 2. 調(diào)用LLM生成CadQuery代碼 response llm_generate(prompt) cad_code extract_python_code(response) # 3. 執(zhí)行CadQuery代碼得到模型對象 exec_namespace {} exec(cad_code, exec_namespace) result exec_namespace.get(result) # 約定生成的變量名必須叫result # 4. 導(dǎo)出STEP文件 exporters.export(result, output.step)這里有一個非常重要的約定生成代碼中必須有一個名為result的變量指向最終的CadQuery Workplane/Shape對象。這樣我的腳本才能從命名空間里把它取出來。這個約定相當(dāng)于你和LLM之間的“接口契約”沒有這個契約后面流程沒法自動化。我實測跑通的一個真實案例提示詞寫的是“一個外徑120mm、內(nèi)徑80mm、高25mm的環(huán)形墊片上下表面各倒角1.5mm”。模型生成的CadQuery代碼大致如下import cadquery as cq outer_d 120 inner_d 80 height 25 chamfer 1.5 result ( cq.Workplane(XY) .circle(outer_d / 2) .circle(inner_d / 2) .extrude(height) .faces(Z).chamfer(chamfer) .faces(Z).chamfer(chamfer) )這段代碼生成后在FreeCAD里打開STEP文件尺寸全部正確倒角方向沒有問題。整個過程從輸入文字到拿到STEP文件大約耗時20秒包含LLM推理時間。3.4 輸出格式轉(zhuǎn)換與下游使用CadQuery支持導(dǎo)出多種格式我在項目中常用的有三種STEP用于工程交換、CAM編程、裝配體配合精度最高STL用于3D打印和網(wǎng)格可視化適合非精密場合DXF用于激光切割、鈑金展開、二維出圖你可以在腳本里快速導(dǎo)出多種格式exporters.export(result, output.step) exporters.export(result, output.stl, tolerance0.1, angularTolerance0.1) exporters.export(result, output.dxf)其中STL導(dǎo)出有兩個關(guān)鍵參數(shù)tolerance控制線性偏差angularTolerance控制角度偏差。這兩個值越小網(wǎng)格越精細文件越大。3D打印的話tolerance0.1已經(jīng)足夠如果是做有限元仿真建議設(shè)置成0.01級別。關(guān)于用戶經(jīng)常搜索的cad轉(zhuǎn)pdf問題我的建議是不要直接從3D模型轉(zhuǎn)PDF正確流程是“生成STEP → 導(dǎo)入CAD軟件出工程圖 → 導(dǎo)出PDF”。這一步text-to-cad管不到但它生成的高精度STEP模型能讓你的出圖環(huán)節(jié)省掉重新建模的時間直接進入標注環(huán)節(jié)。4. 關(guān)鍵細節(jié)為什么生成結(jié)果經(jīng)?!翱粗駥嶋H不能用”跑通流程后你會發(fā)現(xiàn)更大的挑戰(zhàn)不是“能不能生成模型”而是“生成的結(jié)果能否進入真實生產(chǎn)流程”。這里有幾個我反復(fù)踩坑、反復(fù)總結(jié)的關(guān)鍵點。4.1 幾何閉合性與水密性有一次我讓模型生成一個帶內(nèi)腔的殼體輸出的STL在切片軟件里瘋狂報錯一查原因是內(nèi)腔和外殼之間沒有形成閉合的實體邊界存在“開口”面。這在實際加工中是完全不可接受的。這里涉及一個概念水密性Watertight。簡單說一個水密模型的所有邊都是兩個面共用的沒有“漏風(fēng)”的邊界。生成式模型直接輸出點云/網(wǎng)格時最容易出這個問題CadQuery這類基于B-rep邊界表示的程序化建模則天然水密因為OpenCascade內(nèi)核自帶拓撲修復(fù)能力。所以我在方案選擇上堅持用CadQuery理由就在這程序化建模不會產(chǎn)生“看著像、實際縫補不了”的網(wǎng)格漏洞。4.2 參數(shù)化約束缺失的問題純生成式模型第二大致命傷是模型是“死”的。生成一個直徑50mm的圓孔它就是50mm你要改成52mm沒法直接改只能重新跑一遍生成。而參數(shù)化模型的核心價值在于“改參數(shù)就能更新模型”。我在提示詞里強制要求“所有尺寸用變量定義”就是為了保留這個可迭代能力。設(shè)計是個反復(fù)的過程尺寸改三遍五遍太正常了。沒有參數(shù)化能力每次修改都是一次重新生成效率極低。另外約束還體現(xiàn)在特征之間的關(guān)系上。比如“4個螺栓孔到中心孔的距離必須相等”這類幾何約束純生成模型很難保證而CadQuery代碼里用變量定義中心距后再均布陣列天然滿足約束。這件事本質(zhì)上是“把設(shè)計意圖編碼成數(shù)學(xué)關(guān)系”而不是靠模型“猜”。4.3 提示詞工程對生成質(zhì)量的影響我實測發(fā)現(xiàn)同一句話加不加單位、說得具體還是抽象結(jié)果天差地別。比如差勁的描述“一個方形底板上面有孔”好的描述“長200mm寬100mm高10mm的矩形底板4個直徑8mm的圓孔布在四角孔中心距邊沿15mm中心一個直徑20mm通孔”差距不僅僅是有沒有尺寸更關(guān)鍵的是“特征順序”。LLM生成CadQuery代碼時特征的先后順序決定了建模過程能否成功。比如先倒角后打孔和先打孔后倒角結(jié)果完全不同——后者會倒掉孔的邊緣線前者不會。我踩過最深的坑就是倒角和孔的順序。后來我在提示詞里加了一句“先完成所有布爾運算和打孔最后統(tǒng)一處理倒角和圓角”生成成功率立刻提升了一大截。問題典型表現(xiàn)修復(fù)策略特征順序錯誤倒角把孔口搞變形規(guī)定“先主體后細節(jié)先打孔后倒角”尺寸缺失生成結(jié)果比例奇怪提示詞強制給每個特征標尺寸單位歧義零件大十倍或小十倍明說“單位毫米1毫米1單位”約束缺失孔位不對稱要求用變量定義相對位置代碼變量未定義腳本報錯中斷約定變量命名規(guī)范全部在開頭定義4.4 可制造性檢查最后還要說一個很多人忽略的點生成出來的模型即使幾何上正確也可能無法加工。比如太薄的壁低于0.5mm、負角度拔模、沒有避讓的尖角這些都會讓CNC和注塑工藝頭大。我的經(jīng)驗是text-to-cad生成的模型在進入CAM之前必須做一輪可制造性審查。最偷懶的辦法是把生成結(jié)果導(dǎo)入CAD軟件手動檢查最小壁厚和拔模角度。更高級的做法是在提示詞中直接加入工藝約束比如“最小壁厚不低于2mm”“所有外圓角不小于半徑1mm”——這相當(dāng)于是把工藝規(guī)范前置到自然語言階段。5. 常見問題與排查技巧實錄最后這部分是我在實際使用中積累的排查經(jīng)驗。每條都是真實踩坑換來的希望能幫你省時間。5.1 生成速度慢、顯存不足怎么辦本地跑LLM最大的瓶頸就是顯存。我用的7B模型量化后大約需要6GB顯存加上CadQuery建模部分的開銷16GB顯存是夠用的。如果顯卡不夠我用下來最有效的方案是折騰一個“兩段式”在本地用小的規(guī)則模型做初步驗證比如讓模型先生成代碼框架確認邏輯沒問題后再調(diào)用大模型完善細節(jié)。這樣比直接用大模型反復(fù)試錯便宜得多。如果顯存真的不夠還有一個思路控制提示詞長度。英文提示詞比中文省token簡單的零件控制在50詞以內(nèi)生成的代碼體量會小很多顯存壓力也會小很多。5.2 模型輸出無法被CAD軟件打開這是高頻問題。我遇到過的原因有三類第一類是格式版本過新CAD軟件版本太老。STEP格式有AP203和AP214等版本有些老CAD對新的Step文件支持不好。解決辦法是導(dǎo)出時顯式指定使用老版本兼容格式。第二類是文件損壞多見于磁盤空間不足或運行中意外中斷。CadQuery導(dǎo)出是原子操作一般不會有半截文件但如果斷電或強制終止文件也可能寫不完整。重新執(zhí)行導(dǎo)出即可。第三類最隱蔽模型為空。如果CadQuery代碼邏輯有問題導(dǎo)致生成的是空對象導(dǎo)出時會得到空白文件。排查方法是打印result.isValid()和result.Volume()如果體積為零或無效回頭查生成代碼。我建議在導(dǎo)出前加一個校驗邏輯if not result.isValid(): raise ValueError(生成結(jié)果無效請檢查CadQuery代碼) if result.Volume() 1e-6: raise ValueError(生成結(jié)果為空可能是尺寸單位或特征邏輯錯誤)這個校驗邏輯讓我免掉了無數(shù)次白費功夫的導(dǎo)出和導(dǎo)入操作。5.3 生成結(jié)果與描述偏差很大這種情況十有八九是提示詞不夠具體。最常見的問題是說得太抽象比如“好看一點的支架”——“好看”沒有可量化標準模型只能自由發(fā)揮。解決辦法是把抽象詞翻譯成具體幾何描述。比如“好看”翻譯成“左右對稱”“表面圓角過渡”“主體比例為1:2”等等。這個過程相當(dāng)于把審美需求轉(zhuǎn)換成可計算的參數(shù)。另外一個常見問題是中英文混用。CadQuery模型對中文提示詞的支持還行但涉及技術(shù)名詞時英文識別更準確。我的做法是整體用中文但關(guān)鍵尺寸和特征詞用英文寫在括號里如“圓角fillet半徑3mm”。LLM對這種中英對照的提示詞處理效果很好準確率能提高不少。5.4 圍繞CAD生態(tài)的現(xiàn)實問題搜索熱詞里出現(xiàn)“cad如何徹底卸載不影響二次安裝”“cad激活頁面腳本發(fā)生錯誤”這類問題雖然和text-to-cad沒有直接關(guān)系但反映了大量用戶其實是在“工具安裝層”就卡住了。text-to-cad對這種場景的意義是它讓CAD的價值前置到了“描述需求”階段而不是“熟悉界面”階段。如果你正好也被CAD安裝、卸載、報錯這些問題折磨我的建議是優(yōu)先考慮CadQuery FreeCAD這套組合CadQuery負責(zé)程序化建模FreeCAD負責(zé)可視化檢查和工程圖輸出。兩款都是開源工具不存在激活和卸載遺留問題裝錯了大不了刪掉重來不會有后臺服務(wù)殘留。5.5 我的獨家排查技巧匯總下面這幾條是通用文檔里基本不會寫的讓LLM生成代碼后先在本機用python -m py_compile做語法檢查能攔截大半低級語法錯誤避免污染整個流程。處理復(fù)雜零件時不要讓模型一次性全生成先讓它生成“主體框架”再逐個加細節(jié)。分步生成、分步驗證比一次到位成功率高出太多。把常用的提示詞模板保存成配置文件比如“底板類零件”“軸類零件”“法蘭類零件”下次直接套模板不要把同樣的描述反復(fù)重寫。如果LLM生成代碼引用了你未定義的函數(shù)別急著罵模型試著在提示詞中補充一句“只能使用CadQuery官方API”能顯著降低幻覺API的調(diào)用頻率。最后再分享一個我在實際項目中摸索出來的經(jīng)驗text-to-cad 目前效率最高的用法不是讓它獨立完成一個零件而是把它嵌入到“參數(shù)化模板庫”的思路里。你把公司常用的零件族寫成變量化的CadQuery模板然后用LLM做“自然語言 → 模板參數(shù)”的翻譯。這句話200mm×100mm的底板實際就是往模板里填入幾個數(shù)值。這個思路既規(guī)避了LLM在復(fù)雜幾何建模上的短板又保留了自然語言交互的便利性。我自從把這個方案跑通之后整個非標件的前期建模時間大概縮短了一半而且格式規(guī)范、參數(shù)可查、改起來也方便。你如果正考慮把text-to-cad落到實際工作里我強烈建議從這條“模板化參數(shù)翻譯”的路子入手而不是一上來就指望它什么都能畫。