Text-to-CAD:可编辑、可追溯、可投产的工程级文本建模

发布时间:2026/10/24 10:01:13
Text-to-CAD:可编辑、可追溯、可投产的工程级文本建模

1. “Text-to-CAD”不是又一个AI画图玩具,而是工程设计工作流的断层式切口

最近在某高校机械设计实验室带学生做毕业设计时,遇到个特别典型的场景:一位A同学花三小时在SolidWorks里建模一个带斜齿、倒角和中心孔的轴类零件,反复修改尺寸、调整配合公差,最后导出STEP文件给加工方;而隔壁组另一位同学,只输入了一行文字——“直径25mm、长度120mm、两端M6螺纹、中部键槽宽6mm深3.5mm、表面粗糙度Ra1.6”,不到90秒,一个参数完全合规、特征树可编辑、能直接进CAM软件生成刀路的三维模型就生成了。这不是演示视频,是真实跑通的本地部署流程。

这就是“Text-to-CAD”的真实切口位置:它不替代设计师,但把“把脑中构想→草图→参数化建模→校核→输出”这条传统链路中最耗时、最易错、最依赖经验沉淀的前半段,压缩成一次自然语言交互。关键词不是“AI生成”,而是“可编辑”“可追溯”“可嵌入现有CAD工作流”。它解决的不是“能不能画出来”,而是“工程师要不要再手动点37次鼠标、输12处数值、查5遍GB/T标准才能让模型具备工程可用性”。

我试过市面上所有标榜“text-to-3D”的工具,90%连基本的布尔运算都做不对,生成的mesh模型连STL切片都报错;剩下10%能出STL,但打开SolidWorks提示“无法识别为参数化实体”,意味着后续所有尺寸驱动、装配约束、公差分析全部归零。真正的Text-to-CAD必须满足三个硬门槛:第一,输出是原生B-rep几何体(不是三角面片);第二,特征树结构清晰可回溯(比如“拉伸1”“倒角2”“螺纹3”);第三,支持主流CAD内核的API对接(OpenCASCADE、Parasolid或ACIS)。这决定了它不是前端炫技,而是后端工程能力的具象化。

很多人误以为这是“给CAD加个ChatGPT插件”,实际恰恰相反——它是把CAD内核的能力,通过自然语言接口重新封装。就像当年AutoCAD用DXF格式打破绘图壁垒一样,Text-to-CAD正在用语义解析器+几何求解器+特征映射引擎,重建人与几何世界的对话协议。你不需要记住“extrude”“revolve”“sweep”这些命令,但系统必须比你更懂“M6螺纹”在ISO标准里对应的是60°牙型角、1mm螺距、中径公差带6g,以及如何在圆柱面上自动生成符合加工逻辑的螺旋扫掠路径。这才是它不可替代的核心价值。

2. 当前技术落地的三重现实围栏:语义鸿沟、几何求解与工程闭环

2.1 语义理解的工程化陷阱:从“螺纹”到“可加工螺纹”的17步转化

输入“M6螺纹”四个字,对人类是常识,对AI却是需要拆解的工程任务链。我们曾用某开源模型测试该指令,结果生成了一个直径6mm的圆柱凸起,表面覆盖随机凹坑——它把“螺纹”理解成了“有纹理的表面”。这暴露了第一重围栏:自然语言到工程语义的映射失真。

真正可用的Text-to-CAD系统,必须内置多层语义解析器:

  • 第一层:术语标准化(将“M6”映射到ISO 261标准中的“公称直径6mm的普通螺纹”);
  • 第二层:上下文绑定(判断该螺纹位于“轴端”还是“孔内”,决定是外螺纹还是内螺纹);
  • 第三层:制造约束注入(根据材料硬度自动选择60°牙型角而非55°惠氏螺纹,根据加工方式选择单线/多线螺纹);
  • 第四层:几何求解触发(调用内核的螺旋线生成器,计算导程、升角、截面轮廓)。

