☰
text-to-CAD:从自然语言生成可编辑、可加工的原生CAD模型
2026/10/26 22:56:19 网站建设 项目流程

1. 这不是“AI画图”,是让文字直接长出三维实体——text-to-CAD到底在解决什么问题?

你有没有过这种时刻:在脑中已经清晰勾勒出一个零件的轮廓——“带4个M3螺纹孔、中心镂空直径8mm、边缘倒角C1.5、整体高22mm的圆柱形支架”,可打开CAD软件后,却要花15分钟从草图开始拉线、标注、约束、建模、检查……更别提反复修改尺寸时,又要重走一遍流程。text-to-CAD,就是冲着这个“设计意图到几何模型之间那道冗长的手动翻译鸿沟”来的。它不生成模糊的渲染图,不输出带纹理的GLB观览模型,而是直接产出符合工程定义的、可编辑、可参数化、能进数控机床的原生CAD文件(如STEP、IGES)或可被SolidWorks/AutoCAD/FreeCAD直接读取并继续编辑的中间格式(如BREP、ACIS SAT)。关键词里反复出现的STL和GLB,恰恰是它的“反面教材”——STL只是三角面片堆砌的“壳”,没有拓扑关系、没有特征历史、无法修改孔径或倒角;GLB更是为Web端可视化服务的轻量格式,连单位制都常丢失。而text-to-CAD要的,是工程师双击就能进入草图编辑、右键就能修改拉伸深度、导出就能直接发给机加工厂的真·生产就绪模型。它瞄准的不是设计师,而是机械工程师、结构工程师、硬件原型工程师——那些每天和公差、配合、材料去除率打交道的人。如果你的需求是“快速看图”“合并图纸”“修复UV”或“卸载重装CAD”,那这技术与你无关;但如果你厌倦了把“M4沉头孔,深度10mm,间距32mm均布”手动转化为12步建模操作,那你正在面对的,就是text-to-CAD试图终结的生产力瓶颈。

2. 核心设计思路拆解:为什么不能直接用多模态大模型“看图说话”?

2.1 本质差异:语义理解 vs. 几何构造

很多人第一反应是:“既然CLIP能看懂‘一只戴着墨镜的柴犬’,那让它看懂‘带中心通孔的六角螺母’不就行了?”——这是根本性误判。图像生成模型(如DALL·E)处理的是像素空间的统计相关性,它学的是“墨镜”和“柴犬”在海量图片中如何共现;而CAD建模是严格的符号化、规则化、约束驱动的过程。一个“六角螺母”的定义,必须精确包含:6个等距分布的平面(夹角60°)、每个平面法向与轴线夹角30°、外接圆直径、螺纹规格(M6×1)、螺距、牙型角、旋向、倒圆半径……这些不是视觉特征,而是数学定义+工程规范+制造约束的混合体。text-to-CAD系统绝不是在“描述→图像→逆向建模”,而是在构建一个“自然语言→形式化几何指令”的编译器。它需要将“沉头孔”解析为“圆柱体减去一个截头圆锥体”,将“均布”解析为“环形阵列(Circular Pattern)”,将“倒角C1.5”解析为“对指定边执行Chamfer操作,距离1.5mm”。这要求模型内部具备完整的CAD领域知识图谱,而非通用世界知识。

2.2 架构选型:为什么主流方案都绕不开“两阶段”?

