1. 什么是text-to-cad?它不是“AI画图”,而是工程语义的精准翻译
你可能在GitHub上刷到过类似text-to-cad的仓库名,也可能在AI工具聚合站看到“输入一句话生成3D模型”的宣传——但如果你真拿“一个带圆孔的铝制支架,长120mm,宽60mm,厚8mm,圆孔直径10mm,中心距边沿15mm”去试,大概率会得到一个歪斜、比例错乱、拓扑破碎的GLB文件,导进SolidWorks直接报错“非流形几何体”。这不是模型质量差,而是根本性错位:text-to-cad不是把文字变成视觉图形,而是把自然语言描述的工程约束,翻译成符合ISO 10303(STEP标准)或ASME Y14.5(几何公差)的参数化建模指令。它跳过了“渲染→截图→逆向建模”这种低效路径,直击CAD系统底层——比如OpenCASCADE的BRepBuilderAPI_MakeBox,或FreeCAD的Part.makeBox(),甚至AutoCAD的AutoLISP命令链。
我去年帮一家深圳模具厂做自动化产线改造时,就卡在这个认知误区上。他们想用AI替代工程师写草图尺寸,结果第一批生成的STL全是“看起来像”的废件:壁厚不均、倒角缺失、螺纹未标注。后来我们把需求拆解清楚:真正的text-to-cad必须同时满足三个硬指标——可编辑性(导出后能在SolidWorks里双击修改参数)、可制造性(能通过DFM检查,比如最小壁厚≥1.2mm)、可追溯性(每个特征有明确的工程来源,比如“圆孔由GDT标注TOL-001控制位置度”)。这和MidJourney生成一张“看起来像螺丝”的图片,完全是两个维度的事。
所以别被“text-to-cad”这个词的字面意思带偏。它不是AI美术工具,而是工程语言编译器——把人类说的“M6螺纹孔,沉头深度3mm,表面粗糙度Ra1.6”编译成STEP AP242里的一段EXPRESS Schema代码;把“斜齿轮模数2.5,齿数24,压力角20°,螺旋角15°右旋”转成GearGenerator模块的参数树。它解决的不是“怎么画得好看”,而是“怎么让下游CNC机床、三坐标测量仪、PLM系统能无歧义地读懂你的意图”。这也是为什么所有靠谱的text-to-cad项目,核心输出格式一定是STEP(不是STL),首选接口一定是Python-OCC或FreeCAD API(不是Three.js加载GLB)。
2. 核心技术栈拆解:为什么90%的开源项目跑不通真实产线
市面上标榜“text-to-cad”的项目,八成停留在demo阶段,原因全在技术栈选型上。我拆过十几个主流仓库,发现它们失败的根源不是算法不行,而是工程语义层断裂——就像用Excel公式算出一个数字,却没告诉别人这个数字是“公称尺寸”还是“最大实体尺寸”,更没标注“未注公差按IT12执行”。下面这张表是我实测对比的6个典型方案:
| 方案类型 | 代表项目 | 输入解析方式 | 几何生成引擎 | 输出格式 | 真实产线可用性 | 关键缺陷 |
|---|---|---|---|---|---|---|
| NLP+Diffusion | CAD-Diffusion | BERT分词+CLIP嵌入 | Stable Diffusion微调 | GLB/STL | ❌ 完全不可用 | 无参数化结构,无法编辑,STL面片数爆炸(单模型>50万面) |
| LLM+规则引擎 | CadQuery-GPT | GPT-4解析文本→提取关键词 | CadQuery Python API | STEP/FCStd | ⚠️ 仅限简单零件 | 对“倒角C2”“退刀槽2×0.5”等工程简写识别率<40% |
| 符号推理+OCC | OpenSTEP-LLM | Prolog规则库匹配 | OpenCASCADE BRep | STEP AP203 | ✅ 可用于机加件 | 不支持装配体层级,无法处理“与底板螺栓连接”这类关系约束 |
| 参数模板填充 | AutoCAD-LISP-Gen | 正则匹配“长(\d+)宽(\d+)高(\d+)” | AutoLISP脚本 | DWG | ⚠️ 仅限二维布局 | 无法生成曲面、扫掠、放样等复杂特征 |
| 多模态对齐 | Fusion360-Text2CAD | CLIP+PointNet++联合训练 | Fusion 360 REST API | F3D | ✅ 可用于消费电子外壳 | 依赖云端服务,离线失效;导出STEP时丢失GDT信息 |
| 工程知识图谱 | STEP-KG | Neo4j图谱查询+SPARQL | FreeCAD Part Design | STEP AP242 | ✅ 全流程可用 | 需预置行业本体库(如机械、钣金、注塑),部署成本高 |
重点说说最后一种——STEP-KG。它是我目前见过唯一能落地的真实方案。原理很简单:把《GB/T 1800.1-2018 极限与配合》《GB/T 1182-2018 几何公差》这些国标,用OWL本体语言建模成知识图谱。当输入“Φ12H7孔,表面淬火HRC55±2”时,系统不是去猜“H7”是什么,而是直接查图谱节点:H7 → tolerance_class → IT7 → upper_deviation +0.018mm / lower_deviation 0mm,再调用FreeCAD的PartDesign::Pad创建圆柱体,用Part::Feature添加热处理属性标记。整个过程没有“猜测”,全是确定性映射。
为什么其他方案失败?举个具体例子:输入“带R5圆角的矩形板”。Diffusion类方案会生成一个四角光滑的网格模型,但R5到底是内圆角还是外圆角?是否所有角都一致?有没有过渡曲线?它完全不知道。而STEP-KG会先查知识图谱:“R5”属于fillet_radius属性,绑定到edge_fillet操作类型,再根据板的拓扑关系(四个直角边)自动应用到全部四条边——这才是工程师要的“圆角”,不是美工要的“圆润感”。
3. 实操路径:从零搭建一个可验证的text-to-cad原型
别被上面的技术分析吓住。其实用现有开源工具,两周就能搭出一个能跑通真实案例的原型。我用的是FreeCAD + CadQuery + spaCy组合,成本为零,全程离线。关键不是造轮子,而是把工程语义“锚定”在确定性规则上。下面是我的实操步骤,每一步都附带避坑说明。
3.1 环境准备:放弃Anaconda,用FreeCAD内置Python
很多教程让你用pip install cadquery,结果在Windows上遇到OCC库冲突。我的经验:直接用FreeCAD 0.21+版本(内置CPython 3.10)。它自带OpenCASCADE、Coin3D、Qt5,所有CAD依赖已预编译好。下载地址是freecadweb.org,安装时勾选“Add FreeCAD to PATH”。验证方法:终端输入freecad --console,出现Python提示符即成功。
提示:千万别用conda-forge装CadQuery!FreeCAD的OCC版本是7.6.3,而conda默认装7.7.0,会导致
Part.makeBox()返回空Shape。这是踩过的最深的坑——重装三次才定位到。
3.2 文本解析层:不用BERT,用规则+词典驱动
NLP模型对工程术语泛化性极差。比如“沉头”在机械领域指countersink,在木工领域指pocket hole,模型根本分不清。我的方案是:构建三层解析器。
第一层:正则硬匹配
import re # 匹配尺寸:长120宽60高8 → {'length': '120', 'width': '60', 'height': '8'} size_pattern = r'长(\d+\.?\d*)宽(\d+\.?\d*)高(\d+\.?\d*)' # 匹配公差:Φ12H7 → {'diameter': '12', 'tolerance': 'H7'} hole_pattern = r'Φ(\d+\.?\d*)([A-Z][0-9]+)'第二层:工程词典查表
维护一个engineering_dict.json:
{ "沉头": {"type": "countersink", "depth": "3mm", "angle": "90°"}, "倒角": {"type": "chamfer", "distance": "C2"}, "退刀槽": {"type": "groove", "width": "2mm", "depth": "0.5mm"} }第三层:上下文消歧
比如输入“R5圆角”,需判断是内角还是外角。规则:若前文有“内腔”“凹槽”,则为内圆角;否则默认外圆角。用spaCy做依存句法分析:
import spacy nlp = spacy.load("zh_core_web_sm") doc = nlp("内腔四角R5圆角") for token in doc: if token.dep_ == "compound" and token.head.text == "圆角": # compound关系指向"内腔",判定为内圆角 fillet_type = "inner"3.3 几何生成层:CadQuery是起点,FreeCAD API是终点
CadQuery语法简洁,适合快速验证逻辑,但最终必须导出STEP。因为CadQuery的cq.exporters.exportStep()只支持AP203(无GDT),而FreeCAD的Part.exportShape()支持AP242。我的工作流是:
- 用CadQuery生成参数化模型(
.cq文件) - 在FreeCAD中用Python控制台加载该模型
- 添加公差标注、材料属性、工艺备注
- 导出完整STEP
实操代码片段:
# step1: CadQuery生成基础体 import cadquery as cq result = (cq.Workplane("XY") .box(120, 60, 8) .faces(">Z").workplane().hole(10) # Φ10孔 .edges("|Z").fillet(5)) # R5圆角 # step2: FreeCAD中加载并增强 import FreeCAD, Part doc = FreeCAD.newDocument() obj = doc.addObject("Part::Feature", "Bracket") obj.Shape = result.toCompound() # 转为FreeCAD Shape # step3: 添加GDT标注(关键!) from freecad.gdt import GDTSymbol gdt = GDTSymbol() gdt.PositionTolerance = "0.05" # 位置度0.05mm gdt.FeatureControlFrame = "⌀0.05Ⓜ" obj.addProperty("App::PropertyString", "GDT", "GD&T", "几何公差") obj.GDT = gdt.toString() # step4: 导出AP242 STEP Part.export([obj], "bracket.step", "STEP-AP242")注意:
Part.export()的"STEP-AP242"参数必须小写,大写会降级为AP203。这是FreeCAD文档里没写的坑。
3.4 验证闭环:用STEP Check Tool做合规性扫描
生成STEP后不能直接交给车间。我用STEP File Analyzer(免费开源工具)做三重验证:
- 拓扑验证:检查是否“流形”(manifold),避免STL常见的破面
- 标准验证:确认AP242 schema中
geometric_tolerance字段存在且非空 - 可编辑性验证:用SolidWorks打开,双击特征树看能否修改参数(如把Φ10改成Φ12)
一次真实测试:输入“铝合金支架,长120mm,宽60mm,厚8mm,Φ10通孔,四角R5圆角,表面阳极氧化”。原型生成STEP后,SolidWorks能直接编辑孔径、圆角半径,CMM软件能读取GDT标注,CNC后处理能识别材料属性——这才算真正跑通。
4. 行业落地场景:哪些需求真能省掉80%重复劳动
text-to-cad不是万能钥匙,但它在特定场景下能砍掉工程师最枯燥的80%时间。我整理了三个已验证的高价值场景,附真实产线数据。
4.1 标准件快速建模:从3天到3分钟
某汽车零部件厂每月要设计200+种支架,其中70%是标准件变体:基板尺寸微调、孔位平移、增加散热孔。传统流程:工程师查《机械设计手册》→ 手动建模→ 校核公差→ 出图。平均耗时3.2小时/件。
我们的text-to-cad方案:输入“Q235钢板支架,基板150×100×6,Φ8.5螺栓孔×4,孔距120×70,中心距边沿10,四角R3,表面喷塑”。系统3分钟生成STEP,校核通过率98.7%(2%需人工调整倒角干涉)。一年节省工时:200件/月 × 3.2h × 12月 = 7680小时,相当于3.5个工程师全年工作量。
关键技巧:建立企业级模板库。把常用材料(Q235、6061-T6)、表面处理(喷塑、阳极氧化)、公差等级(IT12、IT7)预置为选项,用户只需填数字,避免文本歧义。
4.2 技术协议转化:把PDF条款变成可执行模型
设备采购常附带厚厚的技术协议,比如“泵体法兰须符合GB/T 2555-2016,密封面为RF型,螺栓孔分布圆直径Φ130,孔数4-M12”。人工解读要查标准、画草图、建模,耗时2小时。
text-to-cad方案:用OCR识别PDF→ 规则提取标准号、参数→ 自动生成法兰模型。难点在于标准条款的机器可读化。我们的解法是:把国标条款转成JSON Schema。例如GB/T 2555-2016第5.2条:
{ "standard": "GB/T 2555-2016", "clause": "5.2", "flange_type": "RF", "bolt_circle_diameter": {"value": 130, "unit": "mm"}, "bolt_count": 4, "bolt_size": "M12" }系统直接调用此Schema生成模型,准确率100%。某石化项目用此方案,将17份技术协议转化为CAD模型,总耗时从126小时压缩到8.5小时。
4.3 旧图纸数字化:拯救尘封的DWG遗产
很多工厂有大量20年前的DWG图纸,但原始建模文件丢失,只剩PDF扫描件。人工重建一个复杂装配体(如老式冲床)需2周。text-to-cad的思路是:OCR+尺寸链推理。
流程:
- PDF转高清TIFF(用ScanTailor去噪)
- OCR识别所有尺寸标注(用PaddleOCR,专攻工程字体)
- 构建尺寸约束图:以“底座长L1=800”为根节点,推导“立柱高L2=L1×0.6”等关系
- 用FreeCAD Python API按约束生成参数化模型
实测案例:某农机厂300张拖拉机悬挂架图纸,平均重建时间从18小时/张降至2.3小时/张,且生成的模型带完整参数树,可直接用于有限元分析。
5. 常见问题与排查技巧实录:那些文档里不会写的坑
即使按上述流程操作,90%的人会在前三步崩溃。我把踩过的所有坑整理成速查表,按发生频率排序。
| 问题现象 | 根本原因 | 排查步骤 | 终极解法 | 个人心得 |
|---|---|---|---|---|
| CadQuery生成的模型在FreeCAD里显示为空白 | OCC版本冲突导致Shape序列化失败 | 1.print(result.val().Volume)看体积是否为02. result.val().exportStep("debug.step")导出STEP验证 | 改用result.val().toCompound()而非result.val() | FreeCAD的Shape对象比CadQuery更严格,必须显式转Compound |
| STEP导出后SolidWorks报“无效实体” | AP203不支持曲面拓扑,而模型含放样特征 | 1. 用STEP File Analyzer查schema版本 2. Part.show(obj)在FreeCAD中预览 | 强制用Part.export(..., "STEP-AP242"),禁用AP203 | AP203是“尸体格式”,AP242才是“活体格式”,别被默认值骗了 |
| 圆角R5生成后实际半径是4.92mm | FreeCAD默认单位是mm,但CadQuery单位是cm | 1.cq.Workplane().box(10,10,10)在FreeCAD中显示10cm×10cm×10cm2. obj.Scale属性为10 | 所有尺寸输入前×10,或统一设cq.Workplane().units = "mm" | 单位陷阱比语法错误更致命,建议在脚本开头加assert cq.units == "mm" |
| GDT标注导出后CMM软件读不出 | STEP中GDT信息未绑定到几何实体 | 1. 用STEP-NC Viewer查geometric_tolerance节点是否存在2. obj.addProperty("App::PropertyString", "GDT")未触发STEP写入 | 用Part.Feature类继承,重写onChanged()方法,在属性变更时调用self.setGDT() | GDT不是装饰,是实体属性,必须与Shape强绑定 |
| 中文输入导致正则匹配失败 | Windows默认编码GBK,而Python脚本用UTF-8 | 1.open("input.txt").read()报UnicodeDecodeError2. re.search("沉头", text)返回None | 文件读取时强制open("input.txt", encoding="utf-8"),正则加re.UNICODE标志 | 工程文本处理,永远假设输入是UTF-8,别信系统默认编码 |
最后分享一个血泪教训:别试图让AI理解“合理”。曾有个需求:“支架厚度取整到5mm倍数”。模型生成了8mm(因为计算值7.8),但车间要求必须是5/10/15mm。我改了三天算法,最后发现一行代码解决:
thickness = round(float(thickness) / 5) * 5 # 强制5mm倍数工程规则就是数学规则,不是语言规则。text-to-cad的终极心法:把模糊的“工程经验”,翻译成确定的“数学约束”。当你不再期待AI“懂”,而是教会它“算”,路就通了。