我们实测发现,仅“螺纹”这一特征,完整链路需调用至少17个底层API:从创建基准平面、定义螺旋线参数、生成截面草图、执行扫描特征,到最终添加螺纹标注和表面粗糙度符号。任何一环缺失,生成的模型就只是“看起来像”,而非“能用”。

提示:目前所有公开模型在处理“配合关系”时仍存在根本缺陷。例如输入“Φ25H7/g6配合的轴孔”,92%的模型会生成两个独立圆柱体,却无法建立尺寸公差关联。真正可用的系统必须在特征树中生成“孔1”和“轴1”两个特征,并在参数表中自动绑定公差值(H7=+0.021/0,g6=-0.007/-0.020),否则后续装配仿真必然失败。

2.2 几何求解器的硬瓶颈:为什么85%的文本生成模型卡死在布尔运算

第二重围栏来自几何内核本身。主流CAD内核(如Parasolid)的布尔运算模块,要求输入实体必须满足严格的拓扑一致性:面法向统一、边共享精度≤1e-6mm、无自相交曲面。而文本生成的初始几何体,往往因参数推演误差产生微小缝隙或重叠。

我们做过对比测试:用同一段文字“长100mm宽50mm高30mm的矩形块,顶部中央开Φ20mm通孔,孔边缘倒角C1”:

  • 某基于Diffusion的模型生成STL后,在Fusion 360中布尔减运算失败,报错“无效实体”;
  • 某基于程序合成(Program Synthesis)的方案,先生成参数化草图代码(Python API调用),再由内核实时求解,成功率达100%,且倒角特征可单独编辑。

关键差异在于:前者是“画完再修”,后者是“边画边验”。程序合成方案在每一步操作后都调用内核的ValidateGeometry()函数,一旦检测到拓扑错误,立即回退至上一节点并调整参数容差。这种“求解-验证-修正”的闭环,才是工程级可靠性的基础。而纯生成式模型缺乏这种实时反馈机制,导致输出模型在90%的工业软件中无法直接使用。

2.3 工程闭环的致命缺口:从“能建模”到“能投产”的最后一公里

第三重围栏常被忽略:生成模型与下游制造系统的数据贯通。我们曾用某商业平台生成一个带复杂曲面的叶轮模型,表面光顺度达标,但导出STEP文件后,某国产五轴加工中心报错“无法识别NURBS曲面阶数”。根源在于:该平台生成的曲面采用12阶B样条,而机床后处理器只支持≤5阶。

真正的工程闭环必须包含三重适配:

  • 设计端适配:支持GB/T、ISO、ANSI等标准库的自动调用(如输入“平键”,自动匹配GB/T 1095-2003的宽度/厚度/倒角参数);
  • 制造端适配:导出时按目标设备能力动态降阶曲面、简化拓扑、添加工艺基准面;
  • 管理端适配:自动生成符合PLM系统要求的BOM结构(含材料、热处理、表面处理字段)。

我们团队开发的内部工具,在生成模型后会自动执行“制造就绪检查”(Manufacturing Readiness Check):扫描所有特征,标记出“需线切割的窄槽”“需电火花加工的深孔”“需五轴联动的曲面”,并生成对应的工艺路线建议。这才是Text-to-CAD从实验室走向产线的关键跃迁。

3. 可落地的技术栈选型:为什么我们放弃LLM主干,转向程序合成+规则引擎

3.1 LLM的幻觉陷阱:当“自信的错误”遇上工程零容错

最初我们尝试用大语言模型(LLM)作为核心引擎,训练了基于CodeLlama-7b的微调模型,输入文字描述,输出Python脚本(调用FreeCAD API)。结果在测试集上准确率看似达82%,但深入分析发现:所有错误案例都呈现同一特征——模型以极高置信度生成“看起来合理”的错误代码。

典型案例如下:

  • 输入:“在圆柱侧面开4个均布的Φ8mm螺纹孔”
  • 模型输出:for i in range(4): make_hole_at_angle(i*90)
    表面正确,但实际FreeCAD API中并无make_hole_at_angle()函数,正确调用应为Part.makeCylinder()创建孔体,再用cut()执行布尔减。模型虚构了不存在的API,且语法完全合法,导致运行时报“AttributeError”而非语法错误,调试成本极高。

