我使用下面的代码从 .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
。
据我所知,ezdxf不包括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/