Commandes de base (Nuke)

De FdWiki
Révision datée du 7 octobre 2011 à 09:24 par Narann (discussion | contributions) (add gdb link)
Aller à : navigation, rechercher

Principe

Cette page a pour but de donner des exemples simples des commandes python les plus utilisées dans Nuke

Préférences

Modifier les préférences de Nuke

nuke.toNode('preferences')['CacheLimit'].value()
nuke.toNode('preferences')['CacheLimit'].setValue(75)

Le nom du knob peut être obtenu en plaçant le curseur sur dessus:

Nuke preferences cachelimit.png

Modifier les préférences du projet

nuke.root()['first_frame'].value()	# renvoi le numéro de la frame
nuke.root()['first_frame'].setValue(101)

Les formats

Obtenir la liste des formats disponibles.

nuke.formats()

Et le modifier dans le projet:

nuke.root()['format'].value().name()	# renvoi le nom du format
nuke.root()['format'].value().setName("nomDuFormat")

Et bien d'autres:

nuke.root()['format'].value().width()
nuke.root()['format'].value().height()

Faire un echo des commandes Python lancé par Nuke (à la Maya)

Aller dans:

  • Edit/Preferences
  • Onglet Script Editor
  • Cocher echo python commands to output window

Les nodes

Voir la doc de la classe Node pour plus d'informations:

Créer un node

Deux méthodes pour faire la même chose:

nuke.createNode("Blur")
nuke.nodes.Blur()

D’après la doc officielle:

  • La première version créé un node comme si l'utilisateur l'avait créé. En utilisant le "contexte". Exemple: Si un node est sélectionné, le nouveau node sera connecté au premier. Son panel sera affiché, etc...
  • La seconde méthode créé un node "dans le vide". Connecté a rien, pas de comportement particulier, juste un node.

Ne pas ouvrir le panel du node créé:

nuke.createNode("Blur", inpanel=False )

Setter les knobs d'un node a la creation:

nuke.nodes.Blur(size=10)

Supprimer un node

nuke.delete(myNode)

La selection

Eviter:

nuke.selectedNode()

Comportement complexe, préférer:

nuke.selectedNodes()

Qui revoit une bête liste dans l'ordre inversé de la sélection.

Savoir si un node est sélectionné:

myNode.isSelected()	# True/False

Ajouter/Enlever le node a la sélection:

myNode.setSelected(True)

Depuis le projet

Recupérer tout les nodes:

nuke.allNodes()	# list tout les nodes du projet en cours
nuke.allNodes("Blur")	# list tout les nodes du projet en cours de class Blur

Récupérer un node depuis sont nom:

nuke.toNode("Blur1")

Nom d'un node:

myNode.name()	# renvoit le nom du node "Blur1"
myNode.fullName()	# renvoi le nom complet du node

Positionnement dans le graph:

myNode.xpos()
myNode.ypos()
myNode.setXpos(30)
myNode.setYpos(30)

Paramètre des nodes

Lister les dict des attributs d'un node:

myNode.knobs()

Methode de base pour get/set:

myNode.knob("size").value()	# get value
myNode.knob("size").setValue(2)	# set value

Pour ajouter un paramètre a un node, la convention est la suivante:

myControl = nuke.Array_Knob("name", "label")	# "name" est simplement le nom du knob et "label" est ce qui sera affiché dans l'UI. Ce dernier est optionnel.
myControl.setTooltip('Mon tooltip')	# Ajoute un tooltip au knob
myNode.addKnob(myControl)

Il y a différents types de knobs:

textControl = nuke.Text_Knob("divider")	# Juste une barre de separation
colorControl = nuke.Color_Knob("color")	# Un knob de couleur
doubleControl = nuke.Double_Knob("value")	# Un knob de valeur a virgule flottante
sliderControl = nuke.WH_Knob("value")	# Un knob de deux valeurs: W et H
myNode.addKnob(textControl)
myNode.addKnob(colorControl)
myNode.addKnob(doubleControl)
myNode.addKnob(sliderControl)

Ajouter un bouton qui exécute du Python:

pyButton = nuke.PyScript_Knob("Do something")
pyButton.setCommand("print 'Toto'")
myNode.addKnob(pyButton)

Les autres type de knob sont disponible dans les sous-classe de la classe Knob.

Certains paramètres peuvent être "exécuté" (comme si on cliquait sur le bouton en fait):

for myNode in nuke.allNodes("Read") :
	myNode.knob("reload").execute()

Connections des nodes

Toute les connections se font par les index des inputs/output:

myNode.minInputs()	# 3 pour un node de merge: A, B, et Mask
myNode.maxInputs()	# 101 pour un node de merge: A2, B2, etc...
myNode.maxOutputs()	# Pas le nombre de connections, en output, du node mais le nombre d’élément que sort le node (un seul la plupart du temps)
myNode.optionalInput()	# Index de l'input optionnel (souvent le mask). 2 pour le node de merge

La taille du tableau des inputs:

myNode.inputs()	# La taille du tableau des inputs

