[讨论]将字段转换为文字lisp
自AutoCAD2004之后的版本,增加了一个字段命令,字段是包含说明的文字,这些说明用于显示可能会在图形生命周期中修改的数据,后续版本的图纸集也使用了字段功能来排序等等。没有值的字段将显示连字符 (----)。 例如,在“图形特性”对话框中设置的“作者”字段可能为空。 无效字段将显示井号 (####)。 例如,“当前图纸名”字段仅在图纸空间中有效,将它放置到模型空间中则显示井号。
我们通常在编辑或分开某些含有字段的图形的时候,就会丢失字段链接对象,造成无效字段。
为了避免出现此类问题,可以通过转换为文字来解决,因此有了下面的lisp。
;将字段转换为文字.lsp
;modified by edata
;setupdata@qq.com
;2010年9月13日17:07:08
(vl-load-com)
(defun c:FLD2TXT (/ ss n bn an ad s)
(prompt
"请选择需要转换的对象(块,单行/多行文字,标注): "
)
(setq ss (ssget '((0 . "INSERT,MTEXT,DIMENSION,TEXT,MULTILEADER"))))
(setq n 0)
(while (< n (sslength ss))
(setq bn (ssname ss n))
(setq ad (entget bn))
(cond
((= "INSERT" (cdr (assoc 0 ad)))
(setq an (entnext bn))
(while (and an
(setq ad (entget an))
(= "ATTRIB" (cdr (assoc 0 ad)))
)
(setq s (cdr (assoc 1 ad)))
(entmod (list (assoc -1 ad) (cons 1 "")))
(entmod (list (assoc -1 ad) (cons 1 s)))
(entupd an)
(setq an (entnext an))
)
)
((= "MULTILEADER" (cdr (assoc 0 ad)))
(setq ad (vlax-ename->vla-object bn)
s (vla-get-TextString ad)
)
(vla-put-TextString ad "")
(vla-put-TextString ad s)
)
((= "MTEXT" (cdr (assoc 0 ad)))
(setq ad (vlax-ename->vla-object bn)
s (vla-get-TextString ad)
)
(vla-put-TextString ad "")
(vla-put-TextString ad s)
)
(t
(setq s (cdr (assoc 1 ad)))
(entmod (list (assoc -1 ad) (cons 1 "")))
(entmod (list (assoc -1 ad) (cons 1 s)))
(entupd an)
)
)
(setq n (1+ n))
)
(setq ss nil)
(gc)
(princ)
)
没看懂什么意思 好东西,我配铝模板正好用上了。哈哈 令: FLD2TXT 请选择需要转换的对象(块,单行/多行文字,标注):
选择对象: 指定对角点: 找到 6 个
选择对象:; 错误: 参数类型错误: lentityp nil
多选的时候出错了 帮大忙了啊,500多张图打算复制黏贴来着,抱着试试的心态来找找居然找到了 帮大忙了啊,500多张图打算复制黏贴来着,抱着试试的心态来找找居然找到了 有一点小错误,我修正了一下
;;;将字段转换为文字.lsp;modified by edata;setupdata@qq.com;2010年9月13日17:07:08
;;;modified by yjtdkj---------------yjtdkj8156262@163.com-------------2022.07.01
(vl-load-com)
(defun c:FLD2TXT (/ ss n bn an ad s)
;;;========更新图元组码===========================yjtdkj.2021.07======
;;;参数
;;;en 图元名
;;;number群码代号(整数)
;;;content 更新后的新内容
;;;返回:无
(defun put-dxf (en number content / en_data new-list old-list)
(setq en_data (entget en))
(setq old-list (assoc number en_data))
(setq new-list (cons number content))
(setq en_data (subst new-list old-list en_data))
(entmod en_data)
(entupd en)
) ;_ 结束defun
(prompt "请选择需要转换的对象(块,单行/多行文字,标注): ")
(setq ss (ssget '((0 . "INSERT,MTEXT,DIMENSION,TEXT,MULTILEADER"))))
(setq n 0)
(while (< n (sslength ss))
(setq bn (ssname ss n))
(setq ad (entget bn))
(cond ((= "INSERT" (cdr (assoc 0 ad)))
(setq an (entnext bn))
(while (and an
(setq ad (entget an))
(= "ATTRIB" (cdr (assoc 0 ad)))
)
(setq s (cdr (assoc 1 ad)))
(put-dxf an 1 "")
(put-dxf an 1 s)
;(entmod (list (assoc -1 ad) (cons 1 "")))
;(entmod (list (assoc -1 ad) (cons 1 s)))
;(entupd an)
(setq an (entnext an))
)
)
((= "MULTILEADER" (cdr (assoc 0 ad)))
(setq ad (vlax-ename->vla-object bn)
s(vla-get-TextString ad)
)
(vla-put-TextString ad "")
(vla-put-TextString ad s)
)
((= "MTEXT" (cdr (assoc 0 ad)))
(setq ad (vlax-ename->vla-object bn)
s(vla-get-TextString ad)
)
(vla-put-TextString ad "")
(vla-put-TextString ad s)
)
((= "DIMENSION" (cdr (assoc 0 ad)))
(setq ad (vlax-ename->vla-object bn)
s(vla-get-TextOverride ad)
)
(vla-put-TextOverride ad "")
(vla-put-TextOverride ad s)
)
(t
(setq s (cdr (assoc 1 ad)))
(put-dxf bn 1 "")
(put-dxf bn 1 s)
;(entmod (list (assoc -1 ad) (cons 1 "")))
;(entmod (list (assoc -1 ad) (cons 1 s)))
;(entupd ad)
)
)
(setq n (1+ n))
)
(setq ss nil)
(gc)
(princ)
)
好像高版本 直接X 炸开也可以 常用字段功能才会碰到的困扰,顶一个! 用了字段,分图会很困扰
页:
[1]