Change tags order on a specific object
-
On 10/05/2018 at 08:11, xxxxxxxx wrote:
Hi, thanks to MaximeA i've been able to achieve the first part of a little script i wanted to make to generate an UVW tag and rename it with a specific name. Now i would like to change the order of the different tags that my object contains.
Let's say i have a polygon object with an UVW and a material tag, then i create the second UVW tag with my script. C4D adds this third tag on the left position of the list. I would like to recover the first original uvw tag and place it after my material on the list (originally, it is just before, on its left).
And as for the first part of this project, i can't find anything on the documentation about such an action. So, is it possible and which way should i take to achieve this?
Thanxs a lot
NicoMy original code
import c4d from c4d import documents, plugins from c4d import gui #Welcome to the world of Python def main() : doc = c4d.documents.GetActiveDocument() obj = doc.GetActiveObject() if obj is None: gui.MessageDialog('Select an object first') return tags = obj.GetTags() matTag = obj.GetTag(c4d.Ttexture) if matTag is None: gui.MessageDialog('Insert a material first') matTag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_CUBIC uvwTag = c4d.utils.GenerateUVW(obj, obj.GetMg(), matTag, obj.GetMg()) uvwTag.SetName("CUBIC") newName = uvwTag.GetName() finalName = gui.RenameDialog(newName) uvwTag.SetName(finalName) obj.InsertTag(uvwTag) matTag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_UVW c4d.EventAdd(); if __name__=='__main__': main()
-
On 10/05/2018 at 09:12, xxxxxxxx wrote:
Just to be sure I've understood your request correctly ...
You start with following situation:<object> | <script- generated uvw> <original uvw> <material>
and you want to be able to modify it to the following:
<object> | <script- generated uvw> <material> < original uvw>
I know you can specify the location of a tag when you perform the InsertTag(), as such you would be able to control where your script-generated tag will be put. But not sure you can alter the list afterwards.
The only thing that comes to mind is clone the original UVW tag and insert it at the end of the list then remove the original one. -
On 11/05/2018 at 02:43, xxxxxxxx wrote:
Hi Nicolelectro,
Keep in mind tag/object inherit from BaseList2D which inherit from GeListNode.
That means you can use InsertAfter/Before in order to change the order of your tagCheers,
Maxime -
On 20/05/2018 at 06:42, xxxxxxxx wrote:
Hi and thank you both. I was away for a few days and I'll look into it. Have a great day.
Nico -
On 21/05/2018 at 02:31, xxxxxxxx wrote:
Thanks, guys. It works perfectly. Is there anything I could improve in this code. Is everything all right? The SDK documentation and web examples are really hard to understand (even finding them is a headache). Without basic knowledge, it's very complicated to progress
import c4d from c4d import documents, plugins from c4d import gui #Welcome to the world of Python def main() : doc = c4d.documents.GetActiveDocument() obj = doc.GetActiveObject() #SELECTION OBJET if obj is None: gui.MessageDialog('Select an object first') return tags = obj.GetTags() matTag = obj.GetTag(c4d.Ttexture) baseUV = obj.GetTag(c4d.Tuvw) #print baseUV baseProjection = matTag[c4d.TEXTURETAG_PROJECTION] #Stocke la projection initiale #print baseProjection if matTag is None: gui.MessageDialog('Insert a material first') matTag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_CUBIC uvwTag = c4d.utils.GenerateUVW(obj, obj.GetMg(), matTag, obj.GetMg()) uvwTag.SetName("CUBIC") newName = uvwTag.GetName() # Récupère le nom du tag #print newName finalName = gui.RenameDialog(newName) #fenêtre dialogue uvwTag.SetName(finalName) #Renomme le tag définitivement #print finalName errorName = uvwTag.GetName() #Si on annule la fenêtre de nommage if errorName == "None": uvwTag.SetName("CUBIC") obj.InsertTag(uvwTag) matTag[c4d.TEXTURETAG_PROJECTION] = baseProjection #redonne la projection initiale #CHANGEMENT DE POSITION DU TAG INITIAL lastUV = baseUV.GetClone() lastUV.InsertAfter(matTag) baseUV.Remove() c4d.EventAdd(); if __name__=='__main__': main()