【问题标题】:How do I return the string within 'MTEXT' with ezdxf?如何使用 ezdxf 返回“MTEXT”中的字符串?
【发布时间】:2020-06-11 01:07:05
【问题描述】:

我正在使用以下代码从 .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}'

【问题讨论】:

    标签: python-3.x dxf ezdxf


    【解决方案1】:

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

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

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

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

    据我所知, 不包括 methods,这将允许您获取删除所有格式代码的文本内容,但是在使用 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
    

    【讨论】:

    • 谢谢,我会走正则表达式的路线。你知道什么是“c0;”吗?是为了?我在您链接的 Autodesk 格式设置页面中看不到任何解释这一点的内容。
    • 不客气。我认为c0 最初旨在将颜色更改编码为字体更改的一部分,因为您还可以使用诸如{\\fVerdana|b1|i1|c0|p34;abc} 之类的代码来编码字体、粗体、斜体和段落格式,但 Autodesk 似乎已经决定使用单独的\\C 代码代替颜色。
    • 啊!这是代码页 - 非常感谢 @AndrewTruckle 填补我的知识空白。
    • 从 dxfgrabber 到 ezdxf 中添加了 plain_text() 方法以返回没有格式代码的 MTEX​​T 内容,在下一版本 0.11.1 中可用。
    猜你喜欢
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2021-08-23
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多