Un script qui permet de sélectionner tous les matériaux utilisant une image, lancez le script et choisissez l’image dans la liste.
Un script qui a démarré sur cette discussion initiée par Niko du forum de Frenchcinema4d. L’icône est de Paradox
Lancez le script et choisissez l’image dans la liste déroulante, puis bouton OK. Tous les matériaux qui utilisent l’image seront sélectionnés.
import c4d
import os.path
class MonDlg(c4d.gui.GeDialog):
"""Dialogue pour le choix de l'image, avec liste dérouante de toutes les images
utilisées dans les différents matériaux du doc"""
def __init__(self,lst):
self.lst = lst
self.choix = lst[0]
def CreateLayout(self):
self.SetTitle("Sélecteur de matériau par image ")
self.GroupBegin(1000,flags=c4d.BFH_SCALEFIT, cols=2, rows=1)
self.GroupBorderSpace(10, 10, 10, 0)
self.AddStaticText(1001,name="Image : ", flags=c4d.BFH_MASK, initw=100)
self.AddComboBox(1002,flags=c4d.BFH_MASK, initw=250)
self.GroupEnd()
self.GroupBegin(2000,flags=c4d.BFH_CENTER, cols=2, rows=1)
self.GroupBorderSpace(10, 10, 10, 0)
self.AddButton(2001, flags=c4d.BFH_CENTER, initw=100, name="OK")
self.AddButton(2002, flags=c4d.BFH_CENTER, initw=100, name="Annuler")
self.GroupEnd()
return True
def InitValues(self):
for i,n in enumerate(self.lst):
self.AddChild(1002,i,n)
return True
def Command(self,id,msg):
if id==1002 :#choix dans la liste
self.choix = self.lst[self.GetLong(1002)]
if id==2001:#bouton ok
selectMatImg(self.choix)
self.Close()
if id==2002:#bouton annuler
self.Close()
return True
def searchBitmap(shd, liste):
"""fonction récursive qui renvoie une liste avec les noms des fichiers images
utilisés dans le shader"""
while shd:
if shd.CheckType(c4d.Xbitmap):
fn = shd[c4d.BITMAPSHADER_FILENAME]
name = os.path.basename(fn)
liste.append(name)
searchBitmap(shd.GetDown(), liste)
shd = shd.GetNext()
def getListImg(docu=doc):
"""renvoie la liste de toutes les images contenue dasn les materiaux du doc"""
return sorted([os.path.basename(tex) for i,tex in docu.GetAllTextures()])
def selectMatImg(nom_img, docu=doc):
"""selectionne les materiaux qui utilisent l'image"""
if not nom_img : return
mat = docu .GetFirstMaterial()
while mat:
lst = []
shd = mat.GetFirstShader()
searchBitmap(shd, lst)
if nom_img in lst :
mat.SetBit(c4d.BIT_ACTIVE)
else : mat.DelBit(c4d.BIT_ACTIVE)
mat = mat.GetNext()
c4d.EventAdd()
def main():
imgs = getListImg(docu=doc)
if not len(imgs):
c4d.gui.MessageDialog("Il n'y a aucune image utilisée")
return
dlg = MonDlg(imgs)
dlg.Open(c4d.DLG_TYPE_MODAL)
return
if __name__=='__main__':
main()
materiaux_par_image
icône crée par Paradox