Extrait de code Houdini

Prise en main

Cette section fournie quelques commandes de base pour commencer à scripter dans Houdini.

Le script passe par le module hou. Sa documentation, très bien faite, est disponible ici.

Le Python Shell est disponible dans le menu Windows :

houdini_python_shell_menu

Récupérer un nœud par son chemin

La première commande utile est hou.node(). Elle permet de récupérer un nœud Houdini sous forme d’objet depuis son chemin.

root = hou.node('/obj')

Notez que la variable root fait référence au nœud /obj dans les exemples qui suivent.

Créer et supprimer des nœuds

Cette fonction créée un nœud de type geo :

node = root.createNode('geo')  # hou.ObjNode of type geo at /obj/geo1>

La fonction createNode() peut prendre plusieurs paramètres (voir sa documentation).

On peut accéder au type d’un nœud de cette façon :

node.type().name()  # 'geo'

Le type est également accessible en cliquant sur l’icône Operator Info, depuis l’interface :

houdini_operator_info_001

Il apparaît dans la fenêtre (ici, geo) :

houdini_operator_info_002

Il est aussi disponible en faisant bouton-droit sur un nœud :

houdini_operator_info_bouton_milieu

Pour supprimer un nœud, il faut appeler la méthode destroy() :

node.destroy()

Récupérer l’enfant d’un nœud par son nom

child = root.node('geo1')

Lister les enfants d’un nœud

for node in root.children():
    print node

Récupérer le paramètre d’un nœud par son nom (ou son chemin)

Le nom des paramètres est disponible depuis l’interface en plaçant le curseur sur le paramètre :

houdini_parameter_name

Ici, tx, ty, et tz.

La méthode .parm() d’un nœud permet de récupérer un paramètre par son nom :

node = root.createNode('geo')  # <hou.ObjNode of type geo at /obj/geo1>
node.parm('tx')  # <hou.Parm tx in /obj/geo1>

Notez que vous pouvez récupérer un paramètre depuis son chemin complet via la commande hou.parm() :

hou.parm('obj/geo1/tx')  # <hou.Parm tx in /obj/geo1>

Lister les paramètres d’un nœud

for param in node.allParms():
    print param.name()

Récupérer la valeur d’un paramètre d’un nœud

Dans Houdini, il y a deux façons de récupérer la valeur d’un paramètre :

La première renvoie la valeur tel que défini dans le paramètre : Dans le cas d’une expression, il renvoie l’expression, et non son résultat.

La seconde évalue le contenu du paramètre et renvoi son résultat : Dans le cas d’une expression, il renvoie le résultat de l’expression.

node = root.createNode('geo')  # <hou.ObjNode of type geo at /obj/geo1>

param = node.parm('tx')  # <hou.Parm tx in /obj/geo1>
param.rawValue()  # '0'
param.eval()  # 0.0

On peut lui assigner une valeur via la méthode .set() :

param.set(20)

On peut lui assigner une expression via .setExpression() :

param.setExpression('ch("../my_node/value")')

Cliquer sur un paramètre de type bouton

Certains paramètres sont des boutons. Par exemple, le paramètre buildHierarchy d’un nœud alembicarchive est de type Button :

houdini_parameter_name

Pour les exécuter il suffit d’appeler la méthode .pressButton() :

node.parm('buildHierarchy').pressButton()

Activer un nœud

node.setDisplayFlag(True)

Cela revient à cliquer sur le bouton bleu à droite d’un nœud.

La position des nœuds

x, y = node.position()
node.setPosition(x, y)

Un nœud peut être automatiquement positionné :

node.moveToGoodPosition()

La time line

Récupérer et modifier la time line.

houdini_time_line

current_frame = hou.frame()
start, end = hou.playbar.frameRange()
start, end = hou.playbar.playbackRange()
frame_rate = hou.fps()

hou.setFrame(1)
hou.playbar.setFrameRange(1, 100)
hou.playbar.setPlaybackRange(1, 100)
hou.setFps(24)

Un network box

Ces nœuds servent à empaqueter des nœuds entre eux :

houdini_network_box

root.createNetworkBox(item_name)

box.setComment('foo')
box.setColor(hou.Color(1.0, 1.0, 0.7))  # Background color.

for node in nodes:  # Puts nodes inside box.
    box.addNode(node)

# Adjust size to content.
box.fitAroundContents()

Lister les attributs de primitives d’un Alembic.

Quand on importe un Alembic, il peut être intéressant d’avoir accès à ses attributs de primitive (le plus courant étant path).

for prim in node.geometry.prims():  # `node` is an alembic type node.

    prim.number(), prim.attribValue('path')

L’attribut path est en lecture-seule. Si vous tentez de le modifier, vous lèverez l’exception GeometryPermissionError :

for prim in node.geometry.prims():  # `node` is an alembic type node.

    prim.setAttribValue('path', 'toto')
GeometryPermissionError: Geometry is read-only.

Dernière mise à jour : ven. 07 mai 2021