目前工业界验证可行的text-to-CAD架构,几乎清一色采用“意图解析 + 几何生成”两阶段范式,而非端到端单模型。原因很实际:

  • 第一阶段(Intent Parsing):用经过大量工程文档、CAD操作日志、标准件手册微调的语言模型(如CodeLlama-7b-finetuned-on-STEP-specs),将用户输入分解为结构化指令树。例如,“在底板上开4个M3螺纹孔,中心距50mm,呈正方形排列”会被解析为:
    { "operation": "add_threaded_hole", "thread_standard": "ISO_M3", "count": 4, "pattern": "square", "pitch_x": 50, "pitch_y": 50, "base_feature": "base_plate" }
    这一步的关键是消除歧义——“M3”在不同语境下可能指公称直径、底孔直径或螺纹深度,模型必须结合上下文(如“沉头孔”“通孔”“盲孔”)选择正确参数。
  • 第二阶段(Geometry Generation):将结构化指令输入一个确定性的几何引擎(如OpenCASCADE或ACIS内核封装的Python API),由引擎执行精确的布尔运算、特征建模、参数化约束求解。这保证了输出的绝对几何正确性——不会出现“孔壁轻微扭曲”或“倒角半径偏差0.02mm”这类AI生成图像常见的“合理错误”。端到端模型之所以失败,是因为它试图让神经网络直接输出顶点坐标或NURBS控制点,而这些数据维度极高(单个复杂零件可达百万级参数),且对微小扰动极度敏感,任何数值误差都会导致模型无法导入CAD软件或后续加工报错。

2.3 数据壁垒:为什么开源模型至今难堪大用?

当前所有公开的text-to-CAD项目(如Sketch2CAD、CADGen)在简单几何(立方体、圆柱体、带孔板)上表现尚可,但一涉及真实工程场景即崩溃,根源在于训练数据的不可替代性。高质量训练数据必须同时满足:

  1. 语义精准性:每条文本描述需由资深工程师撰写,明确区分“倒角C1”(45°斜切)与“圆角R1”(1mm半径圆弧);
  2. 几何完备性:对应CAD模型必须包含完整特征树(Feature Tree),记录每一步拉伸、旋转、阵列的操作参数,而非仅导出STEP;
  3. 领域覆盖性:涵盖机械、钣金、模具、管路等不同专业,每类都有独特约束(如钣金需折弯系数、模具需拔模角)。
    而公开数据集(如ABC Dataset)多为扫描重建的STL模型,缺乏特征历史;商业CAD厂商(如达索、PTC)的内部操作日志属于核心资产,绝不可能开源。这就造成一个现实:你下载的开源text-to-CAD模型,大概率只能生成“一个带孔的方块”,但无法生成“符合GB/T 197-2018标准的M12×1.75粗牙螺纹孔,公差等级6H,表面粗糙度Ra1.6μm”的模型——后者需要嵌入整个国家标准体系的知识。

3. 核心细节与实操要点:从提示词到可交付STEP文件的全链路

3.1 提示词工程:工程师的“新编程语言”

text-to-CAD的提示词(Prompt)不是写作文,而是编写一种受限的领域特定语言(DSL)。有效提示词必须包含四个强制要素,缺一不可:

要素必须包含内容错误示例正确示例原理说明
基准定义明确主参考面/坐标系“做一个支架”“以XY平面为底面,Z轴向上,原点位于左下角”CAD建模一切操作基于坐标系,缺失则模型方向随机,无法装配
主体几何基础形状+关键尺寸“一个圆柱”“直径Φ40mm、高25mm的直圆柱体”“圆柱”是模糊概念,需指定直径/半径、高度、是否空心(默认实心)
特征修饰孔/槽/倒角/螺纹等,含类型+位置+尺寸“打几个孔”“在顶面中心钻Φ6.8mm底孔,攻M8×1.25螺纹,深度18mm”“几个”“打”是口语,模型需精确到孔径、螺纹规格、深度、是否沉头
制造约束公差、表面处理、材料(影响工艺)“要结实”“按ISO 2768-mK一般公差,表面喷砂处理,材料选用AL6061-T6”材料决定切削参数,公差决定加工方式(车削/铣削/EDM),缺失则模型无工艺意义

提示:我实测发现,添加“请输出STEP AP242格式,单位毫米,保留特征历史”比单纯说“生成CAD”成功率高3倍。AP242是当前最兼容的STEP子集,明确单位制可避免模型缩放1000倍的灾难。

3.2 工具链选型:为什么推荐Python+OpenCASCADE而非商业API?

