jeudi 9 mai 2013

reseau to local script nuke

   

    Rien de bien étonnant, nuke demande énormément en appels disques et donc sur notre réseau supinfocom, et bien ça rame pas mal !
La solution la plus simple que j'ai trouvé a un mois de la fin et bien c'est de rapatrier toutes nos séquences de rendu en local, rien de bien fou... sauf que je veux garder exactement les mêmes chemins dans mes reads pour pouvoir passer de la séquence réseau a la séquence local juste en changeant la lettre du root (pour notre cas de D: a W:).
De plus j’avais pas envie de perdre de temps a faire ça manuellement donc j'ai écris un script pour automatiser tout ceci.
Voici le script :


 
import os, nuke
import shutil, glob, threading
from PySide import QtGui, QtCore

#creation de la class progress bar en pyside
class progBar(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)

        self.pBar = QtGui.QProgressBar(self)
        #je set la taille de la fenetre ainsi que sa position dans l'espace
        self.setGeometry(500,500,10,20)
        #je set un flag tophint pour que la progress bar soit toujours en top
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) 
        #j'affiche le widget progress bar
        self.show()

    #creation d'une simple fonction pour seter la valeur de la progress bar
    def prog(self, p):
        self.pBar.setValue(p)

        

#creation de la class principal derive du module thread    
class readOnLocalClass(threading.Thread):
    def __init__(self, init = True, parent = None):
        threading.Thread.__init__(self, parent)

        self.init = init

        if self.init:
            self.ini()

        else:
            self.notIni()

    #fonction a executer si l'argument init est True
    def ini(self):

            #ouverture d'une fenetre de dialogue pour selectionner une sequences d'image
            files = nuke.getClipname("files sequences : ", multiple = True)
            #remplacement du root W: en D:
            self.newPathLocal = files[0].replace("W:", "D:")
            #split du path pour avoir que le path
            self.newPathLocalSplit = os.path.split(self.newPathLocal)
            #si le dossier local n'existe pas alors on le cree avec makedirs,
            #makedirs cree de maniere recursive tout l'abre du dossier
            if os.path.isdir(self.newPathLocalSplit[0]):
                pass
            else:
                os.makedirs(self.newPathLocalSplit[0])

            #je liste tout les fichiers present dans le dossier reseau
            self.allFiles = glob.glob(os.path.split(files[0])[0] + "\*.*")
      

            #j'appel la class progressbar et je l'affiche
            self.ProgBar = progBar()
            self.ProgBar.show()

    #fonction a executer si l'argument init est False
    #recupere le path du read selectionner et remplace le D: par W:
    #liste les fichiers reseau a partir du path local
    def notIni(self):
        files = nuke.selectedNode().knob("file").value()
        self.newPathLocal = files.replace("D:", "W:")

        self.allFiles = glob.glob(os.path.split(self.newPathLocal)[0] + "\*.*")
        self.newPathLocal = files.replace("W:", "D:")
        self.newPathLocalSplit = os.path.split(self.newPathLocal)

        #j'appel la class progressbar et je l'affiche
        self.ProgBar = progBar()
        self.ProgBar.show()        

    #derive la fonction run du module thread
    def run(self): 
    
        i = 0
        #tant que i est pas egal au nombre de fichier present dans le dossier reseau
        while i != len(self.allFiles):
            #copie le fichier dans le nouveau dossier local
            shutil.copy(self.allFiles[i], self.newPathLocalSplit[0])
            i+=1
            #calcule du pourcentage pour la progression de la bar
            progr = (float(i)/float(len(self.allFiles)))*100
            #progression de la bar
            self.ProgBar.prog(progr)
        
        print "le thread est finit"
       
        self.ProgBar.close()

        self.creaRead()
        

    #fonction pour creer le node read ainsi que le bouton reload   
    def creaRead(self):
        if self.init:
            #creation du node read
            self.read = nuke.createNode('Read', 'file {' + self.newPathLocal + '}', inpanel = False)
            #creation du knob button reload
            bk = nuke.PyScript_Knob("Reload_Copy")
            #set la command du bouton, ici la fonction reload()
            bk.setCommand("reaload()")
            #ajoute le kno au node read
            self.read.addKnob(bk)

        else:
            print "reload"
            nuke.selectedNode().knob("reload").execute()


       

def readOnLocal():
    b = readOnLocalClass(init = True)
    #lance le thread, la fonction run()
    b.start()

def reaload():
    b = readOnLocalClass(init = False)
    #lance le thread, la fonction run()
    b.start() 


Et en bonus :p le script pour changer de root:

import os
import nuke

#remplace la lettre de disque, demande une nouvelle lettre en str et une list de node read
def changeRoot():
    p = nuke.getInput("Change Root Letter")
    allReads = nuke.allNodes("Read")
    for r in allReads:
        n = r.knob("file").value()
        rr = n.split(":/")
        nn = rr[0].replace(rr[0], p )
        nnP = os.path.join(nn + ":", rr[1])
        r.knob("file").setValue(nnP)


Aucun commentaire:

Enregistrer un commentaire