CAD增量编号与桩号批量标注实战:规则、排序、校验与避坑

发布时间:2026/11/4 13:23:58
CAD增量编号与桩号批量标注实战:规则、排序、校验与避坑

做道路、桥梁、管线、总图这行的都懂,一张图纸里最不起眼、又最容易出事的东西,不是线型,不是标注样式,是那一串串编号——图号、桩号、点位号、孔号。图号错一位,施工队翻错图;桩号差一米,现场就多挖一个坑。偏偏这东西还特别适合批量处理:规则固定、递增、格式统一,人眼盯着改一百个,改到第七十个必走神。所以"自动编号""增量编号""批量标注图号/桩号"这类工具在圈子里一直是刚需,增量编号插件汉化版这类东西一出来,群里就有人转。这篇就把这类工具掰开讲清楚:它到底怎么工作、参数怎么定、桩号怎么换算、排序为什么总排乱、装完之后怎么用才不翻车。不管你是刚接手绘图岗的新人,还是带着几个人做竣工图的老手,下面的内容都能直接照着做。

1. 手工编号为什么几乎一定会返工

1.1 图号和桩号在图纸里到底承担什么职责

先说清楚编号的本质,后面所有参数选择才有依据。图号是图纸的身份标识,它要满足三个条件:唯一、有序、可被引用。唯一好理解,同一个项目里不能出现两个"结施-12";有序指的是它得跟图纸目录、图纸集、出图顺序对得上,方便别人按号索图;可被引用指的是别的图上写"详见图结施-12"时,改号必须同步,否则就是死链。桩号则完全是另一套逻辑,它是线性工程里的一维坐标,沿路线走向把位置换算成"K几加几"的形式,道路、桥梁、渠道、管线、轨道都用它定位。桩号不追求唯一,追求的是连续和可换算——看到 K3+250,脑子里要能立刻反应出这是从起点算起 3250 米的位置,并且这个位置在平面图、纵断面图、横断面图、工程量表里必须一致。

这两者的共同点是:数量大、规则死、改动频繁。一个中型项目的图号动辄上百,一条几公里的路,按 20 米一个桩号布点,光中桩就两三百个。这种"规则清晰但体力消耗巨大"的活,天然就该交给程序。手工做不是不行,是不可维护——设计变更一次,前面加两张图,后面全部顺延,你打算改到几点?

提示:如果项目还在方案阶段、图纸数量少于 20 张、后续大概率推倒重来,不建议上插件。手工改反而快,也不会引入"插件跑一半断电"这种新风险。批量工具的收益从 50 个编号往上才开始明显。

1.2 三类最典型的翻车现场

我见过、也亲手制造过的编号事故,基本集中在三类。第一类是插入导致的全线漂移:原本 A-01 到 A-30,中途补了一张图要插在 A-08 后面,手工改就得从 A-08 一路改到 A-31,改完还要回头检查所有"详见图 A-xx"的引用。人一旦连续改三十个数字,中间必然有一次手滑,而这一次手滑在打印出来的蓝图上根本看不出来。第二类是复制粘贴造成的重号:画节点大样时最常用的一招是复制一份改内容,结果编号忘了改,一张图里出现两个 A-15。这种错误在屏幕上看不出来,只有把图号列成清单排序,才能发现缺号和重号。第三类是桩号进位错误:1000 米进位这件事,人工计算出错的概率高得离谱,把 1050 米写成 K1+050 是对的,但把 950 米写成 K0+950、把 1005 米写成 K1+005 的时候,很多人会在脑子里绕一下,然后写成 K0+1005 或者 K1+5。

这三类错误的共同根源不是粗心,是人和规则不匹配。人会疲劳,规则不会;人会跳行,程序不会。认清这一点,你就不会再有"我小心一点就行"的侥幸。

1.3 增量编号工具的基本工作模型

