Mon premier script Python. J'ai besoin d'aide pour le tester.
Bonjour à tous.
Après avoir lu un tweet de Patrick Letourneau : https://twitter.com/PolygonSandwich/...37946457239553,
j'ai décidé de me coller à la programmation d'un script pour résoudre ce problème.
Voici donc ce qu'il est censé réaliser:
Pour chaque objet sélectionné :
- Effacer les doublons de tags de texture
- Effacer les tags de sélection vide
- Effacer les tags de texture restreint à des tag de sélection qui n'existe pas
C'est sûrement très mal programmé, je débute totalement en python, mais si vous avez l'occasion de le tester, je suis avide de retours...
Code:
import c4d
from c4d import gui
### For selected polygon objects
### - remove empty selection tags
### - remove texture tags restricted to non-existing selection tag
###
def nettoie_polygon_tag(t,anciens_tags):
""" on s'occupe des selections de polygones """
s = t.GetBaseSelect()
if s.GetCount() == 0:
t.Remove()
def nettoie_texture_tag(t,anciens_tags):
""" on s'occupe des textures """
flag_a_garder = False
if t[c4d.TEXTURETAG_RESTRICTION]:
la_restriction = t[c4d.TEXTURETAG_RESTRICTION]
# verifie si restriction existe dans selectiontag
for tt in anciens_tags:
if type(tt) is c4d.SelectionTag:
if tt.GetName() == str (la_restriction):
flag_a_garder = True
else:
flag_a_garder = True
if not flag_a_garder:
t.Remove()
def nettoie_doublon_texture_tag(tag,anciens_tags):
""" on ne garde que la derniere texture """
tags_tex_liste = []
for tt in anciens_tags:
if type(tt) is c4d.TextureTag:
if not tt[c4d.TEXTURETAG_RESTRICTION]:
tags_tex_liste.append(tt)
## tt.Remove()
## remet le dernier
print tags_tex_liste
print (len (tags_tex_liste) )
def nettoie_tags(o):
"""
Nettoyage des Tags
"""
### Passe 1 : virer tag textures doublons
anciens_tags = o.GetTags()
for tag in anciens_tags:
if type(tag) is c4d.TextureTag:
tags_tex_liste = []
for tag in anciens_tags:
if type(tag) is c4d.TextureTag:
if not tag[c4d.TEXTURETAG_RESTRICTION]:
tags_tex_liste.append(tag)
tag.Remove()
c4d.EventAdd()
## Passe 2 : remetre le dernier tag texture
if len (tags_tex_liste) > 0:
le_dernier_tag = tags_tex_liste[len(tags_tex_liste) - 1]
print le_dernier_tag
o.InsertTag(le_dernier_tag)
c4d.EventAdd()
### Passe 3 : virer selection polygones vides
anciens_tags = o.GetTags()
for tag in anciens_tags:
if type(tag) is c4d.SelectionTag:
nettoie_polygon_tag(tag,anciens_tags)
c4d.EventAdd()
### Passe 4 : virer tag textures dont la restriction n'existe pas
anciens_tags = o.GetTags()
for tag in anciens_tags:
if type(tag) is c4d.TextureTag:
nettoie_texture_tag(tag,anciens_tags)
c4d.EventAdd()
def main():
ledoc = c4d.documents.GetActiveDocument() ## type : c4d.documents.BaseDocument
laselection = ledoc.GetActiveObjects(0) ## type : list
ledoc.StartUndo()
for ob in laselection: ## type: c4d.PolygonObject
doc.AddUndo(c4d.UNDOTYPE_CHANGE,ob)
nettoie_tags(ob)
ledoc.EndUndo()
c4d.EventAdd()
if __name__=='__main__':
main()
Besoin d'aide sur un problème du même genre je pense
Bonjour,
Je suis sur c4d r20 et ça fait plus de 6 heures que je cherche désespérément à écrire un script python qui sélectionne tous tags de texture assignés aux objets de scène, puis qui change la valeur de restriction (TEXTURETAG_RESTRICTION) à "0".
Ca désactiverait toutes les textures, également dans le live viewport d'octane.
Pour le moment, je débute et ça m'a donc pris des lustres pour comprendre un peu le language et écrire cela :
Code:
import c4dfrom c4d import gui
def main():
c4d.CallCommand(300001025) # Select All
c4d.CallCommand(16370, 16370) # Select Texture Tags/Objects
s = doc.GetActiveTags()
for i in s:
tag(i)[c4d.TEXTURETAG_RESTRICTION] = "off#"
c4d.EventAdd()
if __name__=='__main__':
main()
Quand j’exécute, ça sélectionne tous tags de texture assignés aux objets de scène mais impossible de changer les valeurs de restriction sur tous en même temps.
Auriez-vous une solution ?
Merci d'avance !
Antoka