MRが楽しい

MRやVRについて学習したことを書き残す

Blender 2.8のPython APIドキュメントを少しずつ読み解く クイックスタートその2

本日は Blender2.8 の調査枠です。
Blender 2.8 の Python API ドキュメントを少しずつ読みつつ試していきます。

Blender 2.8 Python API Documentation

以下のページを日本語訳しつつ実際に試しつつ記事を進めていきます。
docs.blender.org
docs.blender.org
今日は「クイックスタート」のデータアクセスに関してです。
f:id:bluebirdofoz:20190905091832j:plain

データアクセス

DataBlocksへのアクセス

Python はアニメーションシステムおよびユーザーインターフェイスと同じ方法で Blender のデータにアクセスできます。
ボタン(GUI)を介して変更できる設定は、全てPythonからも変更できることを意味します。

現在ロードされているブレンドファイルからデータにアクセスするには bpy.data モジュールを使用します。
bpy.data を使うと、ライブラリデータにアクセスできます。

例えば:

>>> bpy.data.objects
<bpy_collection[3], BlendDataObjects>

>>> bpy.data.scenes
<bpy_collection[1], BlendDataScenes>

>>> bpy.data.materials
<bpy_collection[1], BlendDataMaterials>

f:id:bluebirdofoz:20190905091855j:plain

コレクションについて

コレクションのメンバーにアクセスする際は文字列だけでなくインデックスも使用できます。
Python の辞書と異なり、文字列/インデックスのどちらの方法も受け入れられます。
ただし、要素のインデックスは Blender の実行中に変更される場合があります。

>>> list(bpy.data.objects)
[bpy.data.objects["Cube"], bpy.data.objects["Plane"]]

>>> bpy.data.objects['Cube']
bpy.data.objects["Cube"]

>>> bpy.data.objects[0]
bpy.data.objects["Cube"]

f:id:bluebirdofoz:20190905091909j:plain

属性へのアクセス

マテリアル、オブジェクト、コレクションなどのデータブロックを取得すると、GUIを使用して設定を変更するのと同じように、その属性にアクセスできます。
実際、各ボタンのツールチップには、スクリプトで変更する設定を見つけるのに役立つ Python 属性も表示されます。

>>> bpy.data.objects[0].name
'Camera'

>>> bpy.data.scenes["Scene"]
bpy.data.scenes['Scene']

>>> bpy.data.materials.new("MyMaterial")
bpy.data.materials['MyMaterial']

f:id:bluebirdofoz:20190905091925j:plain

データのアクセスをテストするには[Pythonコンソール]を使用すると便利です。
[Pythonコンソール]ではオートコンプリートがサポートされており、様々なデータを素早く調べることができます。

コンソールからすばやく見つけることができるデータパスの例:

>>> bpy.data.scenes[0].render.resolution_percentage
100

>>> bpy.data.scenes[0].objects["Torus"].data.vertices[0].co.x
1.0

f:id:bluebirdofoz:20190905091937j:plain

データの作成/削除

クラスを呼び出してもbpy APIの新しいデータブロックを作成できません。
他の Python API に精通している人は、これに驚くかもしれません。

>>> bpy.types.Mesh()
Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
TypeError: bpy_struct.__new__(type): expected a single argument

これは意図的なAPI設計です。
Blender / Python APIBlender データベースの外部に存在するBlenderデータを作成できません。
(データベースのアクセスは bpy.data を介する)
これらのデータは Blender によって管理されるためです(保存/読み込み/取り消し/追加など)。

データは、bpy.data のコレクションのメソッドを介して追加および削除します。
例:

>>> mesh = bpy.data.meshes.new(name="MyMesh")
>>> print(mesh)
<bpy_struct, Mesh("MyMesh.001")>

>>> bpy.data.meshes.remove(mesh)

f:id:bluebirdofoz:20190905091952j:plain

カスタムプロパティ

Pythonは、IDを持つ任意のデータブロックのプロパティにアクセスできます
データはリンクか bpy.data からアクセス可能です。プロパティを割り当てるときに、独自の名前を作成できます。
新規作成されるか、同名が存在する場合は上書きされます。

このデータはブレンドファイルと共に保存され、オブジェクトと共にコピーされます。

例:

bpy.context.object["MyOwnProperty"] = 42

if "SomeProp" in bpy.context.object:
    print("Property found")

# Use the get function like a Python dictionary
# which can have a fallback value.
value = bpy.data.scenes["Scene"].get("test_prop", "fallback value")

# dictionaries can be assigned as long as they only use basic types.
collection = bpy.data.collections.new("MyTestCollection")
collection["MySettings"] = {"foo": 10, "bar": "spam", "baz": {}}

del collection["MySettings"]

データのプロパティには基本的な Python タイプのみを割り当てることができます。

・int、float、string
・int / float のリスト
・Dictionary(文字列キーのみがサポートされています。値は基本型でなければなりません)
これらのプロパティの値は Python の外部で利用可能です。
これらは曲線でアニメーション化するか、ドライバーパスで使用できます。
f:id:bluebirdofoz:20190905092002j:plain

bluebirdofoz.hatenablog.com