这类插件的内部逻辑其实非常朴素,拆开就是五步:取选择集 → 提定位点 → 排序 → 算序号 → 写回文字。听起来简单,但每一步都有坑,而工具好不好用,就体现在这些坑有没有被处理好。

取选择集这一步,工具通常支持按图层、按对象类型过滤。你需要它只认单行文字,就别让它把多行文字和标注也圈进去;你需要它处理图框属性块,就得让它识别块参照里的属性。提定位点,是决定编号顺序的关键:单行文字取插入点(组码 10),块参照取插入点,圆取圆心,多段线取顶点或中点。排序,是按 X 坐标、Y 坐标、还是先 Y 后 X(逐行排序),差别巨大,后面专门讲。算序号,就是起始值 + 步长 × 索引,再做补零和加前后缀。写回文字,是最容易被忽略的一步——单行文字改组码 1 就行,但多行文字如果用组码 1 直接替换,原有的字高、颜色、堆叠格式会被清掉,正确做法是用 ActiveX 的vla-put-TextString,块属性则要区分常量和非常量。

理解了这五步,你再看任何一款增量编号插件,都能在三分钟内判断它靠不靠谱:能不能指定排序方式、能不能设容差、能不能预览、能不能只改选中的、出错能不能撤销。

2. 编号规则先定死,再谈批量

2.1 前缀、后缀和补零位数怎么定

批量编号最容易犯的错,是拿到工具就框选,参数随手填。结果跑完发现补零位数不对,A-1 和 A-10 排在一起参差不齐,又得重来。所以在动手之前,把规则写成一行字贴在工作区:前缀 + 补零序号 + 后缀。前缀承担分类职责,比如"结施-""建施-""水施-",后缀承担版本或分区职责,比如"-A""-B""(修)"。这一步不难,难的是补零位数。

补零位数不是随便定的,它由最大序号的数量级决定。公式很简单:位数 = 最大序号数字的字符长度。总共有 128 张图,最大序号 128,三位数,那就补到三位:A-001 到 A-128。如果项目分标段、每个标段单独编号,按单标段的最大值算,不要按总数算。我见过有人在 30 张图的标段里补到四位,出来的 A-0001 看着很专业,实际排目录时数字位置对不齐,还得再调。

最大序号建议位数示例说明
1–91 或 2A-1 / A-01少于 10 张可不补,但和图集混编时建议补到 2 位
10–992A-01 至 A-99最常见的区间
100–9993A-001 至 A-999大中型项目标准做法
1000 以上4A-0001通常是总图、详图大库或点位编号

补零还有一个隐性好处:排序稳定。字符串排序时,"A-10" 会排在 "A-2" 前面,补零之后 "A-02" 和 "A-10" 的顺序就正确了。凡是编号需要在表格、图纸目录、导出清单里排序的,补零是必需品,不是审美问题。

2.2 桩号格式与里程换算

桩号是这批工具里最考验实现质量的功能,因为它的格式不是简单的数字递增,而是公里 + 米的两段式编码。标准写法是K3+250,含义是从起点 3250 米。也有写成K3+250.000精确到毫米的,还有用3+250省掉 K 的。左右线分幅的项目会加前缀:ZK3+250、YK3+250。

换算的核心就两个动作:用总米数除以 1000 取整得到公里数,用总米数对 1000 取余得到米数,米数部分必须补到三位。举例:总长 2345.6 米,2345.6 / 1000 = 2(取整),余 345.6,结果K2+345.6。再举一个容易错的:1005 米,除以 1000 得 1,余 5,结果K1+005,米数补三位,写成K1+5或者K1+0050都是错的。当精度要求到毫米时,余数部分要写成 345.600,补零仍然只补到整数位的三位,小数位单独处理。

负里程和起点前桩号是特殊情况。有些项目起点不在 K0,而是从 K-500 开始(比如接已建路段),这时候取整方向会出问题——很多语言里对负数取整是向零取整,导致 -500 米算出来是 K0+500 而不是 K-0+500。实际做法是统一用"相对起点的偏移量"来算,先确定基准桩号,再把偏移量加到基准上。

