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 :

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