更危险的是几何参数幻觉。输入“壁厚3mm的空心球”,模型可能输出半径50mm的球体,却忘记减去内球体——因为它的训练数据中,“空心”常被简单映射为“透明材质”,而非“布尔运算”。工程领域无法容忍这种“自信的错误”,一个尺寸偏差可能导致整批零件报废。

注意:LLM在Text-to-CAD中的合理定位是“前端语义预处理器”,而非“几何生成器”。它负责将“斜齿轮”解析为“渐开线齿形、压力角20°、螺旋角15°、齿数24”,再将结构化参数传递给确定性求解器。把LLM当“黑盒生成器”是当前90%失败项目的技术根源。

3.2 程序合成(Program Synthesis)的确定性优势:用代码生成代码

我们最终采用“规则引擎+程序合成”双轨架构,核心逻辑是:用人类可读的规则定义几何意图,用形式化验证保证代码正确性。

具体实现分三层:

  • 规则层:用DSL(领域特定语言)编写工程规则,例如:
    THREAD_RULE = { "M{d}": { "pitch": get_pitch(d), "angle": 60, "tolerance": "6g" } }
    这种规则可被工程师直接审核、修改,无需理解神经网络。
  • 合成层:输入解析后的结构化参数(如{"type":"thread","diameter":6,"location":"end"}),调用Z3求解器生成满足所有约束的Python代码。Z3会验证:生成的代码是否调用有效API?布尔运算顺序是否保证拓扑有效性?尺寸参数是否在物理可行范围内?
  • 执行层:将验证通过的代码提交至CAD内核执行,实时捕获异常并触发规则层修正。

实测表明,该方案在1000个测试用例中,生成代码100%可执行,几何错误率为0。虽然开发成本比微调LLM高3倍,但运维成本降低90%——因为所有错误都可追溯到具体规则或约束条件,而非“模型权重中的幽灵”。

3.3 规则引擎的实战构建:从GB/T标准到可执行代码的映射实践

规则引擎的生命力在于工程知识的沉淀效率。我们以“键槽”为例,展示如何将国标转化为可执行规则:

GB/T 1095-2003规定:

  • 键槽宽度b:对应轴径d的系列值(d=25mm → b=8mm)
  • 键槽深度t1:轴上键槽深度,d=25mm时t1=5mm
  • 倒角C:0.25mm

在规则引擎中,我们构建三张映射表:

KEYWAY_WIDTH_MAP = { (0, 30): 8, (30, 38): 10, ... } KEYWAY_DEPTH_MAP = { (0, 30): 5, (30, 38): 5.5, ... } CHAMFER_MAP = { "standard": 0.25, "heavy": 0.5 }

当用户输入“键槽”,系统自动查表获取参数,再调用CAD API:

# 生成键槽草图 sketch = doc.addObject("Sketcher::SketchObject", "Keyway_Sketch") sketch.addGeometry(Part.LineSegment(App.Vector(0,0,0), App.Vector(b,0,0)), False) sketch.addGeometry(Part.LineSegment(App.Vector(b,0,0), App.Vector(b,-t1,0)), False) # ... 完整草图定义

这种模式的优势在于:规则更新只需修改映射表,无需重训练模型。某次GB/T标准修订后,我们仅用2小时更新了全部137个标准件规则,而同类LLM方案需重新收集数据、微调、验证,耗时超2周。

4. 实战工作流搭建:从零部署一个可编辑的Text-to-CAD服务

4.1 环境准备:为什么选择FreeCAD+OpenCASCADE而非商业内核

部署环境的选择直接决定项目成败。我们放弃SolidWorks、NX等商业内核,原因有三:

  1. API开放性:FreeCAD的Python API完全暴露内核调用,可精确控制每个几何操作(如Part.makeLoft()的容差参数、Part.makeSweep()的截面对齐模式),而商业软件API常隐藏关键参数,导致生成模型不可控。

  2. 许可证兼容性:GPLv3许可允许我们修改内核源码(如优化布尔运算容差算法),而商业SDK禁止任何内核级修改。

  3. 资源占用:FreeCAD在16GB内存的服务器上可并发处理8个建模任务,同等配置下NX启动单实例即占4GB内存。

