入行这么多年,我几乎每年都会看到一种新玩法把CAD圈搅动一下。今年绕不开的词,就是 text-to-cad——直接拿一段文字描述,让程序帮你把三维模型建好。听起来像玩笑,但我上个月真的用这条链路完成了一批法兰盘的参数化建模和出图,今天把整个思路、原理和踩坑过程系统捋一遍。
text-to-cad 要解决的核心问题其实很简单:把“设计意图”变成“几何表达”。传统CAD里,你得一步步画草图、拉特征、加约束;text-to-cad 直接把这一步省了,你写“外径100、内径50、厚度10、均布4个直径10的安装孔”,几秒钟后就能拿到一个可编辑的STEP文件。它特别适合三拨人:一是刚接触CAD制图的新手,描述能力比命令记忆强得多;二是做方案选型和多方案对比的工程师,批量生成变体模型非常快;三是需要在出图前快速验证结构的人,省掉大量重复建模时间。下面我把从原理到实操的完整过程展开讲。
1. 先聊聊 text-to-cad 到底解决什么问题
1.1 从标题看需求:不是“画图”,是“说图”
CAD领域这么多年的核心痛点,从来不是“画不画得出来”,而是“画得够不够快、改得够不够容易”。传统流程里,一个非标法兰盘从零建模,熟练工也要十分钟起步;如果客户中途改了三版孔径,你就得回到草图上改尺寸约束,再更新关联特征。text-to-cad 把这条链路的起点从“鼠标操作”挪到了“语言描述”,本质上是把建模前置环节变成了参数化脚本。
我在实际测试中最直观的感受是:描述粒度越接近“工程语言”,生成结果越稳。比如你直接说“一个带四个孔的法兰”,模型就只知道一个大概;但你说“外径100毫米、内径50毫米、厚度10毫米、四个直径10毫米的孔均布在直径80毫米的圆上”,程序就能精确落位。这一点和普通聊天问答完全不同——text-to-cad 需要的是结构化信息,不是文学创作。
它解决的第二个问题是“多方案快速迭代”。以前做对比方案要建三套模型,现在只需要准备三个不同的描述文本,或者同一份参数模板配上三组数值,批量跑一遍就行。我工作中经常遇到客户上午说用4孔法兰、下午改成6孔,传统流程要改特征树、重新全约束定位;换成 text-to-cad 之后,我只需要在JSON里把 bolt_count 从4改成6,重新生成模型,时间复杂度基本为零。
1.2 谁最需要这个能力
顺着CAD相关的搜索热词看,会发现需求人群非常分散。搜“cad制图初学入门”的人,大多是刚入行的学生和转行者,他们的痛点不是命令不全,而是“不知道从哪一步开始”;text-to-cad 可以把描述直接变成实体,让新手先看到结果,再反推建模过程,学习效率反而更高。搜“python批量对cad修改”的是工装、钣金、非标自动化领域的工程师,他们手上一堆重复零件,最需要的不是交互画图,而是数据驱动的模型生成。搜“cad图纸合并”“cad导入layout步骤详解”“cad转pdf”的,是已经在实际出图交付中跑流程的人,模型生成之后还有一连串的布局、标注、打印问题要处理。
还有一个容易被忽略的人群是用行业CAD软件的人,比如瑞丽服装CAD、金林钣金CAD、中望CAD这类细分工具。text-to-cad 不一定直接替换这些软件,而是可以作为前置生成器:用脚本批量生成基础几何,再导入行业软件做工艺细化。钣金件就是典型例子——展开图、折弯系数、板材厚度这些属性,通用三维模型里根本没有,但你可以先生成折弯前的实体外形,再进钣金CAD补工艺参数。所以我的判断是:text-to-cad 不是要取代CAD,而是把“建模”和“设计后续工作”之间那段重复劳动压缩掉。
2. 原理拆解:自然语言是怎么变成特征树的
2.1 一句话模型:意图解析、参数映射、程序化三维
text-to-cad 的完整链路可以拆成三段:意图解析、参数映射、程序化建模。意图解析由大语言模型完成,它把自然语言中关于形状、尺寸、数量、排布的描述提取出来,翻译成结构化数据;参数映射把结构化的键值对换算成几何参数,比如把“均布”换算成360度除以孔数得到的角度间隔;程序化建模则由CAD内核执行,按顺序构建草图、拉伸、打孔、阵列等特征。
用生活化的类比说:自然语言是“你想盖什么样的房子”,结构化参数是“施工蓝图”,而程序化建模是“施工队按图施工”。很多人误以为 text-to-cad 是让AI直接“画”一堆点线面,实际不是——AI只负责把话变成数字,真正画图的还是CAD内核。这样做的好处是结果可控,所有尺寸都能后改,而不是生成一张死图片。
我建议你在工作流里给这三段分别设检查点。意图解析结果可以打印出来看一眼,参数映射可以加单位校验,程序化建模可以中途导出线框预览。哪一段出错,就在哪一段修,不要等问题都堆到最后导出模型才返工。
2.2 为什么是特征树而不是网格
最初的文本生成3D方案走了“生成网格(Mesh)”的路线,用扩散模型直接输出三角面片,类似AI生成图片。但网格在CAD场景里几乎不可用:没有草图平面、没有特征历史、没有约束关系,一个法兰盘就算生成了完美的曲面网格,你也无法修改其中一个孔径然后重新生成。而CAD软件的核心数据结构是特征树——拉伸、旋转、阵列、圆角,每一步都记录了参数和依赖关系,修改某个特征,后续特征自动更新。
text-to-cad 采用程序化建模路线,恰好是为了和特征树对齐。CadQuery、SolidPython、OpenCASCADE这些库之所以适合做后端,就是因为它们能按顺序调用CAD内核,建立真正的参数化历史。这也解释了为什么 text-to-cad 生成的不是“一个文件”,而是“一个可编程的模型生成逻辑”——拿到模型之后,你还可以继续写代码调整倒角、改厚度、换材料。
我在实际使用中会把“特征顺序”当作和“尺寸精度”同样重要的检查项。同一个法兰盘,先拉伸外圆再打中心孔,和先建整块板再挖两个台阶孔,输出结果看起来差不多,但后续修改性完全不同。好的text-to-cad实现,生成的代码里特征顺序应当清晰可读,而不是堆一大段不可维护的几何操作。
2.3 工具选型的取舍
做 text-to-cad 落地,工具链上无非三个选择:直接用商业CAD的AI助手、调用开源模型API、自己用Python库搭全套。商业CAD里的AI功能最省事,但受限于软件闭源特征,通常只能在特定模块里用;开源模型API适合快速验证概念,但输出几何精度参差不齐;自己搭Python库全套是最灵活的方式,代价是需要懂一点代码和CAD内核的基本概念。
我自己的选择是“CadQuery + 大语言模型接口”的组合。CadQuery使用Python语法建模,底层走OpenCASCADE内核,生成的STEP/DXF文件能被主流CAD软件识别,而且它天然支持参数化函数——同一个函数传不同参数就能得到不同规格的零件。这个特点简直是 text-to-cad 的绝配:大语言模型负责把文本转成参数,CadQuery负责把参数转成实体,两者之间用一个JSON字典交接,逻辑非常干净。
顺带提醒一下,不要一上来就追求“完全端到端自动化”。生产环境里真正稳定的做法,是人写一个参数化零件库,AI只负责从自然语言中提取参数。比如法兰库、支架库、轴套库,每个库都是经过验证的CadQuery函数,AI的职责是把“内径50”识别成 inner_diameter=50,而不是让它从头写建模代码。这个思路能大幅降低出错率。
3. 实操走通:用一段话生成法兰盘
3.1 环境准备与基础代码框架
先准备最基本的Python环境,Windows、macOS、Linux都行,我用的是Windows10 + Python 3.10。安装CadQuery只需一条命令:
pip install cadqueryCadQuery安装时会自动带上OpenCASCADE内核,所以不用额外装复杂的依赖。为了解析自然语言并转成结构化参数,我倾向用一个支持函数调用的对话模型,把“从描述中提取参数”做成一个独立的JSON Schema请求。如果你不想接外部模型,也可以先用正则表达式和字典做硬解析,把常见的尺寸关键词匹配出来,效果至少能覆盖大半标准件。
我建议把项目目录分成三块:prompts(存放解析指令和模板)、models(存放参数化建模函数)、output(存放生成的STEP和DXF文件)。这个结构一开始看着多余,等零件种类多了以后就能体会到好处——改一个法兰建模函数,不会影响到轴套函数,也不会污染导出的历史文件。
3.2 构建“意图模板”和结构化参数
text-to-cad 里最核心的设计决策,是定义“自然语言描述”和“JSON参数”之间的映射关系。拿法兰盘举例,我定义的JSON Schema大致是这样:
{ "outer_diameter": 100, "inner_diameter": 50, "thickness": 10, "bolt_circle_pcd": 80, "bolt_count": 4, "bolt_hole_diameter": 10 }这里有几个单位约定必须提前定死:默认毫米,角度默认度,数量默认个。否则模型一会儿把10理解成厘米、一会儿把4理解成半径,最后生成出来的法兰完全没法用。我的做法是在解析指令前面加一段系统提示,明确告诉模型“所有线性尺寸均为毫米,忽略描述中的非工程修饰词”,能显著减少常识性错误。
“意图模板”这个词是我自己起的,意思是针对某一类零件的固定解析规则。比如对法兰盘,固定询问外径、内径、厚度、安装孔PCD、孔数、孔径;对钣金支架,固定询问长宽高、折弯角度、板材厚度、孔位。模板越细,解析越稳。不要指望AI理解“差不多”“大一点的孔”这类模糊词,工程里要的是确定值,模糊表达尽快转成缺省值并提示用户确认。
3.3 从文本到模型的核心实现
先把自然语言描述丢给大语言模型的接口,让它按Schema输出JSON,这一步在所有支持函数调用的模型上都能完成。拿到JSON后,进入CadQuery建模函数。法兰盘的完整代码可以写成这样:
import cadquery as cq def build_flange(outer_diameter=100, inner_diameter=50, thickness=10, bolt_circle_pcd=80, bolt_count=4, bolt_hole_diameter=10): # 1. 拉伸外圆形成法兰主体 part = ( cq.Workplane("XY") .circle(outer_diameter / 2) .extrude(thickness) ) # 2. 从顶面打中心孔 part = ( part.faces(">Z") .workplane() .hole(inner_diameter) ) # 3. 在PCD分布圆上打安装孔 part = ( part.faces(">Z") .workplane() .polarArray(bolt_circle_pcd / 2, 0, 360, count=bolt_count) .hole(bolt_hole_diameter) ) return part # 示例:生成一个外径100、内径50、厚度10、4孔PCD80的法兰 flange = build_flange(outer_diameter=100, inner_diameter=50, thickness=10, bolt_circle_pcd=80, bolt_count=4, bolt_hole_diameter=10) cq.exporters.export(flange, "output/flange_100_4holes.step")这段代码的核心逻辑是三步:画外圆拉伸成主体、从顶面打中心孔、按极坐标阵列打安装孔。其中polarArray参数分别是分布圆半径、起始角度、终止角度、孔数量,我习惯把起始角设为0,四个孔正好落在0、90、180、270度方向,和工程图里的标注习惯完全一致。
参数计算过程也值得说说:PCD是80,那么分布圆半径就是40,polarArray会自动把4个孔均匀分在360度上,每个孔间隔90度。孔的数量和孔径来自JSON,不需要手动算角度。如果你需要孔位避开某个特征,可以把起始角度从0改成45度,比如要孔位在法兰横竖中心线上时就设0,要落在45度斜线上时就设45。
3.4 导出并验证模型
生成STEP文件只是第一步,真正考验人的是“验证模型符不符合预期”。我会用三步检查:先看体积和主尺寸,再导入三维软件检查特征树,最后切工程图看视图关系。
体积校验可以用CadQuery的val().Volume()方法输出数值,比如法兰主体体积约等于 π × (50² - 25²) × 10 ≈ 58,904 立方毫米,如果差了太多说明建模逻辑有误。把STEP导入CAD软体后,检查特征树里是否保留了可编辑的拉伸和孔特征,而不是被炸成“输入实体”。最后导出工程图时,确认主视图轴线、剖切位置和孔位标注都能识别——这一步的常见坑是模型坐标系没摆正,导致工程图的俯视图方向怪异。
我特别建议,在批量生成之前先挑一个代表件走完整验证流程,确认无误后再跑批。因为 text-to-cad 的错往往是有规律的,比如单位毫米和厘米混淆会导致整体缩放10倍,提前发现一个,等于发现了整批的问题。
4. 生成之后:接入常规CAD工作流的几个关键环节
4.1 批量修改:用Python脚本驱动
text-to-cad 生成模型最大的优势是“可编程”,这正是和热搜词“python批量对cad修改”直接对应的地方。我做一个批次任务时,会先准备一组参数列表,然后循环调用建模函数:
variants = [ {"outer_diameter": 100, "bolt_count": 4, "thickness": 10}, {"outer_diameter": 120, "bolt_count": 6, "thickness": 12}, {"outer_diameter": 140, "bolt_count": 8, "thickness": 14}, ] for i, params in enumerate(variants): part = build_flange(**params) filename = f"output/flange_{i}_{params['outer_diameter']}_{params['bolt_count']}holes.step" cq.exporters.export(part, filename)这段代码看起来简单,背后解决的问题很实在:人工在CAD里改一个特征、导出一个文件,10个规格就是10次重复劳动;脚本循环做这件事,唯一耗时是每个模型的内核计算时间,基本可以做到几十秒内生成几十个文件。我再配合一个CSV表格记录参数和文件名,交付时连BOM表都一起出来了。
批量修改真正的坑在于“参数越界”。孔径大于法兰内径、孔数过多导致孔与孔重叠、厚度小于孔径,这些逻辑层面问题脚本不会自动发现。我的做法是在建模函数里加断言检查:assert bolt_hole_diameter < (bolt_circle_pcd / 2) * 2 * sin(pi / bolt_count),这样参数不合理时直接抛异常,而不是生成一个错误模型。
4.2 图纸合并与布局导入
模型生成之后,出图是绕不开的一步。CAD圈里常见的三大需求是图纸合并、CAD导入Layout、快速看图。传统操作是在CAD软件里一个个插入外部参照,再手动对齐原点,费时费力。我更喜欢在Python里先把图纸合并工作做了,CAD软件只做最后微调。
对于DXF格式的二维图纸合并,可以用 ezdxf 库,它相当于DXF文件的读写工具箱。两个零件的二维轮廓分别生成DXF,然后用一个主文档把它们分别插入到不同的坐标系位置:
import ezdxf doc = ezdxf.new("R2010") msp = doc.modelspace() for i, dxf_path in enumerate(["part_a.dxf", "part_b.dxf"]): block = doc.blocks.new(name=f"block_{i}") tmp_doc = ezdxf.readfile(dxf_path) for entity in tmp_doc.modelspace(): block.add_entity(entity) msp.add_blockref(f"block_{i}", insert=(i * 150, 0)) doc.saveas("combined_layout.dxf")这个方式比我手工复制粘贴要快得多,而且块引用保留了每个零件的独立性,后续要给某个零件挪位置、旋转角度,直接改 blockref 的 insert 参数就行。我习惯把零件间距固定下来,比如横向间隔150毫米,这样合并出来的图纸天然适合A3图框排版。注意图框、标题栏、技术说明这些固定元素也可用块做成模板,每次出图自动带上,减少漏标注的问题。
4.3 转PDF与出图
图纸合并完,下一步通常是“CAD转PDF”。三种常用路线:一是直接在CAD软件里用打印管理器批量出图,设置PDF打印机和图纸尺寸;二是用Python调用ezdxf结合第三方渲染库直接把布局渲染成PDF;三是先导出SVG再转PDF。实测下来,图纸数量少、标注复杂的图用CAD自带打印最可控,批量流程中用脚本先把准备好的DXF转成PDF能省大量时间。
这里有个经验:出图前一定要统一线宽和图层设置。text-to-cad 生成的模型导入CAD后,经常出现图层名混乱、线宽全是默认值的情况,直接打出来的PDF要么线条粗细不分,要么虚线变成了实线。我每次批量出图前都先跑一遍“图层标准化脚本”,把轮廓线、中心线、尺寸线、隐藏线分别归入固定图层,再设好全局线宽和颜色。这一步做完,PDF质量才谈得上交付标准。
4.4 多行业落地延伸
text-to-cad 的影响范围绝不只在机械非标件。搜索热词里能看出很多细分行业信号:cad切地形对应的是规划与土木场景,生成起伏曲面再导入地形分析软件;中望cad、瑞丽服装cad、金林钣金cad这类行业软件,各有各的建模语义。比如服装CAD里的“裁片”本质上是二维曲线加缝纫标记,text-to-cad 可以先按尺寸表生成基础裁片轮廓,再进服装软件加缝边;钣金CAD里最关键的是展开图计算,text-to-cad 生成三维折弯件后,展开计算可以在钣金软件里一键完成。
我的个人建议是,别把 text-to-cad 局限在“生成三维模型”这一个点上,要往前后端延伸:向前对接规格参数表,向后对接出图、展开、工艺卡。它的真正价值是让整条数据链路的起点变成文本/数据,而不是鼠标点击。
5. 常见问题排查实录
5.1 生成结果与描述不一致
这是 text-to-cad 被吐槽最多的问题。我遇到过的典型现象包括:要求4个孔生成了6个、说了毫米单位却按英寸处理、把“内径”理解成“半径”。根因通常不在CAD端,而在自然语言解析端。
排查步骤我建议这样:先打印大语言模型返回的JSON,确认参数解析是否准确;再单独调用建模函数,用固定参数验证几何输出;最后检查单位转换环节。每一步都用最小案例复现,别在完整流程里蒙头猜。如果解析频繁出错,优先优化Schema定义和系统提示词,把常见表述明确列出来,比如“内径指直径、两个孔之间的距离指孔心距而非边距”。
5.2 单位、坐标系与特征顺序
单位问题是老生常谈但永远值得单列。text-to-cad 模型的意图解析,默认单位一定要在系统提示里反复强调。我踩过一次最惨的坑:生成的轴套模型在CadQuery里看是直径60毫米,导入中望CAD后变成了60英寸,整根轴放大了25.4倍。原因只是模型输出时单位字段写成了inch,教训是“每个导出函数都要显式指定单位,不要依赖默认值”。
坐标系问题通常表现为:模型导入CAD后主视图方向不对。这源于生成时建模平面选择不当。法兰盘生成我习惯先建在XY平面,拉伸方向沿Z轴,这样工程图主视图直接对应XZ平面,不会有额外的坐标变换。如果你需要多个零件在装配里配合,一开始就要统一基准,比如所有零件都以底面中心作为原点,别把零件原点设在角落。
特征顺序则影响“可修改性”。先拉伸主体再打孔是基本法,但如果你先生成了安装孔位,之后又把外径改大,孔位不会自动跟随外径变化。CadQuery代码按顺序执行,修改外径只会影响外圆草图和拉伸特征,孔位参数还是原来那组,这时候你就要保证孔位PCD是相对原点的绝对参数,而不是依赖某个临时几何引用。建议把关键尺寸全部定义成函数参数,不在建模过程中写“魔法数字”。
5.3 软件环境问题速查表
这部分集中回答CAD安装、卸载、激活、字体和命令失灵的常见搜索词。先说明一个原则:绝大多数软件环境问题,根源不是软件坏了,而是安装残留、脚本权限、文件路径这三类冲突。以下是整理成速查表的排查思路:
| 现象 | 原因 | 处理建议 |
|---|---|---|
| 安装CAD时反复报C++ 2005错误 | 系统缺少对应VC++运行库,或已存在冲突版本 | 先卸载旧VC++运行库,重新安装对应版本后再装CAD;运行安装程序时用管理员权限 |
| 激活页面提示“脚本发生错误” | 杀毒软件拦截脚本组件或IE组件异常 | 临时关闭杀毒软件和防火墙,以管理员身份重新运行激活程序;修复系统IE组件后重试 |
| CAD卸载后二次安装失败 | 注册表残留服务项、安装目录文件未清干净 | 使用官方卸载工具彻底清理后,重启电脑再安装;不要手动删文件造成残留 |
| 模型文字显示为问号乱码 | 缺少SHX字体或字体映射错误 | 下载需要的SHX字体放入字体目录,检查字体映射文件设定,CAD里执行重生成命令刷新 |
| F命令无法使用 | 可能是别的程序占用了F键,或命令被别名覆盖 | 查看命令行输出,检查是否定义了别名F覆盖了圆角FILLET命令;关闭占用热键的输入法/录屏工具 |
| 图纸合并后线型错乱 | 来自不同文件的线型表命名冲突 | 统一图层和线型标准,用脚本清理多余线型定义后再合并 |
CAD快速看图的需求其实也隐含在这类问题里。模型生成后想快速确认轮廓,推荐用轻量看图工具直接打开STEP或DXF,不需要每次都启动重型CAD软件。轻量看图虽然不能编辑特征,但对尺寸测量、视图切换、批注完全够用,日常验证效率高很多。
6. 一些实在的避坑心得
6.1 起步阶段的几条建议
第一,从简单零件练手,别一上来就生成整机装配。法兰盘、轴套、垫片这类回转体零件特征少、约束清晰,是最理想的起步对象。等你能稳定生成“一个带均布孔的法兰”之后,再去尝试有多个凹槽、加强筋、倒圆角关系的复杂钣金件。我见过太多人第一次就想生成一个完整的减速器箱体,结果提示词写了两百字,模型出来一堆破面,立刻失去信心返回手工建模。
第二,提前建好你自己的“描述模板库”。整理20个你经常画的零件类型,每个都定义好JSON Schema、系统提示词、CadQuery建模函数。这个过程有点枯燥,但模板库越厚,后续新项目启动越快。我现在的模板库里已经积累了法兰、轴套、支架、底座、盖板、导轨安装板等几十类常见件,很多新需求只需要复制模板改参数,text-to-cad 的解析压力小很多。
第三,把生成结果当“半成品”,不要当终极交付物。text-to-cad 最大的价值是省掉从零开始的重复劳动,但工程细节——公差、表面粗糙度、热处理要求、标准件库调用——仍然需要人在CAD里补完。你要做的不是研究怎么让AI一次生成完美零件,而是研究怎么让AI快速生成“足够好”的毛坯,再靠你的专业能力完成最后10%的工程化。
6.2 我的实际体会
走通 text-to-cad 这条路之后,我最大的感受是:CAD制图的准入门槛正在被重新定义。以前,“会说”和“会画”之间隔着一大堆命令学习和空间想象训练;“cad制图初学入门”对新人意味着至少两三个月的密集实操。现在,新人只要能准确描述尺寸和结构,先看到模型、再回头学命令,反而更容易理解“特征树到底是什么”。这不是说CAD就不重要了,恰恰相反——模型生成之后,你需要更强的工程判断力去检查、修改和出图,传统技能从未被淘汰,只是被挪到了更靠后的位置。
批量生成、自动出图、合并布局、转PDF,这些能力叠加起来,真正改变的是工作习惯。以前接到一个非标询价,我会犹豫要不要先建模;现在我会直接写几个参数的变体跑一遍,客户有反馈再微调。我个人的体会是,text-to-cad 给设计师带来的不是“不画图”,而是“更快地开始画、更早地看到结果、更从容地应对修改”。如果你手里正好有一批重复性高的零件,我强烈建议从最小的那个开始尝试,先把一条通道跑通,再逐步扩大范围。