ezdxf как извлечь теги, связанные с текстом в макете блока, из файла чертежа САПР

Как извлечь тег, связанный с текстовым значением, из макета блока чертежа CAD (.drw или.dwg).

Вот скриншот:

чертежный файл с разметкой формата

Например, TITLE - это заголовок, который входит в макет формата чертежа, DESC - это текстовый тег, связанный с содержимым TITLE "BASE". Как я могу извлечь DESC (&TITLE) с содержимым TITLE.

Я попытался просмотреть файл DXF в блокноте, но не имеет этих записей тегов. Есть ли способ извлечь не только текст, но и связанный тег?

2 ответа

Как уже упоминалось в названии ezdxf, ezdxf работает с файлами DXF, а не с файлами DWG или DRW, в отличие от DXF, это DWG - недокументированный двоичный кодированный формат файла AutoCAD.

Может быть, вы можете экспортировать ваши файлы как файлы DXF, чтобы обработать их с помощью ezdxf:

Сценарий 1, ATTRIB прикреплен к блоку ссылки INSERT:

doc = ezdxf.readfile('YourFile.dxf')
msp = doc.modelspace()
# block reference attributes (tags) are stored in the INSERT entity
for insert in msp.query('INSERT')
    print(str(insert))
    for attrib in insert.attribs():
        print("Tag: {}, Value: {}".format(attrib.dxf.tag, attrib.dxf.text))

Сценарий 2, ATTRIB, MTEXT или TEXT как отдельная сущность в пространстве модели или в пространстве документов:

msp = doc.modelspace()
# or getting paperspace:
# psp = doc.layout('TabName')
# search for ATTRIB entities
for attrib in msp.query('ATTRIB')
    print("Tag: {}, Value: {}".format(attrib.dxf.tag, attrib.dxf.text))
# search for MTEXT entities
for mtext in msp.query('MTEXT')
    print("MTEXT content: {}".format(mtext.get_text())
for text in msp.query('TEXT')
    print("TEXT content: {}".format(text.dxf.text)

Сценарий 3, объекты, расположенные в определениях БЛОКА:

for block in doc.blocks:
    print('searching in BLOCK definition {}'.format(block.name))
    # search for ATTRIB entities (or MTEXT and TEXT see above)
    for attrib in block.query('ATTRIB')
        print("Tag: {}, Value: {}".format(attrib.dxf.tag, attrib.dxf.text))
    # or like scenarion 1, search for INSERT with attached ATTRIB
    for insert in block.query('INSERT'):
        for attrib in insert.attribs()
            print("Tag: {}, Value: {}".format(attrib.dxf.tag, attrib.dxf.text))                

Для тех, кто плохо знаком с ezdxf (таких как я), мне потребовалось некоторое время, чтобы понять, что в сценарии 2 выше метод .get_text() в MTEXT был заменен на .text с момента выпуска ezdxfVersion 0.10 01.09.2019.

Поэтому мне пришлось заменить следующий код в сценарии 2 выше:

      # search for MTEXT entities
for mtext in msp.query('MTEXT')
print("MTEXT content: {}".format(mtext.get_text())

со следующим:

      # search for MTEXT entities
for mtext in msp.query('MTEXT')
print("MTEXT content: {}".format(mtext.text)

Кроме этого, код от mozman отлично работал для извлечения тегов, связанных с текстом в макетах (MSP или PSP).

Другие вопросы по тегам