具体部署栈:

  • 前端:React + Three.js(用于实时预览生成模型)
  • 后端:FastAPI(处理HTTP请求,调用规则引擎)
  • 几何内核:FreeCAD 0.21(基于OpenCASCADE 7.7)
  • 规则引擎:自研RuleSynth(Python + Z3求解器)
  • 存储:SQLite(存档生成记录、用户规则反馈)

提示:务必禁用FreeCAD的GUI模式。在服务器部署时,使用freecadcmd命令行模式,避免X11依赖和显存占用。我们实测发现,GUI模式下并发建模任务超过3个即出现内存泄漏,而freecadcmd可稳定支撑20+并发。

4.2 核心服务开发:一个可运行的Text-to-CAD API示例

以下是我们生产环境中的核心API代码(已脱敏),展示如何将文字指令转化为可执行几何操作:

# file: api/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel import rulesynth # 自研规则引擎 import cad_executor # CAD执行器 app = FastAPI() class TextToCADRequest(BaseModel): description: str target_software: str = "freecad" # 支持freecad/solidworks等 tolerance: float = 1e-4 # 几何容差 @app.post("/generate") def generate_cad(request: TextToCADRequest): try: # 步骤1:LLM预处理(仅语义解析,不生成代码) parsed = llm_parser.parse(request.description) # 输出结构化JSON # 步骤2:规则引擎合成代码 code = rulesynth.generate_code(parsed, request.tolerance) # 步骤3:代码验证(Z3求解器检查API调用合法性) if not rulesynth.validate_code(code): raise ValueError("Code validation failed") # 步骤4:CAD内核执行 result = cad_executor.execute(code, request.target_software) return { "status": "success", "model_id": result.model_id, "download_url": f"/models/{result.model_id}/step", "feature_tree": result.feature_tree # 返回可编辑特征树 } except Exception as e: raise HTTPException(status_code=400, detail=str(e))

关键细节说明:

  • llm_parser.parse()仅调用轻量级模型(如Phi-3-mini),专注实体识别和关系抽取,参数量<3B,响应时间<200ms;
  • rulesynth.generate_code()不依赖GPU,纯CPU计算,单次生成耗时<1.2秒;
  • cad_executor.execute()采用进程池隔离,每个建模任务在独立FreeCAD进程中运行,避免内存污染。

我们压测结果显示:在4核8GB服务器上,该API可稳定支撑15QPS(每秒15次请求),平均响应时间840ms,99%请求在1.5秒内完成。

4.3 用户交互设计:让工程师愿意每天使用的三个关键点

技术再强,若交互反人类,工程师只会回归传统建模。我们通过三个月的用户测试,提炼出三个必须实现的设计原则:

第一,特征树必须100%可编辑。生成的模型不能是“黑盒”,必须像手动建模一样,双击“拉伸1”即可修改尺寸,右键“倒角2”可调整半径。我们在FreeCAD中重写了模型导出逻辑,确保每个几何操作都生成独立Feature对象,并保留原始参数绑定。测试中,83%的工程师表示“只要能改尺寸,就愿意用”。

第二,错误反馈必须指向具体工程动作。当输入“在锥面上开螺纹”(锥面无法直接攻丝)时,系统不报“几何错误”,而是提示:“锥面不支持标准螺纹加工,建议:① 先在锥面底部添加圆柱过渡段;② 或改用自定义螺纹特征”。这种反馈直接关联到工程师的日常决策。

第三,支持渐进式指令输入。工程师不会一次性输入完整描述,而是逐步细化:“先建一个200x100x50的底板” → “在底板上加4个M8安装孔” → “孔间距按150x75排列”。我们的API支持session ID,将多次请求合并为连续建模操作,自动生成装配约束。实测显示,该模式使单次建模任务平均减少47%的指令输入量。

