资讯动态

text-to-cad实战:从文本需求到CAD模型生成全流程拆解

发布时间:2026/10/27 4:48:57 来源:尧图企业网站定制
“text-to-cad”这个标题乍一看像是实验室里的新玩具但你要是真在制造业、非标设计或者工艺这块干过几年就会明白它戳中的是特别实在的一个痛点从“脑子里的想法”到“图纸上的几何”中间那趟来回折腾的活儿能不能直接省掉。最近我自己花了两周时间把一套基于文本指令生成CAD模型的流程跑通了从最开始的规则解析到接大模型做语义理解再到把生成结果真正落进DWG/DXF文件里踩了不少坑也沉淀下来一套还算能用的方案。这篇文章就把这套玩法从头到尾拆开讲包括技术选型、代码实现、工程化踩坑给想做同样事情的朋友一条能直接上手的路径。先说清楚这套东西解决的是什么问题。传统的CAD操作本质上是你先学会软件然后用鼠标键盘把几何“画”出来。但很多时候真正卡住效率的不是画图这个动作而是“沟通”工艺那边说“这块板四角开四个孔沉孔别太深”设计这边得手动翻译成具体的坐标、直径、深度或者标准件库要批量生成几十种规格的安装板人肉改尺寸改到头大。text-to-cad想做的事就是让“描述需求”和“生成几何”之间直接建立一条自动化的管道你说人话它出图纸。这篇内容适合谁看如果你是做非标设备、机械结构、钣金件设计经常要出重复性高的图纸或者你是搞工艺、搞生产的天天要跟设计对接尺寸需求再或者你是个Python工程师想在CAD领域找点自动化落地的场景这篇文章都很值得读。我会把整个方案的思路、核心代码、参数处理细节以及我实际跑通过程中遇到的坑全部交代清楚。1. text-to-cad整体设计与思路拆解1.1 技术路线选型为什么不能指望一步到位先说结论目前没有哪个现成的模型能像人一样听一句“生成一个带法兰的轴套”就直接吐出完美的三维模型。市面上确实有text-to-3D的研究项目但它们绝大多数面向的是网格模型mesh比如游戏、动画用的OBJ/GLTF这些模型没法直接用于数控加工、装配干涉检查更不符合机械设计的工程规范。真正要落地到生产环境text-to-cad的核心逻辑必然是“规则驱动程序化生成”大模型或者自然语言解析只是前端理解工具真正生成几何的是后端的参数化建模引擎。这条路线其实不新鲜本质上就是参数化建模的升级版。传统参数化建模比如SolidWorks的方程式、Inventor的iLogic也是用参数驱动几何但需要人手动建好参数表再手动触发。text-to-cad要做的是把“手动填参数”这一步变成“自动从文本里提取参数”然后把参数喂给建模引擎批量出图。我的建议是分三步走不要一上来就追求全自动。第一步先做一个纯规则解析器用正则表达式或者简单的关键词匹配从固定格式的文本里提取参数。这一步适合需求高度标准化的场景比如“板类零件”“轴类零件”“法兰盘”每种类型有固定的参数模板文本只需要填数值。第二步接入大语言模型做松散的语义解析。用户可以用自然语言随意描述大模型负责把描述转换成结构化的参数JSON再喂给第一步的程序化生成器。这是目前性价比最高、最稳定的方案也是我最终采用的方式。第三步才是真正意义上的“完全自由对话建模”模型直接输出几何拓扑。这条路目前还不成熟生成结果无法保证水密性更没法保证可加工性我建议暂时只在研究层面探索别用到生产里。1.2 为什么程序化生成比“端到端生成”更适合CAD很多做AI的人容易犯一个错误就是把CAD当成另一种“图片生成”来对待想着用扩散模型直接输出几何。但CAD模型和图片有个本质区别图片错一个像素无所谓CAD错一个毫米零件就废了。程序化生成的优势在于几何拓扑是确定性的尺寸参数是从文本里提取出来的最终生成的结果100%符合建模规则不会出现“线没闭合”“面有破洞”“倒角方向反了”这类工程灾难。哪怕参数的提取有问题最多是“数值不对”而不会是“几何非法”。数值不对很容易检查几何非法往往要等加工完才发现。打个比方这就像做菜。端到端生成像是让一个从没做过饭的AI自由发挥炒菜出来的东西卖相也许好看但味道完全不可控程序化生成则是准备好标准的菜谱框架和所有配料AI只需要根据客人的需求填上“少盐”“多辣”这样的参数出来的菜味道至少是稳定的。所以我在整个方案里始终坚持一个原则文本解析可以智能、可以模糊但几何生成必须确定、必须可靠。1.3 场景定位text-to-cad在制造业的四个落地方向结合我实际接触过的需求text-to-cad最适合贴的落地场景是下面这四个做方案的时候可以优先往这几个方向靠。一是非标设计里的“重复性出图”。比如安装板、支撑座、法兰、支架这类零件结构大同小异只是尺寸每次不同。传统做法是复制旧图纸然后改尺寸经常出现漏改、没关联的情况用text-to-cad直接说需求程序生成新图又快又准。二是工艺与设计的沟通翻译。工艺工程师提出“四个直径10的通孔位置度0.1”设计工程师手动翻译成具体的X/Y坐标。假如能让工艺直接跟系统对话系统自动生成标注好的图纸沟通误差就能基本归零。三是标准件库的批量生产。同一系列的零件从规格1到规格100每档尺寸按规律变化。手动画图得画到崩溃用程序批量生成只要写一次模板然后批量改动参数即可。四是下游仿真和加工的前处理。从文本生成CAD后直接导出STEP格式给仿真软件做强度分析或者导出DXF给激光切割排料。这个流程省掉了“建模-导出-转换”的中间环节效率提升非常明显。2. 核心细节解析与实操要点2.1 从文本到几何的语义拆解到底要提取哪些信息一句话文本听起来简单但真要让它驱动几何生成至少要从里面拆出五类信息。我拿一句真实的需求来举例“一块200x150x10的安装板四角开直径8的通孔沉孔直径14深3中心开M6螺纹孔。”第一是对象类型。“安装板”决定了主体几何是一个长方体板件对应程序里的一个base_plate模板。如果文本里说“法兰”对应的是法兰模板“轴套”对应轴套模板。这一步是整个流程的入口类型识别错了后面全错。第二是主体尺寸。“200x150x10”对应长200、宽150、厚度10这三个数值直接决定长方体拉伸体的参数。注意文本里可能用“长宽高”“长x宽x厚”“20015010”等不同写法解析时要做归一化处理。第三是特征与位置。“四角开直径8的通孔”意味着四个孔位置分别是板四个角需要结合板尺寸计算偏移量。这里的“四角”本身是一种省略表达默认是距离边缘一定距离比如10mm或15mm这个默认值怎么定需要在规则里明确。我实际用的默认值是“距边距离等于通孔直径”像直径8的孔就近边8mm这是很多工程师默认的落孔习惯但换成别的设计人员可能有别的习惯所以最好做成可配置参数。第四是特征内部结构。“沉孔直径14深3”说明孔是台阶孔上面一段直径14深3下面一段直径8通孔。这个结构在程序里是一个复合特征如果分开建会导致后期布尔运算出错。第五是特殊标注与加工要求。“M6螺纹孔”代表直径6的标准螺纹孔程序里要查螺纹底孔对照表一般是5mm底孔而不是直接挖一个直径6的圆孔。这属于国标知识规则库里要内置。一个合格的text-to-cad系统必须把这五类信息完整地结构化缺任何一类生成的模型都会出问题。所以我会用JSON作为中间表达格式文本解析出来后先落成一个JSON字典再交给建模引擎。2.2 单位与坐标系最容易翻车的基础环节做CAD自动化的人十个里有八个死在单位问题上这不是夸张。CAD软件里的单位设置非常灵活一个DWG文件里的长度单位可能是毫米也可能是英寸甚至可能是“图形单位”实体尺寸到底是1800还是18000全靠文件头里几个标志位决定。我建议在text-to-cad的规则里明文约定所有文本输入默认单位是毫米所有输出模型物理尺寸也定义为毫米。这是中国制造业的普遍习惯也是我最推荐的工程默认值。解析的时候如果文本里出现“inch”“”“cm”等单位符号需要做换算换算表写进解析器里。换算逻辑很简单但容易遗漏。比如“2 inch厚的板”程序要自动换算成50.8mm而不是直接取2。如果单位判断错误生成的模型会整体缩放25.4倍放在装配体里跟别的零件一比直接穿帮。坐标系同样要规范。我的约定是板类零件的默认坐标原点在底面几何中心拉伸方向为Z轴正方向轴类零件的原点在大端底面中心轴向沿Z轴法兰盘原点在法兰面中心孔位用极角方式定义。这样约定的目的是让程序生成的模型在装配时能自动对齐不用再手动配对约束。这个约定会直接影响后面的CAM加工基准基层基准一旦定错加工坐标系整个偏掉装夹就乱了。2.3 输出格式选型DXF还是STEP这是个问题text-to-cad的最终产物是CAD文件但具体往哪个格式走取决于下游使用场景。我实际用得最多的是两种DXF和STEP。以下是这两种格式的对比格式适用范围优势劣势我的使用场景DXF二维图纸、激光切割兼容性极好几乎所有CAD都能开文本和标注信息保留完整无法承载三维实体拓扑复杂曲线容易碎钣金展开、激光切割排料、二维工程图STEP三维实体模型、装配设计标准的三维数据交换格式B-rep实体完整可做布尔运算文本标注信息会丢失文件体积比DXF大三维建模、装配、CAM编程、仿真分析除了这两种偶尔还会用到SVG做网页预览用STL做3D打印的网格输入。但对机械加工来说SVG和STL都不够专业不建议作为正式交付格式。我实际流程里的做法是先用参数模板在三维建模引擎里生成实体模型导出STEP然后从实体模型投影生成二维工程图再导出DXF。这样一套流程三维和二维同时拿到且两个文件出自同一个几何内核不会出现“三维是一个样二维展开是另一个样”的尴尬。2.4 图层、命名与标注规范工程交付的隐形门槛用程序生成的CAD图形最大的问题往往是“看起来没问题但图层一塌糊涂”。很多自动化生成工具不关心图层和命名结果就是全画在0层线条颜色全是ByLayer线型也不设置拿给车间老师傅看人家直接就扔回来了——没法下料。规则建模在几何上几乎不会出错但只有在图层上下功夫才真正算工程可用。我定了一套规则强制应用到所有生成的图纸里轮廓线放在OUTLINE层线宽0.35mm颜色统一为白色1号色。中心线放在CENTER层线型设置为CENTER颜色统一为红色1号色的一种常见替代或自定义色号这里根据自己的模板规范来。标注放在DIM层包括尺寸标注、公差标注、粗糙度标注。隐藏线放在HIDDEN层线型设置为DASHED。标题栏和边框放在FRAME层。为什么这么重视图层因为在CAD环境里“图层”承担着比普通设计软件更重的责任下游的激光切割要根据图层设置切割参数穿孔点、切割线、雕刻线全靠图层区分。如果你生成的DXF里没有正确的图层信息排料软件无法区分“哪个是外轮廓要切割”“哪个是内孔要先穿孔”后果轻则报警重则空走甚至撞刀。命名规范也值得养成习惯。每个程序生成的文件名统一格式是[类型]_[规格]_[特征摘要]_[日期].dxf比如base_plate_200x150x10_4xphi8_1xM6_20250612.dxf。文件名本身就是一份结构化的说明书后面归档、检索、版本管理全靠它。这个习惯帮我省下了大量找文件的时间。2.5 文本解析策略正则、规则与大模型的取舍文本解析是整个方案的灵魂方法讲起来就三段从笨办法到进阶法我建议一步步来。底层是正则表达式和规则匹配。这招在文本格式非常固定的场景下最有效例如“标准参数清单”里每行都是“参数名:数值单位”直接用re.findall(r(\w)\s*[::]\s*([\d.])\s*([a-zA-Z]))之类的模式就能全部提取。优点是零依赖、可预测、几乎不会乱来缺点是一遇到口语化表达就歇菜。进阶是大语言模型做NER命名实体识别和参数抽取。给模型一个系统提示告诉它“你是CAD参数提取器提取结果必须严格遵循以下JSON Schema”然后把用户的话丢进去让它返回结构化参数。这个方法最大的优势是容忍口语化表达比如“四个角给我打八个的孔”它也能理解是“四角开直径8的通孔”。缺点是大模型有概率产生幻觉偶尔会输出一个根本不存在于原文的尺寸比如把200输成250。更稳定的是混合策略。先用大模型做语义理解输出JSON参数但这些JSON不直接发给建模引擎而是先经过一个“规则校验器”检查数值范围是否合理、必填字段是否都填了、单位是否合法、孔的数量和位置是否冲突。有任何一项不通过就退回重新解析而不是带病进入建模环节。这个“LLM规则驱动”的组合是目前to B解决方案里最主流的形式稳定性是我亲测能用的关键。3. 实操过程与核心环节实现3.1 环境准备Python CadQuery/ezdxf我这里先按纯Python技术栈来讲这样方便你复现也方便以后扩展。环境需要准备三块Python 3.9最好用虚拟环境管理。CadQuery基于OpenCASCADE的Python库专门做参数化三维建模可以直接导出STEP/DXF。安装命令很简单pip install cadquery。ezdxf处理DXF文件的读写和修改尤其擅长批量操作。安装pip install ezdxf。如果你还希望生成的图纸直接落到AutoCAD里去可以加一个pyautocad库用COM接口驱动AutoCAD。这个库本质上是在操作系统的COM桥接层上做了一层封装需要在Windows环境且已装AutoCAD时才能用。我下面会演示但它不是必需环节纯文件模式也能跑通。这三样工具选型的逻辑很清晰CadQuery承担三维建模的“几何内核”ezdxf承担二维图纸的“排版生成”pyautocad负责“和AutoCAD交互”。三者分工明确互不干扰比依赖单个CAD软件的二次开发接口要灵活得多因为即使没有安装任何商业CAD纯Python也能完成从文本到几何文件的完整闭环。3.2 示例1从一句需求到一块带孔安装板我拿前面说的那句需求来做完整流程演示“一块200x150x10的安装板四角开直径8的通孔沉孔直径14深3中心开M6螺纹孔。”完整流程分四步走。第一步先写一个参数提取函数。大模型的JSON解析后面再说这里先用一个简单但可靠的正则方案做演示import re import json def parse_plate_request(text: str) - dict: # 提取主体尺寸形如200x150x10或200*150*10或200×150×10 dim_match re.search(r(\d)\s*[xX*×]\s*(\d)\s*[xX*×]\s*(\d), text) if not dim_match: raise ValueError(未能识别主体尺寸格式示例200x150x10) length, width, thick map(float, dim_match.groups()) # 提取通孔直径 holes [] for m in re.finditer(r(\d)\s*(?:mm)?\s*(?:的)?通孔, text): holes.append(float(m.group(1))) # 提取沉孔参数直径x深度 或 直径深 counterbores [] for m in re.finditer(r沉孔\s*(\d)\s*(?:直径)?\s*深\s*(\d), text): counterbores.append({diameter: float(m.group(1)), depth: float(m.group(2))}) # 提取螺纹孔规格 threads [] for m in re.finditer(rM(\d), text): threads.append(float(m.group(1))) return { type: plate, length: length, width: width, thickness: thick, through_holes: holes, counterbores: counterbores, threads: threads }这段代码的重点在于用[xX*×]兼容了三种常见的乘号写法用正则的宽松匹配容忍了单位可有可无最后的输出是一个干净的结构化字典。正则虽然看着不高大上但在这个场景下极其可控用户说什么不规范一眼就能从匹配失败中看出问题来。第二步用CadQuery建立三维实体模型。这里用Parasolid内核的做法把参数字典翻译成几何操作import cadquery as cq def build_plate(param: dict) - cq.Workplane: length param[length] width param[width] thickness param[thickness] # 创建底板 plate cq.Workplane(XY).box(length, width, thickness) # 计算孔位四角各一个默认距边距离 通孔直径 for hole_d in param[through_holes]: margin hole_d # 检查是否有对应的沉孔 cb None for item in param[counterbores]: # 沉孔直径通常大于通孔这里做简单匹配 if item[diameter] hole_d: cb item break positions [ (length/2 - margin, width/2 - margin), (length/2 - margin, -width/2 margin), (-length/2 margin, width/2 - margin), (-length/2 margin, -width/2 margin) ] if cb: # 先开沉孔 plate (plate .faces(Z) .workplane() .pushPoints(positions) .cboreHole(cb[diameter], cb[depth]) .faces(Z) .workplane() .pushPoints(positions) .hole(hole_d)) else: plate (plate .faces(Z) .workplane() .pushPoints(positions) .hole(hole_d)) # 中心螺纹孔用底孔直径M6对应5mm底孔 for m_size in param[threads]: pilot_d { 3: 2.5, 4: 3.3, 5: 4.2, 6: 5.0, 8: 6.8, 10: 8.5, 12: 10.2 }.get(int(m_size), m_size * 0.85) plate (plate .faces(Z) .workplane() .center(0, 0) .hole(pilot_d)) return plate这段代码里有个工程细节值得强调螺纹孔不能直接开直径6的圆孔要先查底孔表M6标准底孔是5.0mm如果直接开6mm攻出来的螺纹是残牙加工出来就是废品。我在代码里内置了一个pilot_d字典把常用公制粗牙螺纹的底孔直径都查好写进去了这就是“领域知识进代码”的具体体现。第三步导出STEP和DXF。CadQuery可以直接导出STEP二维投影和相关标注我手动用ezdxf生成这部分稍微繁琐但效果可控# 导出STEP result build_plate(parse_plate_request(req_text)) cq.exporters.export(result, plate.step) # 用ezdxf生成二维工程图 import ezdxf doc ezdxf.new(R2010, setupTrue) msp doc.modelspace() # 添加图层 doc.layers.add(OUTLINE, color7, lineweight35) doc.layers.add(CENTER, color1, linetypeCENTER) doc.layers.add(DIM, color3) # 绘制主视图轮廓简化示意 outline msp.add_lwpolyline([(0, 0), (200, 0), (200, 150), (0, 150)], closeTrue, dxfattribs{layer: OUTLINE}) # 添加中心线 msp.add_line((0, 75), (200, 75), dxfattribs{layer: CENTER}) msp.add_line((100, 0), (100, 150), dxfattribs{layer: CENTER}) # 添加尺寸标注 msp.add_linear_dim(base(0, 0), p1(200, 0), p2(0, 0), dimstyleEZDXF, override{dimtxsty: Standard}).render() doc.saveas(plate.dxf)这里的二维工程图只是示意真正的工程图要做三视图投影、剖视图、公差标注、粗糙度标注工作量不算小但原理一致先创建图层再根据三维模型投影结果添加图形元素最后保存为DXF。真正的三维投影部分可以用CadQuery的cq.exporters.export配合Assembly视图也可以借助ezdxf.add_linear_dim等标注API来进一步完善。第四步也是最容易被忽略的一步——校验。程序化生成的好处是几何不会错但参数可能错。我的校验函数会检查长度和宽度是否为正数、孔是否落在板内margin设置是否合理、M6底孔是否和中心位置重叠、沉孔直径是否大于通孔直径。任何一项不满足直接打回重新解析。这一步是质量保障的核心一定不能省。3.3 示例2用pyautocad批量修改现有图纸说完生成新图再聊一个大家问得特别多的方向批量修改现有图纸。热搜词里“python批量对cad修改”常年有人搜这里我直接分享一个我实测可用的方案。比如你有几百张图纸每张图纸的标题栏里都有图号需要统一把里面的“旧版本号”替换成“新版本号”同时把指定图层上的所有文字改成大写。纯手工操作几百张图搞一天都未必完得成但用pyautocad写个脚本几分钟就跑完。import pyautocad acad pyautocad.Autocad(create_if_not_existsTrue) def batch_modify(text_old: str, text_new: str, layer_name: str TITLE): doc acad.doc for entity in doc.ModelSpace: try: if entity.ObjectName AcDbText: if entity.Layer layer_name and text_old in entity.TextString: entity.TextString entity.TextString.replace(text_old, text_new) elif entity.ObjectName AcDbMText: if entity.Layer layer_name and text_old in entity.TextString: entity.TextString entity.TextString.replace(text_old, text_new) except Exception as e: print(f[跳过] {entity.ObjectName}: {e}) batch_modify(V1.0, V1.1, TITLE)这里有个前提必须先确认AutoCAD本身得开着。pyautocad是COM接口依赖AutoCAD进程不能脱离软件独立运行。这也是它和ezdxf最大的不同——ezdxf是纯文件级操作不依赖任何CAD软件pyautocad是自动化操作正在运行的CAD进程。实际使用中我更喜欢把这两种结合起来先用ezdxf做文件级批量修复比如统一修改图层颜色、替换文字、清理未使用图层这些操作速度快、稳定、不依赖环境再用pyautocad处理需要CAD渲染和重新生成的场景比如强制重新生成标注、更新块属性、刷新布局。两种手段各司其职效率最高。顺带一提很多人在问“cad如何彻底卸载不影响二次安装”这类问题其实跟自动化开发关系不大但确实会影响开发环境。我的经验是在干净的Windows环境里装AutoCAD再开发别在同一台机器上试各种CAD版本COM组件注册表冲突这个坑真的会莫名奇妙地冒出来。3.4 进阶让大模型输出参数JSON而不是输出CAD我知道你一定想问能不能用大模型让用户随便说一句话系统自动生成模型能但关键在于别让大模型直接生成CAD代码或几何数据让大模型只做参数提取几何生成还是交给CadQuery。我给你一个经过实际调优的prompt照着用就行你是一个CAD参数提取器。用户会输入一句话来描述一个零件需求你的任务是提取结构化参数。 规则 1. 只输出JSON不要输出任何解释性文字。 2. 单位统一为毫米遇到英寸要换算成毫米。 3. 螺纹孔用threads数组表示元素类型为数字表示公称直径。 4. 沉孔用counterbores数组表示每个元素包含diameter和depth。 5. 如果缺失某个字段字段值为null不要编造。 示例输入一块200x150x10的安装板四角开直径8的通孔沉孔直径14深3中心开M6螺纹孔。 示例输出 { type: plate, length: 200, width: 150, thickness: 10, through_holes: [8], counterbores: [{diameter: 14, depth: 3}], threads: [6] }输入{user_text}这个prompt看着简单但里面藏着三个关键设计 第一明确要求“只输出JSON”。大模型一旦开始解释输出就变得不可预测必须从源头掐死。 第二明确“缺失字段输出null”。这能有效防止大模型编造尺寸幻觉概率会大幅下降。实测在我的测试集上加了这一条之后幻觉尺寸从大约15%降到3%以内。 第三给了明确示例few-shot。大模型在示例约束下输出格式的稳定性会显著提升这点在工业场景里极其重要。 大模型输出后我还会加上前面提到的规则校验器做一次兜底。只有JSON满足全部校验规则才允许进入建模流程。这套组合拳打下来我实测的稳定率能到95%以上剩下的5%主要来自用户描述里的歧义比如“右上角的孔”到底是什么坐标。 ### 3.5 提示模板让零基础用户也能快速上手 如果你想把text-to-cad包装成一个工具给别人用建议在最前面加一个“输入规范引导”。用户只要照着模板填后面解析的成功率能大幅提升。 我的输入模板长这样请按以下格式描述零件需求 零件类型[安装板/法兰/轴套/支架] 主体尺寸[长x宽x厚] 或 [直径x长度] 孔特征通孔[数量]x[直径]位置[四角/中心/均布]沉孔[直径]x[深度]位置[通孔上方/单独指定]螺纹孔[规格如M6]位置[中心/均布] 示例 零件类型安装板 主体尺寸200x150x10 孔特征通孔4x8位置四角沉孔14x3位置通孔上方螺纹孔M6位置中心这个模板把用户从“自由表达”引导到“结构化表达”看似限制了自由度其实反而降低了使用门槛——用户不用费心组织语言照着填空就行程序解析也不容易出错。很多系统失败的原因不是技术不行而是没有给用户一个“怎么表达才容易被机器理解”的引导。这跟表单设计的逻辑是一样的开放的输入框看似自由但填出来的信息反而因为格式混乱而难以处理。 ## 4. 常见问题与排查技巧实录 ### 4.1 尺寸不对八成是单位错配 程序运行了模型生成了一测量尺寸不对这种事我碰到过不下十次。最常见的原因是DWG/DXF文件里的单位设置和预期不一致。 排查方法很简单用ezdxf读取文件头检查$INSUNITS这个变量。$INSUNITS为4表示毫米为1表示英寸。如果CAD打开后显示单位是英寸但你的参数是按毫米计算的导出的图就会整体缩放25.4倍。 python import ezdxf doc ezdxf.readfile(plate.dxf) print(doc.header.get($INSUNITS, 0)) # 4mm, 1inch如果$INSUNITS不对直接改掉再保存doc.header[$INSUNITS] 4 doc.saveas(plate_fixed.dxf)还有另一种“尺寸不对”的情况是标注值和实际几何尺寸不一致。比如几何长度确实是200mm但标注显示是7.874英寸200÷25.4。这种情况通常是因为标注样式的单位覆盖了图形单位要在标注样式里单独改。处理方法是进入CAD的标注样式管理器把“主单位”选项卡里的单位格式改成“小数”比例因子改成1。如果用程序处理可以在ezdxf里直接修改DIMSTYLE的DIMLUNIT参数。这是很多自动化出图方案没考虑到的地方——模型对了标注不对图照样不能用。4.2 圆孔变椭圆DXF比例因子X不等于Y你见过生成的DXF图纸里原本的圆孔变成了椭圆吗这个问题我踩过一次排查了很久才发现是$EXTMIN和$EXTMAX变量的坑。实际上更直接的原因是view/camera的等轴测视图比例问题或者某些图形插入块的X/Y比例不同。在纯ezdxf场景下最可能的原因是你创建圆的时候用了ARC实体而CAD打开后视图的显示比例是“非等比缩放”圆的显示被拉伸了。但如果你是用块插入的方式放圆那块的X scale和Y scale必须一致。老实说这个问题的常见触发点在于“对LINE实体的起点和终点坐标做四舍五入”后圆的直径在X方向和Y方向上的数据精度不一致导致显示成椭圆。解决方法是生成圆时用add_circle(center, radius)不要自己用线段去拟合圆那样既增加文件体积又会因为精度丢失导致圆不圆。4.3 中文乱码字体和编码双重坑程序生成的DXF里带中文标注比如“安装板”“技术要求”打开一看全变成“”或者一堆乱码。这个问题非常常见因为DXF的中文支持同时依赖字符串编码和字体文件。ezdxf默认输出UTF-8编码的字符串但老版本CAD2007以前默认用ANSI编码读取DXF文件遇到UTF-8直接读成乱码。解决方法是保存DXF时指定编码doc ezdxf.readfile(plate_utf8.dxf) doc.encoding gbk # 或 ansi_1252视目标CAD版本而定 doc.saveas(plate_gbk.dxf)我推荐用GBK编码保存AutoCAD能稳定识别的中文这算是一个兼容性经验。用了UTF-8之后2007版本往后的CAD都能正常读但如果你的下游是激光切割软件或者老版本的看图软件还是GBK最稳妥。另一个坑是字体样式。即使编码对了如果当前字体样式不支持中文AutoCAD会显示乱码。解决方法是确保生成DXF时文字样式引用的字体是中文字体比如“仿宋”、“宋体”或者使用TSSDENG.shx这类自带中文的形文件。在ezdxf里添加字体doc ezdxf.new(R2010, setupTrue) style doc.styles.add(CNTXT, fontsimfang.ttf) # 仿宋 msp.add_text(技术要求, dxfattribs{style: CNTXT, layer: DIM})样式名可以自定义但字体一定要指向真实存在的中文字体文件。如果生成的环境是Linux服务器有时候list字体文件名后会发现根本没有simfang.ttf这时候就要在服务器上装好Windows核心字体包或者改用形文件字体。这个问题我在部署到Linux服务器时踩过一次非常隐蔽。4.4 模型能生成但布尔运算失败CAD内核精度问题用CadQuery生成实体单个零件怎么折腾都行但一放进装配体做布尔运算比如合并、切除偶尔会报错“OpenCASCADE BRep_API: command not done”。这不是你的建模逻辑错了而是几何内核的精度设置问题。OpenCASCADE的布尔运算对Tolarence容差极其敏感。默认容差可能比你的零件尺寸精度还要粗糙导致两个面明明该贴着却差了几个微米系统判定“不相交”于是布尔失败。解决办法是调整精度参数from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox from OCP.BRepAlgoAPI import BRepAlgoAPI_Cut from OCP.TopExp import TopExp_Explorer import math # 调整容差 OCP.Standard.Standard_Precision.SetPrecision(1e-6) OCP.Standard.Standard_Precision.SetConfusion(1e-7)实测把精度从默认的1e-4调高到1e-6之后布尔运算的成功率提高了不少。但注意精度太高会导致模型文件巨大、运算变慢需要找一个折中点。我的经验值是普通机械零件用1e-5或者1e-6比较稳太大会有重叠面太小则卡死。4.5 参数提取里的“Phi8”和“8mm”歧义再补一个文本解析的细节坑用户可能说“8mm孔”也可能说“Φ8孔”甚至可能说“8厘孔”。这几种说法在工程口语里都是同一个东西但正则表达式处理起来完全不一样。我的建议是写一个“单位与符号归一化”函数在进入正则匹配之前先把所有可能的写法统一成标准格式def normalize_unit(text: str) - str: text text.replace(Φ, ).replace(φ, ).replace(phi, ) text text.replace(厘, mm) # 口语“厘”一般指毫米 text text.replace(丝, 0.01mm) # 机械加工口语“一丝”0.01mm text text.replace(寸, inch) return text这层归一化极其管用尤其在对接车间一线师傅的时候。他们不会精确说“直径8毫米”说的是“八个的孔”这个词组在正则眼里就是垃圾但经过归一化之后能正确匹配。做工业软件的人最不该忽略的就是一线用户的表达习惯。4.6 生成的图纸在CAD里打开慢实体太多、优化不足程序生成的DXF如果包含大量曲线比如齿轮齿形、螺纹牙型文件会很大打开也会卡顿。这是因为直接用高密度线段拟合曲线实际工程图里完全可以用标准弧来代替。解决建议是简化几何固定孔用圆和圆孔实体表示不要用polyline分段拟合螺纹用示意符号两条斜线螺纹线表示不要画出真实螺旋线除非是3D打印或特殊需求齿轮齿形用“齿顶圆齿根圆分度圆局部放大”来表达不需要画出完整渐开线齿形。这是工程制图的标准做法不但文件小打印出来也更清晰符合国家制图标准。4.7 常见问题速查表一页纸排查指南问题现象可能原因排查方法尺寸整体缩小/放大25.4倍单位错配检查$INSUNITS改为4毫米中文显示为乱码编码或字体问题保存为GBK编码指定中文字体圆孔显示为椭圆块比例或视图比例检查块X/Y比例用add_circle生成布尔运算失败几何容差过小调高精度到1e-6标注与几何不一致标注样式单位覆盖修改DIMLUNIT比例因子设为1文本解析缺参表达方式未覆盖增加归一化函数用LLM兜底文件打开卡顿图形实体过多用标准圆/弧替代密集线段这张表我贴在工位旁边实际排查问题时按行查一遍大部分问题都在几分钟内定位。做自动化工具最怕的不是复杂问题而是成天在简单问题上反复折腾这张表就是用来解决“简单问题公式化”的。5. 写在最后的实操体会折腾这一圈下来我最大的体会是text-to-cad真正值钱的地方不在“AI自动建模”这个概念本身而在于它把“需求描述结构化”这件事做扎实了。很多人一上来就追最酷炫的端到端生成结果搞了半年还在跟“生成面片有破洞”搏斗。而我这边早就用“正则大模型参数模板”跑通了实际项目图纸都出了几十张。我个人建议的顺序是把参数化模板当作地基把文本解析当作入口把校验逻辑当作安全网。地基稳了再谈更智能的解析。这里面的核心不是“模型有多聪明”而是“流程有多不依赖于模型的聪明”。工程软件最怕的就是不可预测哪怕解析笨一点只要结果可控就能用。最后分享一个小技巧我在生成每一份DXF图纸时会在文件属性或者额外图层里塞一份原始参数JSON相当于图纸的“元数据”。下次无论过多久拿到图就能知道当初是哪些参数生成的需要改的时候直接把JSON调出来改一处再重新生成一次。这个习惯帮我避免了无数“这个图当初怎么画的来着”的追悔时刻。对于长期维护的图纸库来说这个“参数留痕”的做法比任何文档都靠谱。如果你想做类似的事情这就是最好的起步点。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