本人正在编写一个AutoCAD LISP程序,用来实现天正文字转CAD文字。目前图形内的文字已经可以实现转换,但是块内天正文字无法转CAD文字。运行环境AutoCAD2025+天正T30V1.0,有人能帮忙解决吗?

本人正在编写一个AutoCAD LISP程序,用来实现天正文字转CAD文字。目前图形内的文字已经可以实现转换,但是块内天正文字无法转CAD文字。运行环境AutoCAD2025+天正T30V1.0,有人能帮忙解决吗?

上午好☀️☀️☀️️
本答案参考通义千问
在AutoCAD中,使用LISP编程处理块内天正文字(TText)转为标准CAD文字(MText或Text)时,确实会遇到一些挑战。由于天正文字是自定义的实体类型(如 TTEXT),它们通常嵌套在块(Block)中,因此需要特别处理。
你目前的程序可以处理图层上的天正文字,但块内的天正文字无法被识别和转换。这是因为:
TTEXT 的形式存在;TTEXT 类型;以下是详细的解决方案,帮助你实现“块内天正文字转CAD文字”的功能:
使用 entnext 和 vlax-cdr 遍历块中的实体。
(defun get-block-entities (blk-name / ent)
(setq ent (tblobjname "BLOCK" blk-name))
(if ent
(progn
(setq entities nil)
(while ent
(setq entities (cons ent entities))
(setq ent (entnext ent)))
entities)
nil
)
)
天正文字的实体类型为 "TTEXT",可以通过 entget 获取其类型信息。
(defun is-ttext (ent)
(= (cdr (assoc 0 (entget ent))) "TTEXT")
)
为了处理嵌套块,需要使用递归函数。
(defun process-blocks ()
(foreach blk (mapcar 'car (ssnamex (ssget "X" '((0 . "BLOCK")))))
(process-block blk)
)
)
(defun process-block (blk-name)
(let ((ents (get-block-entities blk-name)))
(foreach ent ents
(if (is-ttext ent)
(convert-ttext-to-mtext ent) ; 转换函数
)
(if (and (eq (cdr (assoc 0 (entget ent))) "INSERT")
(not (member (cdr (assoc 2 (entget ent))) '("TTEXT" "MTEXT" "TEXT"))))
(process-block (cdr (assoc 2 (entget ent)))) ; 递归处理子块
)
)
)
)
你可以通过获取天正文字的属性(如文字内容、位置、高度、字体等),然后创建新的 MText 或 Text 实体。
(defun convert-ttext-to-mtext (ttext-ent)
(let*
(
(ent-data (entget ttext-ent))
(pos (cdr (assoc 10 ent-data))) ; 文字位置
(text (cdr (assoc 1 ent-data))) ; 文字内容
(height (cdr (assoc 40 ent-data))) ; 高度
(style (cdr (assoc 7 ent-data))) ; 字体样式
(angle (cdr (assoc 50 ent-data))) ; 角度
(layer (cdr (assoc 8 ent-data))) ; 图层
)
(command "_-mtext" pos height text)
(setq new-ent (entlast))
(entmod (append (entget new-ent)
(list (cons 7 style) (cons 50 angle) (cons 8 layer))))
(entdel ttext-ent)
)
)
TTEXT 的具体结构,以确保提取字段的准确性;entdel 删除原天正文字前,请确保新文字已成功创建。(defun c:tt2cad ()
(process-blocks)
(princ "\n已转换所有块内的天正文字。")
)
TTEXT,则调用 convert-ttext-to-mtext;INSERT(即子块),则递归处理;TEXT 而非 MText;如果你能提供当前代码片段,我可以帮你更精确地修改。希望以上方案能解决你的问题!如有更多疑问,欢迎继续提问。