Ici on parlera Python

Snippet

Un null pour run du python

on va creer un node pour run des scripts python a partir d'un null.

  • modifier un null avec edit parameter interface
  • mettre un parm string, en multi-string et en langage python l'appeller pythonCode
  • mettre un bouton (le nommer RunCode par exemple) avec ce code en callback script:
exec(kwargs['node'].parm('pythonCode').eval())

color node

on va colorer les nodes color et les objets avec la meme couleur. C'est pratique quand on fait du layout pour savoir quel branche du network correspond a tel ou tel objet.

  • mettre un node color
  • mettre un node python derriere avec ce code dedans:
node = hou.pwd()
geo = node.geometry()

color =node.inputAncestors()[0]
r=color.parm("colorr").eval()
g=color.parm("colorg").eval()
b=color.parm("colorb").eval()
myColor = hou.Color((r,g,b))

color.setColor(myColor)

codeColor

Nodes shape list

editor = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
print(editor.nodeShapes())

# Returned tuple of strings:
# ('rect', 'bone', 'bulge', 'bulge_down', 'burst', 'camera', 
# 'chevron_down', 'chevron_up', 'cigar', 'circle', 'clipped_left', 
# 'clipped_right', 'cloud', 'diamond', 'ensign', 'gurgle', 'light', 
# 'null', 'oval', 'peanut', 'pointy', 'slash', 'squared', 'star', 
# 'tabbed_left', 'tabbed_right', 'tilted', 'trapezoid_down', 
# 'trapezoid_up', 'wave')

cryptomatte: generer des set de selection

utile pour de la crowd par exemple. On va recupperer les objet par id. puis faire des selection par pourcentage.

  • on va utiliser un node qui nous permet de lancer du python.
  • modifier un null avec edit parameter interface
  • mettre un parm string, en multi-string et en langage python l'appeller pythonCode
  • mettre un bouton (le nommer RunCode par exemple) avec ce code en callback script:
exec(kwargs['node'].parm('pythonCode').eval())
  • mettre ce code dans pythonCode
import hou
import os
import random
cList = hou.parm("../crypto_list").eval()
#convertir en list
cList = cList.split(",")
print (cList)
it = 0.0 + hou.parm("../seed").eval()
nList=[]

pourcent = hou.parm("../pourcent").eval()

for i in cList:
    it+=1
    random.seed(it)
    r = random.random()
    if (r<pourcent):
        print (i)
        nList.append(i)

print(nList)
sList = str(nList)
sList = sList.replace("[","")
sList = sList.replace("]","")
sList = sList.replace("'","")

print (sList)
hou.parm("../new_list").set(sList)
  • creer les parms suivant (avec edit parameter interface): crypto_list (string), seed (float), pourcent (float), newList (string)
  • cliquez sur runCode et le tour est joué.
  • creer un hda pour plus de simplicité comme suit:

cryptoListe

disable tout les lock flag d'une scene

import hou

import nodesearch
matchType = nodesearch.NodeType("*")
matchName = nodesearch.Name("*")
match = nodesearch.Group([matchType,matchName])
net = hou.node("/")

for node in match.nodes(net,recursive =True):
    try:
        node.setHardLocked(False)
    except:
        pass

les menus dynamiques

un menu en fonction des groupes

On va generer un menu dynamique en fonction de groups sur les primitives

import hou

import nodesearch
matchType = nodesearch.NodeType("*")
matchName = nodesearch.Name("*")
match = nodesearch.Group([matchType,matchName])
net = hou.node("/")

for node in match.nodes(net,recursive =True):
    try:
        node.setHardLocked(False)
    except:
        pass        
  • creer un parametre depuis "edit parametre interface"
  • creer un string parameter, dans menu cocher use menu, mettre en replace
  • ce mettre sur menu script
  • et mettre le code si dessus dedans
  • faire aplly, accept et le tour est joué !

node search

search and replace les chemins de textures

On va lancé une recherche pour tout les node de texture pour corriger les chemin. Très utile si on change de disk en cours de projet par exemple et qu'on a pas prédéfini de variable vers un disque. on peu utiliser cette methode pour n'importe quel type de node.

import hou
# node courant
myPath = hou.pwd()
import nodesearch

search = hou.parm("../search").eval()
replace = hou.parm("../replace").eval() 

#maj all texture mantra legacy
matchType = nodesearch.NodeType("texture")
#cherche quimporte le nom du node
matchName = nodesearch.Name("*")
match = nodesearch.Group([matchType,matchName])
#!!! cherche a partir de ce chemin !!!
net = hou.node("/obj/")
#cherche de maniere recursive
# tout ce joue ici
for node in match.nodes(net,recursive =True):
    try:
        print(node)
        parm = node.parm("map")
        file = parm.eval()
        file = file.replace(search,replace)
        parm.set(file)
    except: 
        pass
  • Mettre ce code dans un null pour run du python (cf: premier article de cette page).
  • modifier un null avec edit parameter interface creer deux parametre string, les nommer respectivement search et replace.
  • dans search mettre le bout de string qu'on veut changer et dans replace mettre le nouveau bout de string qu'on veut mettre a la place.
  • faire run

recupperer une liste de fichier et la mettre en attribut sur une geo

Ici on vas recuperrer tout les chemins des fichiers contenus dans un dossiers. utile pour faire des convertion de geometry ou de texture en masse par exemple

node = hou.pwd()
geo = node.geometry()

import os

roots = hou.parm("sourcePath").eval()

path = next(os.walk(roots))[2]
pathExp = []
textS = ""
for i in path:
    tmp = i.split(".")[0]
    pathExp.append(tmp)
    textS += tmp +"\n"
range = len(path)

geo.setGlobalAttribValue("path",path)
geo.setGlobalAttribValue("pathExp",pathExp)
geo.setGlobalAttribValue("range",range)

hou.parm("text_list").set(textS)

Parm . Interfaces ...

color parm

hou.FloatParmTemplate("Color", "Color", 3, default_value=(1,1,1), look=hou.parmLook.ColorSquare, naming_scheme=hou.parmNamingScheme.RGBA)

supprimer un parm

import hou
node = hou.pwd()
g= node.parmTemplateGroup()
g.remove("p")
node.setParmTemplateGroup(g)

disable when

node.setConditional(hou.parmCondType.DisableWhen, "{uniformsamples != 4}")
node.setConditional(hou.parmCondType.HideWhen, "{uniformsamples != 4}")
#https://www.keatonwilliamson.com/houdini/python/parmtemplate

lien

ressource python generale

Docsstrings

Side Fx doc

doc side fx hom module doc

ressource py houdini

Oriol Manzana 24-points-to-master-python-language-in-houdini.pdf

Gfxhacks create_parm_methode

Houdini