SOLVED Move Tag Position in the Stack?

Hi,

How do I move the tag position in stack? For instance, moving the python tag into the farther right.
You can check an illustration of the problem here:
https://www.dropbox.com/s/k9apte4whn7cqvh/c4d211_move_tag_position.jpg?dl=0

Thank you

Hi @bentraje,

I came across this problem some time ago.
Have a look at: https://www.lasselauch.com/c4d-quicktip-shift-tags/

2018-07-12_11-55-22.gif

import c4d
 
def main():
    doc.StartUndo()
    sel = doc.GetActiveTags()
 
    for tag in sel:
        obj = tag.GetMain()
        taglist = obj.GetTags()
 
        for i, t in enumerate(taglist):
            if t in sel:
                index = i+1
                if index == len(taglist):
                    return
                #print """Tag: %s || Index: %s""" % (t.GetName(), i)
                doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                obj.InsertTag(t, taglist[index])
 
    doc.EndUndo()
    c4d.EventAdd()
 
if __name__=='__main__':
    main()

This was essentially my approach, it’s not bulletproof but it works if you want to send multiple tags from one index to the next.

Cheers,
Lasse

@lasselauch

Thanks for the response. Gave me an idea what code to use.
Here is my working code:

import c4d
from c4d import gui

# Select an object. 
# Hit Execute
# Sets python tag in the right most place

def main():
    tag_list = op.GetTags()
    for tag in tag_list:
        if tag.GetType() == c4d.Tpython: 
            op.InsertTag(tag, tag_list[-1])
            


    c4d.EventAdd()
main()

Hi @bentraje, thanks for reaching out us.

With regard to the solutions offered by @lasselauch - kudos Lasse - I have to remind that you're both benefiting of a automatism found in the Python implementation of the BaseObject::InsertTag(): when the method is called in Python, before inserting the tag, it first gets removed from the previous owner and then is inserted in the new one.
This is very convenient and delivered for free in the Python implementation, in C++ this is not and this should be took in consideration.

Finally, one note about the code design: it could lead to unpredictable results, especially on more complex scenarios, re-ordering a list while iterating on the same list. I would rather suggest iterating on list and operate the reorder on a copy of such list.

Cheers, R

@r_gigante

Gotcha. Thanks for the warning.