python-3.x - 如何使用ezdxf返回 'MTEXT'内的字符串?

标签 python-3.x dxf ezdxf

我使用下面的代码从 .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}'

最佳答案

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

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

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

结果是使用 simplex 字体显示字符串 TEXT THAT I WANT

据我所知,不包括methods这将允许您获取删除了所有格式代码的文本内容,但在使用 text 获取内容时属性,然后您可以使用正则表达式来删除此类代码。

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

;; 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

关于python-3.x - 如何使用ezdxf返回 'MTEXT'内的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60426121/

相关文章:

java - 如何使用java修改dxf文件

c# - 使用 WPF ArcSegment 绘制 DXF 圆弧

python - 使用 ezdxf 接口(interface)从 Python 导出 Mesh 后无法在 Freecad 中显示 Mesh

python - 使用ezdxf描述图层属性描述时出现错误

python - 第二次 python 执行失败

python - 如何仅在必要时从套接字读取数据

python - 在Django中,如何获取通过外键连接的子对象?

c++ - 解析挤出方向 vector DXF

python-3.x - 如何告诉 Spacy 不要使用 retokenizer 将任何单词与撇号分开?