Si mask (index 2) est connecté, la taille est de 3 (0,1,2).

Si A est connecté, la taille est de... 2 (0,1). (Apparemment, A est la seconde entrée du tableau et B la première... Allez savoir pourquoi...)

Si B est connecté, la taille est de... 1 (Juste 0).

myNode.canSetInput(0, anotherNode)	# Vérifie que la connection de anotherNode sur myNode a l'index 0 est possible
myNode.setInput(0, anotherNode)	# Connecter un node a un autre sur l'index 0
myNode.setInput(0, None)	# Déconnecter un input
myNode.connectInput(0, anotherNode)	 # connect l'output de anotherNode a l'input 0 de myNode
myNode.channels()	# ['rgba.red', 'rgba.green', 'rgba.blue', 'rgba.alpha', 'depth.Z']

Lister les dépendances montantes et descendantes:

myNode.dependent()	# Renvoi la liste des nodes dépendants (enfant) de myNode
myNode.dependencies()	# Renvoi la liste des nodes dont dépendent myMode (ces parents)

Label des nodes

On peut modifier le label d'un node (ce qui est affiché dans l'interface, sous le nom du fichier) avec un syntaxe particulière:

[ lindex [split [filename] /] end-1]	# le nom du dossier qui contient l'image ("p099" si "s002/p099/diffuse.0001.exr")
[ lindex [split [filename] /] end-2][ lindex [split [filename] /] end-1]	# Variante du dessus ("s002p099" si "s002/p099/diffuse.0001.exr")
[ lindex [split [lindex [split [knob [topnode].file] .] 0] /] end]	# Le nom du fichier sans l'extension
[date %d]/[date %m]/[date %y]	# Affiche la date de l'image

Le langage utilisé semble être du tcl.

Interface

Liens intéressants:

Menus

Customiser le menu:

menuBar = nuke.menu("Nuke")	# La barre de menu principale
myMenu = menuBar.addMenu("&myMenu")	# Ajoute un menu custom
myMenuCommand = myMenu.addCommand("Do Something", "doSomething()")	# Ajoute une commande

mySubMenu = myMenu.addMenu("mySubMenu")	# Ajoute un sous menu a notre menu custom
mySubMenu.addCommand("Do Something", "doSomething()")	# Ajoute une commande

editMenu = menuBar.findItem("&Edit")	# Cherche un menu existant
editMenu.addCommand("Do Something", "doSomething()")	# Et y ajoute une commande
nodeSubMenu = editMenu.findItem("Node")	# Cherche le sous menu "Node"
nodeSubMenu.addSeparator()	# Y ajoute un separator
nodeSubMenu.addCommand("Do Something", "doSomething()")	# Et une commande

Dialog

Une fileDialog, pour les clips. Un seul/plusieurs fichiers:

nuke.getClipname( "fileDialogName" )
# Result: '/path/to/my/file'
nuke.getClipname( "fileDialogName", multiple=True )
# Result: [/path/to/my/file1', '/path/to/my/file2', '/path/to/my/file3']

Une autre avec pattern et defaultPath:

nuke.getFilename("fileDialogName", pattern="*.png;*.jpeg", default="/path/to/a/file" )

Yes/No dialog

nuke.ask("Ça roule?")	# revoit True/False

Icones

Appliquer une icone à un node:

myNode.knob("icon").setValue("/path/to/an/icon.png")

Autres

Overrider la fonction de création d'un node:

def myCreateNode() :
	print "coucou"
nukescripts.create_read = myCreateNode

Debug

Afficher les plugin path

nuke.pluginPath()

Obtenir des statistiques (performance metrics) sur les nodes calculés

En mode terminal ou GUI, uniquement sous Linux

nuke -P

Obtenir un debug des déchargements de la mémoire de Nuke

Lancer le Nuke avec la variable d’environnement NUKE_DEBUG_MEMORY à 1 (voir page 9 de la doc).

Combiné à -P cette option est très interessante.

Connaître l'état de Nuke lors d'un crash

Il faut récupérer le PID de Nuke avec la commande:

ps aux | grep nuke

Puis lancer:

gdb -p <PID>
  • gdb s'initialisera et Nuke s'arretera.
  • tapez continue pour que Nuke reprenne sont travail.
  • Quand Nuke crash, gdb reprend la main.
  • Tapez bt (pour backtrace) et ainsi voir la liste des fonction et celle ou Nuke plante.

Plus de commandes ici: Utiliser le debuger GDB

Divers

Lancer nuke en mode terminal (pas de GUI):

nuke -t

Faire un print dans le terminal qui a lancé Nuke:

nuke.tprint("Hello World!")

Vider le cache:

nuke.memory("free")

Reviens a cliquer sur Clear Buffers F12:

Nuke cache clearBuffers.png

Savoir si le script s'execute en mode terminal ou en mode GUI:

nuke.GUI

Connaitre le nombre de CPU:

nuke.NUM_CPUS

Pour une liste complète:

help(nuke)