Search code examples
pythontagstraversaldm-script

How do I travel through TagGroups in python dm-script


How do I use unknown structures of TagGroups in in python?


TagGroups are widely used in DigitalMicrograph. But how do I travel through them in python? How do I get all available tag names?

In normal dm-script there are functions like TagGroupGetTagLabel() and TagGroupGetTagType(). One can use a for-loop to check the structure. But there is not a single function in the python wrapper class Py_TagGroup to get information about the labels. Also the examples never deal with unknown TagGroups.


I have a very simple problem: I want to use (show, modify, check, save, ...) the tags from an image. But I don't know the tag names.

img = camera.AcquireImage()
tg = img.GetTagGroup()

But now what? I don't know anything about this TagGroup. TagGroups are not iterable so I cannot use them in for-loops. I can get their length but I can only access data at indices. And that only if I know the datatype. Neither can I get the type nor the label.


So again: How can I travel through TagGroups in python in ? How can I get the structure?


Solution

  • The Python module execdmscript on GitHUB with (version ≥ 1.1.4) supports converting Py_TagGroups to python dicts or lists. So the following code works for me:

    import execdmscript
    
    img = camera.AcquireImage()
    tg = img.GetTagGroup()
    
    # convert the Py_TagGroup object to a python dict
    tg = execdmscript.convert_from_taggroup(tg)
    
    for key in tg:
        print(key, tg[key])
    

    Disclaimer: I am the author of the execdmscript module. Still there is no easy solution1 for this problem at the moment so I am sure this is the best solution.


    1execdmscript.convert_from_taggroup() uses the persistent tags and dm-script code for this. It involves saving the Py_TagGroup to the global tags. Since dm-script code can travel through TagGroups, the strucutre of the TagGroup is analyzed by executing dm-script code from the python interpreter. The results are saved to the persistent tags again. Then the structure is read from the global tags with python and a dict or list can be created from it.