最近更新于 2026-05-06 15:41
最近移动了一个图纸文件,刚才打开编辑时就出现了奇怪的问题。其中一个问题是矩形图框无法被批量打印插件识别了,手动去改也太麻烦。

后面我让 Google Gemini 给我分析,提供 LISP 代码给我去分析图框,得出的结论是我这里的 AM_0 图层的 AcDbPolyline 矩形框数据缺失了,内部有损坏,这还是有点莫名奇妙的。
反复折腾好久让 Gemini 给我生成代码修复都没解决,后面我提供了一种思路,直接重新画。
读取现有 AM_0 图层的 AcDbPolyline 矩形框坐标、大小,然后把现有的矩形框全部删除,按读取的位置和大小重新绘制就行了。
现在可以识别出图框了

下面是 LISP 代码,复制代码粘贴到 AutoCAD 下方的键入命令框中回车,然后执行RebuildFrames命令即可

(defun c:RebuildFrames (/ ss i ent vObj minPt maxPt p1 p3 p2 p4)
(vl-load-com)
;; 1. 获取所有 AM_0 层多段线
(setq ss (ssget "X" '((0 . "LWPOLYLINE") (8 . "AM_0"))))
(if ss
(progn
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq vObj (vlax-ename->vla-object ent))
;; 2. 获取该对象的几何外接矩形
(vla-getboundingbox vObj 'minPt 'maxPt)
(setq p1 (vlax-safearray->list minPt)) ; 左下角 (x y z)
(setq p3 (vlax-safearray->list maxPt)) ; 右上角 (x y z)
;; 计算四个标准顶点(取 XY 坐标)
(setq p2 (list (car p3) (cadr p1))) ; 右下角
(setq p4 (list (car p1) (cadr p3))) ; 左上角
;; 3. 删除旧图元
(entdel ent)
;; 4. 使用标准的 4 点矩形数据重绘
;; 顺时针或逆时针排列点均可,(70 . 1) 会自动将第 4 点连回第 1 点
(entmake
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(8 . "AM_0")
'(90 . 4) ; 顶点数量
'(70 . 1) ; 闭合标志:必须为 1 才能闭合最后一段
(cons 10 (list (car p1) (cadr p1))) ; 1. 左下
(cons 10 (list (car p2) (cadr p2))) ; 2. 右下
(cons 10 (list (car p3) (cadr p3))) ; 3. 右上
(cons 10 (list (car p4) (cadr p4))) ; 4. 左上
'(210 0.0 0.0 1.0) ; 明确指定法向量,防止显示异常
)
)
(setq i (1+ i))
)
(princ (strcat "\n完成!已重构 " (itoa i) " 个标准闭合矩形。"))
)
(princ "\n未发现可处理的对象。")
)
(princ)
)
AutoCAD Mechanical 图纸文件移动后,批量打印无法识别图框
