CAD插件分享:如何将多个单行文字(Text)一键转为属性定义(AttDef)?
我们在制作CAD动态块、图框或明细表时,通常需要使用属性定义 。 但在实际绘图中,为了排版方便,我们往往习惯先用普通的“单行文字”把内容排好位置、调好大小。
等到要制作成块的时候,痛苦就来了:你需要删掉文字,用 ATT 命令重新创建属性,还得重新对齐坐标……
今天分享一段不到60行的 Lisp 代码,它的功能很简单:把你选中的普通文字,瞬间变成属性定义。
【代码分享】
(defun c:T2A (/ ss n ent ent_data str pt lay hgt sty wid tag_val)(prompt "\nSelect text to convert: ")(setq ss (ssget '((0 . "TEXT"))))(if ss(progn(setq n 0)(repeat (sslength ss)(setq ent (ssname ss n))(setq ent_data (entget ent));; --- 1. 获取原文字信息 ---(setq str (cdr (assoc 1 ent_data))) ; 内容(setq pt (cdr (assoc 10 ent_data))) ; 坐标(setq lay (cdr (assoc 8 ent_data))) ; 图层(setq hgt (cdr (assoc 40 ent_data))) ; 高度(setq sty (cdr (assoc 7 ent_data))) ; 样式;; [新增修复] 获取宽度因子 (DXF 41)(setq wid (cdr (assoc 41 ent_data)))(if (null wid) (setq wid 1.0)) ; 如果获取不到,默认为1.0;; --- 2. 处理标签 (Tag) ---(setq tag_val str)(if vl-string-translate(setq tag_val (vl-string-translate " " "_" str)));; --- 3. 创建属性定义 ---(entmake (list'(0 . "ATTDEF")'(100 . "AcDbEntity")(cons 8 lay)'(100 . "AcDbText")(cons 10 pt)(cons 40 hgt)(cons 41 wid) ; [新增修复] 这里应用宽度因子(cons 1 str)(cons 7 sty)'(100 . "AcDbAttributeDefinition")(cons 3 str)(cons 2 tag_val)'(70 . 0)))(entdel ent)(setq n (1+ n)))(princ (strcat "\nConverted: " (itoa n))))(princ "\nNo text selected."))(princ))
【使用方法】
-
加载插件:在 CAD 中输入命令
AP(Appload),找到刚才保存的TextToAtt.lsp并加载。或者直接把文件拖入 CAD 绘图区。 -
运行命令:输入快捷键
T2A(Text to Attribute)。 -
选择对象:框选你需要转换的一个或多个单行文字,回车。
-
完成:文字已变为属性定义!
【注意事项】
-
关于标签:由于属性的“标签(Tag)”不允许包含空格,插件会自动将空格替换为下划线
_。 -
最后一步:转换完成后,这些对象目前只是“属性定义”,你必须用
B(Block) 命令将它们制作成块,它们才会变成真正的可编辑属性。
夜雨聆风
