ARTICLE · 1185259
实战|用 AI 写 CAD 插件:图纸一键排版(附源码 + 提示词)

痛点:图纸天女散花────────────────────────────────────────────────────────────────────────────────────────────────────
画图的人都懂这个场景。
有时候图纸画的乱七八糟的 这里放一个那里放一个,最后整理还要花不少时间或者是
选中一个节点 → MOVE → 找基准点 → 放到空白处 → 再选下一个 → 再 MOVE → 再放……
选着选着就出问题了。图里面有线、有文字、有标注、有填充,一个节点可能有几十个实体,用鼠标一个个点根本选不全。框选吧,又容易选到隔壁节点的东西。
选完了移动的时候,总有那么一两条线"掉队",忘了被框进去。放过去之后一看,怎么多出一条线?回头找半天。
一张图整理完,一个小时没了。
插件效果:框选一下,整整齐齐────────────────────────────────────────────────────────────────────────────────────────────────────

命令 ARRANGE,回车,弹出一个小窗口。
第一步,在窗口里设置参数。从左到右还是从右到左,单行还是多行,间距多少,底对齐还是顶对齐。还有一个"识别间距",这个后面细说。
第二步,点「框选并排列」,窗口自动隐藏。
第三步,在图上把所有要排的东西框一下,回车。
第四步,命令行提示"请指定排列起始点",在空白处点一下。
好了,所有东西整整齐齐排到你指定的位置。
原来一个小时的事,现在三十秒。