注意:桩号不连续是正常的。断链(因改线导致里程不连续)在公路项目里普遍存在,工具默认按等步长递增,遇到断链必须手工处理那一段,或者把路线拆成两个区段分别编号。任何号称"一键全自动"的工具都处理不了断链,因为它根本不知道你的断链位置在哪。

2.3 排序规则是编号的灵魂

同样的选择集,排序方式不同,编出来的号完全不同,而且错了还看不出来——数字都连续,就是位置全乱。常见的三种排序:

按 X 坐标升序,适合横向排列的构件编号,比如一排桩基从左到右 K1、K2、K3。按 Y 坐标降序,适合纵向排列,比如楼层、标高点。先 Y 后 X 的逐行排序,这是图面上最常用的,因为人读图是从上往下、从左往右,编号顺序也必须跟视线一致。逐行排序的实现要点是:先把 Y 坐标接近的对象归为一行,行内再按 X 排。这里的"接近"就是容差,容差设小了,同一行文字因为插入点有几毫米差异被分成两行;容差设大了,相邻两行被并成一行,顺序直接颠倒。

还有一个容易被忽略的选项是按选择顺序。有些插件默认按你点选的先后顺序编号,框选时这个顺序是由 CAD 内部的选择集顺序决定的,跟你的直觉完全无关,肉眼看起来就是随机的。除非你是一个一个点选,否则不要用这个模式。

按路径排序是最贴近工程实际的做法:沿着一条多段线或路线的走向编号,桩号才符合"沿里程递增"的定义。多数轻量插件不支持这个模式,只支持 X/Y 排序,这就要你在布点时做妥协——把点位沿着路线摆成大致有序的形态,或者分段处理。

2.4 图层、文字样式和块属性的事前约定

批量操作最怕的不是算法错,是数据本身不干净。我踩过的坑里,有一半是图层和样式的问题。跑编号之前,先做四件事:

第一,把所有待编号的文字放到同一个专用图层,比如"标注-编号",并且锁定其他所有图层。这样点选或框选时不会误伤,也不会把图框、标题栏里的文字卷进来。第二,统一文字样式和字高,如果原来就有多种字高,先刷成一种,否则跑完之后图面会很难看。第三,如果编号写在属性块里,确认属性不是"常量"类型——常量属性在界面上根本改不了,工具也改不动,只能炸开重定义。第四,确认这些文字没有在锁定图层上,锁定图层上的对象可以被选中,但无法修改,工具会静默跳过,你以为改完了,其实一个都没动。

前置检查项错误表现处理办法
图层未统一部分文字未被编号用快速选择按对象类型筛选,统一图层
文字样式混杂编号后字高、字体不一致刷样式后再编号
属性为常量块内编号不变重定义块,把属性改为非常量
图层锁定编号"跑了"但内容没变解锁图层,重新执行
文字在多行文字内替换后格式丢失用 ActiveX 方式写入,不用组码替换

3. 从零跑完一次批量编号

3.1 加载与信任设置

增量编号插件汉化版这类工具,交付形态一般有两种:一种是编译好的程序集,需要在命令行里加载;一种是源码形式的脚本文件,直接拖进绘图窗口或者用加载命令挂上。不管哪种,第一次用都会遇到同一个问题:加载失败,提示找不到文件或安全限制。

处理思路是通用的。把插件文件放在一个固定且路径不含中文和空格的目录里,比如D:\Tools\Numbering\,然后在软件的选项设置里,把这个目录加入受信任位置。这一步的作用是告诉软件:"这个目录下的东西我认了,别每次弹警告。"没做这一步,程序集类插件会直接被拒绝加载,而脚本文件则每次打开图纸都要重新确认一次,非常烦。加载成功后,用命令别名或菜单入口触发主命令,先把命令名记下来写在便签上,因为汉化版的命令名有时和菜单显示不一致。

