夜雨聆风学习资料网

ARTICLE · 1130062

实战|用 AI 写 CAD 插件:图库资源管理器(附源码 + 提示词)

实战|用 AI 写 CAD 插件:图库资源管理器(附源码 + 提示词)

点击蓝字,关注我们

这是《零基础 CAD 插件从 0 到 1》第 18 篇

先说一句实话:这个插件我写得挺费劲

前几期做的小工具,基本上一个下午就能跑通——定时保存、图层切换、快捷键,都是几十行代码的事。

但这个图库资源管理器,我前后折腾了两三天。

不是功能有多复杂,是问题太碎:

  • 图库里有 200 多个图块,第一次打开面板卡了七八秒

  • 白底黑线的图块,显示出来和黑底白线的混在一起,看着像半成品

  • 分类树点一下换一个分类,卡片墙整个重建,一抖一抖的

  • 有的图块有属性、有的没属性,插入的时候属性经常丢

  • 最头疼的是:图块的缩略图到底从哪来

每一个都是小问题,但凑在一起就是:能用,但不好用。

后来我一边画图一边改,一边截图丢给 AI 让它优化,才慢慢把体验磨到位。

这篇不是"你看我多厉害",是"我踩过的坑你别再踩"

先看效果:选图块不用再翻文件夹

看实际操作:

打开窗口设置你的图库目录

插入图块

不用打开资源管理器一层层找图块,不用靠文件名猜里面画的什么。

打开面板,左边挑分类,右边挑图块,双击一下就插到图纸里。

缩略图直接显示,黑底白线,跟你想要的风格一致。200 个图块也是秒开。

这个插件解决了什么问题?

针对设计师找图块最烦的几件事,做了四个改进:

图块看得见自动扫描你指定的图库文件夹(子文件夹也扫),把所有图块以缩略图墙的方式摆出来。不用打开 DWG 挨个看,一眼扫过去就知道要哪个。

第二次打开秒出图每个图块第一次显示会慢一点(要读 SLD 生成缩略图),之后就记住了。下次再打开面板,200 个图块也是瞬间铺满,不用再等。

分类树好管左边自动按文件夹生成分类,右键就能加分类、改名字、删分类,跟 Windows 文件夹一样用。找图块先点分类缩小范围,再慢慢挑。

双击即插选中图块双击,切到 CAD 里点一下位置,图块就插进去了。带属性的动态块也能正确带出属性。

交互设计:一次设置,永久使用

设置一次,以后再也不用管。

图库资源管理器界面

首次配置(仅做一次)

  1. 输入 TUKU 回车,面板弹出来

  2. 点右上角扳手 🔧 图标,选你的图库文件夹(比如 C:\CAD\YQArch\sys\blocks)

  3. 关闭。下次再打开,它记住了

日常使用

  • 看:左边点分类,右边缩略图跟着变

  • 找:上面搜索框输关键字,即时筛选

  • 插:双击缩略图,CAD 里点位置,完成

  • 改分类:右键分类,加、改、删

  • 调透明度:标题栏滑块拖动,不影响画图

  • 刷新:图库变了,点左下角「刷新缩略图」

全程无感,专心选图。

核心干货:给 AI 的精准提示词

还是那句话

用 AI 写插件写出来的功能不对,本质是需求没说细。AI 就像助理,你说清楚规则,它才能做准。下面是实测多轮、输出稳定能用的提示词模板,直接复制就能用:


角色设定:你是资深 CAD 插件开发工程师,精通 C# 和 CAD 原生接口,

面向室内设计场景开发插件。

功能需求:开发一个「图库资源管理器」插件,具体要求:

命令名:TUKU

打开方式:

在 CAD 里输入 TUKU 回车,弹出一个窗口,显示图库里的所有图块。

窗口长相:

- 无边框、圆角、看着像现代软件那种

- 不抢 CAD 的焦点(用户还能继续在 CAD 里操作)

- 不占任务栏

- 标题栏放:软件名、透明度滑块、打开日志、设置目录、最小化、关闭

- 左边一列:搜索框 + 分类树 + 刷新按钮

- 右边一大块:4 列的缩略图墙

- 底部:进度提示 + 数量统计 + 插入按钮

缩略图怎么来(这是最关键的部分):

- 优先读跟 DWG 同名的 SLD 文件(CAD 自带的幻灯片格式,

  里面存着图块画好的样子,比打开 DWG 快几十倍)

- 读 SLD 的时候要解析它的二进制结构,按绘图指令把线条画出来

- 把读出来的图,白底黑线统一改成黑底白线,看着整齐

