ARTICLE · 1122687
实战|用 AI 写 CAD 插件:图片插入工具(附源码 + 提示词)
点击蓝字,关注我们这是《零基础 CAD 插件从 0 到 1》第 16 篇
做设计的小伙伴肯定都知道图片插入,如果要发给别人其实是很麻烦的。
CAD 插入图片,要么用 IMAGEATTACH,要么 OLE 拖进去。两个都不好用:
光栅图像:DWG 里存的只是一条路径,图片本身没进去。图纸一发出去,或者换台电脑打开,图片就变成"图像未找到"。给你发图的人折腾半天,收到的人看到的全是空框。
OLE 嵌入:倒是真进 DWG 了,但打印模糊、文件巨大、大图容易崩、调不了透明度。做底图的时候能把人逼疯。
更烦的是,图上插了 20 张效果图,哪张丢了、哪张没加载,完全看不出来。想重新链接,还得一张一张点特性面板改路径。
今天咱们用 AI 写一个图片管家,从根上解决"图片会丢":
图片二进制直接嵌入 DWG、走哪带哪、打开自动恢复、支持批量插入、一键删除——单 DWG 文件就能发给别人。
先看效果:单 DWG走天下

这是《零基础 CAD 插件从 0 到 1》第 16 篇
做设计的小伙伴肯定都知道图片插入,如果要发给别人其实是很麻烦的。
CAD 插入图片,要么用 IMAGEATTACH,要么 OLE 拖进去。两个都不好用:
光栅图像:DWG 里存的只是一条路径,图片本身没进去。图纸一发出去,或者换台电脑打开,图片就变成"图像未找到"。给你发图的人折腾半天,收到的人看到的全是空框。
OLE 嵌入:倒是真进 DWG 了,但打印模糊、文件巨大、大图容易崩、调不了透明度。做底图的时候能把人逼疯。
更烦的是,图上插了 20 张效果图,哪张丢了、哪张没加载,完全看不出来。想重新链接,还得一张一张点特性面板改路径。
今天咱们用 AI 写一个图片管家,从根上解决"图片会丢":
图片二进制直接嵌入 DWG、走哪带哪、打开自动恢复、支持批量插入、一键删除——单 DWG 文件就能发给别人。
先看效果:单 DWG走天下

GIF1(打开窗口):输入 PIC → 弹出图片管家 → 显示当前图纸所有图片,带缩略图、状态。

GIF2(插入图片):点"插入图片" → 选图片(可多选)→ 图纸上点一下 → 图片插入完成。

GIF3(批量插入):多选 3 张 → 点起始位置 → 从左到右依次排开,间距可设置。

