1. 从一句话到三维模型text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词很多做机械设计或者工业建模的朋友第一反应是又来了一个新概念。但如果你真的动手试过把一段文字描述直接变成可用的三维模型就会明白这件事的分量——它试图砍掉的是从想法到几何体之间那段最枯燥、最耗时的重复劳动。传统流程是什么样你脑子里有一个零件先要在脑子里把它拆成特征底座多大、孔位在哪、倒角多少、壁厚几毫米。然后打开 CAD 软件画草图、拉伸、打孔、阵列、倒角一步步把脑子里的东西翻译成软件能理解的几何语言。这个过程里真正有创造性的部分可能只占两成剩下八成都是在跟坐标系、约束关系、尺寸标注较劲。text-to-cad 想做的就是让你用自然语言把需求说清楚由系统去完成那八成的机械操作直接吐出 STEP、GLB、STL 这类标准格式的文件。它适合谁我梳理了一下大致是三类人。第一类是产品经理、工业设计师这类有想法但不一定精通 CAD 操作的角色他们需要快速把概念可视化拿去跟团队或客户对齐。第二类是机械工程师日常要处理大量标准件、简单结构件的建模用 text-to-cad 做初稿能省下大量时间。第三类是搞 3D 打印、创客、教育场景的玩家他们关心的是 STL 能不能直接切片打印对建模精度要求没那么苛刻但对快和简单要求极高。这里必须先说清楚一个关键点text-to-cad 生成的模型和资深工程师手工精修的模型在质量上是有差距的。它更像是一个高质量初稿生成器而不是一键替代设计师。理解这个定位你才不会对它抱有不切实际的期待也才能把它用在真正能发挥价值的地方。下面我会从整体设计思路、核心技术细节、完整实操流程、常见问题排查几个维度把这件事掰开揉碎讲清楚。2. 整体设计思路为什么是文本到几何这条链路2.1 从自然语言到参数化特征的映射逻辑text-to-cad 的核心难点不在于生成一个模型而在于生成一个符合描述、且几何上合法的模型。这两者差别巨大。随便生成一堆三角面片很容易但要生成一个壁厚均匀、孔位对称、能通过基本几何校验的实体就需要一套严谨的映射逻辑。我研究过几套主流实现思路本质上都绕不开一个中间层把自然语言先解析成结构化的参数化描述再由参数化描述驱动几何内核生成实体。举个例子你说一个 100mm × 60mm × 20mm 的矩形底板四角各有一个直径 6mm 的通孔孔中心距边缘 10mm系统需要先把它解析成这样的结构基础体长方体尺寸 (100, 60, 20)特征1四个圆柱孔直径 6深度贯穿孔位约束距相邻两边各 10mm这个结构化描述才是真正驱动建模的东西。自然语言只是入口参数化特征才是骨架。为什么这么设计因为几何内核比如 OpenCASCADE 这类本身不认识四角各有一个孔这种话它只认识坐标、向量、布尔运算。中间加一层参数化描述既能让语言解析和几何生成解耦各自独立优化也方便后续做校验和修改。提示如果你自己要搭一套类似的系统强烈建议把语言解析和几何生成分成两个独立模块中间用一份 JSON schema 约定好接口。我见过太多把两者揉在一起的项目后期想换个语言模型或者换个几何内核牵一发动全身。2.2 输出格式的选择STEP、GLB、STL 各管什么热词里反复出现 STEP、GLB、STL这三个格式不是随便列的它们对应完全不同的使用场景选错了会直接导致下游流程走不通。格式本质典型用途是否保留特征/精度STEP边界表示B-rep实体工程交付、CAD 二次编辑、CNC 加工保留精确几何可参数化编辑GLB三角网格 材质网页展示、AR/VR、渲染预览网格化丢失精确特征STL纯三角网格3D 打印、切片只有面片无单位无材质STEP 是工程界的通用语它记录的是精确的数学曲面你拿到之后还能在 SolidWorks、中望 CAD 这类软件里继续改尺寸、加特征。GLB 是给看用的带材质和颜色适合放到网页或者三维预览里给人看效果。STL 是给打印用的它把模型表面全部三角化切片软件只认这个。所以一个成熟的 text-to-cad 系统通常不会只输出一种格式而是根据用户意图自动选择或者干脆三种都生成。我的经验是默认给 STEP需要预览时转 GLB需要打印时转 STL。转换方向基本是单向的——STEP 可以转成 GLB 和 STL但 STL 转回 STEP 只能得到一堆碎面片特征全丢了。热词里那个sw中stl转stp之所以是个高频问题就是因为很多人不知道这个单向性拿到 STL 想回去编辑结果发现根本没法改。2.3 为什么不做成纯端到端大模型直接吐网格有人会问现在生成式模型这么强为什么不直接训练一个模型输入文字输出网格一步到位我实际踩过这个坑。纯端到端生成网格最大的问题是不可控。你让它生成一个带孔的板它可能给你生成一个孔的位置偏了 2mm、或者孔根本不贯穿的模型。对于展示用途勉强能看但对于任何需要精度和可制造性的场景这就是废品。参数化中间层的价值就在这里每一步都有明确的数值孔位是 (10, 10)直径是 6这些数字可以被校验、被修改、被追溯。生成完之后你可以写规则去检查壁厚是否小于 1mm孔是否超出边界不满足就报错或者自动调整。这种可控性是纯端到端方案目前给不了的。所以我的判断是短期内参数化中间层 几何内核的组合仍然是 text-to-cad 最靠谱的工程路线。3. 核心细节解析文本解析、几何生成与格式转换的关键环节3.1 文本解析怎么把人话变成机器能懂的参数文本解析这一步决定了整个系统的上限。解析得准后面就顺解析得糊后面全是坑。我把它拆成三个子任务实体识别、尺寸抽取、关系推理。实体识别是找出描述里有哪些几何元素。比如底板圆柱孔倒角筋板这些词对应不同的特征类型。尺寸抽取是把100mm直径6距边缘10mm这些数值和单位抓出来并且知道每个数值属于哪个实体。关系推理最难它要理解四角各有一个孔意味着四个孔的位置是对称分布的孔中心距边缘10mm意味着孔位和边界之间有约束关系。实际做的时候我建议用规则 模型的混合方案。纯规则能覆盖 70% 的常见表达比如长宽高直径阵列这些高频词用正则和词典就能搞定又快又稳。剩下 30% 的复杂、口语化表达交给语言模型去兜底。为什么不全用模型因为模型有幻觉它可能把直径6理解成半径6这种错误在几何上就是灾难。规则部分负责精确模型部分负责灵活两者互补。注意单位处理是个高频翻车点。用户说100的时候到底是 100mm 还是 100cm我的做法是默认毫米工程界惯例但在解析结果里显式标注单位并且在最终生成前做一次单位归一化。曾经有个项目因为没做这步用户输入10被当成 10 米生成了一个 10 米长的零件直接笑不出来。3.2 几何生成参数化描述如何驱动内核建模拿到结构化参数之后就进入几何生成阶段。这一步通常依赖一个成熟的几何内核比如 OpenCASCADE开源、Parasolid商业这类。内核提供的是底层能力创建长方体、创建圆柱、做布尔运算、倒角、抽壳。你要做的是把这些底层调用按照参数化描述的顺序编排起来。编排顺序很讲究。正确的顺序一般是先建基础体再做减材特征打孔、挖槽最后做修饰特征倒角、圆角。为什么因为如果你先倒角再打孔孔可能会把倒角切掉一部分导致结果和你预期不符。这个顺序逻辑和人工建模时的习惯是一致的——有经验的工程师也是先做大形再做细节。举个具体的参数计算例子。假设要生成一个带四个角孔的底板孔中心距边缘 10mm板尺寸 100×60。那么四个孔的圆心坐标分别是(10, 10)(90, 10)(10, 50)(90, 50)这个计算看着简单但如果板尺寸是变量孔距边缘也是变量你就得写成(margin, margin)、(length - margin, margin)这样的表达式让系统在运行时求值。我见过有人把坐标写死结果用户一改板尺寸孔就跑到板外面去了。所有位置参数都应该用相对表达式而不是绝对数值这是参数化建模的铁律。3.3 格式转换STEP 到 STL 的网格化参数怎么定生成 STEP 之后要转成 STL 或 GLB中间要做网格化tessellation。这一步有个关键参数弦高偏差chordal deviation和角度偏差angular deviation。简单说就是用多少三角面片去逼近一个曲面。参数越小面片越多模型越精细但文件越大、处理越慢。我的经验值是这样的做 3D 打印预览弦高偏差设 0.1mm 左右就够了肉眼基本看不出棱角做网页展示可以放宽到 0.2~0.3mm文件小加载快做精密分析或者大曲率曲面比如球面、圆柱面要压到 0.05mm 以下。这个参数没有绝对标准取决于你的用途和对文件大小的容忍度。提示STL 文件本身不记录单位。很多切片软件默认按毫米处理但如果你生成的 STL 实际是英寸单位打印出来尺寸会差 25.4 倍。所以转换时一定要确认单位一致最好在文件名或者元数据里标注清楚。4. 实操过程从零搭一条 text-to-cad 的最小可用链路4.1 环境准备与依赖选型要跑通一条最小链路你需要三样东西一个几何内核、一个语言解析模块、一个格式转换工具。我推荐的技术栈是 Python CadQuery基于 OpenCASCADE 的 Python 封装 一个语言模型 API trimesh做网格转换。为什么选 CadQuery因为它把 OpenCASCADE 那套复杂的 C 接口封装成了很 Pythonic 的链式调用写起来直观。比如建一个带孔的板代码大概长这样import cadquery as cq result ( cq.Workplane(XY) .box(100, 60, 20) .faces(Z) .workplane() .rect(80, 40, forConstructionTrue) .vertices() .hole(6) ) cq.exporters.export(result, plate.step)这段代码做的事情就是建一个 100×60×20 的盒子在顶面建工作平面画一个 80×40 的构造矩形在它的四个顶点打直径 6 的通孔最后导出 STEP。你看参数化描述里的四角各有一个孔在这里就是构造矩形的四个顶点。4.2 完整流程的代码骨架把语言解析接进来整个流程分成四步接收文本、解析成参数、驱动 CadQuery 建模、导出多格式。下面是一个可运行的骨架import cadquery as cq import trimesh import json def parse_text_to_params(text): # 这里接语言模型或规则解析返回结构化参数 # 示例解析100x60x20的板四角打直径6的孔孔距边10 params { length: 100.0, width: 60.0, height: 20.0, hole_dia: 6.0, margin: 10.0, unit: mm } return params def build_model(params): L, W, H params[length], params[width], params[height] d, m params[hole_dia], params[margin] inner_L L - 2 * m inner_W W - 2 * m model ( cq.Workplane(XY) .box(L, W, H) .faces(Z) .workplane() .rect(inner_L, inner_W, forConstructionTrue) .vertices() .hole(d) ) return model def export_all(model, base_name): cq.exporters.export(model, f{base_name}.step) # 转 STL cq.exporters.export(model, f{base_name}.stl, tolerance0.1, angularTolerance0.1) # 转 GLB mesh trimesh.load(f{base_name}.stl) mesh.export(f{base_name}.glb) if __name__ __main__: text 100x60x20的板四角打直径6的孔孔距边10 params parse_text_to_params(text) model build_model(params) export_all(model, output_part) print(生成完成output_part.step / .stl / .glb)这段代码跑通之后你就有了一个能用的最小系统。输入一句话输出三种格式的文件。当然真实场景里解析部分要复杂得多但骨架就是这个骨架。4.3 参数校验生成前必须过的几道关模型生成之前一定要做参数校验否则很容易生成几何上非法的东西。我总结了几个必查项尺寸正负长宽高、直径、壁厚必须为正数。负数尺寸会让内核直接报错或者生成诡异形状。孔位越界孔中心到边缘的距离必须大于孔半径否则孔会切穿边界。比如孔距边 10mm、孔半径 3mm是安全的但如果孔距边 2mm、孔半径 3mm孔就出界了。壁厚下限如果模型有抽壳或者薄壁结构壁厚不能小于某个阈值比如 0.5mm否则制造不出来。特征干涉多个特征之间不能互相冲突比如两个孔重叠、倒角半径大于相邻面尺寸等。这些校验用简单的 if 判断就能实现但能挡掉大量低级错误。我的做法是校验不通过就返回明确的错误信息告诉用户哪个参数有问题、应该怎么改而不是默默生成一个坏模型。提示校验逻辑最好和建模逻辑分开写做成独立的校验函数。这样你可以在不建模的情况下快速验证参数节省计算资源也方便单元测试。5. 常见问题与排查技巧实录5.1 生成失败或模型为空怎么办这是最常见的问题表现是程序不报错但导出的文件是空的或者只有几个面片。排查思路按这个顺序走第一检查参数是否合法。很多时候是某个尺寸为 0 或者负数导致布尔运算结果为空。打印出解析后的参数字典肉眼过一遍。第二检查布尔运算顺序。如果你先做了减材再做大形减掉的部分可能被后面的操作覆盖了。确认顺序是先加后减。第三检查工作平面。CadQuery 里.workplane()的朝向很关键如果工作平面方向不对孔可能打在模型外面。用.faces(Z)明确指定顶面比默认行为可靠。第四检查内核报错。OpenCASCADE 有时候会吞掉异常建议在关键步骤加日志把每一步的中间结果导出看看。5.2 格式转换后模型变形或丢失细节这个问题通常出在网格化参数上。如果 STL 看起来棱角分明、曲面变成多边形说明弦高偏差设太大了调小到 0.05~0.1mm 试试。如果 GLB 打开后颜色或材质丢失那是转换时没带上材质信息需要在导出 GLB 时显式指定。还有一种情况是模型看起来对但尺寸不对。这基本是单位问题。STEP 是有单位的STL 没有。转换时如果没做单位换算就会出现 25.4 倍的偏差。我的做法是在整个流程里统一用毫米导出 STL 前再确认一次。5.3 常见问题速查表现象可能原因排查方向模型为空参数非法/布尔运算顺序错打印参数、检查建模顺序孔位偏移用了绝对坐标而非相对表达式检查坐标计算逻辑STL 曲面有棱角弦高偏差过大调小 tolerance 到 0.1 以下尺寸差 25.4 倍单位不一致统一为毫米转换前确认GLB 无材质导出未带材质导出时指定材质参数生成速度慢网格过密/模型过复杂放宽网格参数简化特征5.4 几个我踩过的坑第一个坑过度信任语言模型。早期我全用模型解析结果它把半径3和直径3搞混生成的孔小了一半。后来改成规则优先、模型兜底准确率立马上来了。第二个坑忽略浮点精度。两个本该重合的面因为浮点误差差了 0.0001mm布尔运算就失败了。解决办法是在关键运算前做一次坐标对齐或者给内核设置合理的容差。第三个坑没做增量导出。一开始每次生成都覆盖旧文件结果调试时想对比前后版本都做不到。后来改成带时间戳的文件名问题一目了然。6. 这套东西还能怎么扩展跑通最小链路之后我实际用下来觉得最有价值的扩展方向有三个。第一个是模板库。把常见的零件类型法兰、支架、齿轮坯、外壳做成参数化模板用户只需要填几个关键尺寸不用每次从零描述。这比纯文本生成稳定得多因为模板本身已经验证过几何合法性。第二个是批量生成。热词里有个python批量对cad修改其实和 text-to-cad 是绝配。你可以读一张 Excel 表每行是一组参数批量生成几十上百个变体模型用于系列化设计或者参数扫描。这个场景下 text-to-cad 的效率优势特别明显。第三个是和下游工具打通。生成的 STEP 可以直接喂给 CAM 软件做加工路径STL 可以直接进切片软件。如果能把这条链路自动化从一句话到可打印文件中间不需要人工干预那才是真正把价值释放出来。我个人在实际操作中的体会是text-to-cad 现在最成熟的用法不是替代设计师而是把重复性的、有明确参数的建模工作自动化掉。你越能把需求描述得结构化、参数化它生成的结果就越靠谱。反过来如果你的需求本身就很模糊、很依赖审美判断那还是老老实实手工建模更靠谱。工具是死的怎么用是活的找到它擅长的边界比盲目追求全自动要实在得多。