- 没 SLD 就依次找:同名 PNG → 同名 JPG → DWG 里嵌的预览图

- 都没有,最后才打开 DWG 截图(最慢的兜底)

- 处理好的缩略图存起来,下次直接用,不用重新生成

分类树:

- 按图库文件夹的结构自动生成,根节点叫「全部」

- 右键能加子分类、改名字、删分类

- 点分类,右边缩略图跟着过滤

- 展开、折叠用起来跟 Windows 文件夹一样

数据管理:

- 缩略图列表用最轻的方式存,切换分类不重新建卡片

- 过滤条件缓存起来,避免反复读界面

配置保存:

- 用简单的配置文件存用户的目录设置、透明度

- 下次打开自动读出来

插入逻辑:

- 双击缩略图 → 面板暂时隐藏 → 切到 CAD → 提示用户点一个位置 → 图块插进去

- 带属性的动态块也能正确带出属性

- 插完面板自动弹回来

环境:.NET Framework 4.8,AutoCAD 2021 或更新版本

输出要求:

给出完整可复制编译的代码,关键地方加中文注释,

说明怎么编译、怎么加载到 CAD 里


写提示词的核心原则

  1. 先定身份先让 AI 进入专业 CAD 开发的角色,避免用错 API、写出行外代码。

  2. 再划边界明确命令名、CAD 版本、运行环境,从根源减少兼容问题和报错。

  3. 讲清规则怎么保存、怎么注入、怎么设为当前,每一步规则都说死,不给 AI 自由发挥的空间。

  4. 固定格式要完整代码、要注释、要部署说明,都明确提出来,输出直接能用。

照着这个结构写,AI 输出代码的可用率至少提升 80%。

核心源码分享

下面是一部分代码,

