Найти сущность .dxf на основе дескриптора с библиотекой EZDXF - PullRequest
0 голосов
/ 28 февраля 2020

Я использовал Autocad API для заполнения атрибутов блока на основе (предварительно определенного) идентификатора дескриптора. Вот пример реализации:

    frame1 = acad.ActiveDocument.HandleToObject('18CA1')
    frame2 = acad.ActiveDocument.HandleToObject('77CE9')

    frames = [frame1, frame2]


    for i in range(len(frames)):
        for attrib in frames[i].GetAttributes():
            if attrib.TagString == 'DATE':
                attrib.TextString = datasource.date
            if attrib.TagString == 'CLIENT_NAME':
                attrib.TextString = datasource.client_name
            attrib.Update()

Теперь я хочу реализовать ту же функциональность, используя библиотеку ezdxf. Я просто не смог найти метод, похожий на .HandleToObject ("xxx") . Основываясь на следующем коде, я определил, что идентификаторы идентификатора действительно такие же, как в реализации autocad.

modelspace = dxf.modelspace()

for e in modelspace:
    if e.dxftype()== 'TEXT':
        print("text: %s\n" % e.dxf.text)
        print("handle: %s\n" % e.dxf.handle)

Возможно ли это в ezdxf? Я составил списки всех описанных дескрипторов c, которые мне нужно изменить, и в идеале я бы предпочел перебирать этот список, а не перебирать все сущности, чтобы проверить их дескриптор.

1 Ответ

3 голосов
/ 28 февраля 2020

ezdxf сохраняет все сущности документа DXF в базе данных сущностей по их дескриптору в качестве ключа:

doc = ezdxf.new()
msp = doc.modelspace()
p = msp.add_point((0, 0))

Извлечение сущностей с помощью оператора индекса:

p1 = doc.entitydb[p.dxf.handle]
assert p1 is p

Этот метод вызывает KeyError, если дескриптор не существует, функция get() возвращает None, если дескриптор не существует:

p2 = doc.entitydb.get(p.dxf.handle)
assert p2 is p
assert doc.entitydb.get('ABBA') is None
...