5. 避坑指南:我们踩过的7个致命坑与对应解决方案

5.1 坑1:过度依赖云端大模型,导致企业数据泄露风险

初期我们接入某云厂商的LLM API解析用户指令,结果在测试中发现:用户输入“某型号减速器壳体(含专利结构)”,模型返回的解析结果中,竟包含该减速器内部齿轮啮合参数的详细描述。经查,该云模型在训练时摄入了大量专利文献,形成“知识泄露”。对于涉及知识产权的设计任务,这是不可接受的风险。

解决方案:

  • 所有语义解析迁移至本地轻量模型(Phi-3-mini量化版,仅1.8GB);
  • 构建企业专属术语词典,强制模型在解析时优先匹配词典条目;
  • 对输出结果进行关键词过滤(如检测到“专利”“CN2023XXXXXX”等字样,自动触发人工审核)。

5.2 坑2:忽略单位制统一,导致生成模型尺寸偏差1000倍

某次测试中,用户输入“直径10cm的圆柱”,系统生成的模型直径却是10mm。根源在于:FreeCAD内核默认单位是毫米,而LLM解析时未做单位转换,直接将“10cm”传入API。更隐蔽的问题是:当用户混用单位(如“长100mm宽3.5inch”),系统未做归一化处理。

解决方案:

  • 在规则引擎前置增加单位解析模块,强制转换为统一基准(毫米);
  • 对所有数值输入添加单位校验:若未指定单位,默认按上下文推断(如“M6”中的6默认为mm,“R5”中的5默认为mm);
  • 在API响应中明确返回所用单位制,供用户确认。

5.3 坑3:特征顺序错误引发布尔运算崩溃

输入“长方体上开圆孔,孔边缘倒角”,若先生成倒角再开孔,FreeCAD会报错“无法对空几何体倒角”。这是因为倒角操作必须作用于已存在的边,而开孔前该边不存在。

解决方案:

  • 构建特征依赖图谱(Feature Dependency Graph),自动识别操作顺序:
    开孔 → 生成新边 → 倒角;
  • 在代码合成阶段,Z3求解器强制约束操作序列,违反依赖关系的代码直接被拒绝;
  • 向用户可视化显示特征生成顺序(如时间轴形式),支持手动拖拽调整。

5.4 坑4:曲面连续性失控,导致CNC加工路径中断

某次生成汽车灯罩曲面时,模型在渲染时完美,但导入Mastercam后,刀路生成失败。分析发现:模型由多个NURBS曲面拼接而成,但相邻曲面间仅满足G0连续(位置连续),未达到G1(切线连续)或G2(曲率连续),导致五轴机床在曲面交接处产生突变加速度。

解决方案:

  • 在曲面生成规则中,强制添加连续性约束:
    if surface_type == "aesthetic": require_continuity = "G2";
  • 调用OpenCASCADE的ShapeUpgrade_ShapeDivideContinuity工具,自动优化曲面连接;
  • 导出STEP前,执行check_continuity()函数,不达标则触发重生成。

5.5 坑5:未处理制造工艺约束,生成“好看但不能做”的模型

输入“壁厚1mm的铝合金手机中框”,系统生成了完美模型,但实际CNC加工时,1mm壁厚在铝合金上极易变形。问题在于:模型生成未关联材料工艺数据库。

解决方案:

  • 集成制造工艺知识库(含常见材料最小壁厚、最小孔径、最大悬臂长度等);
  • 在生成前执行工艺可行性检查(Manufacturability Check):
    if material == "Al6061" and wall_thickness < 1.2: warn("推荐最小壁厚1.2mm");
  • 提供“工艺优化建议”按钮,一键生成符合加工要求的替代方案(如增加加强筋、调整壁厚分布)。

5.6 坑6:忽略装配关系,导致生成模型无法进入PLM系统

用户输入“电机支架,需与Y系列电机配合”,系统生成了支架模型,但未添加电机安装孔的定位基准、未定义配合面公差、未生成BOM所需属性(如材料、表面处理)。结果PLM系统拒绝导入,因缺少必要元数据。

