2

我正在使用下面的代码从.dxf 中的所有TEXT项目中返回一个字符串

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

这运作良好,所以我想对所有MTEX​​T项目做同样的事情。通过阅读文档,我将以下内容放在一起;

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

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

>>>   '{\\Fsimplex|c0;TEXT THAT I WANT}'
4

1 回答 1

3

您在 MText 内容中看到的附加信息是 MText 格式代码。

当通过 MText 编辑器应用格式覆盖时(与应用到 MText 对象引用的文本样式相反),格式使用嵌入在文本内容中的格式代码进行编码。此类格式代码在 AutoCAD 中不可见,但用于适当地渲染代码所包含的文本内容的各个部分 - 在您的情况下,格式代码:

{\\Fsimplex|c0;TEXT THAT I WANT}

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

据我所知,不包含允许您获取删除所有格式代码的文本内容的方法,但是在使用该属性获取内容后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
                               '(
                                    ("\032"     . "\\\\\\\\")
                                    (" "        . "\\\\P|\\n|\\t")
                                    ("$1"       . "\\\\(\\\\[ACcFfHKkLlOopQTW])|\\\\[ACcFfHKkLlOopQTW][^\\\\;]*;|\\\\[ACcFfKkHLlOopQTW]")
                                    ("$1$2/$3"  . "([^\\\\])\\\\S([^;]*)[/#\\^]([^;]*);")
                                    ("$1$2"     . "\\\\(\\\\S)|[\\\\](})|}")
                                    ("$1"       . "[\\\\]({)|{")
                                    ("\\$1$2$3" . "(\\\\[ACcFfHKkLlOoPpQSTW])|({)|(})")
                                    ("\\\\"     . "\032")
                                )
                                (vlax-put-property rgx 'pattern (cdr pair))
                                (setq str (vlax-invoke rgx 'replace str (car pair)))
                            )
                        )
                    )
                )
            )
        )
        str
    )
)

对于您的示例文本字符串,上面将返回:

_$ (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
于 2020-02-27T13:25:14.967 回答