コンテンツにスキップ

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 です。


最終更新日: 2022-08-15 16:04:59