MRが楽しい

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

Blender 2.8のPython APIドキュメントを少しずつ読み解く Python APIの概要 その2

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

Blender 2.8 Python API Documentation

以下のページを日本語訳しつつ実際に試しつつ記事を進めていきます。
docs.blender.org
docs.blender.org

今日は「Python APIの概要」のクラスを介した統合までです。
f:id:bluebirdofoz:20190921205042j:plain

クラスを介した統合

テキストエディターでPythonスクリプトを実行する方法は、テストを行うのに役立ちます。
しかし、Blenderを拡張して他の組み込み機能のようにツールにアクセスできるようにする必要があります。

Blender Python APIにより、以下との統合が可能です。
・bpy.types.Panel
・bpy.types.Menu
・bpy.types.Operator
・bpy.types.PropertyGroup
・bpy.types.KeyingSet
・bpy.types.RenderEngine

これは意図的に制限されています。
現在、メッシュモディファイヤ、オブジェクトタイプ、シェーダノードなどのより高度な機能を使用するには、C/C ++ を使用する必要があります。

Python統合の場合、Blenderはすべてのタイプに共通のメソッドを定義します。
これはBlenderとのインターフェース用に事前定義されている親クラスによって指定された、変数と関数を含むBlenderクラスのPythonサブクラスを作成することで機能します。

例を以下に示します。

import bpy
class SimpleOperator(bpy.types.Operator):
    bl_idname = "object.simple_operator"
    bl_label = "Tool Name"

    def execute(self, context):
        print("Hello World")
        return {'FINISHED'}

bpy.utils.register_class(SimpleOperator)

f:id:bluebirdofoz:20190921205055j:plain

最初に、bpy.types のメンバーをサブクラス化していることに注目してください
これはBlenderと統合して使用できるすべてのクラスに共通するため、登録時にPanelではなくOperatorであると分かります。

クラスプロパティは bl_ プレフィックスで始まります。
これはBlenderのプロパティと自分で追加したプロパティを区別するために使用される規則です。

次に、演算子インスタンスと現在のコンテキストを取得する execute 関数があります。
関数には共通の接頭辞は使用されません。

最後にregister関数が呼び出されます。
これによりクラスが取得され、Blenderにロードされます。
詳しくは Class Registration を参照してください。
・Class Registration
 https://docs.blender.org/api/blender2.8/info_overview.html#class-registration

継承に関して、Blenderは使用されるクラス継承の種類を制限しません。
登録チェックは親クラスで定義された属性と関数を使用します。

以下に例を示します。

import bpy
class BaseOperator:
    def execute(self, context):
        print("Hello World BaseClass")
        return {'FINISHED'}

class SimpleOperator(bpy.types.Operator, BaseOperator):
    bl_idname = "object.simple_operator"
    bl_label = "Tool Name"

bpy.utils.register_class(SimpleOperator)

これらのクラスは__init__(self)関数を定義しないことに注意してください。

__init__()および__del__()が定義されている場合は呼び出されますが、クラスインスタンスの有効期間は実行中のみです。
例えば、パネルには再描画ごとに新しいインスタンスとなります。
このため、パネルインスタンスに変数を格納する理由はほとんどありません。
代わりに、永続変数はBlenders ATAに保存して、Blenderの再起動時に状態を復元できるようにする必要があります。

Modal演算子は例外であり、Blenderの実行時にインスタンス変数を保持します。
演算子テンプレートを参照してください。

クラスがBlenderに登録されると、クラスのインスタンス化と関数の呼び出しはBlenderに任されます。
ほとんどのPython APIで分かるように、スクリプトからこれらのクラスをインスタンス化することはできません。

演算子を実行するには、API を介してそれらを呼び出すことができます。

import bpy
bpy.ops.object.simple_operator()

f:id:bluebirdofoz:20190921205107j:plain

UIクラスには、描画するコンテキスト、ボタンウィンドウ、ファイルヘッダー、ツールバーなどが与えられます。
その領域が表示されるときに描画されるため、Pythonスクリプトから直接呼び出されることはありません。
bluebirdofoz.hatenablog.com