Code Vonc

Nettoie-Mat

v 1.0

Script Python pour Cinéma 4D R13.

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

Ce script vous permet de supprimer en un clic les propriétés Texture ainsi que les sélections de polygones inutilisées sur l'objet actif.





import c4d
from c4d import gui

class Dialogue(gui.GeDialog) :
    vireTexmat = True
    vireTexpol = True
    vireSelmat = True
    
    def CreateLayout(self) :
        self.GroupBegin(100, c4d.BFH_SCALEFIT, 1, 1)
        self.GroupBorderSpace(5, 5, 5, 5)
        
        self.AddStaticText(20, c4d.BFH_FIT, 0, 0, "Supprimer :")
        self.AddCheckbox(10, c4d.BFH_SCALEFIT, 0, 0, "Les propriétés textures sans matériaux.")
        self.AddCheckbox(11, c4d.BFH_SCALEFIT, 0, 0, "Les propriétés textures sans polys affectés.")
        self.AddCheckbox(12, c4d.BFH_SCALEFIT, 0, 0, "Les sélections de polys inutilisées par les matériaux.")
        
        self.GroupBegin(101, c4d.BFH_SCALEFIT, 2, 1)
        self.GroupBorderSpace(7, 7, 7, 7)
        self.AddButton(1, c4d.BFH_SCALEFIT, initw = 70, inith = 15, name = "Nettoie-Mat ça !")
        self.AddButton(2, c4d.BFH_SCALEFIT, initw = 70, inith = 15, name = "Annuler")
        self.GroupEnd()
        
        self.AddStaticText(21, c4d.BFH_FIT, 0, 0, "v 1.0 - César Vonc - http://code.vonc.fr/", c4d.BORDER_THIN_IN)
        
        self.GroupEnd()
        return True
    
    def InitValues(self) :
        self.SetTitle("Nettoie-Mat")
        self.SetBool(10, self.vireTexmat)
        self.SetBool(11, self.vireTexpol)
        self.SetBool(12, self.vireSelmat)
        return True
    
    def Command(self, id, msg) :
        if id == c4d.DLG_OK :
            self.vireTexmat = self.GetBool(10)
            self.vireTexpol = self.GetBool(11)
            self.vireSelmat = self.GetBool(12)
            self.nettoyeur()
            self.Close()
            
        elif id == c4d.DLG_CANCEL :
            self.Close()
        return True

    def vire(self, p) :
        doc.AddUndo(c4d.UNDOTYPE_DELETE, p)
        p.Remove()
        
    def netTex(self, p) :
        mat = p[c4d.TEXTURETAG_MATERIAL]
        if not mat :
            self.vire(p)
            return True
        return False

    def netSelPol(self, p) :
        bs = p.GetBaseSelect()
        nb = bs.GetCount()
        if not nb :
            if self.vireSelmat and self.vireTexpol : self.vire(p)
            return True
        return False

    def nettoyeur(self) :
        objs = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_0)
        if not objs : return
        
        doc.StartUndo()
        
        for obj in objs :
            ps = obj.GetTags()
            dic = {}
            sel_uti = []
            
            for p in ps :
                if p.CheckType(c4d.Tpolygonselection) :
                    if not self.netSelPol(p) :
                        nom = p[c4d.ID_BASELIST_NAME]
                        if nom in dic :
                            dic[nom].append([p, False])
                        else :
                            dic[nom] = [[p, False]]
                
                if self.vireTexmat :
                    if p.CheckType(c4d.Ttexture) : self.netTex(p)
            
            ps = obj.GetTags()
            for p in ps :
                if p.CheckType(c4d.Ttexture) :
                    sel = p[c4d.TEXTURETAG_RESTRICTION]
                    if sel :
                        if not sel in dic :
                            if self.vireTexpol :
                                self.vire(p)
                        else :
                            nbpp = len(dic[sel])
                            for ipp in xrange(nbpp) :
                                dic[sel][ipp][1] = True
            
            if self.vireSelmat :
                for ppa in dic.values() :
                    for pp in ppa :
                        if not pp[1] :
                            self.vire(pp[0])
            
        doc.EndUndo()
    
if __name__=='__main__':
    dial = Dialogue()
    dial.Open(c4d.DLG_TYPE_MODAL)
    c4d.EventAdd()