Как мне вернуть строку в MTEXT с помощью ezdxf? - PullRequest
2 голосов
/ 27 февраля 2020

Я использую приведенный ниже код для возврата строки из всех TEXT элементов в .dxf

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

Это работает хорошо, поэтому я хотел бы сделать то же самое для всех MTEXT предметов. Из чтения документов Я собрал ниже:

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

Но вывод, кажется, включает некоторые дополнительные данные. Я мог бы использовать некоторое регулярное выражение, чтобы получить текст, который мне нужен, но хотел бы знать, есть ли лучший способ, встроенный в ezdxf

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

1 Ответ

2 голосов
/ 27 февраля 2020

Дополнительная информация, которую вы видите в содержимом 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
...