NukeScript

LauDistortion

05 Novembre 2018

Le script

Après avoir expérimenté en autodidacte le workflow autour des distortions, je me suis dit que ca pourrait être sympa de disposer d'une base de données avec les valeurs de distortion. Ainsi, on pourrait appliquer directement un node de LensDistortion avec les bonnes valeurs pour un objectif connu, pour peu que l'on sache avec quel objectif le plan a été tourné.

Bon, ce script n'a pas non plus vraiment d'utilité dans la mesure où c'est assez rapide de calculer une distorsion et que généralement on ne connaît pas la focale utilisée. Mais l'intérêt pour moi était de pouvoir concevoir un script avec une interface dans Nuke. De pouvoir gérer des données saisies par l'utilisateur et de pouvoir communiquer avec une base de données.

Mon script vérifie également sur mon site, si le client possède la dernière version de la base de données. Pour ce faire, j'ai simplement écrit un script PHP qui vérifie la version dans la base de données et renvoie uniquement le numéro de version. Ainsi avec le module urllib je peux interroger le script et récupérer la valeur. Il ne me suffit plus qu'a comparer la version en ligne avec la version locale.

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

Démonstration du script

L'interface

Aperçu de l'interface dans Nuke.

Pour cette interface, j'ai utilisé PySide. Attention la version 11 de Nuke embarque une mise à jour de ce module. Il faut donc rajouter cette ligne :


try:
    from PySide.QtGui import *
    from PySide.QtCore import *
except:
    from PySide2.QtGui import *
    from PySide2.QtCore import *
                

La base de données

Pour la base de données, je suis passé par sqlite3 dans la mesure où il est inclus de base dans Python. Cela évite à l'utilisateur final de devoir installer un module.

Voici la class que j'ai utilisé pour initier la connexion à la DB, et pouvoir effectuer mes requettes SQL.


#Database Manager to connect and query DB
class DatabaseManager(object):
    def __init__(self, db):
        self.conn = sqlite3.connect(db)
        self.conn.execute('pragma foreign_keys = on')
        self.conn.commit()
        self.cur = self.conn.cursor()

    def query(self, arg):
        self.cur.execute(arg)
        self.conn.commit()
        return self.cur

    def __del__(self):
        self.conn.close()
                

La gestion de la mise à jour

J'ai utilisé le module urllib pour pouvoir vérifier et exécuter les mises à jour. La aussi le module est présent dans Python donc aucun souci pour l'utilisateur final.

Voici un exemple du code avec l'utilisation de ce module :


def check_last_version_database_online(self):
    # Try to check the number of the last version
    try:
        page_version = urllib.urlopen('http://laurette.alexandre.free.fr/nukeScripts/LauDistortion/version.php')
        self.last_version = page_version.read()
        self.last_version = float(self.last_version)
    # If it failed, no newer version is available
    except:
        self.last_version = "none"

def check_last_version_database_local(self):
    try:
        self.current_version = start.database_manager.query("SELECT version_number FROM version").fetchone()[0]
        self.current_version = float(self.current_version)
    except:
        self.current_version = "none"

def download_last_version(self):
    url = 'http://laurette.alexandre.free.fr/nukeScripts/LauDistortion/distortion.db'
    try:
        with open(DATABASE, 'wb') as db:
            db.write(urllib.urlopen(url).read())
        self.download_success = True
    except Exception as e:
        print (e)
        self.download_success = False
                

Voici la page qui retourne la dernière version de la base de données : http://laurette.alexandre.free.fr/nukeScripts/LauDistortion/version.php


Le package

Cliquez ici pour télécharger le package. La base de données n'est pas à jour dans ce package pour que vous puissiez tester la mise à jour.

Installation

Pour l'installation, il suffit simplement de copier le dossier téléchargé dans votre dossier .nuke et d'ajouter ces lignes dans votre menu.py.


import LauDistortionCore
toolbar = nuke.toolbar("Nodes")
toolbar.addCommand('LauDistortion Plugin', 'LauDistortionCore.start()', icon="LauDistortionIcon.png")
                

Il faut aussi ajouter cette ligne dans votre init.py :


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