如何使用 ezdxf return 'MTEXT' 中的字符串?

How do I return the string within 'MTEXT' with ezdxf?

我正在使用下面的代码 return 来自 .dxf

中所有 TEXT 项目的字符串
    for i in m_space.query('TEXT'):
        return(str(i.dxf.text))

这很好用,所以我想对所有 MTEXT 项目做同样的事情。 From reading the docs 我整理了以下内容;

    for i in m_space.query('MTEXT'):
        return(str(i.text))

但输出似乎包含一些额外的数据。我可以使用一些正则表达式来获取我需要的文本,但想知道 ezdxf

是否有更好的内置方法
>>>   '{\Fsimplex|c0;TEXT THAT I WANT}'

您在多行文字内容中看到的附加信息是多行文字格式代码。

当通过多行文字编辑器应用格式覆盖(而不是应用于多行文字对象引用的文本样式)时,格式使用嵌入在文本内容中的 formatting codes 进行编码。此类格式代码在 AutoCAD 中不可见,但用于适当地呈现代码所包含的文本内容的各个部分 - 在您的情况下,格式代码:

{\Fsimplex|c0;TEXT THAT I WANT}

导致字符串 TEXT THAT I WANT 使用 simplex 字体显示。

据我所知, does not include methods which will allow you obtain the text content with all formatting codes removed, but upon obtaining the content using the text 属性,然后您可以使用正则表达式删除此类代码。

为了提供一个现有示例,我之前开发了以下 AutoLISP 函数,它使用正则表达式删除所有格式代码,但可能还有其他方法来表达 RegEx 模式并获得相同的结果:

;; Quick Unformat  -  Lee Mac
;; Returns a string with all MText formatting codes removed.
;; rgx - [vla] Regular Expressions (RegExp) Object
;; str - [str] String to process

(defun LM:quickunformat ( rgx str )
    (if
        (null
            (vl-catch-all-error-p
                (setq str
                    (vl-catch-all-apply
                       '(lambda nil
                            (vlax-put-property rgx 'global     actrue)
                            (vlax-put-property rgx 'multiline  actrue)
                            (vlax-put-property rgx 'ignorecase acfalse) 
                            (foreach pair
                               '(
                                    ("2"     . "\\\\")
                                    (" "        . "\\P|\n|\t")
                                    (""       . "\\(\\[ACcFfHKkLlOopQTW])|\\[ACcFfHKkLlOopQTW][^\\;]*;|\\[ACcFfKkHLlOopQTW]")
                                    ("/"  . "([^\\])\\S([^;]*)[/#\^]([^;]*);")
                                    (""     . "\\(\\S)|[\\](})|}")
                                    (""       . "[\\]({)|{")
                                    ("\" . "(\\[ACcFfHKkLlOoPpQSTW])|({)|(})")
                                    ("\\"     . "2")
                                )
                                (vlax-put-property rgx 'pattern (cdr pair))
                                (setq str (vlax-invoke rgx 'replace str (car pair)))
                            )
                        )
                    )
                )
            )
        )
        str
    )
)

对于您的示例文本字符串,上面的内容会 return:

_$ (setq rgx (vlax-create-object "vbscript.regexp"))
#<VLA-OBJECT IRegExp2 00000000315de460>
_$ (LM:quickunformat rgx "{\Fsimplex|c0;TEXT THAT I WANT}")
"TEXT THAT I WANT"
_$ (vlax-release-object rgx)
0