如果插件是随图纸走的,还要考虑启动组。把加载命令写进启动组,以后每次启动自动加载,团队里其他人拿到你的样板文件也能直接用。这一招在推广阶段特别管用——你把样板文件发下去,别人打开就能用,不需要再教一遍怎么装。

3.2 建一个小测试集再动真图

这是我最想强调的一条经验:不要拿正在出的施工图当试验品。正确做法是先复制一份,在新文件里建一个 10 到 20 个对象的测试集,故意做得乱一点——有的文字偏上,有的偏下,有的在图块里,有的在锁定图层上。然后用这个测试集把所有参数试一遍,观察输出。

测试集要验证四件事:排序是否符合预期、补零位数是否正确、前后缀有没有多空格、执行后能不能一次撤销。特别是第四点,很多人第一次跑完发现不对,连按撤销,结果只撤销了一半,还得手工收拾。测试集跑通之后,再上真图,并且上真图之前另存一个带日期的备份,文件名后加_bak,这是花五秒钟买保险。

3.3 主流程:选择、参数、预览、执行

假设工具界面是常见的三段式:选择对象、设置参数、执行。操作顺序建议这样走:

  1. 先冻结无关图层,只留待编号的对象可见,然后用窗口选择整体框选。
  2. 选择对象类型过滤,只勾单行文字和块参照,别把标注、引线卷进来。
  3. 设定排序方式,逐行编号就选"先 Y 后 X",并设置容差。容差的取值方法在 4.3 节细讲。
  4. 填前缀、起始值、步长、补零位数。起始值注意是从 0 开始还是从 1 开始,很多事故就出在这一个数上。
  5. 点预览。有预览功能的工具一定要用,预览能把顺序问题暴露出来。没有预览功能的,先拿 5 个对象跑一次,看结果对不对,再全选。
  6. 执行并立即检查首尾。看第一个和最后一个编号,再看中间随机三个,四个点对上了,基本就没问题。

