Code Vonc

Définir le chemin des textures

v 1.0

Script Python pour Cinéma 4D R13.

TéléchargerDownload
Faire un donMake a donation
Comment installer ?How to install ?
CommentairesComments


Le script modifie le chemin de toutes les textures utilisées par les matériaux sélectionnés.

Sélectionnez les matériaux à modifier avant de lancez le script vous demandant le nouveau chemin relatif des textures.





import os
import c4d
from c4d import gui

# v 1.0 - code.vonc.fr

class Dialogue(gui.GeDialog):
    annuler = True
    dossier = ""
    
    def CreateLayout(self):
        self.SetTitle("Dossier de textures")
        self.AddStaticText(13, c4d.BFH_SCALEFIT, 0, 0)
        self.GroupBegin(10, 2, 2)
        self.AddStaticText(11, c4d.BFH_SCALEFIT, 0, 0, "Dossier :", 0)
        self.AddEditText(12, c4d.BFH_SCALEFIT, 300, 0)
        self.GroupEnd()
        self.AddDlgGroup(c4d.DLG_OK|c4d.DLG_CANCEL)
        return True
    
    def InitValues(self) :
        nb = doc.GetActiveMaterials()
        nb = len(nb)
        if not nb :
            self.SetString(13, "Aucun matériau sélectionné.")
        elif nb < 2 :
            self.SetString(13, "1 matériau sélectionné.")
        else :
            self.SetString(13, str(nb) + " matériaux sélectionnés.")
            
        self.SetString(12, "textures\\")
        return True
    
    def Command(self, id, msg):
        if (id == 1):
            self.annuler = False
            self.dossier = self.GetString(12)
            self.Close()
        if (id == 2):
            self.Close()
        return True

def ChangeLien(bitmap, mat, dossier) :
    lien = bitmap[c4d.BITMAPSHADER_FILENAME]
    lien = os.path.join(dossier, os.path.basename(lien))
    bitmap[c4d.BITMAPSHADER_FILENAME] = lien
    mat.Message(c4d.MSG_UPDATE)

def main():
    dial = Dialogue()
    dial.Open(c4d.DLG_TYPE_MODAL)
    if dial.annuler : return
    
    doc.StartUndo()
    mats = doc.GetActiveMaterials()
    for mat in mats :
        tex = mat.GetFirstShader()
        while tex :
            texs = [tex]
            for t in texs :
                if t.CheckType(c4d.Xbitmap) :
                    doc.AddUndo(c4d.UNDOTYPE_CHANGE, mat)
                    ChangeLien(t, mat, dial.dossier)
                texs.extend(t.GetChildren())
            tex = tex.GetNext()
    
    doc.EndUndo()
    c4d.EventAdd()

if __name__=='__main__':
    main()