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