>>> print "HELLO".center(50, "-") ----------------------HELLO-----------------------
Un Blog de Colin
Mes boulots, mes projets, des trucs et astuces.
mardi 21 mai 2013
joli print avec .center =)
Petit poste rapide pour vous présenter une façon de faire des prints ou commentaires de manière cool et visible; grâce a la fonction .center du module string:
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)
lundi 22 avril 2013
python nuke unpremult for all read and shuffle node
Voici un petit script qui fait gagner du temps, il crée un node unpremult sous tout les nodes read, shuffle et le script recrée les connections des dependences:
#permet de recupere un dictionnaire contenant le node connecte ainsi que l'id de son input
def getOutput(node):
dep = node.dependent()
id = []
for d in dep:
ip = d.inputs()
for i in range(ip):
if d.input(i) == node:
id.append(i)
dictNodeInput = dict(zip(dep, id))
return dictNodeInput
#permet de connecter tout les inputs d'un dict cree par la fonction getOutput() a un node
def setOutput(node, dictInput):
for e, i in dictInput.items():
e.setInput(i, node)
return
read = nuke.allNodes("Read")
s = nuke.allNodes("Shuffle")
for p in s:
read.append(p)
for r in read:
d = getOutput(r)
unp = nuke.nodes.Unpremult()
unp.setInput(0,r)
setOutput(unp, d)
mardi 16 avril 2013
Petite astuce dict zip python.
Voici une petite astuce pour simplifier les attributions "keys", "values" d'un dictionnaire.
Lorsque l'on a deux listes et qu'on veut les combiner dans un dictionnaire on peut le faire sans boucle avec la fonction zip de la class dict. Comme ceci:
keys = ['A', 'B', 'C']
values = [1, 2, 3]
dic = dict(zip(keys, values))
print(dic)
>>> {'A': 1, 'B': 2, 'C': 3}
mardi 9 avril 2013
PySide/PyQt QDesktopWidget
Petit pense-bête sur le module Qt QDesktopWidget:
#module pour les info ecrans ff = QtGui.QDesktopWidget() #recupere les dimension des ecrans. ff = QtGui.QDesktopWidget().screenGeometry(widget) #recupere l'index de l ecran ou est place le widget ff = QtGui.QDesktopWidget().screenNumber(widget) #recupere le nombre d'ecran du system ff = QtGui.QDesktopWidget().screenCount()
jeudi 28 mars 2013
Slate Material Editor et Py3dsMax (sme)
Voici quelques fonctions bien utiles pour scripter avec le slate material editor (sme), je vous les présentes a travers un petit script qui permet de stocker tout les matériaux des objets sélectionnés dans une nouvelles vue du sme.
from Py3dsMax import mxs
#je recupere la liste des objets selectionnes:
sel = mxs.selection
#je cree une nouvelle vu et recupere son node:
nodeView = mxs.sme.GetView(mxs.sme.CreateView("stock_view"))
#je cree la boucle qui traitera chaque objets:
for node in sel:
#je recupere le node material:
mat = node.material
#je creer le node material dans la nouvelle vue, je lui donne une position grace a la fonction point2 vector.
nodeView.CreateNode(mat, mxs.point2(0,0))
#j'execute une commande maxscript qui permet de mettre en ordre les materiaux dans la nouvelles vue.
mxs.execute('actionMan.executeAction 369891408 "40060"')
mardi 12 mars 2013
Py3dsMax et les modifiers
Voici les principales fonctions py3dsmax pour travailler avec les modifiers:
#import de la library py3dsmax
from Py3dsMax import mxs
#cree une liste des objets selectionne
sel = mxs.selection
#cree un modifier avant l'index 6 (l'index 1 est le modifier le plus haut de la pile)
#pour avoir un modifier toujour en bas de la pile mettre un grand before (ex: 10000)
mxs.addModifier(sel[0], mxs.Skin_Wrap(), before = 6)
#la liste des modifiers de l'objet
ld = sel[0].modifiers
#recupere un modifier par son nom
sk = sel[0].modifiers["Skin_Wrap"]
#recupere le node d'un objet par le nom
corp = mxs.getNodeByName("name_obj")
Inscription à :
Messages (Atom)