0

I've been using the Autocad API to fill out block attributes based on the (pre determined) handle ID. Here is a sample of the implementation:

    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()

Now I want to implement the same functionality using the ezdxf library. I just haven't been able to find a method similar to .HandleToObject("xxx"). Based off the following code I determined that the handle ID's are indeed the same as in the autocad implementation.

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)

Would this be possible in ezdxf? I have made lists of all the specific handles I need to change and ideally I'd rather iterate over that list than having to iterating over all entities to check their handle.

Jowizo
  • 57
  • 1
  • 5

1 Answers1

3

ezdxf stores all entities of a DXF document in the entity database by their handle as key:

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

Retrieve entities by index operator:

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

This method raises a KeyError if the handle doesn't exist, the get() function returns None if the handle doesn't exist:

p2 = doc.entitydb.get(p.dxf.handle)
assert p2 is p
assert doc.entitydb.get('ABBA') is None
mozman
  • 2,001
  • 8
  • 23