edata 发表于 2010-9-13 17:27:00

[讨论]将字段转换为文字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)
)

gzbccy 发表于 2013-8-9 12:43:28

没看懂什么意思

oyj9 发表于 2015-4-10 10:51:08

好东西,我配铝模板正好用上了。哈哈

oyj9 发表于 2015-4-10 10:56:05

令: FLD2TXT 请选择需要转换的对象(块,单行/多行文字,标注):
选择对象: 指定对角点: 找到 6 个
选择对象:; 错误: 参数类型错误: lentityp nil
多选的时候出错了

hadessna 发表于 2021-4-12 19:31:41

帮大忙了啊,500多张图打算复制黏贴来着,抱着试试的心态来找找居然找到了

l982414603 发表于 2021-9-19 14:10:38

帮大忙了啊,500多张图打算复制黏贴来着,抱着试试的心态来找找居然找到了

yjtdkj 发表于 2022-7-1 12:16:28

有一点小错误,我修正了一下
;;;将字段转换为文字.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)
)

Aries 发表于 2022-9-2 18:53:42

好像高版本   直接X 炸开也可以

jkop 发表于 2023-8-8 17:53:41

常用字段功能才会碰到的困扰,顶一个!

xiaoquansb 发表于 2024-10-12 17:14:26

用了字段,分图会很困扰
页: [1]
查看完整版本: [讨论]将字段转换为文字lisp