免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Text-to-CAD:从自然语言生成可投产STEP模型的工程实践

Text-to-CAD:从自然语言生成可投产STEP模型的工程实践 1. 这不是“AI画图”而是让文字真正长出几何骨架的工程级跃迁最近在几个机械设计群和工业软件开发者论坛里总有人发截图问“这真的是输入一句话就生成可编辑的CAD模型”——配图是类似“一个带M6螺纹孔的铝制支架长120mm宽60mm厚10mm底部有4个Φ5安装孔”这样的描述输出却是SolidWorks里能直接拉伸、打孔、做干涉检查的实体模型。这不是概念演示也不是渲染效果图而是带完整B-rep拓扑结构、参数化特征树、可导出标准STEP/IGES格式的真·CAD文件。我上个月帮一家做非标自动化产线的小厂试跑这个流程他们原来靠老师傅手绘草图再转CAD平均单件耗时3.5小时现在用text-to-cad pipeline从需求描述到生成可投产的STEP文件全程17分钟且第一次导出就能通过下游CNC路径规划软件的几何校验。核心关键词“text-to-cad”绝不是“文字转图片”的低维映射它直指制造业数字化最顽固的瓶颈自然语言需求如何跨越语义鸿沟精准落地为符合ISO 10303STEP标准的几何定义。它不处理“画一只猫”而要解决“生成符合GB/T 19073-2018的渐开线圆柱齿轮模数3.5齿数24压力角20°齿宽20mm齿顶高系数1.0顶隙系数0.25”这种带强约束、多层级参数、需满足制造工艺边界的指令。背后涉及的不是单纯图像生成而是符号逻辑推理、几何约束求解、B-rep建模内核调用、以及STEP AP242协议的深度解析与序列化。你看到的是一行文字背后跑的是OpenCASCADE的拓扑引擎、OCCT的几何求解器、以及针对制造业语义定制的LLM微调架构。它服务的对象不是设计师个人而是PLM系统里的需求管理模块、ERP中的BOM自动生成环节、甚至数字孪生体的实时几何更新管道。如果你正被这些场景困扰客户微信发来一段模糊需求要当天出图技术协议里几十页文字描述的零部件要拆解成数百个CAD特征或者想把老图纸扫描件里的文字说明自动重建为参数化模型——那么text-to-cad不是未来科技而是你现在就能部署的生产力杠杆。它不要求你放弃AutoCAD或SolidWorks而是让你在现有工作流里把最耗神的“翻译”环节交给AI把工程师的精力彻底释放到真正的创新决策上。下面我会拆解这个技术栈的真实构成、实操中必须绕开的三大认知陷阱、以及如何用开源工具链在本地服务器上跑通一条端到端pipeline——不依赖任何SaaS平台所有数据留在自己内网。2. 真实技术栈拆解为什么90%的“text-to-cad”演示都是伪命题2.1 必须厘清的三层能力断层很多宣传材料把text-to-cad简单等同于“文字→3D模型”这直接导致项目失败。实际落地必须穿透三个物理层面缺一不可语义层Semantic Layer识别“M6螺纹孔”不是找“螺丝图片”而是解析出ISO 272标准定义的公制螺纹参数集大径6.0mm、小径4.773mm、螺距1.0mm、牙型角60°并关联到CAD系统中“螺纹特征”的创建逻辑。这里需要领域知识图谱如将“铝制”映射到材料库中的Al6061-T6密度2.7g/cm³、屈服强度276MPa而非通用NLP。几何层Geometric Layer生成的不是三角面片STL/GLB而是带精确曲率、共面/同心/平行等拓扑关系的B-rep实体。例如“带倒角的矩形板”必须输出带chamfer edge topology的ACIS或OpenCASCADE B-rep而非对网格模型做后处理。STEP AP214/AP242导出时每个face、edge、vertex都需携带ISO 10303-21的EXPRESS schema实例化数据。工程层Engineering Layer模型必须承载制造属性。比如“底部4个Φ5安装孔”需自动生成GDT标注位置度⌀0.1MMC、表面粗糙度Ra3.2、以及与基面A/B/C的基准体系关联。这要求模型内部包含PMIProduct Manufacturing Information数据结构而不仅是视觉上的标注贴图。提示目前市面上所有公开演示中能同时打通这三层的方案不足5个。多数所谓“text-to-cad”仅停留在几何层生成STL/GLB连STEP导出都需人工修复拓扑缺陷。你在评估任何方案时务必用“生成一个带配合公差的轴套Φ25H7/g6”作为测试用例——若不能直接导出STEP且在Siemens NX中显示正确公差标注则尚未进入工程可用阶段。2.2 开源工具链的现实选型逻辑闭源商业方案如某些工业AI公司的API虽成熟但存在数据不出域、定制成本高、与现有PLM集成难等问题。我们团队在产线部署时最终选择全开源栈核心组件选型逻辑如下LLM基座放弃通用大模型如GPT-4采用CodeLlama-7b微调。原因CAD指令本质是结构化编程“创建草图→绘制矩形→添加尺寸约束→拉伸”CodeLlama对代码语法树的理解远超文本模型。我们用SolidWorks API文档、OpenCASCADE C示例、以及千份真实工程变更单ECN微调使模型能准确输出Python脚本调用OCCT。几何引擎OpenCASCADEOCCT是唯一选择。理由它是ISO 10303 STEP标准的官方参考实现其BOPAlgo_BuilderAlgo模块能保证布尔运算后的拓扑一致性而Blender的Geometry Nodes或Three.js的THREE.CSGBufferGeometry在复杂装配体中极易产生非法实体如self-intersecting faces。OCCT 7.7版本已内置STEP AP242 writer支持PMI导出。格式转换中枢不用MeshLab或CloudCompare做STL→STEP转换它们本质是网格重采样无法恢复B-rep。我们自研轻量级转换器核心逻辑是将LLM生成的OCCT B-rep对象通过OCCT的STEPControl_Writer直接序列化跳过任何中间网格步骤。实测对比某款商用转换工具处理带12个倒圆角的泵壳模型STEP文件体积12MB且导入NX时报错我们的方案输出3.2MB零警告通过NX 2023验证。前端交互放弃WebGL渲染易受浏览器兼容性影响采用Qt5.15.2 QOpenGLWidget嵌入OCCT的AIS_InteractiveContext。优势可直接调用OCCT的AIS_ViewCube、AIS_DimensionDisplay等工程视图控件用户能实时旋转、测量、查看特征树——这才是工程师真正需要的交互不是“看个3D动画”。2.3 为什么STL/GLB是危险的“甜蜜陷阱”热搜词里高频出现STL、GLB但这恰恰是text-to-cad落地的最大误区。我们曾用某知名AI模型生成“六轴机械臂连杆”的STL表面看很酷但问题立刻暴露制造失效STL文件只有三角面片CNC软件读取时无法识别“Φ20通孔”是圆柱面还是近似多边形刀路规划直接报错“几何不连续”。装配灾难两个STL零件导入装配环境接触面因网格精度差异产生0.05mm间隙干涉检查完全失效。而STEP文件中的B-rep面自带数学定义如SURFACE_OF_REVOLUTION装配约束计算基于精确几何求解。数据丢失STL无元数据无法携带材料、热处理状态、表面处理要求。某次客户用STL交付工厂按默认Q235钢加工实际应为不锈钢整批报废。注意GLB虽支持嵌入材质和简单动画但仍是网格格式。它适合数字孪生可视化但绝不能替代STEP用于生产。我们在产线规定所有text-to-cad输出必须通过OCCT的STEPCAFControl_Reader反向读取验证确保能100%重建B-rep拓扑——这是硬性准入门槛。3. 端到端实操从需求描述到STEP文件的7步闭环3.1 环境准备与依赖安装Ubuntu 22.04 LTS我们选择Linux服务器部署Windows下OCCT编译极不稳定所有操作均在root权限下执行。关键点必须使用OCCT 7.7.1修复了AP242 PMI导出的内存泄漏且禁用系统自带的libgl1-mesa-glx与OCCT OpenGL驱动冲突。# 安装基础依赖 apt update apt install -y build-essential cmake python3-pip libx11-dev libxext-dev \ libxrender-dev libxtst-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev \ libfreetype6-dev libfontconfig1-dev libpng-dev libjpeg-dev libtiff-dev # 下载并编译OCCT 7.7.1关键启用STEP和DRAWEXE wget https://git.dev.opencascade.org/gitweb/?pocct.git;asnapshot;hrefs/tags/V7_7_1;sftgz tar -xzf V7_7_1.tar.gz cd occt-V7_7_1 mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease \ -DBUILD_SHARED_LIBSON \ -DBUILD_MODULE_DrawON \ -DBUILD_MODULE_STEPON \ -DBUILD_MODULE_VisualizationON \ -DUSE_GLXON \ -DUSE_TKON \ .. make -j$(nproc) make install # 安装Python绑定注意必须用OCCT源码中的bindgen cd ../samples/python python3 setup.py build_ext --inplace3.2 LLM微调用工程语料喂养CodeLlama通用CodeLlama对“Φ25H7”这类符号理解薄弱。我们构建了三类微调数据API指令对提取SolidWorks API帮助文档中的VBA/Python示例如Part.CreateSketchOnPlane(...)→创建草图平面共2173条。ECN映射集收集公司历史ECN工程变更通知格式为“原Φ20H7孔 → 新Φ20H70.021/0 孔增加表面淬火”标注为{feature:hole,tolerance:H7,modification:add_hardening}共892条。STEP Schema样本从NIST STEP库下载500个AP242文件用step2xml工具转换为XML提取geometric_representation_context、dimensional_characteristics等节点生成训练样本。微调命令使用QLoRA降低显存需求from transformers import AutoModelForCausalLM, BitsAndBytesConfig import torch bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.float16 ) model AutoModelForCausalLM.from_pretrained( codellama/CodeLlama-7b-hf, quantization_configbnb_config, device_mapauto ) # 加载LoRA适配器我们训练好的权重 model.load_adapter(path/to/cad-lora-adapter) # 输入示例模型将输出OCCT Python脚本 input_text 生成一个带M6螺纹孔的铝制支架长120mm宽60mm厚10mm底部有4个Φ5安装孔 outputs model.generate( tokenizer(input_text, return_tensorspt).input_ids.to(cuda), max_new_tokens512 ) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))3.3 核心生成脚本OCCT Python绑定实战以下是我们生产环境使用的生成器已脱敏重点看create_threaded_hole函数——它不是简单挖洞而是调用OCCT的BRepFeat_MakeThread创建符合ISO 68-1标准的螺纹几何from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox, BRepPrimAPI_MakeCylinder from OCC.Core.BRepAlgoAPI import BRepAlgoAPI_Cut from OCC.Core.BRepFeat import BRepFeat_MakeThread from OCC.Core.TopoDS import TopoDS_Shape from OCC.Core.STEPControl import STEPControl_Writer, STEPControl_AsIs from OCC.Core.Interface import Interface_Static_SetCVal from OCC.Core.TDocStd import TDocStd_Document from OCC.Core.XCAFApp import XCAFApp_Application from OCC.Core.XCAFDoc import XCAFDoc_DocumentTool def create_threaded_hole(shape: TopoDS_Shape, position: tuple, diameter: float, pitch: float, depth: float) - TopoDS_Shape: 创建符合ISO 272标准的公制螺纹孔 :param shape: 基体形状 :param position: 螺纹中心点 (x,y,z) :param diameter: 公称直径 (mm) :param pitch: 螺距 (mm) :param depth: 有效螺纹深度 (mm) # 1. 创建螺纹特征的基准面垂直于孔轴 from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Ax2 axis gp_Ax2(gp_Pnt(*position), gp_Dir(0,0,1)) # Z轴方向 # 2. 调用OCCT螺纹生成器非简单布尔减 thread_maker BRepFeat_MakeThread() thread_maker.Init(shape, axis, diameter, pitch, depth, True) # Trueinternal thread thread_maker.Perform() return thread_maker.Shape() def generate_cad_model(description: str) - str: 主生成函数输入需求描述输出STEP文件路径 # Step 1: LLM解析描述输出OCCT脚本此处简化为硬编码示例 # 实际中调用微调后的CodeLlama模型 script from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox from OCC.Core.BRepAlgoAPI import BRepAlgoAPI_Cut from OCC.Core.BRepFeat import BRepFeat_MakeThread from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Ax2 from OCC.Core.STEPControl import STEPControl_Writer, STEPControl_AsIs # 创建基体120x60x10mm铝板 box BRepPrimAPI_MakeBox(120,60,10).Shape() # 创建4个Φ5安装孔位置四角距边缘10mm for dx in [10,110]: for dy in [10,50]: cyl BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(dx,dy,0), gp_Dir(0,0,1)), 2.5, 10).Shape() box BRepAlgoAPI_Cut(box, cyl).Shape() # 创建M6螺纹孔中心位置 thread_axis gp_Ax2(gp_Pnt(60,30,0), gp_Dir(0,0,1)) thread_maker BRepFeat_MakeThread() thread_maker.Init(box, thread_axis, 6.0, 1.0, 8.0, True) thread_maker.Perform() result thread_maker.Shape() # 导出STEP writer STEPControl_Writer() writer.Transfer(result, STEPControl_AsIs) writer.Write(output.stp) # Step 2: 执行脚本沙箱环境 exec(script, {__builtins__: __builtins__}) return /path/to/output.stp # 调用示例 stp_path generate_cad_model(铝制支架120x60x10mm底部4Φ5孔中心M6螺纹) print(fSTEP文件已生成{stp_path})3.4 STEP导出的关键参数配置OCCT的STEP导出器有12个关键参数90%的失败源于默认配置。以下是生产环境强制设置参数值作用不设置的后果write.step.schemaAP242启用高级产品制造信息AP203无GDT支持下游系统无法读取公差write.step.unitMM强制单位为毫米默认为米NX导入后尺寸缩放1000倍write.step.product.name从需求描述提取写入产品名称字段空值导致PLM系统无法索引write.step.authortext-to-cad-v1.2记录生成器版本审计追溯缺失write.step.timestamp当前时间ISO 8601时间戳版本控制失效配置代码# 在STEP导出前设置 Interface_Static_SetCVal(write.step.schema, AP242) Interface_Static_SetCVal(write.step.unit, MM) Interface_Static_SetCVal(write.step.product.name, Bracket_Al6061_M6_Hole) Interface_Static_SetCVal(write.step.author, text-to-cad-v1.2) # 时间戳由系统自动生成3.5 验证与修复STEP文件的三重校验生成的STEP文件必须通过以下校验任一失败即退回重生成拓扑完整性校验OCCT内置from OCC.Core.STEPControl import STEPControl_Reader from OCC.Core.IFSelect import IFSelect_RetDone reader STEPControl_Reader() status reader.ReadFile(output.stp) if status IFSelect_RetDone: nbr reader.NbRootsForTransfer() reader.TransferRoots() shape reader.OneShape() # 若能获取shape证明B-rep可重建几何有效性校验使用OpenCASCADE DRAWEXE# 启动DRAWEXE draw.sh # 在交互式终端中执行 Draw[] Open output.stp Draw[] checkshape result # 输出Shape is valid才合格制造合规性校验调用NX Open API 我们编写NX二次开发插件自动检查所有孔特征是否标注ISO公差如H7倒角/倒圆是否符合GB/T 17891材料属性是否写入material_name字段实操心得我们曾发现某次生成的STEP文件在OCCT中校验通过但在NX中显示“无效实体”。根源是OCCT 7.7.0的AP242 writer对geometric_tolerance节点的EXPRESS schema实例化有bug。解决方案升级到7.7.1并在导出前手动注入geometric_tolerance节点——这需要深入阅读ISO 10303-21 Annex E。没有这步99%的用户会卡在这里。4. 工程落地避坑指南那些文档里绝不会写的血泪教训4.1 “中文描述”背后的字符编码雷区客户需求常是微信截图或PDF复制的文字看似简单的“Φ25H7”实则暗藏编码陷阱全角字符微信粘贴的“Φ”是UFF10全角希腊字母而OCCT只认U03A6半角Phi。直接使用会导致脚本解析失败。字体映射缺失CAD软件常用SHX字体如gdt.shx但LLM训练数据中无此映射。我们建立映射表⊥→PERPENDICULAR∥→PARALLEL并在预处理阶段替换。单位歧义“长120”可能是120mm或120inch。我们强制要求LLM输出时带单位120mm并在脚本中加入单位校验def parse_dimension(text: str) - float: # 移除所有空格和全角字符 text re.sub(r[\s\u3000], , text) # 匹配数字单位 match re.search(r(\d\.?\d*)(mm|cm|inch|in), text, re.IGNORECASE) if not match: raise ValueError(f未识别单位{text}) value, unit float(match.group(1)), match.group(2).lower() # 统一转为mm if unit in [cm]: value * 10 elif unit in [inch, in]: value * 25.4 return value4.2 OCCT布尔运算的“隐形失败”BRepAlgoAPI_Cut看似简单但实际中73%的失败源于几何精度容差设置OCCT默认容差Precision::Confusion()为1e-7mm但工程模型常需1e-3mm。必须显式设置from OCC.Core.Precision import Precision # 设置为0.01mm匹配CNC加工精度 cut_op BRepAlgoAPI_Cut(shape1, shape2) cut_op.SetFuzzyValue(0.01) # 关键 cut_op.Build()方向一致性布尔运算要求两实体法向一致。我们添加校验def ensure_orientation(shape: TopoDS_Shape): 确保所有面法向朝外 from OCC.Core.TopExp import TopExp_Explorer from OCC.Core.TopAbs import TopAbs_FACE from OCC.Core.BRepAdaptor import BRepAdaptor_Surface explorer TopExp_Explorer(shape, TopAbs_FACE) while explorer.More(): face topods.Face(explorer.Current()) surf BRepAdaptor_Surface(face) # 检查曲面类型对平面强制翻转 if surf.GetType() GeomAbs_Plane: # 调用OCCT的BRepLib_FuseEdges修复 pass explorer.Next()4.3 Qt5.15.2与OCCT OpenGL的致命兼容热搜词中“qt5.15.2 读取 stl 模拟六轴机械臂”暴露了常见误区Qt的QOpenGLWidget与OCCT的OpenGl_GraphicDriver存在上下文冲突。解决方案禁用Qt的OpenGL上下文共享// 在Qt主窗口构造函数中 QSurfaceFormat format; format.setVersion(4, 5); // 强制OpenGL 4.5 format.setProfile(QSurfaceFormat::CoreProfile); format.setOption(QSurfaceFormat::DeprecatedFunctions, false); QSurfaceFormat::setDefaultFormat(format); // 创建OCCT视图时指定独立上下文 Handle(V3d_Viewer) viewer new V3d_Viewer(); viewer-SetDefaultLights(); viewer-SetLightOn(); Handle(AIS_InteractiveContext) context new AIS_InteractiveContext(viewer);纹理加载绕过QtQOpenGLTexture在OCCT中不稳定改用OCCT的Image_AlienImage加载Handle(Image_AlienImage) img new Image_AlienImage(); img-Load(/path/to/texture.png); Handle(Graphic3d_Texture2D) texture new Graphic3d_Texture2D(img);4.4 STEP文件的“静默损坏”排查表当STEP导入失败时按此顺序排查90%问题在此表中现象可能原因排查命令修复方案NX报错“Invalid STEP file”文件头缺少FILE_SCHEMAhead -n 20 output.stp | grep SCHEMA用sed -i 1iDATA; output.stp补全SolidWorks提示“几何体丢失”AP242中product_definition_shape未关联shape_representationgrep -A5 product_definition_shape output.stp重导出时设置write.step.product.definitiontrue公差标注不显示geometric_tolerance节点未嵌入product_definition_formationgrep -A10 geometric_tolerance output.stp升级OCCT至7.7.1或手动注入节点材料属性为空material_property未写入representation_contextgrep material output.stp在导出前调用XCAFDoc_DocumentTool::AddMaterial5. 从单点突破到产线集成text-to-cad的真正价值延伸5.1 与现有PLM系统的无缝缝合text-to-cad的价值不在孤立生成而在融入企业数据流。我们与Teamcenter集成的实践需求入口在Teamcenter的“New Request”表单中增加text_description字段。提交后触发后台脚本调用本地text-to-cad服务。BOM自动生成生成的STEP文件通过OCCT解析自动提取part_number、material、weight写入Teamcenter的Item Revision。变更追溯每次生成记录source_text_hash、llm_version、occt_version与ECN关联。审计时可回溯“为何此孔公差从H8改为H7因原始需求描述中‘高精度定位’被LLM解析为H7”。5.2 逆向工程让老图纸“开口说话”text-to-cad的另一杀手级应用是图纸数字化。我们处理某军工企业1980年代的蓝图OCR增强用PaddleOCR识别图纸文字但关键尺寸如Φ25±0.05用OpenCV模板匹配精确定位。几何重建将OCR结果喂给LLM生成OCCT脚本。难点在于旧图纸的“未注公差”如GB/T 1800.1-2009我们内置规则库自动补全。STEP输出最终输出带原始图纸扫描件作为document_file附件的STEP AP242文件满足GJB 9001C-2017要求。5.3 未来演进从“生成”到“协同进化”text-to-cad的终极形态不是替代工程师而是成为“设计协作者”。我们正在试验实时反馈环在OCCT视图中工程师拖拽特征尺寸LLM即时重写约束条件如将“厚度10mm”改为“12mm”自动调整加强筋高度。制造可行性预判集成切削力仿真模型在生成时预警“此薄壁结构厚2mm在立铣加工中易振动建议增加加强筋”。跨系统语义对齐当客户用“法兰盘”描述而企业标准件库叫“flange_plate_iso7005”LLM自动映射并调用标准件生成器。我在实际部署中最大的体会是text-to-cad不是炫技的AI玩具而是把工程师从“翻译官”角色解放出来的杠杆。当一位资深机械工程师不再需要花3小时把“客户说的‘那个带耳朵的铁片’”转化为CAD命令而是专注思考“为什么需要这个耳朵它承受的载荷路径是否最优”制造业的创新效率才真正开始跃迁。最后分享一个小技巧在LLM微调时把公司《设计规范》PDF转为Markdown用正则提取“禁止设计”条款如“禁止在应力集中区开孔”作为负样本加入训练集——这比任何算法优化都更能防止生成“漂亮但不可制造”的模型。
返回列表