这个插件到底解决了什么问题?────────────────────────────────────────────────────────────────────────────────────────────────────
从实际使用角度看,它解决了三个层次的问题。
1最表面的问题:重复劳动。
一个个选、一个个移,每张图都要来一遍。纯粹的体力活,程序最适合干这种活。
2识别问题:一个"整体"其实是散的。
这是关键。排版跟批量打印不一样,批量打印只要识别图框就行,框里是什么不重要。排版要识别的是"一个完整的东西",但它可能是这样的:
一个等轴测的立体线框(全是斜线,没有一条水平或垂直的线)
旁边跟着几个数字标号
底下跟着几个尺寸标注
这几样东西在图上没有连在一起,中间有缝。但它们是"一个整体",移动的时候必须一起动。
所以插件的识别逻辑不是"找图框",而是"找一伙的东西"——实体之间靠得近,就认为是一伙的,整伙一起排。
3参数问题:太近了会散,太远了会粘。
判断"靠得近"需要一个阈值。这个阈值给大了,隔壁的图形也被吸进来,两个图形合成一个;给小了,文字和线框分开,一个图形拆成两个。
所以插件界面上给了个"识别间距"参数,让用户自己调。调一次之后,同一套图纸基本就不用动了。
操作方式:一个命令搞定────────────────────────────────────────────────────────────────────────────────────────────────────
加载好插件之后,只需要记住一个命令:ARRANGE。
在 CAD 命令行输入这个命令,回车,弹出工具窗口。
窗口分三个区块:
排列设置区:方向(从左到右/从右到左)、排列(单行/多行)、每行个数、水平间距、垂直间距、对齐方式(底对齐/顶对齐/居中)、识别间距。全部可视化设置。
运行日志区:实时显示每一步,识别到几个图形、排列了多少个,带时间戳。
底部按钮:一个「框选并排列」,一个「关闭」。
操作流程就是一个按钮走完:点按钮 → 窗口自动隐藏 → 框选 → 点起始点 → 自动跳回窗口 → 日志显示"✔ 排列完成,共 N 个图形"。
核心干货:给AI的提示词────────────────────────────────────────────────────────────────────────────────────────────────────
下面是我实际用的提示词。
1立项目标
我跟 AI 说,我想做一个 CAD 图纸排版工具,用 C# 和 WPF。需求有六条:
弹出一个窗口,让用户先设置参数:排列方向、单行/多行、每行个数、水平间距、垂直间距、对齐方式、识别间距。
用户点一个按钮之后,窗口隐藏,在 CAD 里框选要排列的图形,然后点一个起始点。
框选的时候不能识别"图框",要识别"图形"。判断标准是实体之间的距离小于阈值就归为一个图形。
每个图形用它的总包围盒参与排列,图形内的所有实体一起移动。
排列时支持三种对齐:底对齐、顶对齐、居中。
界面用 WPF,风格参考我之前发的那套(红色主题、圆角、毛玻璃卡片)。
最后加一句:请给我完整的项目结构和代码,并解释一下思路。
2解决聚类问题
第一版做出来之后,聚类效果不理想,相邻的两个图形被吸到一起了。
于是我跟 AI 说:聚类用并查集实现。两两判断实体包围盒之间的最小距离,用切比雪夫距离(取 dx 和 dy 的最大值),而不是欧氏距离。距离小于阈值就合并。这样合并出来的连通分量就是一个个"图形"。
3解决窗口隐藏和恢复
框选的时候窗口要隐藏,点完起始点之后要恢复。
我跟 AI 说:流程是这样的。点按钮 → 窗口隐藏 → 调 GetSelection 框选 → 调 GetPoint 点起始点 → 排列 → finally 里恢复窗口。所有步骤用 try-catch 包住,出错也要能回到窗口。
写提示词的核心原则────────────────────────────────────────────────────────────────────────────────────────────────────
- 先定身份先让 AI 进入专业 CAD 开发的角色,避免用错 API、写出行外代码。
再划边界明确命令名、CAD 版本、运行环境,从根源减少兼容问题和报错。
讲清规则怎么保存、怎么注入、怎么设为当前,每一步规则都说死,不给 AI 自由发挥的空间。
固定格式要完整代码、要注释、要部署说明,都明确提出来,输出直接能用。照着这个结构写,AI 输出代码的可用率至少提升 80%。
核心源码分享────────────────────────────────────────────────────────────────────────────────────────────────────
这是一部分代码,完整代码可以领取,见文末。
聚类算法(并查集 + 切比雪夫距离):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 并查集
varparent=newint[n];
for (inti=0; i < n; i++) parent[i] = i;
intFind(int x)
{
while (parent[x] != x)
{
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
voidUnion(int a, int b)
{
intra= Find(a), rb = Find(b);
if (ra != rb) parent[ra] = rb;
}
// 两两判断包围盒距离
for (inti=0; i < n; i++)
{
for (intj= i + 1; j < n; j++)
{
if (BoxDistance(exts[i], exts[j]) <= gapTol)
Union(i, j);
}
}
// 切比雪夫距离
privatestaticdoubleBoxDistance(Extents3d a, Extents3d b)
{
doubledx= Math.Max(0, Math.Max(
a.MinPoint.X - b.MaxPoint.X,
b.MinPoint.X - a.MaxPoint.X));
doubledy= Math.Max(0, Math.Max(
a.MinPoint.Y - b.MaxPoint.Y,
b.MinPoint.Y - a.MaxPoint.Y));
return Math.Max(dx, dy);
}
AI开发插件的完整流程────────────────────────────────────────────────────────────────────────────────────────────────────
把这次的实战经验,抽象成可复用的流程。
明确需求。用一句话概括"我想让 CAD 做什么",然后拆解成核心功能、交互步骤、参数设置。
编写提示词。包含技术方向、业务规则、界面风格参考。
第一轮生成。让 AI 给完整项目结构和代码。
编译测试。遇到报错,把完整堆栈发给 AI。
调参数。像"识别间距"这种跟具体图纸相关的参数,得拿真实图纸试,才能定下来合适的值。
优化体验。最后再打磨窗口样式、日志、拖拽这些细节。
成品领取 & 下期预告────────────────────────────────────────────────────────────────────────────────────────────────────
成品插件直接领
不想自己编译、调代码的朋友,关注公众号 「下班让AI教我做插件」,后台回复 「图框排列」,直接领取编译好的 DLL 插件文件,NETLOAD 加载或者是使用我写的dll插件加载工具箱。 完整工程源码拿到手就能二次修改。
下期预告
下一篇咱们继续图纸提效工具,如果有想要的插件可以在评论区留言,我看看哪个留言最多就做哪个。
我是做插件的设计师,专注用 AI 提高 CAD 设计效率。关注我,下班一起做插件,把重复工作交给程序。















































































