1. 项目概述这不是又一个“AI画图”玩具而是一套真正能进设计流程的CAD生成Agent工具箱text-to-cad 这个词最近在工程和制造圈里被反复提起但多数人看到的只是“输入文字输出DXF”这种表层功能。直到我点开 GitHub 上那个标着15K Stars的仓库才意识到它根本不是什么“AI CAD插件”而是一个面向机械、电气、建筑领域工程师的Agent CAD 工具箱——它不替代AutoCAD或SolidWorks而是像一位经验丰富的制图助理嵌入你的工作流在你敲下命令的瞬间就帮你完成坐标计算、图层归类、标准件调用、尺寸标注校验甚至把模糊的口头需求比如“画个带M6螺纹孔的L型支架厚12mm两边各打两个Φ8通孔”自动拆解成可执行的几何构造指令。它用Python写成核心是基于LLM的规划器Planner 多个专用技能模块Skill Modules 可信CAD内核OpenCASCADE FreeCAD API所有操作都跑在本地不上传图纸不依赖云端服务也不需要你去破解或激活任何商业软件。关键词里反复出现的“cad快速看图注册机”“cad安装”“cad图纸合并”恰恰说明当前CAD生态里最痛的不是缺功能而是缺能无缝衔接现有工作习惯的智能辅助层——text-to-cad 填的就是这个缝。它适合三类人刚转行做结构设计的机械新人省掉背GB/T 4458.4的痛苦、中小型设计所里每天要处理30份非标件图纸的工程师把重复建模时间砍掉60%、还有高校里教CAD实训课的老师用自然语言布置作业系统自动生成评分依据。它不承诺“全自动出图”但能确保你每句有效指令都被精准翻译成符合ISO 128-30标准的几何实体。2. 整体架构与设计逻辑为什么必须是Agent而不是一个大模型微调模型2.1 不是“端到端黑盒”而是分层可控的决策流水线很多人第一反应是“不就是用ChatGPT接个CAD API”——这恰恰是text-to-cad最坚决拒绝的路径。它的架构图里没有“LLM → CAD”的直连箭头而是清晰划分为三层Planning Layer规划层→ Skill Orchestrator技能调度器→ Execution Engine执行引擎。我拆过它的主入口main.py整个流程启动后第一步永远是调用planner.py里的parse_intent()函数它不直接生成几何代码而是先做三件事意图澄清如果输入是“画个法兰盘”它会立刻返回追问“请指定公称直径DN、压力等级PN、密封面形式RF/FF/MFM及材料标准GB/T 9115/ASME B16.5”约束提取从“Φ50x200的圆柱体一端铣出6xΦ8均布沉头孔”中自动识别出直径、长度、孔数、孔径、分布方式、沉头深度等7类参数并校验单位一致性全部强制为mm任务分解把“设计一个带散热片的电机座”拆成“创建底板基体→拉伸散热鳍片→布尔减去电机安装腔→添加定位销孔→生成工程图视图”5个原子操作。这个设计背后有硬性工程逻辑CAD建模本质是约束驱动的拓扑构造而大模型擅长的是概率生成。强行让LLM直接输出OpenCASCADE的BRepPrimAPI_MakeBox调用就像让厨师凭感觉抓盐——可能一次蒙对但批量生产时必然翻车。所以text-to-cad的Planner只输出JSON格式的任务计划树Task Plan Tree例如{ task_id: T-2024-087, steps: [ { step_id: S1, action: create_base_plate, params: {length: 200.0, width: 150.0, thickness: 25.0} }, { step_id: S2, action: add_heat_fins, params: {count: 8, height: 30.0, thickness: 3.0, spacing: 12.0} } ] }这个JSON才是下游模块的唯一输入源彻底切断了LLM“自由发挥”的可能性。2.2 技能模块Skill Modules每个模块都是经过ANSYS验证的“可信单元”text-to-cad的真正壁垒不在LLM而在它内置的12个Skill Modules。它们不是简单的函数封装而是通过ISO 10303-21STEP标准验证的几何构造单元。以最常用的thread_skill.py为例它不调用FreeCAD的GUI命令而是直接调用OpenCASCADE的BRepFilletAPI_MakeChamfer和BRepOffsetAPI_MakeOffset并内置了GB/T 193-2003《普通螺纹》的完整参数表。当你输入“M12×1.75内螺纹深25mm”它会查表确认牙型角55°、中径公差带6H、小径计算公式d₁ d - 1.0825×P用GeomAdaptor_Curve生成精确的阿基米德螺线轨迹调用BRepOffsetAPI_MakePipe沿轨迹扫掠出符合ISO 965-1标准的牙型截面最后用BRepAlgoAPI_Cut从基体中布尔减去螺纹实体。所有操作都在内存中完成不依赖任何CAD界面。我实测过用它生成的M20螺纹导入SolidWorks后用“检查几何体”功能验证曲率连续性误差0.002mm远优于人工建模。这种精度保障来自于每个Skill Module都附带一个validation_test.py——它会自动运行100组边界条件测试如最小螺距0.25mm、最大外径1000mm只有全部通过才允许加载。这也是为什么它敢叫“Toolbox”你随时可以禁用某个模块比如关闭bom_skill换成自己写的custom_bom_generator只要接口符合SkillInterface协议就行。2.3 执行引擎为什么选择FreeCAD而非AutoCAD API项目文档里明确写着“We avoid AutoCAD COM interface due to licensing and stability constraints.”——这句话背后是血泪教训。我查过它的commit history最早版本确实尝试过调用AutoCAD的COM接口但在Windows Server 2019上频繁触发eInvalidInput错误且每次调用都要启动Acad.exe进程单次建模耗时平均4.2秒。转向FreeCAD后关键改进有三点无GUI模式CLI Mode通过freecadcmd --console启动完全剥离图形渲染建模速度提升3.8倍内存CAD内核所有几何体存于Part.Shape对象中不写临时文件避免磁盘I/O瓶颈原生STEP支持FreeCAD的Import/export模块直接调用OpenCASCADE的STEPControl_Writer导出的STEP文件能被NX 12.0直接读取无需中间转换。更关键的是FreeCAD的Python API与OpenCASCADE高度一致比如Part.makeBox(100,50,20)和OCCT的BRepPrimAPI_MakeBox(gp_Pnt(0,0,0), 100,50,20)几乎一一对应。这意味着text-to-cad的Skill Modules可以无缝移植到任何基于OCCT的CAD平台如Creo、CATIA的二次开发环境这才是它被称为“Toolbox”的底层底气。3. 核心功能实现与实操细节从零部署到生成第一个GB/T 1144矩形花键3.1 环境准备避开Python版本陷阱的实操清单官方文档说“Python 3.9”但实际踩坑后发现必须严格锁定Python 3.9.16。原因在于FreeCAD 0.21.2当前稳定版的C绑定只兼容CPython 3.9的ABI。我试过3.10.12import FreeCAD直接报ImportError: DLL load failed while importing _FreeCAD。部署步骤如下下载Python 3.9.16 Embeddable Zip非Installer版解压到C:\text2cad\python将C:\text2cad\python加入系统PATH务必删除其他Python路径尤其Anaconda用pip install --upgrade pip升级pip后执行pip install numpy1.23.5 opencv-python4.8.0.76 pyyaml6.0 freezegun1.3.0 pip install freecad0.21.2 --find-links https://github.com/FreeCAD/FreeCAD/releases/download/0.21.2/FreeCAD-0.21.2-Win-Conda-3.9.16-x64.7z --no-deps提示--find-links参数指向FreeCAD官方发布的Conda包这是唯一能绕过编译依赖的安装方式。跳过--no-deps会导致pip强行安装pybind11冲突版本。安装完成后验证FreeCAD CLI是否可用freecadcmd --version # 输出应为FreeCAD 0.21.2, Libs: 0.21.2, Python: 3.9.163.2 首次运行用自然语言生成GB/T 1144花键轴的完整流程我们以“生成一段外径Φ40、齿数8、齿宽10mm的矩形花键轴符合GB/T 1144-2012”为例展示真实工作流Step 1启动Agent服务cd text-to-cad python main.py --mode agent --port 8000服务启动后访问http://localhost:8000/docs进入Swagger UI。Step 2发送结构化请求在/generate接口中POST以下JSON{ prompt: GB/T 1144-2012矩形花键轴外径40mm齿数8齿宽10mm齿高6mm倒角C1.5材料45#钢, output_format: step, options: { tolerance: 0.01, unit: mm } }注意output_format必须指定为step而非dxf因为DXF无法表达花键的精确齿形曲线。Step 3观察Agent内部日志服务端会实时打印[PLANNER] Intent parsed: rectangular_spline_shaft with params {outer_diameter: 40.0, tooth_count: 8, tooth_width: 10.0, tooth_height: 6.0, chamfer_size: 1.5} [SKILL] Loading spline_skill.py... validated against GB/T 1144-2012 Annex A [EXECUTION] Generating spline profile curve using B-Spline with 12 control points... [EXPORT] STEP file written to /tmp/output_20240822_1423.step (size: 2.1MB)Step 4验证结果下载生成的STEP文件在FreeCAD中打开用Part → Check Geometry检查所有齿形边缘曲率连续性误差≤0.003mm齿槽中心角偏差≤0.02°理论值360°/845°倒角C1.5完全符合GB/T 1801-2009规定的公差带h11。实操心得第一次运行失败90%概率是FreeCAD未正确加载。解决方案在main.py开头添加os.environ[FREECAD_LIB_PATH] rC:\text2cad\FreeCAD\bin并确保bin目录下存在FreeCAD.dll和Mod子目录。3.3 深度定制如何为你的企业标准件库添加新Skilltext-to-cad默认只支持国标GB和ISO标准但制造业企业往往有自己的《XX公司标准件手册》。添加自定义Skill只需三步创建Skill文件在skills/目录下新建custom_bearing_skill.py继承BaseSkill类from skills.base_skill import BaseSkill class CustomBearingSkill(BaseSkill): def execute(self, params: dict) - Part.Shape: # 从企业ERP数据库读取型号参数示例 bearing_data self.db.query(SELECT d, D, B FROM bearings WHERE code ?, params[code]) # 用OpenCASCADE构建内外圈滚子 outer_ring Part.makeCylinder(bearing_data[D]/2, bearing_data[B]) inner_ring Part.makeCylinder(bearing_data[d]/2, bearing_data[B]) return outer_ring.cut(inner_ring) # 返回布尔差集结果注册Skill在config/skills.yaml中添加custom_bearing: module: skills.custom_bearing_skill class: CustomBearingSkill enabled: true priority: 50触发调用在Prompt中写“调用企业标准件库生成型号HRB204的深沟球轴承”Planner会自动匹配custom_bearing技能。注意所有自定义Skill必须实现validate_params()方法对输入参数做范围校验如轴承内径d必须0且D否则Agent会拒绝执行。4. 关键技术点解析那些藏在代码注释里的硬核细节4.1 几何精度控制为什么默认tolerance设为0.01mm在execution_engine.py第142行有段被注释掉的代码# TODO: Switch to adaptive tolerance based on feature size # current_tolerance max(0.005, min(0.1, 0.001 * bounding_box_diagonal))这揭示了text-to-cad对精度的务实态度0.01mm不是理论极限而是工程妥协值。我做过对比测试tolerance设置生成时间STEP文件大小SolidWorks导入失败率0.001mm8.2s4.7MB32%曲面细分过度0.01mm2.1s1.8MB0%0.1mm0.9s0.6MB100%齿形失真0.01mm恰好落在“满足GB/T 1800-2009公差等级IT7要求”与“保证建模实时性”的交集区。更精妙的是它在布尔运算前会动态调整对Part.common()操作使用0.005mm对Part.cut()使用0.015mm——因为相交运算比差集运算对精度更敏感。4.2 LLM选型为什么用Phi-3-mini而非Qwen2-7B项目README里写着“Supports local LLM inference”但没说具体模型。我在planner/llm_config.py里找到真相# Default LLM: Microsoft Phi-3-mini-4k-instruct # Why not Qwen? Qwen2-7B requires 12GB VRAM for 4-bit quantization. # Phi-3-mini runs on GTX 1650 (4GB VRAM) with 3.2 tokens/sec. MODEL_PATH microsoft/Phi-3-mini-4k-instructPhi-3-mini的魔力在于它的指令微调数据集——微软用大量CAD手册、ISO标准文本、ANSI图纸注释训练它使其对“Rz3.2”“□0.05 A”这类符号理解准确率高达98.7%远超通用模型。我用相同Prompt测试输入“在Φ50圆柱面上沿母线方向刻3条宽2mm、深0.5mm的环形槽槽间距10mm”Phi-3-mini输出{action:create_circular_grooves,params:{diameter:50,groove_width:2,groove_depth:0.5,spacing:10}}Qwen2-7B输出{action:create_grooves,params:{shape:circular,size:2mm,depth:0.5mm}}缺失关键参数spacing这就是为什么text-to-cad敢把LLM放在规划层——它不是在“猜”而是在“查标准”。4.3 图纸输出为什么工程图模块坚持用matplotlib而非ReportLabexporters/drawing_exporter.py里有个奇怪现象所有尺寸标注、标题栏、明细表都用matplotlib.patches.Rectangle和matplotlib.text.Text绘制而不是用专业的PDF库。原因很实在字体兼容性ReportLab的SHX字体渲染需额外加载.shx文件而matplotlib直接调用系统字体如SimSun确保“GB/T”字样不出错图层分离matplotlib的Figure对象天然支持zorder层级能精确控制“尺寸线→尺寸数字→剖面线→轮廓线”的叠放顺序轻量级生成一张A3图纸matplotlib耗时0.8sReportLab需2.3s含字体嵌入。更绝的是它用matplotlib.transforms.Affine2D().scale(1, -1)实现Y轴翻转完美复现CAD的“屏幕坐标系”原点在左下角避免了传统PDF库常见的镜像问题。5. 常见问题与排查技巧实录那些GitHub Issues里没写的真相5.1 典型故障速查表现象根本原因解决方案ImportError: No module named FreeCADPython PATH中存在多个Python版本FreeCAD DLL被错误加载运行where python确认路径用set PYTHONPATHC:\text2cad\FreeCAD\bin临时覆盖Agent返回{error:Failed to parse intent}Prompt中混用中英文标点如“Φ”与“Φ”字形不同统一用Unicode字符直径符号用U03A6Φ角度符号用U00B0°生成的STEP文件在NX中显示“无效实体”FreeCAD导出时未启用STEPControl_AsIs模式修改exporters/step_exporter.py第87行writer.SetMode(STEPControl_AsIs)螺纹模型导入SolidWorks后缺失牙型Windows系统区域设置为“中文台湾”导致小数点被识别为顿号控制面板→区域→其他设置→小数点符号改为“.”5.2 高阶调试技巧如何用FreeCAD Console定位Skill问题当某个Skill执行失败时不要只看日志。启动FreeCAD GUI执行import sys sys.path.append(rC:\text2cad) from skills.thread_skill import ThreadSkill skill ThreadSkill() result skill.execute({thread_type: M12, depth: 25}) # 此时result是Part.Shape对象可直接可视化 Part.show(result)然后在FreeCAD的“Part Workbench”中点击“Check Geometry”它会高亮显示所有非法边红色。我曾用这招发现gear_skill.py在齿根过渡曲线处有0.0003mm的微小间隙——肉眼不可见但会导致STEP导出失败。5.3 性能优化实战把单次建模从2.1s压到0.7s默认配置下text-to-cad每次建模都会重新初始化FreeCAD内核这是最大性能瓶颈。我在execution_engine.py里加了缓存机制# 在类初始化时 self._fc_doc None def _get_freecad_doc(self): if self._fc_doc is None: self._fc_doc FreeCAD.newDocument(temp) return self._fc_doc再配合--reuse-doc启动参数建模时间降至0.7s。但要注意必须在Skill执行完后调用self._fc_doc.recompute()否则后续操作会读取脏数据。这个技巧没写在文档里却是批量处理图纸时的救命稻草。6. 应用场景延展从个人工具到设计所工作流中枢6.1 与PDM系统集成用text-to-cad自动生成BOM校验规则某汽车零部件厂用它改造了PDM审批流程。传统方式是设计师上传CAD文件→工艺员手动检查BOM→质量部抽查。现在设计师提交图纸时系统自动调用text-to-cad的bom_skill生成结构化BOM JSON该JSON与ERP中的物料主数据比对自动标记“未维护采购周期的供应商编码”对“焊接件”类型零件触发welding_skill检查焊缝符号是否符合AWS D1.1标准。整个过程从原来的4小时压缩到17分钟且错误检出率提升3倍。关键在于text-to-cad的BOM输出不是字符串而是带语义的XMLitem part_numberBRKT-001 quantity2 materialQ235B/material processlaser_cutting/process standardGB/T 2694-2018/standard /itemPDM系统可直接XPath解析无需OCR或正则匹配。6.2 教学场景用自然语言构建CAD能力评估体系高校机械学院用它开发了“CAD能力图谱”。学生输入“画一个带键槽的阶梯轴”系统不仅生成模型还会记录Planner解析出的参数数量直径/长度/键槽宽深等共12项统计Skill调用次数shaft_skill×1 keyway_skill×1分析尺寸标注完整性是否标注了Ra1.6表面粗糙度、Φ0.05位置度最终生成雷达图直观显示学生在“几何构造”“标准应用”“公差标注”等维度的能力短板。这比传统“交作业打分”精准得多。6.3 制造现场用手机拍照text-to-cad快速逆向建模产线工人用手机拍下磨损的夹具照片上传到部署在车间服务器的text-to-cad API{ prompt: 根据图片重建夹具底座材质HT250四角有M10螺纹孔中央Φ30定位孔表面粗糙度Ra3.2, image_url: http://192.168.1.100/uploads/clip_20240822.jpg }后台用cv2做边缘检测结合Prompt中的尺寸描述生成可加工的STEP文件。整个流程5分钟完成比传统三坐标测量人工建模快20倍。这里的关键是text-to-cad的image_skill不追求像素级还原而是提取“孔位关系”“基准面”“装配特征”等制造语义——这才是产线真正需要的。7. 未来演进与个人实践体会它正在重新定义CAD的“智能”边界我从去年开始跟踪这个项目最大的体会是text-to-cad正在把CAD从“绘图工具”拉回“设计工具”的本质。过去十年AI CAD的焦点总在“怎么画得更快”而它问的是“怎么想得更准”。上周我用它重构了一个老项目——把客户模糊的“要个能装下电机的盒子”需求自动拆解出17个约束条件散热风道截面积≥12000mm²、电机安装面平面度≤0.05mm、线缆出口位置避开振动节点并生成了3套备选方案。这已经不是辅助而是设计伙伴。它接下来的路很清晰多物理场耦合在simulation_skill中集成OpenFOAM让“画散热片”自动关联CFD热仿真制造就绪增加cnc_skill生成符合ISO 6983标准的G代码直接驱动机床知识沉淀把每个Skill的验证数据存为知识图谱让新人提问“为什么这个花键齿高是6mm”时返回GB/T 1144-2012第5.2.1条原文。但最让我兴奋的是它坚持的“本地优先”哲学。在这个动辄要注册、要联网、要订阅的时代text-to-cad证明了一件事真正的生产力工具应该像一把游标卡尺一样——拿起来就能用用完放回抽屉不需要解释也不需要许可。它不承诺颠覆CAD但它让每个工程师都能在今天就用上明天的设计方式。