如果工具没有预览,有个土办法可以替代:先把所有待编号文字的内容统一改成一个占位符(比如全部改成###),然后执行编号。这样顺序错了也能一眼看出来,因为所有文字长得一样,只有位置不同。

3.4 用属性块做图号的高级玩法

把图号写在属性块里,比写在普通文字里强很多,原因有三:属性块可以被数据提取、可以被图纸集识别、可以在标题栏里自动同步。做法是把图号做成一个块,块里定义一个属性标签叫DWG_NO,默认值随意,然后把这个块放进图框右下角或者其他需要显示图号的位置。

批量编号时,工具识别到块参照,会去遍历它的属性,找到标签匹配的那个属性并改写值。这里的坑在于:属性标签必须和工具要求的一致,或者工具允许你指定标签名。如果工具没有指定标签的选项,它通常会改第一个非常量属性,那就必须保证块里只有一个非常量属性,或者把图号属性排在第一位。这一条在汉化版的说明里经常写得含糊,实测最快。

改完之后,用属性提取或者数据提取功能导出一遍,得到一个"图号—文件名—日期"的清单,这份清单既是校验依据,也是后面做图纸目录的原始数据。这一步花的时间,比后面手工核对省得多。

3.5 结果校验的三道关

编号跑完不等于结束,必须过三道关。

第一道,数量关。用快速选择按图层统计对象数量,和你预期的编号总数对一下。少一个就是有对象被跳过,通常是锁定图层或者类型不对。

第二道,连续性关。把所有编号文字导成文本,排序,看有没有缺号和重号。手工看不现实,做法是用数据提取导出到表格,加一列公式判断当前值 - 上一个值是否等于步长,不等于的地方标红。一百个编号,这一步两分钟。

第三道,位置关。抽查图面上首、中、尾各三处,确认编号和它指向的对象是对应的。这一道最容易被跳过,也最容易出问题——数字连续、数量正确,但编号和构件错位了,这种错误在打印稿上完全看不出来。

4. 几个必须动手算的参数

4.1 补零位数与总编号数的关系

前面提过公式,这里给完整的推算过程,因为很多人卡在"到底补几位"。

设最大序号为 N,补零位数 d 满足10^(d-1) ≤ N < 10^d,即 d = floor(log10(N)) + 1。N = 99 时,d = 2;N = 100 时,d = 3。注意 100 这个临界点:如果你的编号是 1 到 100,补两位就只能到 99,第 100 个会变成三位,整列数字宽度跳变。所以取位数时向上取整到下一个数量级,也就是 N = 100 时按 999 算,d = 3。

再考虑一个实际因素:编号后面可能还要接后缀。A-001-A这种,A 是分区,-001 是序号。后缀越长,总长度越长,标题栏里的空间够不够要提前量。字高 3.5 毫米,一个字符宽约 2.5 毫米,A-001-A是 6 个字符,占 15 毫米宽,标题栏格子留 20 毫米足够。如果编号长到 12 个字符,就要考虑分两行或者缩小字高。

4.2 桩号换算的完整算法与进位陷阱

给一段可以直接用的换算逻辑,伪代码形式,任何语言都能翻译:

输入:总米数 m, 精度 p(0 表示整米, 3 表示毫米) 公里数 km = floor(m / 1000) 余数 r = m - km * 1000 米数部分 = 补零到 3 位(整数部分) + 小数部分(按 p 位) 输出: "K" + km + "+" + 米数部分

进位陷阱出现在三个地方。一是浮点误差:2345.6 在计算机里可能是 2345.599999,取余后得到 345.599999,四舍五入到毫米是 345.600,没错;但如果精度是整米,345.599999 向下取整就变成 345,而正确答案应该是 346。所以整数精度的桩号,余数要先四舍五入再补零。二是整千点:1000 米应该输出 K1+000,余数为 0,补零后是 000,这个必须显式处理,不能因为"余数为零就省略"。三是米数超过三位:理论上不会,但如果输入的 m 是负数,-500 米算出来 km = 0,r = -500,直接套模板会输出 K0+-500,必须单独处理负值。

还有一个工程量上的细节:桩号标注的字高和朝向。沿着路线标注的桩号,文字通常要跟着路线旋转,不然斜路上的桩号看起来是歪的。批量工具一般只改内容不改旋转,所以旋转要在编号之前统一处理好。

4.3 排序容差怎么取,给一个能落地的算法

容差的作用是判断"两个对象算不算同一行"。取值不能拍脑袋,要跟图面尺寸挂钩。计算过程如下:

先确定出图比例,比如 1:500。再确定打印字高,比如 2.5 毫米。模型空间里的字高 = 2.5 × 500 = 1250 个图形单位。人眼判断"同一行"的宽松程度大约是 1 到 1.5 倍字高,所以容差取1250 到 1900 个图形单位。取中间值 1500 比较稳妥。

写成通用公式:

容差 = 打印字高(mm) × 出图比例分母 × 1.2

1:200 的图,字高 3 毫米,容差 = 3 × 200 × 1.2 = 720 个图形单位。1:1000 的图,字高 2.5 毫米,容差 = 3000 个单位。

容差取完还要验证:跑一次预览,看有没有本来同一行的被拆开、本来两行的被合并。拆开的特征是行内编号跳号,合并的特征是编号顺序在图上呈"之"字形。这两种情况都得调容差重跑。

提示:如果图面上的对象在 Y 方向本来就是严格对齐的(比如从表格里复制过来的),容差可以取很小甚至取 0,这时候按 Y 精确分组反而更快。

4.4 步长选择与号段预留

步长的默认值是 1,但工程上经常不用 1。桩号布点常用 20 米、25 米、50 米,钻孔编号可能用 1,结构构件编号可能用 10 给后续留空间。步长选择的原则是:预留足够的插入空间。

举例:某构筑物现在有 12 个构件,编号 1 到 12,步长 1。半年后要加构件,只能插在中间,又得全改。如果一开始用步长 10,编号是 10、20、30……120,中间插入一个就用 15,完全不用动其他。这个做法的代价是编号看起来不连续,但换来的是可维护性。什么情况下不适合留空?图号。图号和图纸目录严格对应,中间留空会被审图的人问"缺的那几张在哪",所以图号必须连续,步长固定为 1。

号段预留是另一件事,指不同专业、不同分区用不同的数字区间。比如建筑 100 段,结构 200 段,机电 300 段。这样即使各专业并行出图,也不会撞号。区段一旦定下来,写进项目的制图统一规定里,不要中途改。

5. 常见问题排查速查

5.1 编号全变成同一个数

这是最高频的问题,原因通常有三个。第一,选择集里有重复对象,比如同一个文字被选了两次,工具按索引写值,最后一个覆盖前面的,全变成同一个数。第二,写回逻辑用了错误的组码,比如把序号写到了别的组码上,而文字内容组码没动,看起来"没变化"或者"全一样"。第三,工具把序号当成了全局变量而不是循环变量,这是程序缺陷,换个版本或者换工具。

排查顺序:先用快速选择确认对象数量,再拿三个对象单独跑一次,如果三个还是一样,基本就是工具缺陷,别浪费时间,换一个。

5.2 编号顺序看起来是随机的

排序问题占了故障的一半。按可能性从高到低排:排序模式选成了"按选择顺序",这是默认值陷阱;容差设置不当,同一行被拆成多行,行内顺序乱;对象定位点取错了,比如多行文字取的是左上角而不是插入点,导致坐标判断偏移;图面本身Z坐标不一致,有些对象在标高 0,有些在 0.0001,按三维排序就乱了。最后这一条特别隐蔽,处理办法是把所有对象先FLATTEN一遍,统一到 Z=0。

5.3 块属性改不动与中文变问号

块属性改不动,九成是属性类型为常量。常量属性在块定义里被标记为不可编辑,界面上双击块也看不到它。处理办法:编辑块定义,把该属性改成非常量,保存,再跑编号。另一种情况是属性在动态块的可见性状态里被隐藏,工具遍历不到。这种要先切换到对应可见性状态。

中文变问号或者乱码,原因一般是编码不匹配。脚本文件类的插件,文件本身要用与软件一致的编码保存;程序集类的插件,多语言资源缺失时会显示问号,但功能通常正常。如果只是界面文字变问号,不影响使用;如果是写进图纸的编号变成问号,那就是文字样式用的字体不支持中文,换成支持中文的字体即可。

5.4 撤销不干净与图层锁死

撤销不干净的表现是:按一次撤销,编号只回退了一部分,剩下的还得手工改。原因在于插件的实现方式——如果它用的是直接修改实体数据,这种修改不进撤销栈,或者只进一部分;如果用的是命令调用方式,就能整体撤销。用之前先在测试集里按两次撤销试试,能一次全回去的才放心用。

图层锁死的问题在 2.4 节提过,这里补一个排查技巧:跑完之后如果发现部分对象没变,先别怀疑工具,直接在图上点那个对象,看命令行提示什么。提示"位于锁定图层上",问题就找到了。把所有图层解锁,重跑一遍,比分段排查快得多。

现象最可能原因快速验证处理
编号全一样重复选择或写错组码拿 3 个对象单独跑去重或换工具
顺序随机用了"按选择顺序"看参数面板改为按坐标排序
同行被拆开容差过小调大容差重跑按 4.3 节公式取值
部分对象不变图层锁定或类型不符点选对象看提示解锁图层、加类型过滤
块内编号不变属性是常量双击块看属性改为非常量
多行文字格式丢失用组码替换内容看字体颜色是否变改用 ActiveX 写入
撤销不彻底直接改实体数据按撤销看回退范围换用命令式实现的工具
桩号显示 K0+1005米数未做三位补零看余数处理补零到三位并进位

6. 让编号这件事长期不出问题的几个做法

6.1 建一份编号台账,比什么校验都管用

工具能保证"这一次"编号正确,保证不了"下一次"还正确。真正的护城河是一份编号台账:一个表格,列出每个编号、对应的图纸名或构件名、责任人、修改日期。台账不需要多复杂,四五列就够,关键是每次批量编号之后同步更新。

台账的用法很直接:改图之前先查台账,确认这个号有没有被占用;改完之后更新台账,并且在图上用数据提取导出一次做交叉验证。两份数据对不上,就说明有对象被漏改或者多改。这个动作看着笨,但它把"编号"从一次性操作变成了可追溯的过程。项目做到后期,图纸被人接手、被反复修改,台账就是唯一的真相来源。

6.2 分区分批跑,别一次全选

新手最容易犯的错是一次框选整张图,几百个对象一起跑,跑完发现前面几个错了,全部重来。正确做法是分区分批:按图幅分、按楼层分、按桩号区段分,一批 20 到 50 个,跑完检查,没问题再跑下一批。批与批之间用一个明确的起始值衔接,比如第一批 1 到 50,第二批从 51 开始。

分批的另一个好处是出错影响面小。整批跑错,你得撤销全部再重来;分批跑错,只回退一批。而且分批跑的时候,人是在逐步确认的,对顺序的感觉会越来越准,后面的批次基本一次就对。

6.3 一段可以直接改的排序编号代码

如果手上的工具不支持你要的排序方式,或者你想完全掌控逻辑,写一小段脚本是最省事的。下面这段是按 X 坐标升序给单行文字编号的最小实现,可以直接改成按 Y 排序或者逐行排序,改一行比较函数就行。

(defun c:NUMSORT ( / ss i e ed p lst n txt) (setq ss (ssget '((0 . "TEXT")))) (if ss (progn (setq lst nil i 0) (repeat (sslength ss) (setq e (ssname ss i) ed (entget e) p (cdr (assoc 10 ed))) (setq lst (cons (list (car p) (cadr p) e) lst)) (setq i (1+ i))) ;; 按 X 升序;改成逐行排序时,先用 Y 分桶再排 X (setq lst (vl-sort lst '(lambda (a b) (< (car a) (car b))))) (setq n 1) (foreach item lst (setq ed (entget (caddr item))) (setq txt (strcat "A-" (if (< n 10) "0" "") (itoa n))) (entmod (subst (cons 1 txt) (assoc 1 ed) ed)) (setq n (1+ n))) (princ (strcat "\n完成,共 " (itoa (1- n)) " 个"))) (princ "\n未选中文字")) (princ))

几点说明,都是实测踩出来的。第一,这段只处理单行文字,多行文字要换成 ActiveX 写入,否则格式全丢。第二,vl-sort不是稳定排序,坐标完全相同的两个对象顺序不确定,所以坐标里最好带一点差异。第三,逐行排序要把比较函数换成"先比 Y 再比 X",并且 Y 的比较要用容差区间判断,不能直接比大小,否则差一个单位就被分成两行。第四,起始值和前缀写在strcat里,改的时候注意别漏空格。

改完代码,先在一个空文件里造五个文字测一遍,再看结果。脚本类的东西,自己写自己用,最大的好处是逻辑透明——出错的时候你知道该改哪一行,而不用去猜一个黑盒工具在想什么。

最后分享一个我在实际项目里反复用到的小技巧:编号跑完之后,临时把图面所有编号文字改成一个醒目的颜色,通读一遍,看看有没有位置明显不对的。眼睛对"顺序"这件事其实很敏感,连续的数字里夹一个跳号,配上颜色,一眼就能扫出来。确认没问题,再把颜色还原。这比导出表格核对方便,也比逐个点选快。