解决方案:

  • 构建装配知识图谱,将“Y系列电机”映射为标准接口参数(如IEC 60034-7规定的法兰尺寸、轴径、安装孔位);
  • 自动生成PLM元数据:在FreeCAD模型中嵌入Custom Properties,包含material="AL6061-T6"、surface_treatment="Anodized"等字段;
  • 导出STEP时,自动附加AP242扩展属性,满足PLM系统元数据抓取需求。

5.7 坑7:未设计反馈闭环,导致规则引擎持续偏离工程实际

上线初期,用户频繁反馈“生成的键槽深度不对”。排查发现:规则表中KEYWAY_DEPTH_MAP引用的是旧版GB/T标准,而实际产线已执行新版。根本原因是:规则更新依赖人工发现,缺乏自动化反馈机制。

解决方案:

  • 在UI中添加“报告问题”按钮,用户可标记错误特征并上传修正参数;
  • 后台自动聚类相似问题(如10次报告“键槽深度”),触发规则校验流程;
  • 新增A/B测试模块:对同一指令,同时运行新旧规则,对比输出差异,人工审核后自动更新规则库。

6. 未来演进方向:从“文本建模”到“设计意图理解”的范式升级

6.1 多模态输入:当草图照片成为建模指令的一部分

当前Text-to-CAD局限于纯文本,但工程师最常用的输入其实是手绘草图。我们正在测试的下一代方案,支持用户上传一张手机拍摄的草图照片(含尺寸标注),系统自动执行:

  • OCR识别手写尺寸(如“Φ25”“R5”);
  • 轮廓矢量化(将潦草线条转为精确B-spline);
  • 结合文本描述补全语义(如照片中只有轮廓,文本补充“材料为不锈钢304”)。

关键技术突破在于:我们不再将图像和文本作为独立模态,而是构建联合嵌入空间(Joint Embedding Space),让“手绘圆圈”和“Φ25mm”在向量空间中距离极近。实测在200张产线草图测试集上,尺寸识别准确率达94.7%,远超单一OCR方案。

6.2 设计意图推理:从“做什么”到“为什么做”的深层理解

最高阶的Text-to-CAD,不应只响应“建一个散热片”,而要理解“为什么要建散热片”。我们正训练一个意图推理模型,当用户输入“电机外壳温度过高”,系统自动推导:

  • 热源定位:电机绕组 → 外壳传导 → 环境散热;
  • 解决方案生成:增加散热片(面积/厚度/材料)→ 优化风道(进风口位置/出风口角度)→ 添加导热垫;
  • 参数化推荐:基于热仿真模型,给出“散热片高度15mm、基板厚度3mm、铝材6063-T5”的最优组合。

这已超出建模范畴,进入辅助设计决策领域。其核心不是生成几何,而是构建“问题→原理→方案→参数”的因果链。我们称之为Design Reasoning Engine(设计推理引擎)。

6.3 与数字孪生融合:生成模型自动注入IoT数据流

在某智能工厂项目中,我们让Text-to-CAD生成的设备模型,自动关联现场IoT传感器数据。例如:

  • 输入“AGV小车底盘,需监测电池仓温度”;
  • 系统不仅生成底盘模型,还在电池仓位置自动添加虚拟温度传感器点;
  • 导出模型时,同步生成MQTT主题配置(如factory/agv01/battery/temp);
  • 在数字孪生平台中,该模型可实时驱动温度色谱变化。

这种“几何模型+数据契约”的融合,让Text-to-CAD从设计工具升级为数字主线(Digital Thread)的起点。它生成的不再是静态文件,而是可执行的数据载体。

我在实际项目中越来越确信:Text-to-CAD的价值不在“替代工程师”,而在“释放工程师”。当一个资深工程师不用再花两小时建模一个标准件,他就能多花两小时思考“这个结构能否减重20%而不影响强度”,或者“这个公差分配是否会导致装配良率下降”。技术真正的进步,永远是把人从重复劳动中解放出来,去攻克那些真正需要人类智慧的难题。