Extrait de code USD
Avant-propos
Le but de cette page est de proposer les principaux points d’entrée d’USD en Python.
Il est conseillé de comprendre un peu USD et d’avoir lu la page dédiée à la description de l’API.
Référence
Il existe de nombreux morceaux de code disponible pour USD. En voici quelques-uns :
- Tutoriels officiels
- Tutoriels de Nvidia
- Python Code Snippets de chez Nvidia
- Des exemples plus complexes dans le repo USD Cookbook de Colin Kennedy.
Récupérer la version d’USD
>>> from pxr import Usd
>>> Usd.GetVersion()
(0, 22, 11)
Stage
Ouvrir un stage
Un stage s’ouvre avec la fonction UsdStage::Open()
.
from pxr import Usd
stage = Usd.Stage.Open(file_path)
Par défaut, le stage est entièrement chargé (les payloads sont déroulés).
Vous pouvez passer une variable Usd.Stage.LoadNone
pour overrider ce comportment :
stage = Usd.Stage.Open(file_path, Usd.Stage.LoadNone)
Traverser un stage
Un stage se traverse via UsdStage::Traverse()
.
for prim in stage.Traverse():
print(prim.GetPath())
La traversée se fait de haut en bas :
/world
/world/myprim
/world/myprim/mysubprim
La différence entre Traverse()
et TraverseAll()
est que la première exclue
les Prim
qui ne sont pas totalement définies et ne revoit que des Prim
valides.
Les deux itérateurs suivants sont similaires :
# Only valid prims.
for prim in stage.Traverse():
print(prim.GetPath())
# All prims.
for prim in stage.TraverseAll():
if prim.IsValid():
print(prim.GetPath())
Layer
Ouvrir un layer
Un layer s’ouvre avec la fonction SdfLayer::FindOrOpen()
.
from pxr import Sdf
lay = Sdf.Layer.FindOrOpen(path) # Warning: lay can be None.
Gardez à l’esprit qu’un layer peut ne pas exister. Aucune exception n’est levée, c’est à vous de vérifier que la valeur renvoyée n’est pas None
.
Traverser un layer
Un layer n’est pas composé de Prim
, mais de PrimSpec
(explications ici).
root_prim_spec = lay.pseudoRoot
for prim_spec in root_prim_spec.nameChildren:
print(prim_spec.path, prim_spec.typeName)
for prop in prim_spec.properties:
print(prop.path)
Le concept de PseudoRoot
est expliqué ici.
Prim
>>> prim.GetPath()
Sdf.Path('/world/myprim')
>>> str(prim.GetPath())
'/world/myprim'
Property, Attribute et Relationship
Vous pouvez accéder aux properties depuis une Prim
:
for prop in prim.properties:
print(prop, prop.typeName)
Ce mécanisme laisse l’appelant responsable de la détection du type :
for prop in prim.properties:
if isinstance(prop, Usd.Attribute):
# ...
elif isinstance(prop, Usd.Relationship):
# ...
Une façon d’accéder directement aux attributes et aux relationship via des itérateurs dédiés :
for attr in prim.attributes:
print(attr)
for rel in prim.relationships:
print(rel)
Dernière mise à jour : mer. 15 février 2023