Skip to content

EditTargetで指定レイヤーを操作

ipynbFile USDEditTarget__EditTargetで指定レイヤーを操作.ipynb
Root - layerA - layerB のようなサブレイヤー構成で
各レイヤーを取得する方法とかテスト。

In [1]:

1
from pxr import Usd, UsdGeom, Sdf

In [2]:

1
2
3
Usd.StageCache().Clear()
stage = Usd.Stage.Open(r"D:\work\usd_py36\usd\rootLayer.usda")
# RootLayerのターゲット取得

In [3]:

1
2
3
4
# レイヤー取得

layers = stage.GetUsedLayers()
print(layers)

Success

1
[Sdf.Find('d:/work/usd_py36/usd/layerA.usda'), Sdf.Find('anon:000001C85E39D3E0:rootLayer-session.usda'), Sdf.Find('d:/work/usd_py36/usd/rootLayer.usda'), Sdf.Find('d:/work/usd_py36/usd/layerB.usda')]

In [4]:

1
2
3
# EditTarget関係
# EditTarget取得 デフォルトはRoot
target = stage.GetEditTarget()

In [5]:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Spec取得
prim = stage.GetPrimAtPath("/testPrim")
attr = prim.GetAttribute("hoge")
attrB = prim.GetAttribute("val")

# Path指定でEditTarget取得したい
# GetUsedLayers()の引数では Sdf.Findの配列なので、これを使う手もある。
targetB = stage.GetEditTargetForLocalLayer(Sdf.Find('d:/work/usd_py36/usd/layerB.usda'))
# それからPrimSpecを取得
targetBPrim = targetB.GetLayer().GetPrimAtPath('/testPrim')

# アトリビュートが定義されてるか
print('val' in targetBPrim.attributes)
# セットされている値を取得
print(targetBPrim.attributes['val'].default)

Success

1
2
True
10

In [6]:

1
2
3
4
5
6
# Root以外のレイヤーを編集ターゲットにする
stage.SetEditTarget(targetB)
# 試しに追加
stage.DefinePrim("/addTest")
# そして保存
targetB.GetLayer().Save()

Success

1
True