戰(zhàn):從自然語言到 STEP/URDF/G-code 的三段式管線)
1. 從一句話到三維模型text-to-cad 到底在解決什么問題第一次聽到 “text-to-cad” 這個(gè)詞很多人腦子里蹦出來的畫面可能是對(duì)著電腦說一句“給我畫個(gè)法蘭盤”然后 CAD 軟件里就自動(dòng)生成了一張圖紙。這個(gè)理解方向沒錯(cuò)但實(shí)際落地遠(yuǎn)沒有這么簡(jiǎn)單。text-to-cad 本質(zhì)上是一套把自然語言描述轉(zhuǎn)換成結(jié)構(gòu)化三維模型數(shù)據(jù)的技術(shù)鏈路它的輸出通常不是一張 DWG 圖紙而是 STEP、URDF、G-code 這類可以被下游工具直接消費(fèi)的中間格式。我接觸這個(gè)方向是從一個(gè)很具體的需求開始的手頭有一批參數(shù)化零件每次改尺寸都要手動(dòng)在 CAD 里重新拉伸、打孔、倒角重復(fù)勞動(dòng)太多。后來想能不能用一段文字描述直接驅(qū)動(dòng)模型生成試了幾輪之后發(fā)現(xiàn)text-to-cad 真正的價(jià)值不在于“替代畫圖”而在于把設(shè)計(jì)意圖變成可復(fù)用的數(shù)據(jù)流。你描述的是“一個(gè)外徑 80、內(nèi)徑 40、厚度 10 的法蘭均布 6 個(gè)直徑 8 的孔”系統(tǒng)輸出的是帶完整幾何拓?fù)涞?STEP 文件這個(gè)文件可以進(jìn)仿真、可以進(jìn)切片、可以進(jìn)機(jī)器人仿真環(huán)境。它適合誰三類人最值得關(guān)注一是做參數(shù)化設(shè)計(jì)的機(jī)械工程師二是搞機(jī)器人仿真需要批量生成 URDF 的技術(shù)人員三是做增材制造想把文字需求直接轉(zhuǎn)成 G-code 的創(chuàng)客。如果你只是偶爾畫兩張二維圖那 text-to-cad 對(duì)你的邊際收益不大但如果你面對(duì)的是成百上千個(gè)變體零件這套思路能省掉大量重復(fù)操作。需要先明確一點(diǎn)text-to-cad 不是某一個(gè)軟件的功能按鈕而是一條從語義解析到幾何生成再到格式導(dǎo)出的完整管線。下面我按自己實(shí)際搭過的流程把每個(gè)環(huán)節(jié)拆開講。2. 整體架構(gòu)設(shè)計(jì)為什么是“解析—建?!獙?dǎo)出”三段式2.1 核心思路與方案選型我試過兩種路線。第一種是端到端生成用大模型直接輸出 CAD 腳本或網(wǎng)格數(shù)據(jù)第二種是分階段管線先把文字解析成結(jié)構(gòu)化參數(shù)再調(diào)用幾何內(nèi)核建模最后按目標(biāo)格式導(dǎo)出。實(shí)測(cè)下來第一種路線在簡(jiǎn)單形狀上能跑通但一旦涉及孔位陣列、倒角、裝配關(guān)系生成結(jié)果就很不穩(wěn)定而且出錯(cuò)之后幾乎沒法調(diào)試。所以我最終采用的是三段式架構(gòu)語義解析層把自然語言拆成“實(shí)體類型 尺寸參數(shù) 特征操作”的結(jié)構(gòu)化描述幾何建模層用參數(shù)化建模內(nèi)核根據(jù)結(jié)構(gòu)化描述生成三維實(shí)體格式導(dǎo)出層把實(shí)體轉(zhuǎn)換成 STEP、URDF、G-code 等目標(biāo)格式這個(gè)設(shè)計(jì)的核心考量是可調(diào)試性。文字解析錯(cuò)了我只需要改解析規(guī)則幾何生成錯(cuò)了我只需要調(diào)建模參數(shù)導(dǎo)出格式不對(duì)我只需要換導(dǎo)出器。每一層都可以單獨(dú)驗(yàn)證不會(huì)出現(xiàn)“一句話進(jìn)去、一坨亂碼出來、完全不知道哪里錯(cuò)了”的情況。提示如果你剛開始做 text-to-cad強(qiáng)烈建議不要一上來就追求端到端。先把中間的結(jié)構(gòu)化描述定義清楚后面所有工作都會(huì)輕松很多。2.2 各層職責(zé)與數(shù)據(jù)流結(jié)構(gòu)化描述我用的是 JSON字段設(shè)計(jì)參考了常見 CAD 特征的參數(shù)組織方式。一個(gè)典型的法蘭描述長(zhǎng)這樣{ entity: flange, params: { outer_diameter: 80, inner_diameter: 40, thickness: 10, holes: { count: 6, diameter: 8, pcd: 60 } }, units: mm }這個(gè) JSON 就是整條管線的“合同”。解析層負(fù)責(zé)產(chǎn)出它建模層負(fù)責(zé)消費(fèi)它導(dǎo)出層不關(guān)心它怎么來的。這樣做的好處是哪天我想換一個(gè)更好的語言模型來解析文字只要它還能輸出同樣結(jié)構(gòu)的 JSON后面兩層完全不用動(dòng)。幾何建模層我選的是基于OpenCASCADE的內(nèi)核因?yàn)樗鼘?duì) STEP 格式的支持最成熟布爾運(yùn)算也穩(wěn)定。URDF 導(dǎo)出則需要額外處理關(guān)節(jié)和連桿的層級(jí)關(guān)系這部分后面單獨(dú)講。G-code 導(dǎo)出相對(duì)獨(dú)立本質(zhì)上是把三維模型切片后生成路徑我一般用現(xiàn)成的切片引擎來處理。2.3 為什么不用直接生成網(wǎng)格有人會(huì)問現(xiàn)在網(wǎng)格生成模型那么多為什么不直接文字生成 STL我的經(jīng)驗(yàn)是網(wǎng)格數(shù)據(jù)不可參數(shù)化。你拿到一個(gè) STL想改一個(gè)孔的直徑只能重新生成整個(gè)網(wǎng)格。而 STEP 是邊界表示B-rep每個(gè)面、每條邊都是帶參數(shù)的改一個(gè)尺寸只需要更新對(duì)應(yīng)參數(shù)。對(duì)于需要反復(fù)迭代的設(shè)計(jì)場(chǎng)景這個(gè)差別是致命的。另外URDF 和 G-code 對(duì)幾何精度的要求不同。URDF 關(guān)心的是碰撞體和視覺體的近似G-code 關(guān)心的是切片路徑兩者都需要從精確的 B-rep 模型出發(fā)做不同處理。如果中間只有網(wǎng)格很多下游操作會(huì)變得很別扭。3. 語義解析層把“人話”變成“機(jī)器能懂的參數(shù)”3.1 解析策略規(guī)則優(yōu)先還是模型優(yōu)先我一開始用純規(guī)則做解析寫了一大堆正則表達(dá)式。簡(jiǎn)單句還能應(yīng)付比如“直徑 50 的圓盤”但一旦出現(xiàn)“外徑 80 內(nèi)徑 40 厚度 10 均布 6 個(gè)直徑 8 的孔”這種復(fù)合描述規(guī)則就開始打架。后來改成模型抽取 規(guī)則校驗(yàn)的混合策略先用語言模型把句子里的實(shí)體、尺寸、數(shù)量、位置關(guān)系抽出來再用規(guī)則檢查參數(shù)是否完整、單位是否明確、數(shù)值是否在合理范圍內(nèi)。這個(gè)混合策略的關(guān)鍵在于校驗(yàn)環(huán)節(jié)。語言模型有時(shí)候會(huì)把“內(nèi)徑”和“外徑”搞反或者漏掉單位。規(guī)則校驗(yàn)會(huì)檢查外徑是否大于內(nèi)徑孔的數(shù)量是否是整數(shù)孔徑是否小于壁厚這些檢查能攔掉大部分低級(jí)錯(cuò)誤。3.2 參數(shù)完整性檢查清單在實(shí)際操作中我發(fā)現(xiàn)以下幾類問題出現(xiàn)頻率最高建議在解析層就做好攔截問題類型典型表現(xiàn)處理方式單位缺失“直徑 80”沒說是 mm 還是 inch默認(rèn) mm但在輸出中標(biāo)注假設(shè)參數(shù)矛盾內(nèi)徑大于外徑直接報(bào)錯(cuò)要求重新描述特征沖突孔的位置超出實(shí)體范圍計(jì)算孔邊距超出則報(bào)錯(cuò)數(shù)量模糊“幾個(gè)孔”沒有具體數(shù)字追問或使用默認(rèn)值并標(biāo)注術(shù)語歧義“大孔”沒有具體尺寸要求補(bǔ)充具體數(shù)值注意不要小看單位問題。我踩過一次坑一批零件默認(rèn)用了 inch結(jié)果導(dǎo)出 STEP 之后進(jìn)仿真尺寸差了 25.4 倍排查了半天才發(fā)現(xiàn)是單位沒統(tǒng)一。3.3 從描述到 JSON 的實(shí)操示例假設(shè)輸入是“一個(gè)長(zhǎng) 100 寬 60 高 20 的方塊四個(gè)角各有一個(gè)直徑 6 的通孔孔中心距邊緣 10?!苯馕鰧拥墓ぷ髁鞒淌亲R(shí)別實(shí)體類型方塊box抽取主尺寸長(zhǎng) 100、寬 60、高 20識(shí)別特征操作通孔through hole抽取孔參數(shù)直徑 6、數(shù)量 4推斷孔位置四角中心距邊緣 10生成結(jié)構(gòu)化 JSON對(duì)應(yīng)的 JSON 如下{ entity: box, params: { length: 100, width: 60, height: 20, holes: { type: through, diameter: 6, count: 4, positions: [ {x: 10, y: 10}, {x: 90, y: 10}, {x: 10, y: 50}, {x: 90, y: 50} ] } }, units: mm }這里的位置計(jì)算是解析層做的孔中心距邊緣 10所以四個(gè)角的坐標(biāo)分別是 (10,10)、(90,10)、(10,50)、(90,50)。這個(gè)計(jì)算邏輯要寫清楚因?yàn)椴煌藢?duì)“距邊緣”的理解可能不一樣——是孔中心到邊緣還是孔邊到邊緣我默認(rèn)按孔中心算并在文檔里注明。4. 幾何建模層從參數(shù)到實(shí)體的關(guān)鍵操作4.1 建模內(nèi)核的選擇與初始化幾何建模層我用的 OpenCASCADEPython 綁定用的是 pythonocc。初始化流程大概是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 # 創(chuàng)建方塊 box BRepPrimAPI_MakeBox(100, 60, 20).Shape() # 創(chuàng)建圓柱并做布爾減 for pos in hole_positions: cylinder BRepPrimAPI_MakeCylinder(3, 20, gp_Ax2(gp_Pnt(pos.x, pos.y, 0), gp_Dir(0, 0, 1))).Shape() box BRepAlgoAPI_Cut(box, cylinder).Shape()這段代碼的邏輯很直接先建主實(shí)體再逐個(gè)建特征實(shí)體最后用布爾運(yùn)算把特征從主實(shí)體上“挖”掉。但實(shí)際操作中有幾個(gè)細(xì)節(jié)要注意。4.2 布爾運(yùn)算的穩(wěn)定性技巧布爾運(yùn)算是幾何建模里最容易出問題的環(huán)節(jié)。我遇到過圓柱和方塊表面剛好相切導(dǎo)致運(yùn)算失敗的情況也遇到過孔的位置太靠近邊緣導(dǎo)致生成薄壁碎片。幾個(gè)實(shí)用技巧留余量做減運(yùn)算的圓柱高度要比主實(shí)體厚度多出一點(diǎn)確保完全穿透。比如方塊高 20圓柱高度用 22兩端各多 1mm。避免相切孔中心到邊緣的距離不要?jiǎng)偤玫扔诳讖降囊话肷晕㈠e(cuò)開一點(diǎn)避免相切。分步運(yùn)算如果有多個(gè)孔不要一次性做所有布爾運(yùn)算逐個(gè)做每做一步檢查一下實(shí)體是否有效。容差設(shè)置OpenCASCADE 有默認(rèn)容差如果模型尺寸很小比如微米級(jí)需要手動(dòng)調(diào)整容差參數(shù)。提示布爾運(yùn)算失敗時(shí)先檢查兩個(gè)實(shí)體是否有重疊體積。如果只是面接觸運(yùn)算結(jié)果可能為空或報(bào)錯(cuò)。4.3 特征順序?qū)Y(jié)果的影響建模順序會(huì)影響最終結(jié)果尤其是涉及倒角和圓角的時(shí)候。我的經(jīng)驗(yàn)是先做減運(yùn)算再做倒角。如果先倒角再打孔孔可能會(huì)切掉倒角的一部分導(dǎo)致邊緣不完整。正確的順序是創(chuàng)建主實(shí)體執(zhí)行所有減運(yùn)算孔、槽、腔執(zhí)行倒角和圓角檢查實(shí)體有效性這個(gè)順序不是絕對(duì)的但大多數(shù)情況下能避免特征干涉。如果倒角之后還需要打孔那就要重新評(píng)估順序。4.4 模型有效性檢查每次布爾運(yùn)算之后我都會(huì)跑一遍有效性檢查from OCC.Core.BRepCheck import BRepCheck_Analyzer analyzer BRepCheck_Analyzer(shape) if not analyzer.IsValid(): print(模型無效需要排查)無效模型導(dǎo)出 STEP 后下游工具可能讀不出來或者讀出來是破面。與其等到下游報(bào)錯(cuò)不如在建模層就攔住。5. 格式導(dǎo)出層STEP、URDF、G-code 的差異化處理5.1 STEP 導(dǎo)出最直接的路徑STEP 導(dǎo)出是最成熟的OpenCASCADE 自帶導(dǎo)出器from OCC.Core.STEPControl import STEPControl_Writer, STEPControl_AsIs writer STEPControl_Writer() writer.Transfer(shape, STEPControl_AsIs) writer.Write(output.step)這里的關(guān)鍵參數(shù)是STEPControl_AsIs表示按原樣導(dǎo)出不做額外處理。如果模型有裝配關(guān)系需要額外處理裝配層級(jí)。對(duì)于單實(shí)體零件這樣導(dǎo)出就夠了。STEP 的好處是通用性強(qiáng)幾乎所有 CAD 軟件都能讀。我試過用 FreeCAD、中望 CAD、SolidWorks 分別打開同一個(gè) STEP 文件幾何信息都能正確識(shí)別。但要注意STEP 不保留特征樹導(dǎo)出的是一堆面片和邊想改參數(shù)只能回到生成端重新生成。5.2 URDF 導(dǎo)出機(jī)器人仿真的特殊需求URDF 是機(jī)器人描述格式它關(guān)心的不是精確幾何而是連桿、關(guān)節(jié)、碰撞體、視覺體的層級(jí)關(guān)系。從 text-to-cad 生成 URDF需要額外做幾件事定義連桿每個(gè)獨(dú)立運(yùn)動(dòng)的部件作為一個(gè) link定義關(guān)節(jié)link 之間的連接關(guān)系包括關(guān)節(jié)類型旋轉(zhuǎn)、平移、固定和運(yùn)動(dòng)范圍簡(jiǎn)化碰撞體URDF 的碰撞體通常用簡(jiǎn)單幾何方塊、圓柱、球近似不需要精確 B-rep指定視覺體視覺體可以用網(wǎng)格文件通常導(dǎo)出為 STL 或 DAE我一般的工作流是先用 text-to-cad 生成精確 STEP 模型再根據(jù)裝配關(guān)系手動(dòng)或半自動(dòng)地定義 URDF 結(jié)構(gòu)。完全自動(dòng)從文字生成 URDF 目前還比較困難因?yàn)殛P(guān)節(jié)類型和運(yùn)動(dòng)范圍很難從自然語言中準(zhǔn)確推斷。注意URDF 導(dǎo)入 CoppeliaSim 時(shí)路徑問題是最常見的坑。建議用相對(duì)路徑并且把網(wǎng)格文件和 URDF 放在同一個(gè)目錄下。5.3 G-code 導(dǎo)出從模型到制造路徑G-code 導(dǎo)出本質(zhì)上是切片加路徑規(guī)劃。text-to-cad 生成的模型需要先導(dǎo)出為 STL再進(jìn)切片引擎。我常用的流程是從 B-rep 模型導(dǎo)出 STL注意設(shè)置合適的網(wǎng)格精度用切片引擎如 CuraEngine、PrusaSlicer生成 G-code根據(jù)打印機(jī)參數(shù)調(diào)整速度、溫度、層高這里的關(guān)鍵是網(wǎng)格精度。STL 是三角網(wǎng)格精度太低會(huì)導(dǎo)致圓弧變成多邊形精度太高會(huì)導(dǎo)致文件過大。我的經(jīng)驗(yàn)是對(duì)于一般零件弦高公差設(shè) 0.01mm角度公差設(shè) 0.5 度能在文件大小和精度之間取得平衡。格式主要用途精度要求導(dǎo)出難度STEPCAD 交換、仿真高B-rep低URDF機(jī)器人仿真中簡(jiǎn)化碰撞體中G-code增材制造中切片路徑中STL3D 打印、可視化中三角網(wǎng)格低6. 實(shí)操全流程從一句話到可用的 STEP 文件6.1 環(huán)境準(zhǔn)備與依賴安裝我用的環(huán)境是 Python 3.10 pythonocc-core numpy。安裝 pythonocc 在 Windows 上稍微麻煩一點(diǎn)推薦用 condaconda install -c conda-forge pythonocc-core如果不用 condapip 安裝可能會(huì)缺依賴。Linux 下相對(duì)簡(jiǎn)單apt 裝好 OpenCASCADE 開發(fā)庫之后 pip 裝 pythonocc 基本能跑通。6.2 完整代碼示例下面是一個(gè)從文字描述到 STEP 導(dǎo)出的最小可運(yùn)行示例import json 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 from OCC.Core.BRepCheck import BRepCheck_Analyzer # 假設(shè)解析層已經(jīng)產(chǎn)出結(jié)構(gòu)化描述 spec { entity: box, params: { length: 100, width: 60, height: 20, holes: { type: through, diameter: 6, count: 4, positions: [ {x: 10, y: 10}, {x: 90, y: 10}, {x: 10, y: 50}, {x: 90, y: 50} ] } }, units: mm } # 建模 p spec[params] shape BRepPrimAPI_MakeBox(p[length], p[width], p[height]).Shape() hole_r p[holes][diameter] / 2 hole_h p[height] 2 # 留余量 for pos in p[holes][positions]: cyl BRepPrimAPI_MakeCylinder( hole_r, hole_h, gp_Ax2(gp_Pnt(pos[x], pos[y], -1), gp_Dir(0, 0, 1)) ).Shape() shape BRepAlgoAPI_Cut(shape, cyl).Shape() # 有效性檢查 if not BRepCheck_Analyzer(shape).IsValid(): raise RuntimeError(模型無效) # 導(dǎo)出 STEP writer STEPControl_Writer() writer.Transfer(shape, STEPControl_AsIs) writer.Write(output.step) print(STEP 文件已生成)這段代碼跑通之后你會(huì)得到一個(gè)帶四個(gè)通孔的方塊 STEP 文件。用 FreeCAD 打開應(yīng)該能看到完整的幾何。6.3 參數(shù)計(jì)算的實(shí)際案例再舉一個(gè)法蘭的例子說明參數(shù)計(jì)算過程。輸入描述“外徑 120內(nèi)徑 60厚度 15均布 8 個(gè)直徑 10 的孔孔中心圓直徑 90?!庇?jì)算過程外半徑 120 / 2 60內(nèi)半徑 60 / 2 30孔半徑 10 / 2 5孔中心圓半徑 90 / 2 45孔中心坐標(biāo)角度間隔 360 / 8 45 度第 i 個(gè)孔的角度 i * 45 度x 45 * cos(角度)y 45 * sin(角度)這些計(jì)算在解析層完成建模層直接消費(fèi)坐標(biāo)。這樣做的好處是如果以后要改孔的數(shù)量只需要改解析層的計(jì)算邏輯建模層不用動(dòng)。7. 常見問題與排查技巧實(shí)錄7.1 布爾運(yùn)算失敗怎么辦這是最高頻的問題。表現(xiàn)是BRepAlgoAPI_Cut返回空形狀或者拋異常。排查順序檢查兩個(gè)實(shí)體是否有實(shí)際重疊體積而不只是面接觸檢查實(shí)體是否有效用BRepCheck_Analyzer驗(yàn)證嘗試調(diào)整容差BRepAlgoAPI_Cut可以設(shè)置模糊容差如果還不行把減運(yùn)算的實(shí)體稍微移動(dòng)一點(diǎn)避開相切位置我遇到過一次圓柱和方塊的一個(gè)面剛好共面導(dǎo)致布爾運(yùn)算結(jié)果不穩(wěn)定。把圓柱沿軸向移動(dòng) 0.01mm 之后就正常了。7.2 STEP 導(dǎo)出后下游讀不出來通常是模型本身有問題。先用BRepCheck_Analyzer檢查如果模型有效但下游還是讀不出來可能是 STEP 版本問題。OpenCASCADE 默認(rèn)導(dǎo)出 AP214有些老軟件只支持 AP203。可以在導(dǎo)出時(shí)指定協(xié)議writer.Transfer(shape, STEPControl_AsIs) # 或者嘗試其他協(xié)議另外文件名不要用中文和特殊字符有些下游工具對(duì)路徑編碼支持不好。7.3 URDF 導(dǎo)入仿真環(huán)境后位置不對(duì)URDF 的坐標(biāo)系定義和 CAD 的坐標(biāo)系定義可能不一致。CAD 通常 Z 軸向上URDF 通常也是 Z 軸向上但有些仿真環(huán)境默認(rèn) Y 軸向上。導(dǎo)入之后如果發(fā)現(xiàn)模型躺倒了檢查一下坐標(biāo)系約定。還有一個(gè)常見問題是單位。URDF 默認(rèn)用米CAD 默認(rèn)用毫米。導(dǎo)出 URDF 時(shí)要把尺寸除以 1000否則模型會(huì)大 1000 倍。7.4 G-code 路徑異常G-code 路徑異常通常出在切片參數(shù)上。檢查層高是否合理一般 0.1-0.3mm噴嘴直徑是否和切片參數(shù)匹配模型是否封閉非封閉模型切片會(huì)出問題模型是否在打印平臺(tái)范圍內(nèi)我踩過一次坑模型導(dǎo)出 STL 時(shí)精度設(shè)得太低圓弧變成了明顯的多邊形切片后路徑抖動(dòng)很厲害。把弦高公差從 0.1mm 調(diào)到 0.01mm 之后就順滑了。7.5 常見問題速查表問題現(xiàn)象可能原因排查方向布爾運(yùn)算返回空實(shí)體無重疊或相切檢查位置關(guān)系留余量STEP 導(dǎo)出失敗模型無效或路徑含特殊字符檢查模型有效性換路徑URDF 導(dǎo)入后尺寸不對(duì)單位不一致毫米轉(zhuǎn)米URDF 導(dǎo)入后姿態(tài)不對(duì)坐標(biāo)系約定不同檢查軸向定義G-code 路徑抖動(dòng)STL 精度太低提高網(wǎng)格精度模型面數(shù)過多網(wǎng)格精度太高降低弦高公差孔位置偏移坐標(biāo)計(jì)算錯(cuò)誤檢查解析層計(jì)算邏輯8. 工具鏈選型與擴(kuò)展思路8.1 建模內(nèi)核對(duì)比內(nèi)核優(yōu)勢(shì)劣勢(shì)適用場(chǎng)景OpenCASCADE開源STEP 支持好學(xué)習(xí)曲線陡通用 CAD 生成CGAL幾何算法豐富偏學(xué)術(shù)工程化弱研究性項(xiàng)目FreeCAD API上手快Python 友好依賴 FreeCAD 環(huán)境快速原型CadQuery語法簡(jiǎn)潔參數(shù)化強(qiáng)底層還是 OCC參數(shù)化零件我目前主力用 OpenCASCADE因?yàn)榭煽匦宰顝?qiáng)。如果只是做簡(jiǎn)單零件CadQuery 的語法更友好寫起來快很多。8.2 從單零件到裝配體單零件跑通之后下一步自然是裝配體。裝配體的 text-to-cad 需要額外處理零件間的位置關(guān)系配合、對(duì)齊、距離裝配層級(jí)子裝配和總裝配的關(guān)系干涉檢查零件之間是否有碰撞這部分我還在摸索目前的做法是先用文字分別生成每個(gè)零件再手動(dòng)或半自動(dòng)地定義裝配關(guān)系。完全自動(dòng)的裝配體生成難點(diǎn)在于自然語言中的位置描述往往很模糊比如“把軸插進(jìn)孔里”到底插多深、什么配合都需要額外推斷。8.3 批量生成的工程化考慮如果要做批量生成比如一次生成 100 個(gè)不同尺寸的法蘭需要考慮模板化把常用零件做成模板只改參數(shù)隊(duì)列處理生成任務(wù)排隊(duì)避免內(nèi)存爆掉錯(cuò)誤重試某個(gè)零件生成失敗時(shí)自動(dòng)重試或跳過日志記錄每個(gè)零件的生成參數(shù)和結(jié)果都要記錄方便追溯我用 Python 的 concurrent.futures 做并行生成但要注意 OpenCASCADE 不是線程安全的每個(gè)線程需要獨(dú)立的建模上下文。簡(jiǎn)單做法是用多進(jìn)程每個(gè)進(jìn)程獨(dú)立初始化。9. 我踩過的坑與實(shí)操心得第一個(gè)坑是單位不統(tǒng)一。前面提過一批零件默認(rèn)用了 inch導(dǎo)出 STEP 后進(jìn)仿真尺寸差了 25.4 倍。后來我在解析層強(qiáng)制要求標(biāo)注單位沒標(biāo)注的一律按 mm 處理并在輸出中打印警告。第二個(gè)坑是布爾運(yùn)算的順序。有一次先倒了角再打孔結(jié)果孔切掉了倒角的一部分邊緣出現(xiàn)了薄壁碎片。后來改成先打孔再倒角問題消失。這個(gè)順序不是絕對(duì)的但大多數(shù)情況下先減后倒更安全。第三個(gè)坑是URDF 的碰撞體簡(jiǎn)化。一開始我直接把精確模型作為碰撞體導(dǎo)出結(jié)果仿真時(shí)碰撞檢測(cè)特別慢。后來改成用簡(jiǎn)單幾何近似碰撞體視覺體用精確模型仿真速度提升了一個(gè)數(shù)量級(jí)。第四個(gè)坑是G-code 的模型封閉性。有一個(gè)模型因?yàn)椴紶栠\(yùn)算出了一個(gè)小破面肉眼看不出來但切片時(shí)路徑直接亂掉。后來每次導(dǎo)出 STL 之前都跑一遍封閉性檢查不通過就不切片。提示text-to-cad 的產(chǎn)出物最終是要給下游用的所以下游能讀、能用比生成得快更重要。寧可多花幾秒做有效性檢查也不要生成一堆廢文件。10. 這個(gè)方向后續(xù)還能怎么擴(kuò)展目前我跑通的鏈路是“文字 → 結(jié)構(gòu)化參數(shù) → 單零件 STEP/URDF/G-code”。下一步想嘗試的是從裝配描述直接生成裝配體比如“一個(gè)減速箱輸入軸和輸出軸平行中心距 80”系統(tǒng)自動(dòng)推斷齒輪參數(shù)和箱體尺寸。這個(gè)難度不小因?yàn)樯婕肮こ逃?jì)算的推斷不只是幾何生成。另一個(gè)方向是反向鏈路從現(xiàn)有 STEP 文件反推出結(jié)構(gòu)化描述再用文字描述去修改。這樣就能實(shí)現(xiàn)“打開一個(gè)現(xiàn)有模型說一句‘把孔徑改成 12’模型自動(dòng)更新”。這個(gè)在參數(shù)化設(shè)計(jì)場(chǎng)景下很有用技術(shù)上也比正向生成容易一些因?yàn)閹缀涡畔⑹乾F(xiàn)成的只需要做特征識(shí)別和參數(shù)提取。還有一個(gè)實(shí)用擴(kuò)展是和現(xiàn)有 CAD 軟件集成。比如生成 STEP 之后自動(dòng)導(dǎo)入中望 CAD 或 FreeCAD 做后續(xù)處理或者把 G-code 直接推送到打印機(jī)。這些集成本身不難主要是接口適配的工作量。我個(gè)人在實(shí)際操作中的體會(huì)是text-to-cad 目前最適合的場(chǎng)景是參數(shù)化變體生成而不是從零開始的全新設(shè)計(jì)。你給它一個(gè)明確的參數(shù)化模板它能快速生成大量變體但你讓它憑空設(shè)計(jì)一個(gè)復(fù)雜零件它還很吃力。把預(yù)期放在“提效工具”而不是“替代設(shè)計(jì)師”心態(tài)會(huì)好很多落地也會(huì)順利很多。