GIF4(批量删除):勾选多张 → 点"删除选中图片" → 一次性清掉。
这个插件解决了什么问题?
图片二进制直接嵌入 DWG
打开图纸,把图片文件读成二进制,用 XRecord 存到 DWG 的命名对象字典里。
打开图纸自动恢复
用户完全无感。 只要 DWG 打开,图片就自动回来。
临时文件机制
DWG 里的图片是二进制,CAD 不认识。所以需要:
插入时:二进制存进 DWG,同时提取一份到临时目录;
显示时:
RasterImageDef指向临时文件,CAD 才认得;重开时:临时文件不在了就重新提取。
批量插入 + 自动排布
一次选多张图 → 点一下起始位置 → 从左到右依次排开。
顶部可以设置间距(默认 1000mm)。
顺序就是你选图片时的顺序。
批量删除
列表每行加复选框,表头有全选框,下面是"全选 / 反选 / 删除选中图片"。
一次删 10 张也没问题,删除后立即 Regen 刷新。
不抢焦点
窗口打开后不抢 CAD 焦点,鼠标直接移到图纸上就能点插入点。
插入时窗口自动隐藏 → 让用户点位置 → 完成后自动显示。整个流程一气呵成。
交互设计:一个窗口,四个区域
启动命令:输入 PIC 回车,弹出图片管家。【区域 1:标题栏】- 应用图标 + "图片管家"- 最小化 / 关闭按钮- 可拖拽移动【区域 2:插入卡片】- "插入图片"按钮(支持多选)- 间距输入框(默认 1000)【区域 3:图片列表】- 每行:复选框 / 缩略图 / 文件名 / 嵌入标识 / 状态- 单击选中 → 双击定位到图片- 状态:已嵌入(绿色)/ 数据丢失(红色)【区域 4:操作按钮】- 定位到图片 / 全选 / 反选 / 删除选中图片 / 刷新【底部状态栏】- 显示"共 N 张图片,其中 M 张未找到"
核心干货:给 AI 的精准提示词
还是那句话:用 AI 写插件写出来的功能不对,本质是需求没说细。
下面是实测多轮、输出稳定能用的提示词模板:
角色设定你是资深 CAD 插件开发工程师,用 C# 和 WPF 做 AutoCAD 插件。 功能需求开发一个「图片管家」插件,命令名 核心目标解决"插入图片后图纸发出去图片就丢"的问题。 现在的做法要么是引用外部路径(图片一移动就丢),要么是 OLE 嵌入(打印模糊、文件大、容易崩)。 要做的是:把图片直接装进 DWG 文件里,走哪带哪。 界面WPF 无边框圆角窗口,毛玻璃卡片风格:
功能要求
环境.NET Framework 4.8,AutoCAD 2021 及以上,用 AcMgd、AcDbMgd、AcCoreMgd 三个引用。 输出要求
|
写提示词的核心原则
先定身份——让 AI 进入专业 CAD 开发角色,避免用错 API。
再划边界——明确命令名、CAD 版本、运行环境。
讲清规则——特别是图片的嵌入机制(XRecord)、RasterImage 的 Orientation、LockDocument 的用法,这几处 AI 最容易搞错。
固定格式——要完整代码、要注释、要部署说明。
照着这个结构写,AI 输出代码的可用率至少提升 80%。
重要提示:实际开发时不要一次把所有功能都塞给 AI。真正开发时,一个功能一个功能来——先做窗口,再做嵌入机制,再做列表,再做插入……每步跑通再下一步。
核心源码分享
publicstaticstringEmbedImage(Database db, string imagePath){byte[] data = File.ReadAllBytes(imagePath);string md5 = ComputeMd5(data);using (var tr = db.TransactionManager.StartTransaction()){var nod = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);DBDictionary embedDict;if (nod.Contains("PIC_INS_EMBEDDED"))embedDict = (DBDictionary)tr.GetObject(nod.GetAt("PIC_INS_EMBEDDED"), OpenMode.ForWrite);else{embedDict = new DBDictionary();nod.SetAt("PIC_INS_EMBEDDED", embedDict);tr.AddNewlyCreatedDBObject(embedDict, true);}// 已存过就跳过(同图只存一份)if (embedDict.Contains(md5)){tr.Commit();return md5;}// 按 127 字节分块,TypeCode 310 = 二进制var rb = new ResultBuffer();int offset = 0;while (offset < data.Length){int len = Math.Min(127, data.Length - offset);byte[] chunk = new byte[len];Array.Copy(data, offset, chunk, 0, len);rb.Add(new TypedValue(310, chunk));offset += len;}// 扩展名rb.Add(new TypedValue(1, Path.GetExtension(imagePath)));var xrec = new Xrecord();xrec.Data = rb;embedDict.SetAt(md5, xrec);tr.AddNewlyCreatedDBObject(xrec, true);tr.Commit();}return md5;}
用 AI 开发插件的完整流程
需求拆解
把「图片管家」拆成六个模块:窗口框架 → 嵌入机制 → 打开恢复 → 列表显示 → 插入(含批量) → 批量删除。逐个让 AI 实现。
分步验证
先做"能读出来",再做"能嵌入",最后做"能自动恢复"。每一步跑通再往下,出问题好定位。
实测优化
拿不同 CAD 版本测试:2021、2024、2026 都有细微差异。踩的坑包括:
窗口里改图必须先"锁定文档",否则报错;
从没插过图的图纸,图片存放区还不存在,要自己创建;
图片存放区的 key 不能用带反斜杠的路径,要用纯字母数字;
图片上下颠倒——方向设反了;
删除后不刷新——忘了让 CAD 重绘。
细节调整
窗口大小、按钮颜色、间距默认值、缩略图尺寸,都可以根据自己的操作习惯改。
成品领取 & 下期预告
成品插件直接领
不想自己编译、调代码的朋友,关注公众号 「下班让AI教我做插件」,后台回复 「图片管理」,直接领取编译好的 DLL 插件文件,NETLOAD 加载或者是使用我写的dll插件加载工具箱。 完整工程源码拿到手就能二次修改。
下期预告
下一篇咱们继续图纸提效工具,如果有想要的插件可以在评论区留言,我看看哪个留言最多就做哪个。
我是做插件的设计师,专注用 AI 提高 CAD 设计效率。关注我,下班一起做插件,把重复工作交给程序。

E
N
D