コンテンツにスキップ

Plugin Metadataを使おう

Plugin Metadataとは、PrimやLayer、Attributeなどに対してMetadataを
指定できるようにする機能です。

Pluginで特に指定がない場合、

1
prim.SetMetadata('metadata_name',100)

このようにMetadataを指定しようとしても、エラーになります。
(自由に指定をしたい場合は、CustomDataを使う)

Plugin Metadataを使用すれば、指定の名前・型のMetadataを定義して
使用できるようになります。

plugInfo.json

Plugin Metadataは、 plugInfo.json で定義します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "Plugins": [
    {
      "Name": "MetadataPlugin",
      "Type": "resource",
      "Info": {
        "SdfMetadata": {
          "sample_metadata": {
            "type": "string",
            "appliesTo": "prims",
            "default": "hello world!!"
          },
          "layer_metadata": {
            "type": "string",
            "appliesTo": "layers",
            "default": "layer sample!!"
          },
          "attr_metadata": {
            "type": "int",
            "appliesTo": ["properties", "attributes"],
            "default": 100
          }
        }
      }
    }
  ]
}

基本構造はこんな感じになります。

https://graphics.pixar.com/usd/docs/api/sdf_page_front.html#sdf_metadata_types
使える型一覧はこのページにまとめてあります。
"type" value で型を指定して、appliesTo で、適応する対象を指定します。

plugInfo.jsonを保存する

作成した plugInfo.jsonは、PXR_PLUGINPATH_NAME で指定したフォルダ以下の
pluginDirName/resources/plugInfo.json
に保存します。

Metadataを使用する

In [2]:

1
2
3
4
5
6
from pxr import Usd,Sdf
stage = Usd.Stage.CreateInMemory()
prim = stage.DefinePrim('/samplePrim')
# Metadataを指定する
prim.SetMetadata('sample_metadata','hogehoge')
print(stage.GetRootLayer().ExportToString())

Success

1
2
3
4
5
6
7
#usda 1.0

def "samplePrim" (
    sample_metadata = "hogehoge"
)
{
}

custom_metadata.ipynb

まずはPrimを指定する場合。
appliesTo で、 prims を指定することでPrimにMetadataを追加できます。

In [3]:

1
2
3
4
5
6
stage = Usd.Stage.CreateInMemory()
layer = stage.GetRootLayer()
# Layerに対してMetadataを追加する
pseudoRoot = stage.GetPseudoRoot()
pseudoRoot.SetMetadata('layer_metadata','hoge')
print(layer.ExportToString())

Success

1
2
3
4
#usda 1.0
(
    layer_metadata = "hoge"
)

custom_metadata.ipynb

次にLayerの場合。
SdfLayerには SetMetadataはありません。
Layerに対してLayerを指定したい場合は、GetPseudoRoot で RootPrimを取得して
そのPrimに対してMetadataを指定すると、Layerに対してMetadataを指定できます。

In [1]:

1
2
3
4
5
6
7
8
9
from pxr import Usd,Sdf
stage = Usd.Stage.CreateInMemory()
prim = stage.DefinePrim('/samplePrim')
attr = prim.CreateAttribute('sampleAttr',Sdf.ValueTypeNames.Int)
attr.Set(100)
attr.SetMetadata('attr_metadata',123)
# Metadataを指定する
prim.SetMetadata('sample_metadata','hogehoge')
print(stage.GetRootLayer().ExportToString())

Success

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#usda 1.0

def "samplePrim" (
    sample_metadata = "hogehoge"
)
{
    custom int sampleAttr = 100 (
        attr_metadata = 123
    )
}

custom_metadata.ipynb

Attribute/Propertisに対しての場合。
appliesToは複数指定することができて、複数の場合は配列で渡せばOKです。


最終更新日: 2021-05-29 18:53:27