资讯动态

text-to-cad 实战:从自然语言到 STEP/GLB/STL 三维模型生成全链路

发布时间:2026/10/8 22:59:31 来源:尧图企业网站定制
1. 从一句话到三维模型text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词我脑子里蹦出来的画面是对着电脑敲一句给我画一个 80x60x20 的法兰盘中心开直径 30 的通孔四角各一个 M6 沉头孔然后屏幕上直接出现一个可以旋转、可以导出、可以拿去加工的实体模型。这个画面在几年前还属于科幻范畴但现在它已经是一条能跑通的技术链路了。text-to-cad 本质上是一套把自然语言描述转换成参数化 CAD 模型的流程最终产物通常是 STEP、GLB、STL 这类通用三维格式能直接喂给下游的建模软件、渲染引擎或者 3D 打印机。它解决的问题非常具体传统 CAD 建模的门槛在于你得先学会软件。SolidWorks、中望 CAD、Fusion 360 这些工具功能强大但一个新手从打开界面到画出一个带孔的法兰盘可能要折腾一两个小时还得记住草图约束、拉伸、打孔、倒角这一整套操作顺序。而 text-to-cad 想做的事情是把操作软件这件事抽象掉让用户只需要描述几何意图由程序去生成对应的建模指令或者直接输出网格/实体文件。对于做批量零件、做参数化设计、做快速原型的人来说这个价值是实打实的。这篇文章适合几类人看一是想给自己的设计流程加一点自动化能力的工程师二是做 3D 打印、需要快速把想法变成 STL 的创客三是想理解大模型 CAD这条技术路线到底怎么落地的开发者。我不会只讲概念会把整条链路拆开——从文本解析、参数提取、几何生成到 STEP/GLB/STL 三种格式的导出差异再到实际踩过的坑全部摊开讲。你不需要有很深的 CAD 背景但最好对三维坐标、网格、实体这几个概念有个模糊印象剩下的我尽量用生活化的方式说清楚。需要先明确一点text-to-cad 不是一个现成的、点一下就能用的软件它更像是一个技术方案集合。市面上有商业产品在做这件事也有开源项目在探索但真正落地时你往往需要自己把几个环节拼起来。所以下面我讲的是基于常见工程实践的一套可复现思路而不是某个特定产品的说明书。2. 整体架构设计文本到模型中间到底隔了几层2.1 为什么不能一步到位从自然语言到几何的鸿沟很多人第一反应是现在大模型这么强直接让它输出一个 STL 不就行了我试过结论是——能输出但基本不能用。原因在于自然语言和几何数据之间隔着一道表示鸿沟。语言是离散的、模糊的、有歧义的而 CAD 模型是精确的、连续的、有严格拓扑关系的。你说一个圆角到底是 R2 还是 R5你说厚一点厚多少这些在语言里可以含糊但在几何里必须落到具体数值。更麻烦的是STL 这种格式本质上是三角网格它只记录表面的一堆三角形面片不记录这是一个圆柱这种语义信息。大模型直接生成 STL等于让它一次性吐出几万个浮点数还要保证这些三角形严丝合缝地拼成一个封闭实体——这个任务对当前的生成模型来说稳定性和精度都远远不够。我见过一些尝试生成的模型表面坑坑洼洼孔洞位置偏移根本没法用于加工。所以正确的思路是分层让语言模型负责它擅长的部分理解意图、提取参数、生成结构化指令让几何内核负责它擅长的部分精确建模、布尔运算、格式导出。中间用一个结构化的中间表示来衔接比如 JSON 描述的参数表或者一段可执行的建模脚本。这样每一层都做自己最可靠的事情整体成功率会高很多。2.2 三层架构解析层、建模层、导出层我实际跑通的方案是三层结构这里展开讲每一层的职责和选型考量。解析层负责把自然语言变成结构化参数。输入是画一个长 100 宽 50 高 30 的盒子顶部中心挖一个直径 20 深 10 的圆槽输出应该是一段类似这样的结构化数据{ type: box_with_pocket, dimensions: {length: 100, width: 50, height: 30}, features: [ {type: pocket, shape: cylinder, diameter: 20, depth: 10, position: top_center} ] }这一层可以用大模型来做也可以用规则引擎。我的经验是混合使用常见的基础形状盒子、圆柱、孔、槽用规则匹配复杂或模糊的描述交给大模型兜底。纯靠大模型的问题是它偶尔会幻觉出不存在的位置描述比如左上角在一个圆形零件上到底指哪里这种歧义必须靠预设的坐标系约定来消除。建模层拿到结构化参数后调用几何内核生成实体。这里的选择很关键。主流方案有两类一类是调用现成 CAD 软件的 API比如通过 Python 脚本驱动 FreeCAD、或者用 OpenCASCADE 这个开源几何内核另一类是用代码化建模库比如 CadQuery、build123d。我最终选的是CadQuery OpenCASCADE这套组合原因是它纯代码驱动、跨平台、对 STEP 导出支持好而且社区活跃遇到问题能查到资料。导出层负责把生成的实体转成目标格式。STEP、GLB、STL 三种格式的用途完全不同导出时的参数设置也差别很大这部分我在第 4 节会详细讲。2.3 为什么选代码化建模而不是直接操作 GUI有人会问为什么不直接写个脚本去点 SolidWorks 的按钮我早期确实试过用自动化工具去驱动 GUI 软件结论是极其脆弱。界面一更新按钮位置一变脚本就废了而且 GUI 操作没法在服务器上无头运行批量处理时效率很低。代码化建模的好处是整个流程是确定性的、可版本控制的、可批量并行的。你写好的建模脚本今天跑和明年跑结果一致这对工程应用来说太重要了。代价是学习曲线。CadQuery 的 API 需要花点时间熟悉但它的逻辑其实很直观——你就是在用代码描述先画个草图然后拉伸然后打孔这个过程。对于有编程基础的人来说一两天就能上手基本操作。3. 核心细节拆解文本解析与参数提取的实操要点3.1 坐标系约定所有歧义的根源在动手写解析逻辑之前必须先定死一套坐标系约定否则后面全是坑。我的约定是这样的以零件的最小包围盒为参考原点设在包围盒的一个角上通常是左下后角X 轴向右Y 轴向后Z 轴向上。所有位置描述都相对于这个原点。为什么这么定因为中心顶部左侧这些词如果没有参照系根本无法转成坐标。比如顶部中心挖孔在 Z 轴向上的约定下就是孔的中心在 XY 平面的包围盒中心孔的起始面在 Z 等于零件高度的位置向下挖。这套约定一旦定死解析层就可以把位置词映射成确定的坐标计算。我踩过的一个坑是早期没定约定结果中心有时候被理解成几何中心有时候被理解成原点生成的模型孔位飘忽不定。后来我把约定写进解析层的系统提示里并且用几个测试用例反复验证才稳定下来。3.2 参数提取数值、单位与默认值文本里的数值提取看似简单其实细节很多。首先是单位。用户说长 100是毫米还是厘米我的做法是默认毫米机械设计最常用但如果文本里出现cm米inch这类词就做换算。这里要注意大模型有时候会把100mm理解成100把单位吞掉所以解析后要做一个单位校验如果数值明显不合理比如一个法兰盘直径 5000就触发告警让人工确认。其次是默认值。用户不会把所有参数都说全。比如打个孔没说直径怎么办我的策略是维护一张默认值表孔默认直径 10mm、默认通孔、默认在中心。这些默认值要在输出里明确标注出来让用户知道哪些是他指定的哪些是系统补的。这个习惯能省掉大量返工。还有一个容易忽略的点是数值范围校验。用户可能说挖一个深 50 的槽但零件总高只有 30这时候要么报错要么自动截断并提示。我选择报错因为静默修改用户的意图是危险的宁可让他重新描述。3.3 特征识别从挖槽到布尔运算自然语言里的挖切钻开这些动词在几何上对应的都是布尔减运算而加凸长出来对应布尔加。解析层需要把这些动词映射成操作类型。我的做法是建一个动词映射表自然语言动词几何操作典型特征挖、切、钻、开、掏布尔减孔、槽、腔加、凸、长、堆布尔加凸台、筋、柱倒、圆倒角/圆角边处理抽、挖空抽壳薄壁件这张表不是万能的遇到在角上做个缺口这种描述就需要结合上下文判断。我的经验是把常见动词覆盖到 80% 以上剩下的用大模型兜底整体准确率就能接受。另外要注意同一个动词在不同语境下含义可能不同比如开个口可能是打孔也可能是开槽这时候要看后面跟的名词——口配圆就是孔配长条就是槽。4. 建模与导出STEP、GLB、STL 三条路怎么选4.1 三种格式的本质差异很多人把 STEP、GLB、STL 当成可以随便互换的格式这是大错特错。它们的底层表示完全不同用途也完全不同。STEP是**边界表示B-rep**格式它记录的是精确的几何曲面和拓扑关系——这是一个半径 10 的圆柱面而不是这是一堆三角形。所以 STEP 文件可以无损地导入任何 CAD 软件继续做参数化编辑、做工程图、做数控加工。它的缺点是文件结构复杂解析起来重而且不同软件对 STEP 的实现有细微差异偶尔会出现导入后曲面破损的情况。STL是三角网格格式它把模型表面离散成一堆三角形。优点是简单、通用几乎所有 3D 打印切片软件都认它。缺点是丢失了所有语义信息——导入 STL 后你没法再选中那个圆柱孔去改直径因为它只是一堆三角形。而且 STL 的精度取决于三角面片的密度密度不够曲面就显棱角密度太高文件又巨大。GLB是 glTF 的二进制版本本质也是网格但它为实时渲染优化过支持材质、纹理、动画文件紧凑加载快。它适合做网页展示、AR/VR、游戏资产但同样不适合精密加工。我把三者的关键差异整理成表方便对照维度STEPSTLGLB底层表示B-rep 精确曲面三角网格三角网格材质可否参数化编辑可以不可以不可以典型用途加工、工程图3D 打印网页/AR 展示文件大小中等可大可小小精度控制精确靠网格密度靠网格密度材质支持无无有4.2 导出参数怎么设以 STL 为例STL 导出最容易出问题因为它的精度是可调的调不好要么文件爆炸要么模型失真。核心参数是弦高偏差linear deflection和角度偏差angular deflection。弦高偏差控制的是当用三角形去逼近一个曲面时三角形边和真实曲面之间允许的最大距离。设成 0.1mm意味着曲面上的误差不超过 0.1mm。这个值越小三角形越多文件越大。对于 3D 打印一般设 0.05 到 0.1mm 就够了对于大尺寸模型可以放宽到 0.2mm。角度偏差控制的是相邻三角形法向的夹角默认 0.5 弧度左右。对于圆柱面这个值决定了圆周方向被切成多少段。太小会导致圆柱看起来像多边形太大又浪费面片。我的经验参数是弦高 0.08mm角度 0.4 弧度这个组合在大多数桌面级 3D 打印场景下既能保证曲面光滑文件又不会太大。如果是精细模型比如带螺纹的弦高要降到 0.02mm。注意STL 导出前一定要确认模型是封闭实体watertight。如果模型有破面或者非流形边切片软件会报错或者打印出问题。CadQuery 生成的实体默认是封闭的但如果你做了复杂的布尔运算建议用isValid()检查一下。4.3 STEP 导出的坑单位与坐标系STEP 导出相对省心但有两个坑。第一是单位。STEP 标准默认单位是毫米但有些软件导出时会写成米导致导入后模型缩小 1000 倍。CadQuery 导出时默认毫米一般没问题但如果你从别的库转过来一定要确认。第二是坐标系朝向。不同 CAD 软件对上的定义不同有的 Z 向上有的 Y 向上。导出 STEP 时如果朝向不对导入后模型可能是躺着的。我的做法是在导出前统一把模型摆正Z 轴向上并且在文件名或元数据里标注朝向。5. 完整实操流程从零跑通一个 text-to-cad 例子5.1 环境准备与依赖安装先把环境搭起来。我用的是 Python 3.10核心依赖是 CadQuery。安装命令如下pip install cadquery pip install ocpCadQuery 依赖 OpenCASCADE 的 Python 绑定OCP安装包比较大第一次装可能要几分钟。装完后跑一个简单测试import cadquery as cq result cq.Workplane(XY).box(10, 10, 10) cq.exporters.export(result, test.step)如果没报错并且当前目录出现了 test.step说明环境 OK。5.2 解析层实现把一句话变成参数假设输入是画一个 80x60x20 的底板四角各打一个直径 6 的通孔孔中心距边缘 10mm。解析层要提取出底板尺寸 80/60/20孔直径 6孔数量 4孔位置在四角边距 10。我用一个简单的规则 正则来做import re def parse_text(text): params {} # 提取尺寸 dim_match re.search(r(\d)\s*[xX×]\s*(\d)\s*[xX×]\s*(\d), text) if dim_match: params[length] float(dim_match.group(1)) params[width] float(dim_match.group(2)) params[height] float(dim_match.group(3)) # 提取孔径 hole_match re.search(r直径\s*(\d), text) if hole_match: params[hole_dia] float(hole_match.group(1)) # 提取边距 margin_match re.search(r距边缘\s*(\d), text) if margin_match: params[margin] float(margin_match.group(1)) # 判断孔数量 if 四角 in text or 四个角 in text: params[hole_count] 4 return params这段代码很粗糙但能覆盖基础场景。实际项目中我会把正则匹配不到的部分丢给大模型让它输出 JSON再做校验。5.3 建模层实现用 CadQuery 生成实体拿到参数后建模逻辑就很直接了import cadquery as cq def build_plate(params): L params[length] W params[width] H params[height] d params[hole_dia] m params[margin] # 建底板 plate cq.Workplane(XY).box(L, W, H) # 计算四角孔位 x_offset L/2 - m y_offset W/2 - m hole_positions [ (x_offset, y_offset), (-x_offset, y_offset), (-x_offset, -y_offset), (x_offset, -y_offset) ] # 打孔 plate (plate.faces(Z).workplane() .pushPoints(hole_positions) .hole(d)) return plate这里的关键是faces(Z)选中顶面然后pushPoints在指定位置放点hole打孔。hole默认是通孔如果要盲孔加depth参数。5.4 导出与验证生成实体后导出三种格式result build_plate(params) cq.exporters.export(result, plate.step) cq.exporters.export(result, plate.stl, tolerance0.08, angularTolerance0.4) cq.exporters.export(result, plate.glb)导出后一定要验证。我的验证清单是STEP 用 FreeCAD 打开看曲面是否完整STL 用切片软件比如 Cura打开看是否封闭、尺寸是否正确GLB 用在线查看器看渲染是否正常。这一步不能省我见过太多次导出参数设错导致模型尺寸偏差的情况。6. 常见问题与排查技巧实录6.1 模型生成失败或形状不对最常见的问题是布尔运算失败。比如在一个已经很复杂的实体上打孔如果孔的位置刚好在边线上OpenCASCADE 可能算不出来。排查思路是先把孔的位置往内移一点看是否能成功如果能说明是边界问题需要调整位置或者先做倒角再打孔。另一个常见问题是单位混乱。如果生成的模型尺寸明显不对比如大了 1000 倍检查解析层有没有做单位换算以及导出时有没有指定单位。6.2 STL 导入切片软件报错如果切片软件提示模型不是封闭的通常是网格有破面。解决办法有两个一是回到建模层检查布尔运算是否产生了非流形边二是用网格修复工具比如 MeshLab 的 Close Holes 功能补一下。但根治还是要从建模层解决因为修复工具可能改变几何精度。6.3 大模型解析不稳定用大模型做解析时同一个输入可能每次输出略有不同。我的应对策略是固定随机种子如果 API 支持并且在提示词里给出严格的输出格式示例。另外对输出做 schema 校验字段缺失或类型不对就重试。实测下来加上校验和重试机制后解析成功率能从 70% 提到 95% 以上。6.4 批量处理时的性能问题如果要批量生成几百个模型逐个跑会很慢。我的优化是把建模和导出放在多进程里并行每个进程独立处理一个任务。注意 CadQuery 不是线程安全的所以用多进程而不是多线程。另外STEP 导出比 STL 慢很多如果只是要 STL就别导出 STEP。问题现象可能原因排查方法解决手段模型尺寸偏差 1000 倍单位换算错误检查解析层和导出层单位统一用毫米布尔运算失败特征位置在边界移动特征位置测试调整位置或加过渡STL 不封闭非流形边用网格工具检查回建模层修复解析结果不稳定大模型随机性多次运行对比加 schema 校验重试批量处理慢单进程串行看 CPU 利用率改多进程并行7. 几个我踩过的坑和实用心得第一个坑是过度依赖大模型。我一开始想让大模型直接输出 CadQuery 代码结果它经常写出语法正确但逻辑错误的代码比如把孔打到实体外面。后来改成大模型只输出参数代码由模板生成稳定性大幅提升。这个思路值得借鉴让大模型做它擅长的语义理解把确定性强的几何计算交给模板代码。第二个心得是建立测试用例库。我维护了 20 多个典型零件的描述文本和期望输出每次改解析逻辑或建模代码都跑一遍回归测试。这个习惯帮我抓到了好几次隐蔽的 bug比如某个动词映射被改错了导致所有开槽都变成了打孔。第三个心得是导出格式按需选择。早期我图省事每次都导出三种格式结果批量处理时慢得离谱。后来改成根据下游用途动态选择要加工就 STEP要打印就 STL要展示就 GLB。这一个改动让整体处理速度提升了将近一倍。第四个心得是给用户反馈中间结果。text-to-cad 的解析不可能 100% 准确与其让用户拿到一个错误的模型不如在生成前把解析出的参数展示出来让他确认。我在流程里加了一个参数预览步骤用户确认后再建模返工率明显下降。最后分享一个小技巧如果你的描述里包含多个特征尽量按从大到小的顺序说。先建主体再打孔再倒角这个顺序符合大多数几何内核的处理逻辑成功率更高。反过来先说倒角再说打孔有时候会因为倒角改变了面的拓扑而导致打孔失败。这个细节看起来不起眼但在实际使用中能省不少事。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