NukeScript

LauGizmoFolder

04 Novembre 2018

Le script

J'ai eu envie de créer ce script, car je trouvais intéressante, l'idée de faciliter les installations de gizmos pour les graphistes. Un script similaire et bien plus complet avait déjà été créé par www.luma-pictures.com : Script. Mais je souhaitais créer ce script moi-même dans le but de ma familiariser avec Python dans Nuke.

Voici une brève vidéo du fonctionnement de ce script.

Démonstration du script

Le code

Pour réaliser ce script, il suffit simplement d'analyser le contenu du dossier dans lequel on copie les gizmos. Pour ce faire, j'ai importé le module OS qui permet de récupérer le chemin du dossier dans lequel le script est exécuté. Ensuite, j'ai importé le module GLOB qui me permet de lister le contenu du dossier en ajoutant une règle. Ici, par exemple, je demande à lister le contenu du dossier en ne tenant compte que des fichiers se terminant par .gizmo. On notera aussi l'utilisation du caractère joker "*" qui comprend le nom du gizmos.

import nuke
import glob
import os

# GLOBAL VARIABLE
# Folder for gizmos
LAU_GIZMO_FOLDER = os.path.dirname(os.path.abspath(__file__))
# Filter only .gizmos
LAU_GIZMOS = glob.glob(LAU_GIZMO_FOLDER + "/*.gizmo")
                

La fonction GLOB retournera une liste avec les noms de fichiers. Ici, j'attribue cette liste à la variable LAU_GIZMOS.

Par la suite, on commence par créer le menu qui contiendra tous les gizmos du dossier :


# Start to create the icon into the nuke's menu
t=nuke.menu("Nodes")
u=t.addMenu("LauGizmoFolder", icon="LauGizmoFolder.png")
                

À partir de ce moment, il nous suffit simplement de faire une boucle pour lire un à un les éléments de la liste, afin de créer les commandes d'exécution des gizmos.


# For all of gizmos into the folder
for gizmos in LAU_GIZMOS:

    # Remove the link of the gizmo
    gizmos = gizmos.replace(LAU_GIZMO_FOLDER+"\\","")
    # Remove the extension
    gizmos_name = gizmos.replace(".gizmo","")

    # Try to open the icon's gzimo (need to have the same name)
    try:
        with open(LAU_GIZMO_FOLDER+"/"+gizmos_name+".png"):
            # Gizmo image
            gizmos_image = gizmos_name+".png"
            # Add the gizmo into the menu with a custom image
            exec ('t.addCommand("LauGizmoFolder/' + gizmos_name + '","nuke.createNode(\'' + gizmos_name + '\')", icon="'+gizmos_image+'")')
    # No image found
    except:
        # Add the gizmo into the menu with the default icon
        exec('t.addCommand("LauGizmoFolder/'+gizmos_name+'","nuke.createNode(\''+gizmos_name+'\')", icon="Default.png")')
                

J'ai utilisé ici des opérations sur les chaînes de caractères comme les ".replace()" dans le but de ne garder que le nom exact du gizmo en vue de l'intégrer dans une commande d'exécution.

J'ai également utilisé un try pour voir si une image est associée au gizmo (il faut que l'image possède exactement le même nom que le gizmo). Si c'est le cas, alors on crée une commande avec comme icône, l'image associée au gizmo. Sinon on attribut une icône par défaut.

Le code complet du programme :

import nuke
import glob
import os

# GLOBAL VARIABLE
# Folder for gizmos
LAU_GIZMO_FOLDER = os.path.dirname(os.path.abspath(__file__))
# Filter only .gizmos
LAU_GIZMOS = glob.glob(LAU_GIZMO_FOLDER + "/*.gizmo")

# Start to create the icon into the nuke's menu
t=nuke.menu("Nodes")
u=t.addMenu("LauGizmoFolder", icon="LauGizmoFolder.png")

# For all of gizmos into the folder
for gizmos in LAU_GIZMOS:

    # Remove the link of the gizmo
    gizmos = gizmos.replace(LAU_GIZMO_FOLDER+"\\","")
    # Remove the extension
    gizmos_name = gizmos.replace(".gizmo","")

    # Try to open the icon's gzimo (need to have the same name)
    try:
        with open(LAU_GIZMO_FOLDER+"/"+gizmos_name+".png"):
            # Gizmo image
            gizmos_image = gizmos_name+".png"
            # Add the gizmo into the menu with a custom image
            exec ('t.addCommand("LauGizmoFolder/' + gizmos_name + '","nuke.createNode(\'' + gizmos_name + '\')", icon="'+gizmos_image+'")')
    # No image found
    except:
        # Add the gizmo into the menu with the default icon
        exec('t.addCommand("LauGizmoFolder/'+gizmos_name+'","nuke.createNode(\''+gizmos_name+'\')", icon="Default.png")')
                

Le package

Pour télécharger mon package c'est par ici : Cliquez ici

Installation

Il suffit ensuite de simplement rajouter une ligne dans votre menu.py comme suit :


import LauGizmoFolder
                

Et d'ajouter le dossier du script dans le fichier init.py comme suit :


nuke.pluginAddPath('YOUR_PATH\.nuke\LauGizmoFolder')
                

Il ne reste plus qu'a télécharger des gizmos pour Nuke et à les glisser dans le dossier LauGizmoFolder. Si Nuke est ouvert lors de la copie d'un nouveau gizmo, il faudra redémarrer Nuke pour que le nouveau gizmo soit pris en compte.