戰(zhàn):從自然語言到 STEP/STL 模型全流程)
1. 從一句話到三維模型text-to-cad 到底在解決什么問題第一次聽到 “text-to-cad” 這個(gè)詞我腦子里蹦出來的畫面是對(duì)著電腦說一句“給我畫一個(gè)帶法蘭的六角螺栓”然后 CAD 界面里就自動(dòng)長出一個(gè)可以旋轉(zhuǎn)、可以導(dǎo)出 STEP 的實(shí)體。這個(gè)畫面放在五年前還像科幻但現(xiàn)在已經(jīng)有一批工具在往這個(gè)方向走了。所謂 text-to-cad直白點(diǎn)講就是用自然語言描述替代傳統(tǒng)的手工建模操作讓程序去生成 CAD 模型文件。它輸出的格式通常不是一張圖片而是STEP、GLB、STL這類真正帶幾何信息的三維文件。這件事的價(jià)值在哪里我做過幾年機(jī)械相關(guān)的項(xiàng)目最深的體會(huì)是CAD 建模的門檻不在“想不想得到”而在“手能不能跟上”。一個(gè)熟練的工程師畫一個(gè)簡單的支架可能要二十分鐘畫一個(gè)復(fù)雜的裝配體可能要一整天。而 text-to-cad 想做的是把“描述需求”和“得到模型”之間的那段重復(fù)勞動(dòng)壓縮掉。它適合的人群其實(shí)比想象中廣做產(chǎn)品原型的設(shè)計(jì)師、需要快速驗(yàn)證結(jié)構(gòu)的工程師、搞 3D 打印的玩家、甚至是想批量生成模型做數(shù)據(jù)集的開發(fā)者。但我要先把話說在前面text-to-cad 目前還不是“一句話出成品”的魔法。它更像一個(gè)理解能力不錯(cuò)但經(jīng)驗(yàn)不足的助理你描述得越精確它給的結(jié)果越靠譜你含糊其辭它就自由發(fā)揮。所以這篇文章不會(huì)給你畫大餅而是把這條鏈路拆開講清楚它背后的技術(shù)點(diǎn)、實(shí)操步驟、格式選擇的門道以及我踩過的那些坑。關(guān)鍵詞里的 CAD、STEP、GLB、STL 會(huì)貫穿全文因?yàn)樗鼈兎謩e代表了“設(shè)計(jì)環(huán)境”“工程交換格式”“通用渲染格式”和“打印切片格式”這四個(gè)關(guān)鍵環(huán)節(jié)。2. 核心原理拆解自然語言是怎么變成幾何體的2.1 從文本到參數(shù)語義解析是第一道關(guān)text-to-cad 的第一步是把你說的話變成機(jī)器能理解的“結(jié)構(gòu)化參數(shù)”。比如你說“一個(gè)長 50 毫米、寬 30 毫米、高 20 毫米的長方體中心開一個(gè)直徑 10 毫米的通孔”系統(tǒng)需要識(shí)別出形狀是長方體尺寸是 50×30×20特征是通孔孔徑 10位置在中心。這個(gè)過程依賴的是自然語言處理里的意圖識(shí)別和實(shí)體抽取。我實(shí)測過幾個(gè)方案發(fā)現(xiàn)一個(gè)規(guī)律帶明確數(shù)值和幾何術(shù)語的描述解析成功率遠(yuǎn)高于口語化描述。你說“搞個(gè)方塊”它可能給你一個(gè)默認(rèn)尺寸的立方體你說“長寬高分別是 50、30、20 的方塊”它就能精確還原。這背后的原因是當(dāng)前多數(shù) text-to-cad 工具用的是“模板匹配 參數(shù)填充”的思路而不是真正的端到端生成。也就是說它內(nèi)部預(yù)置了一批常見的幾何操作拉伸、切除、倒角、陣列你的描述被映射到這些操作上。這里有個(gè)技術(shù)細(xì)節(jié)值得說為什么很多工具選擇輸出 STEP 而不是直接輸出網(wǎng)格因?yàn)?STEP 是邊界表示B-rep格式它記錄的是精確的曲面和實(shí)體信息可以被后續(xù)的 CAD 軟件繼續(xù)編輯。而 STL 和 GLB 本質(zhì)上是三角網(wǎng)格一旦生成就很難再改尺寸。所以如果你的目標(biāo)是“生成后還要改”STEP 是首選如果只是“看一眼”或者“直接打印”STL 更方便。2.2 幾何內(nèi)核真正的難點(diǎn)在“算得出來”文本解析只是前半段后半段才是硬骨頭把參數(shù)變成真實(shí)的幾何體。這一步依賴幾何內(nèi)核常見的有 OpenCASCADE、Parasolid、ACIS 等。OpenCASCADE 是開源方案里用得最多的很多 text-to-cad 項(xiàng)目底層就是它。幾何內(nèi)核要做的事情包括布爾運(yùn)算、倒角、抽殼、曲面求交這些操作的穩(wěn)定性直接決定了生成模型能不能用。我遇到過一個(gè)典型問題描述里帶“倒角”的時(shí)候如果倒角半徑大于相鄰面的尺寸內(nèi)核會(huì)直接報(bào)錯(cuò)或者生成一個(gè)破面。這不是 text-to-cad 的鍋而是幾何運(yùn)算本身的邊界情況。所以我在實(shí)操中會(huì)遵循一個(gè)原則先做主體再加細(xì)節(jié)。先把大形狀生成出來確認(rèn)沒問題再逐步添加孔、槽、倒角這些特征。這樣即使某一步失敗也不會(huì)推翻全部。2.3 輸出格式的選擇邏輯STEP、GLB、STL 這三個(gè)格式很多人分不清該用哪個(gè)。我用一張表來說明它們的區(qū)別和適用場景。格式本質(zhì)能否編輯典型用途文件體積STEPB-rep 精確幾何可以主流 CAD 都支持工程交換、后續(xù)修改中等GLB三角網(wǎng)格 材質(zhì)很難需重新拓?fù)渚W(wǎng)頁展示、AR/VR較小STL純?nèi)蔷W(wǎng)格幾乎不能3D 打印、切片較大精度高時(shí)選擇邏輯很簡單要改就 STEP要展示就 GLB要打印就 STL。但這里有個(gè)坑STL 的精度是用弦高chord height控制的弦高設(shè)得太大會(huì)導(dǎo)致圓弧變成多邊形打印出來表面有棱角設(shè)得太小文件又會(huì)爆炸。我一般會(huì)根據(jù)模型尺寸來定比如 100 毫米以內(nèi)的零件弦高設(shè) 0.05 到 0.1 毫米比較平衡。3. 實(shí)操全流程從描述到可用的模型文件3.1 環(huán)境準(zhǔn)備與工具選型如果你只是想快速體驗(yàn) text-to-cad最省事的方式是用現(xiàn)成的在線工具或者開源項(xiàng)目。我試過幾種路線各有優(yōu)劣。在線工具的好處是開箱即用壞處是模型復(fù)雜了就容易卡住而且很多不支持導(dǎo)出 STEP。開源項(xiàng)目的好處是可控壞處是要自己配環(huán)境依賴 OpenCASCADE 的編譯有時(shí)候挺折騰。我自己的做法是本地裝一個(gè) Python 環(huán)境用 CadQuery 或者 build123d 這類庫作為幾何后端再套一層文本解析。CadQuery 的語法很接近“描述式建模”比如cq.Workplane(XY).box(50, 30, 20).faces(Z).hole(10)就能生成一個(gè)帶孔的長方體。如果你不想寫代碼也可以找?guī)D形界面的工具但靈活性會(huì)差一些。提示OpenCASCADE 的版本兼容性是個(gè)大坑不同版本之間的 API 有變化。建議鎖定一個(gè)穩(wěn)定版本不要盲目追新。3.2 描述文本的寫法規(guī)范這一步是很多人忽略的但恰恰是最影響成功率的。我總結(jié)了一個(gè)“三段式描述法”形狀 尺寸 特征。舉個(gè)例子形狀長方體尺寸長 50 毫米寬 30 毫米高 20 毫米特征中心有一個(gè)直徑 10 毫米的通孔四個(gè)角有半徑 3 毫米的圓角這樣寫出來解析器基本不會(huì)誤解。反過來如果你寫“一個(gè)大概五十乘三十的板子中間打個(gè)洞”系統(tǒng)就要猜“板子”是多厚“洞”是多大。我實(shí)測下來帶單位的數(shù)值描述成功率比不帶單位高出一大截因?yàn)閱挝蝗笔?huì)導(dǎo)致縮放錯(cuò)誤。還有一個(gè)技巧用坐標(biāo)系語言描述位置。比如“在頂面中心”“沿 X 軸方向”“距離左邊緣 10 毫米”這些表述比“在那邊”“靠左一點(diǎn)”精確得多。text-to-cad 不是人它沒有常識(shí)只有坐標(biāo)。3.3 生成與驗(yàn)證的完整流程我通常按這個(gè)流程走先用最簡單的描述生成一個(gè)基礎(chǔ)形狀確認(rèn)解析和幾何內(nèi)核都正常。逐步添加特征每加一個(gè)就導(dǎo)出一次 STL 看一眼。確認(rèn)無誤后導(dǎo)出 STEP 作為最終交付格式。如果需要展示再額外導(dǎo)出 GLB。這里有個(gè)實(shí)操細(xì)節(jié)導(dǎo)出 STL 做視覺檢查時(shí)用網(wǎng)格查看器比用 CAD 軟件快。我常用的是一個(gè)輕量的 STL 查看器加載快旋轉(zhuǎn)流暢能快速發(fā)現(xiàn)破面或者缺失的特征。等確認(rèn)沒問題了再用 CAD 軟件打開 STEP 做精確檢查。關(guān)于參數(shù)計(jì)算我舉個(gè)實(shí)際例子。假設(shè)要生成一個(gè)法蘭盤外徑 100 毫米內(nèi)徑 50 毫米厚度 10 毫米均勻分布 6 個(gè)直徑 8 毫米的螺栓孔孔中心圓直徑 75 毫米。那么每個(gè)孔的角度間隔是 360/660 度第一個(gè)孔可以放在 0 度位置后續(xù)依次旋轉(zhuǎn) 60 度。這個(gè)計(jì)算過程在代碼里就是一個(gè)循環(huán)但如果你用自然語言描述就要說清楚“6 個(gè)孔均勻分布在一個(gè)直徑 75 毫米的圓上”。4. 常見問題與排查技巧實(shí)錄4.1 生成失敗或結(jié)果不符預(yù)期這是最常見的問題原因通常有三類描述歧義、幾何運(yùn)算失敗、格式導(dǎo)出錯(cuò)誤。我整理了一個(gè)速查表。現(xiàn)象可能原因排查方法解決思路生成的形狀完全不對(duì)描述被錯(cuò)誤解析檢查關(guān)鍵詞是否被識(shí)別換更標(biāo)準(zhǔn)的幾何術(shù)語尺寸差了一個(gè)數(shù)量級(jí)單位缺失或錯(cuò)誤確認(rèn)描述里有沒有單位顯式寫上毫米或米特征丟失布爾運(yùn)算失敗單獨(dú)生成該特征測試調(diào)整特征位置或尺寸導(dǎo)出文件打不開格式不兼容換一個(gè)查看器驗(yàn)證重新導(dǎo)出或換格式模型有破面幾何內(nèi)核精度問題放大檢查邊緣簡化特征或調(diào)整公差我踩過最坑的一次是描述里寫了“倒角 2 毫米”但相鄰面的寬度只有 1.5 毫米結(jié)果內(nèi)核直接崩潰連主體都沒生成出來。后來我養(yǎng)成了一個(gè)習(xí)慣任何特征尺寸都要小于它所在面的最小尺寸這是幾何上的硬約束。4.2 格式轉(zhuǎn)換中的信息丟失STEP 轉(zhuǎn) STL 是單向的轉(zhuǎn)過去就回不來了。我見過有人把 STEP 轉(zhuǎn)成 STL 之后想改尺寸結(jié)果發(fā)現(xiàn)只能重新建模。所以我的建議是永遠(yuǎn)保留 STEP 源文件STL 和 GLB 都是派生文件隨時(shí)可以重新生成。另外STEP 轉(zhuǎn) GLB 的時(shí)候材質(zhì)和顏色信息可能會(huì)丟失如果需要帶顏色的展示模型要在轉(zhuǎn)換時(shí)顯式指定。還有一個(gè)細(xì)節(jié)STL 文件分二進(jìn)制和 ASCII 兩種。二進(jìn)制體積小ASCII 可讀但體積大。做 3D 打印一般用二進(jìn)制做數(shù)據(jù)分析可能用 ASCII。這個(gè)在導(dǎo)出時(shí)通常有選項(xiàng)別選錯(cuò)了。4.3 批量生成的性能問題如果你要批量生成幾十上百個(gè)模型性能就會(huì)成為瓶頸。我實(shí)測下來幾何內(nèi)核的布爾運(yùn)算是主要耗時(shí)點(diǎn)尤其是帶大量孔洞的模型。優(yōu)化思路有幾個(gè)一是復(fù)用基礎(chǔ)形狀只改參數(shù)二是并行生成用多進(jìn)程而不是多線程因?yàn)閹缀芜\(yùn)算通常是 CPU 密集型的三是降低中間驗(yàn)證的精度最后再出高精度版本。注意并行生成時(shí)要注意內(nèi)存占用OpenCASCADE 的某些操作比較吃內(nèi)存開太多進(jìn)程反而會(huì)拖慢整體速度。5. 工具鏈與生態(tài)text-to-cad 周邊的那些事5.1 和傳統(tǒng) CAD 的關(guān)系text-to-cad 不是要取代 CAD 軟件而是補(bǔ)上“快速生成”這一環(huán)。生成的 STEP 文件可以導(dǎo)入到中望 CAD、SolidWorks 或者其他主流 CAD 里繼續(xù)編輯。我經(jīng)常的做法是用 text-to-cad 生成基礎(chǔ)結(jié)構(gòu)然后導(dǎo)入 CAD 做細(xì)節(jié)調(diào)整和裝配。這樣比從零開始畫快很多。這里要提一下 CAD 的 shx 字體和圖紙合并這些操作雖然和 text-to-cad 不直接相關(guān)但如果你生成的模型要出工程圖這些就是下游環(huán)節(jié)。我的經(jīng)驗(yàn)是text-to-cad 負(fù)責(zé)“有模型”CAD 負(fù)責(zé)“出圖紙”兩者配合使用效率最高。5.2 和 3D 打印的銜接STL 是 3D 打印的通用格式但 text-to-cad 生成的 STL 不一定直接能打印。常見的問題是壁厚太薄或者有懸空結(jié)構(gòu)。我一般會(huì)在切片軟件里先預(yù)覽一遍看看有沒有紅色警告區(qū)域。如果有就回到 text-to-cad 調(diào)整描述增加壁厚或者添加支撐結(jié)構(gòu)。還有一個(gè)坑STL 的網(wǎng)格質(zhì)量直接影響打印效果。如果生成的 STL 三角面片太大曲面就會(huì)顯得很粗糙。這時(shí)候可以在導(dǎo)出時(shí)調(diào)小弦高或者用網(wǎng)格細(xì)分工具處理一下。我試過用 Python 的 trimesh 庫做網(wǎng)格細(xì)分效果還不錯(cuò)。5.3 和其他技術(shù)的結(jié)合點(diǎn)text-to-cad 可以和參數(shù)化設(shè)計(jì)結(jié)合比如用 Python 腳本批量生成不同尺寸的模型。也可以和 AR/VR 結(jié)合把 GLB 格式的模型直接放到網(wǎng)頁或者頭顯里展示。我甚至見過有人把 text-to-cad 和機(jī)械臂仿真結(jié)合用生成的 STL 模型做碰撞檢測。這些場景說明text-to-cad 的輸出不只是“一個(gè)模型”而是“一個(gè)可以被下游系統(tǒng)消費(fèi)的數(shù)據(jù)源”。6. 我個(gè)人的實(shí)操心得與避坑建議先說一個(gè)最實(shí)用的心得描述文本要像寫工藝卡片一樣寫。什么叫工藝卡片就是每一步做什么、用什么尺寸、達(dá)到什么效果寫得清清楚楚。比如“在長方體頂面中心位置沿 Z 軸負(fù)方向切除一個(gè)直徑 10 毫米、深度 20 毫米的孔”這種描述幾乎不會(huì)出錯(cuò)。反過來“在頂上打個(gè)洞”這種描述十有八九要返工。第二個(gè)心得是關(guān)于格式選擇的不要一上來就導(dǎo)出 STL。STL 是終點(diǎn)格式不是中間格式。我見過太多人把 STL 當(dāng)中間文件用結(jié)果改不動(dòng)了。正確的做法是 STEP 作為工作格式STL 和 GLB 作為交付格式。第三個(gè)心得是關(guān)于幾何精度的公差不是越小越好。有些場景下過小的公差會(huì)導(dǎo)致幾何運(yùn)算失敗或者文件巨大。我一般會(huì)根據(jù)模型用途來定公差展示用的模型公差可以放寬到 0.1 毫米工程用的模型控制在 0.01 毫米以內(nèi)。最后分享一個(gè)小技巧如果你不確定描述該怎么寫可以先在紙上畫一個(gè)草圖把關(guān)鍵尺寸標(biāo)上去然后照著草圖寫描述。這樣寫出來的文本結(jié)構(gòu)清晰解析成功率會(huì)高很多。這個(gè)習(xí)慣我堅(jiān)持了很久實(shí)測下來比直接對(duì)著屏幕敲字靠譜得多。至于后續(xù)擴(kuò)展text-to-cad 這條鏈路還可以往“批量參數(shù)化生成”和“模型庫自動(dòng)構(gòu)建”方向走。比如你有一批標(biāo)準(zhǔn)件可以用腳本批量生成 STEP 文件建一個(gè)自己的模型庫。需要的時(shí)候直接調(diào)用不用每次重新描述。這個(gè)思路我在幾個(gè)項(xiàng)目里用過省下來的時(shí)間相當(dāng)可觀。