using System;using System.IO;using System.Reflection;using System.Windows.Interop;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.Runtime;using AcApp = Autodesk.AutoCAD.ApplicationServices.Application;using Exception = System.Exception;[assembly: ExtensionApplication(typeof(GalleryExplorer.GalleryExplorerApp))]namespace GalleryExplorer{    public class GalleryExplorerApp : IExtensionApplication    {        private static GalleryExplorerWindow _win;        publicvoidInitialize()        {            GalleryLog.Init();            // 加载 SlideCtrl.dll            try            {                string path = FindSlideCtrl();                if (path != null)                {                    var asm = Assembly.LoadFrom(path);                    GalleryLog.Info("已加载 SlideCtrl.dll:" + path +                        ",版本:" + asm.GetName().Version);                }                else                {                    GalleryLog.Warn("找不到 SlideCtrl.dll,所有候选路径均不存在");                }            }            catch (Exception ex)            {                GalleryLog.Error("加载 SlideCtrl.dll 失败", ex);            }            // 兜底:注册程序集解析事件            AppDomain.CurrentDomain.AssemblyResolve += ResolveSlideCtrl;            GalleryLog.Info("插件 Initialize 完成");        }        publicvoidTerminate()        {            GalleryLog.Info("插件 Terminate");        }        ///<summary>        /// 从多个候选位置搜索 SlideCtrl.dll        ///</summary>        privatestaticstringFindSlideCtrl()        {            string myDir = "";            try            {                myDir = Path.GetDirectoryName(                    Assembly.GetExecutingAssembly().Location);            }            catch { }            string localAppData = Environment.GetFolderPath(                Environment.SpecialFolder.LocalApplicationData);            string myDocs = Environment.GetFolderPath(                Environment.SpecialFolder.MyDocuments);            var candidates = new System.Collections.Generic.List<string>();            // 1. 当前 Assembly 所在目录            if (!string.IsNullOrEmpty(myDir))                candidates.Add(Path.Combine(myDir, "SlideCtrl.dll"));            // 2. %LOCALAPPDATA%\GalleryExplorer\            candidates.Add(Path.Combine(localAppData,                "GalleryExplorer", "SlideCtrl.dll"));            // 3. 我的文档\GalleryExplorer\            candidates.Add(Path.Combine(myDocs,                "GalleryExplorer", "SlideCtrl.dll"));            // 4. 项目 bin 目录(硬编码,方便开发时用)            candidates.Add(@"E:\CAD\GalleryExplorer\bin\Debug\SlideCtrl.dll");            candidates.Add(@"E:\CAD\GalleryExplorer\bin\Release\SlideCtrl.dll");            // 5. NuGet 包目录(硬编码)            candidates.Add(@"E:\CAD\GalleryExplorer\packages\AutoCAD.Slide.Control.1.1.0\lib\net45\SlideCtrl.dll");            candidates.Add(@"E:\CAD\GalleryExplorer\packages\AutoCAD.Slide.Control.1.1.0\lib\net40\SlideCtrl.dll");            foreach (var c in candidates)            {                if (File.Exists(c)) return c;            }            // 都没找到,打印一遍方便排查            GalleryLog.Warn("SlideCtrl.dll 搜索路径:");            foreach (var c in candidates)                GalleryLog.Warn("  " + c);            return null;        }        privatestatic Assembly ResolveSlideCtrl(object sender, ResolveEventArgs args)        {            try            {                var asmName = new AssemblyName(args.Name);                if (asmName.Name != "SlideCtrl") return null;                string path = FindSlideCtrl();                if (path != null)                {                    GalleryLog.Info("AssemblyResolve 加载:" + path);                    return Assembly.LoadFrom(path);                }            }            catch { }            return null;        }        [CommandMethod("TUKU")]        publicvoidShowWindow()        {            GalleryLog.Info("命令 TUKU 被调用");            Document doc = AcApp.DocumentManager.MdiActiveDocument;            if (doc == null)            {                GalleryLog.Warn("没有活动文档,退出");                return;            }            if (_win != null && _win.IsLoaded)            {                GalleryLog.Info("窗口已存在,激活它");                if (_win.WindowState == System.Windows.WindowState.Minimized)                    _win.WindowState = System.Windows.WindowState.Normal;                _win.Show();                _win.Topmost = true;                _win.Topmost = false;                return;            }            GalleryLog.Info("创建新窗口");            _win = new GalleryExplorerWindow(doc);            try            {                var helper = new WindowInteropHelper(_win);                helper.Owner = AcApp.MainWindow.Handle;                GalleryLog.Info("窗口 Owner 已设为 CAD 主窗口");            }            catch (Exception ex)            {                GalleryLog.Error("设置 Owner 失败", ex);            }            _win.Closed += (s, e) =>            {                GalleryLog.Info("窗口已关闭");                _win = null;            };            _win.Show();            GalleryLog.Info("窗口已显示");        }    }}

用 AI 开发插件的完整流程

这类带界面的工具插件,用 AI 分步开发最顺手:

需求拆解

把「图库资源管理器」拆成五块,逐个让 AI 实现:

  • 第一块:窗口长得像什么样

  • 第二块:缩略图怎么生成

  • 第三块:分类树怎么建、怎么过滤

  • 第四块:双击怎么插入图块

  • 第五块:设置怎么记住

不要一次性把完整需求丢给 AI,它消化不了。

分步验证

  • 先写缩略图,看能不能正常显示出来

  • 再加黑底白线处理,看效果对不对

  • 再加分类树,测右键增删改能不能同步到文件夹

  • 最后加插入逻辑,测带属性的块属性有没有带出来

每一步跑通再往下,出问题好定位。

实测优化

挂 200 多个图块跑一天,看会不会卡,看反复点分类有没有变慢,把遇到的问题截图发给 AI,让它优化。

细节调整

默认目录、缩略图大小、一行显示几个,都可以直接告诉 AI 让它改。

开发过程中我遇到的几个大的问题

问题1:SLD 文件到底怎么读

就是上面说的那件事。没有现成资料,全靠自己试。

用十六进制工具一个字节一个字节看,试了十几种读法,花了整整一天才把 SLD 的结构搞清楚。

这绝对是整个插件最难的 20%。

问题2:第一次打开太慢

200 个图块,每个都要现场生成缩略图,第一次打开要等七八秒。

后来加了个「记住」机制——第一次生成过就存起来,下次直接读,第二次打开 1 秒内。

问题3:白底黑线看着不像话

有些图块是白底黑线,有些是黑底白线,混在一起像半成品。

后来统一处理:不管原来什么底色,都给它变成黑底白线,看着整齐。

成品领取 & 下期预告

成品插件直接领

不想自己编译、调代码的朋友,关注公众号 「下班让AI教我做插件」,后台回复 「图库」,直接领取编译好的 DLL 插件文件,NETLOAD 加载或者是使用我写的dll插件加载工具箱。 完整工程源码拿到手就能二次修改。

下期预告

下一篇咱们继续图纸提效工具,如果有想要的插件可以在评论区留言,我看看哪个留言最多就做哪个。

我是做插件的设计师,专注用 AI 提高 CAD 设计效率。关注我,下班一起做插件,把重复工作交给程序。

声明

本插件完全免费分享,仅供交流学习使用。严禁任何人将其用于商业倒卖或牟利。如需转载,请注明出处。请大家尊重作者的劳动成果,共同维护良好的交流环境。

E

N

D

相关学习资料