MRが楽しい

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

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

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

Blender 2.8 Python API Documentation

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

コンテキスト

名前またはリストからデータに直接アクセスできるのは便利ですが、Blender ではユーザーの選択物を操作する方が一般的です。
コンテキスト(ユーザの選択)は常に bpy.context からアクセスできます。
これは他の多くの属性とともにアクティブなオブジェクト、シーン、ツール設定を取得するために使用できます。

一般的な使用例:

>>> bpy.context.object
>>> bpy.context.selected_objects
>>> bpy.context.visible_bones

f:id:bluebirdofoz:20190906093411j:plain

コンテキストは読み取り専用であることに注意してください。これらの値を直接変更することはできません。
ただし、API関数を実行するかデータAPIを使用すると、その値を変更できます。

以下の例はエラーが発生します。

bpy.context.object = obj

f:id:bluebirdofoz:20190906093421j:plain

以下の例は期待通りに動作します。

bpy.context.view_layer.objects.active = obj

※ 公式ページに記載されている以下コマンドは Blneder 2.8 では動作しない
bpy.context.scene.objects.active = obj

f:id:bluebirdofoz:20190906093450j:plain

コンテキスト属性はアクセス先に応じて変わります。
例えば、[3Dビュー]には[Pythonコンソール]とは異なるコンテキストメンバーがあります。
そのため、コンテキスト属性にアクセスするときはユーザの状態に注意してください

詳しくは bpy.context APIリファレンスを確認してください。
docs.blender.org

オペレーター(ツール)

オペレーターは一般にボタン、メニュー項目、またはキーショートカットからユーザーがアクセスするツールです。
GUIの観点からはツールですが、Python は bpy.ops モジュールを介してこれらを実行できます。

例:

>>> bpy.ops.mesh.flip_normals()
{'FINISHED'}
>>> bpy.ops.mesh.hide(unselected=False)
{'FINISHED'}
>>> bpy.ops.object.transform_apply()
{'FINISHED'}

f:id:bluebirdofoz:20190906093530j:plain

メニューの ヘルプ -> 操作チートシート には、Python 構文の全てのオペレーターとそのデフォルト値のリストが表示されます。
これは Blender の全てのオペレーターの概要を知るのに便利です。
f:id:bluebirdofoz:20190906093544j:plain

実行後、テキストエディタ―からテキストデータとして出力された"OperatiorList.txt"を開いて確認できます。
f:id:bluebirdofoz:20190906093553j:plain

Poll()関数

多くのオペレーターには「ポーリング」機能があります。
これはカーソルが有効な領域にあるかオブジェクトが正しいモード(編集モード、ウェイトペイントなど)にあるかを確認します。
「ポーリング」機能が Python 内で失敗すると、例外が発生します。

例えば bpy.ops.view3d.render_border() をコンソールから呼び出すと、次のエラーが発生します。

RuntimeError: Operator bpy.ops.view3d.render_border.poll() failed, context is incorrect

この場合、コンテキスト(ユーザの選択)はアクティブなカメラのある3Dビューでなければなりません。
f:id:bluebirdofoz:20190906093606j:plain

オペレーターが呼び出されるたびにtry / except句を使用しないようにするには、オペレーターの poll() 関数を呼び出します。
poll() 関数は、オペレーターが現在のコンテキストで実行できるかどうかを確認します。

例:

if bpy.ops.view3d.render_border.poll():
    bpy.ops.view3d.render_border()

f:id:bluebirdofoz:20190906093617j:plain

bluebirdofoz.hatenablog.com