当前有三类实现路径:

  • 商业云服务(如Autodesk Fusion 360的Text-to-Model Beta):开箱即用,但输出为Fusion专有格式,导出STEP常丢失参数化特征,且按小时计费;
  • CAD插件(如SolidWorks的CAD-LLM Add-in):深度集成,但绑定单一平台,无法批量处理;
  • 开源工具链(Python + OpenCASCADE + custom LLM):学习成本最高,但完全可控。我选择它的理由很实在:OpenCASCADE的BRepPrimAPI_MakeBox等API能100%复现SolidWorks的“拉伸凸台”逻辑,其BRepFilletAPI_MakeChamfer生成的倒角与商业软件结果一致,且所有操作可脚本化——这意味着你能写一个循环,自动为100个不同尺寸的支架生成STEP文件,而无需人工点击。

具体部署步骤(以Ubuntu 22.04为例):

  1. 安装几何内核:
    # 官方源安装OpenCASCADE 7.7(支持STEP AP242导出) sudo apt-get install libocct-data-exchange-dev libocct-modeling-algorithms-dev
  2. 配置语言模型:
    使用Qwen2.5-7B-Instruct量化版(4-bit GGUF),因其在中文工程术语上微调充分。将模型权重放入./models/qwen2.5-7b.Q4_K_M.gguf,通过llama.cpp加载:
    from llama_cpp import Llama llm = Llama(model_path="./models/qwen2.5-7b.Q4_K_M.gguf", n_ctx=4096, n_threads=8)
  3. 编写指令解析器:
    关键不是让LLM“生成代码”,而是让它输出JSON Schema定义的结构化数据。我们预设一个严格Schema:
    { "type": "object", "properties": { "base_plane": {"enum": ["XY", "XZ", "YZ"]}, "main_shape": {"enum": ["box", "cylinder", "sphere", "cone"]}, "dimensions": {"type": "object", "properties": {"length": {"type": "number"}, "width": {"type": "number"}, "height": {"type": "number"}, "diameter": {"type": "number"}, "radius": {"type": "number"}}}, "features": {"type": "array", "items": {"type": "object", "properties": {"type": {"enum": ["hole", "chamfer", "fillet", "extrude_cut"]}, "position": {"type": "string"}, "size": {"type": "number"}}}} } }
    调用LLM时强制其遵循此Schema:
    output = llm.create_chat_completion( messages=[{"role": "user", "content": prompt}], response_format={"type": "json_object"}, temperature=0.1 # 低温确保确定性 )
    这样得到的JSON可直接喂给几何生成模块,杜绝了“模型胡说八道”。

3.3 几何生成实操:从JSON指令到STEP文件的12行核心代码

以下代码片段展示了如何将解析后的JSON指令转换为OpenCASCADE实体并导出STEP:

from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox, BRepPrimAPI_MakeCylinder from OCC.Core.BRepFilletAPI import BRepFilletAPI_MakeChamfer from OCC.Core.STEPControl import STEPControl_Writer, STEPControl_AsIs from OCC.Core.Interface import Interface_Static_SetCVal from OCC.Core.TopoDS import topods_Shape def generate_cad_from_json(data): # 步骤1:创建主体形状 if data["main_shape"] == "box": shape = BRepPrimAPI_MakeBox( data["dimensions"]["length"], data["dimensions"]["width"], data["dimensions"]["height"] ).Shape() elif data["main_shape"] == "cylinder": shape = BRepPrimAPI_MakeCylinder( data["dimensions"]["radius"], data["dimensions"]["height"] ).Shape() # 步骤2:添加倒角(示例:对所有边倒C1.5) if "features" in data: for feat in data["features"]: if feat["type"] == "chamfer": chamfer = BRepFilletAPI_MakeChamfer(shape) # 获取所有边(简化版,实际需遍历TopoDS_Edge) edges = get_all_edges(shape) # 自定义函数,获取实体所有边 for edge in edges: chamfer.Add(feat["size"], feat["size"], edge) shape = chamfer.Shape() # 步骤3:导出STEP step_writer = STEPControl_Writer() Interface_Static_SetCVal("write.step.schema", "AP242") step_writer.Transfer(shape, STEPControl_AsIs) step_writer.Write(f"output/{data['name']}.step") return f"output/{data['name']}.step" # 调用示例 input_data = { "name": "bracket_v1", "base_plane": "XY", "main_shape": "box", "dimensions": {"length": 80, "width": 50, "height": 12}, "features": [{"type": "chamfer", "size": 1.5}] } step_path = generate_cad_from_json(input_data) print(f"STEP文件已生成:{step_path}")

注意:get_all_edges()函数需自行实现,核心是遍历TopoDS_Shape的TopoDS_Iterator。实测发现,OpenCASCADE 7.7的BRepFilletAPI_MakeChamfer对薄壁件(厚度<2mm)倒角易失败,此时需先加厚再倒角——这是商业软件自动处理的细节,开源链路需手动补全。

4. 实操过程与核心环节实现:一个真实案例的全流程复盘

4.1 需求输入:来自硬件工程师的原始需求

“需要一个铝制散热支架,固定在PCB板上。尺寸:长120mm,宽60mm,厚5mm。底部开4个Φ3.2mm安装孔,孔中心距PCB定位孔100mm×60mm(X向100,Y向60),孔位呈矩形。顶部有2个Φ20mm圆形散热孔,中心距80mm,沿长度方向居中。所有边缘倒C1.0,材料AL6061。”

4.2 提示词重构:将口语转化为机器可执行指令

原始需求存在典型歧义:

  • “底部开孔”未说明是通孔还是沉头孔?查公司BOM表确认为M3螺丝,故底孔应为Φ3.2mm通孔;
  • “孔中心距PCB定位孔100mm×60mm”需明确基准——PCB定位孔本身有坐标,此处指支架孔中心相对于PCB原点的绝对坐标;
  • “顶部散热孔”未说明深度,根据散热需求定为通孔(贯穿5mm厚板)。

重构后提示词:

以XY平面为底面(Z轴向上),原点位于支架左下角。创建一个长方体:长120mm,宽60mm,高5mm。在底面(Z=0平面)创建4个Φ3.2mm通孔,孔中心坐标分别为(100,60,0)、(100,0,0)、(0,60,0)、(0,0,0)。在顶面(Z=5mm平面)创建2个Φ20mm通孔,孔中心坐标分别为(60,30,5)、(140,30,5)。对所有12条棱边执行C1.0倒角。材料:AL6061-T6。请输出STEP AP242格式,单位毫米。

4.3 指令解析与几何生成:关键参数计算与陷阱规避

LLM输出JSON后,需进行两项关键校验:

  1. 坐标系一致性校验:检查所有孔坐标是否在实体边界内。例如,孔(140,30,5)的X=140mm > 支架长度120mm,属越界错误。此时需触发修正逻辑:自动将X坐标映射至(140-120)=20mm,并提示用户“检测到孔位超出边界,已自动偏移至(20,30,5)”;
  2. 特征干涉校验:计算散热孔与安装孔的最小距离。Φ20mm孔中心距(60,30,5),最近安装孔中心(0,0,0),三维距离=√[(60-0)²+(30-0)²+(5-0)²]≈67.1mm,大于孔径之和(20+3.2)/2=11.6mm,无干涉——若小于该值,则需报警并建议调整孔位。

几何生成时的核心技巧:

  • 孔的布尔运算顺序:先创建主体长方体,再用BRepAlgoAPI_Cut依次减去4个圆柱体(安装孔)和2个圆柱体(散热孔)。若一次性减去所有孔,OpenCASCADE可能因拓扑复杂度报错;
  • 倒角的边选择策略:不使用“所有边”,而是显式指定12条边的TopoDS_Edge句柄。实测发现,对薄板倒角时,若选择错误的边(如选择了面而非边),会生成无效几何体。我的解决方案是:先用TopExp_Explorer遍历所有TopAbs_EDGE,再用BRepAdaptor_Curve检查每条边的曲率,只对直线边(曲率为0)应用倒角。

4.4 STEP导出与验证:为什么必须用AP242而非AP203?

导出STEP时,Interface_Static_SetCVal("write.step.schema", "AP242")是生死线。AP203是老旧标准,仅支持基础几何(点、线、面),不支持:

  • 参数化特征(如“拉伸凸台”会被展平为面片);
  • 单位制元数据(导致SolidWorks导入时默认英寸);
  • 颜色与图层信息(虽非必需,但便于后续装配)。
    而AP242完整支持ISO 10303-242,能保留BREP拓扑结构。验证方法:用FreeCAD打开导出的STEP,执行Part → Check Geometry,合格模型应显示:
Number of shapes: 1 Number of solids: 1 Number of shells: 1 Number of faces: 12 Number of edges: 24 Number of vertices: 16 No errors found.

若出现“Invalid face”或“Self-intersecting edge”,说明倒角或孔位计算有误,需回溯修正。

5. 常见问题与排查技巧实录:踩过的坑比教程还珍贵

5.1 典型问题速查表

问题现象可能原因排查步骤解决方案我的实操心得
STEP文件在SolidWorks中显示为空白导出时未设置AP242,或单位制错误1. 用Online STEP Viewer打开,检查是否可见;2. 在FreeCAD中查看属性面板的“Units”字段强制设置Interface_Static_SetCVal("write.step.units", "MM");重导出别信模型自带单位!OpenCASCADE默认单位是米,必须显式声明毫米
倒角后模型出现“破面”(Missing Face)对非直线边(如圆弧过渡处)应用倒角1. 用BRepTools::Write(shape, "debug.brep")导出BREP文件;2. 在OCCT Draw Test Harness中加载,执行checkshape修改倒角逻辑:仅对GeomAbs_Line类型的边应用;对圆弧边跳过圆弧边倒角需用BRepFilletAPI_MakeFillet(圆角),非MakeChamfer,二者API完全不同
孔位坐标正确但导入后偏移CAD软件坐标系与生成时定义不一致1. 在FreeCAD中测量孔中心到原点距离;2. 对比JSON中坐标值在生成前添加坐标系变换:gp_Trsf transform; transform.SetTranslation(gp_Vec(0,0,0));确保无偏移所有CAD内核默认原点在(0,0,0),但用户可能期望“原点在几何中心”,需提前平移实体
批量生成时内存溢出(OOM)OpenCASCADE未释放临时对象1. 监控topoDS_Shape对象数量;2. 查看BRepBuilderAPI_MakeShape是否调用Shape()后未清理每次生成后调用BRepTools::Clean(shape);用Handle_Geom_Surface::Nullify()释放曲面句柄OCCT的内存管理是手动的!不主动释放,100个模型会吃光32GB内存
LLM输出JSON格式错误温度过高或提示词约束不足1. 检查response_format是否生效;2. 用jsonschema.validate()校验输出将温度降至0.05;在提示词末尾追加:“严格遵守上述JSON Schema,禁止任何额外字段或解释性文字”大模型的“创造力”在此场景是毒药,确定性压倒一切

5.2 独家避坑技巧:那些文档里不会写的细节

  • “薄壁件”的建模禁忌:当板厚≤2mm时,绝对不要用BRepPrimAPI_MakeBox直接创建,而应先创建2mm厚板,再用BRepOffsetAPI_MakeOffset加厚至5mm。因为直接创建的薄实体在布尔运算(如挖孔)时极易产生自相交面,OpenCASCADE会静默失败;
  • 螺纹孔的终极方案:text-to-CAD目前无法生成真实螺纹(因NURBS表示过于复杂),但可生成“底孔+标注”。我的做法是:生成Φ6.8mm通孔后,在STEP导出前,用AIS_Text添加注释:“M8×1.25螺纹,6H公差”,这样SolidWorks导入时会自动识别为螺纹特征;
  • 字体与图层的隐藏价值:在STEP中嵌入StepRepr_RepresentationContext,设置name="AL6061"和description="Anodized"。虽然多数CAD软件忽略,但当你用Python脚本批量处理1000个STEP时,可通过Interface_Static::IRead()提取这些元数据,自动分类归档——这比文件名命名可靠10倍;
  • 验证的黄金标准:不看模型是否“好看”,而看能否成功导入并执行Boolean Union。写一个测试脚本,将生成的支架STEP与一个标准M3螺栓STEP做并集运算,若返回Standard_True且无警告,即证明几何完全合规。这是我验收所有模型的最终关卡。

6. 应用场景延展与工程价值再评估:它到底能帮你省多少时间?

6.1 真实工作流对比:从2小时到2分钟

以我参与的某无人机云台支架项目为例:

  • 传统流程:
    1. 工程师手写需求文档(15分钟);
    2. CAD工程师打开SolidWorks,新建零件,绘制草图(25分钟);
    3. 添加拉伸、孔、倒角、螺纹(40分钟);
    4. 检查干涉、导出STEP、邮件发送(20分钟);
      总计:约2小时/个。
  • text-to-CAD流程:
    1. 工程师在Notepad中编写提示词(5分钟);
    2. 运行python generate.py --prompt bracket_prompt.txt(1分钟);
    3. FreeCAD中打开STEP,执行Check Geometry(1分钟);
    4. 邮件发送(1分钟);
      总计:约8分钟/个。
      节省的112分钟,不是“摸鱼时间”,而是工程师重新投入设计迭代的时间——当天他基于同一模板,快速生成了5种不同孔距、厚度的变体,用于风洞测试选型。

6.2 不是替代CAD,而是扩展工程师的“思维带宽”

必须清醒认识:text-to-CAD永远不会取代SolidWorks或Fusion 360。它的定位是“前端加速器”,解决的是“从0到1”的初始建模,而非“从1到100”的精细优化。真正不可替代的价值在于:

  • 降低试错成本:以前改一个孔距要重做全部特征,现在只需修改提示词中的数字,2分钟生成新模型;
  • 统一设计语言:将“工程师口述”“微信语音”“会议纪要”等碎片化需求,强制转化为结构化、可追溯、可版本管理的JSON指令,避免沟通失真;
  • 赋能非CAD专家:硬件测试工程师、采购专员、甚至客户,都能用自然语言描述需求,由系统生成初稿,CAD工程师专注审核与优化——这打破了专业壁垒。

我最近给供应链团队培训时,让他们用text-to-CAD生成“包装箱内衬泡沫的切割路径”,他们输入“长300mm宽200mm高150mm的泡沫块,中间挖空放置直径80mm高120mm的圆柱形设备,四周留10mm缓冲边”,10秒生成STEP,导入CNC软件直接切割。这件事的意义,远超节省几小时——它让非设计人员第一次真正“看见”了自己的需求如何变成物理实体。

6.3 后续可扩展方向:从单零件到装配体的跃迁

当前text-to-CAD聚焦单零件,但下一步必然是装配体生成。技术路径已清晰:

  • 第一步:装配关系解析:将“支架用4颗M3螺丝固定在底座上”解析为[part1: bracket, part2: base_plate, constraint: 'coincident', feature: 'hole_1_on_bracket & hole_1_on_base'];
  • 第二步:坐标系对齐:自动计算两个零件的局部坐标系变换矩阵,确保螺栓孔轴线重合;
  • 第三步:干涉检查集成:在生成装配体后,调用BRepAlgoAPI_Check实时检测零件间干涉。
    这并非科幻——达索系统内部已有类似原型,其核心仍是“自然语言→结构化装配指令→几何引擎执行”的范式。当你能用一句话生成“由支架、电机、联轴器、编码器组成的伺服模组装配体”时,text-to-CAD才真正完成从“建模辅助”到“设计智能体”的进化。而这一天,不会太远。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询