Skip to content

Propertyを追加する

Blender では、Mesh や Camera、Material 等プロジェクトを構成するデータは Data Block と呼ばれる単位で
扱われます。

そのデータは、 Data API で確認することができて、各 Type 以下に Data-Block があります。

たとえば、Objects の場合。
Objects 以下にはプロジェクトに含まれる Objects の Data-Block があります。

この Data-block に、この DataType を構成するための Property があります。

Blender ではこの Data-block を Add-on で拡張することができて
何かしら処理を実行したい場、Property を指定し
GUI から変更するできるようにパネルを用意することで、様々なツールを作ることができます。

Property を追加する

基本

Data-Block は、プログラミング的に言うとクラスのインスタンスのようなもので
指定の型(bpy.types ) をひな形として作成されるオブジェクトです。

1
bpy.types.Object.hoge = bpy.props.IntProperty()

Types(bpy.types)を確認すると、types の中に ID を継承した型があるのがわかります。
これらが、Data-Block の元になるタイプなので、
拡張する場合は、この bpy.types に指定の名前の property を用意し、作成したい型の Property Definitions (bpy.props) を代入します。

ObjectType に対して hoge の IntProperty を追加しました。

1
2
3
4
# 代入
 bpy.data.objects[0].hoge = 100
 # 取得
 print(bpy.data.objects[0].hoge)

types に追加されると、Data-Block に Property が追加され、取得したり代入したりすることが可能になります。

ある Data-Block への参照

Property には、Int や Float のような値以外に
別の Data-Block への参照を定義することができます。
(Object への Data 指定、Material の Assing 情報なども同様の方法で定義されています)

1
bpy.types.Object.sample = bpy.props.PointerProperty(type=bpy.types.Material)

PointerProperty は、指定の Type を指定すると
その Type の Data-Block を指定できるようになります。

PointerProperty を定義すると、このように特定の Type への接続口が作成されます。

1
bpy.data.objects[0].sample = bpy.data.materials[0]

その作成した PointerProperty に、指定の Type の Data-Block を代入すると

リンクが作成できました。

Property から、指定の Data-Block を取得できました。

PropertyGroup

最後に、PropertyGroup を使用すると、Property を1つの構造体として定義することができます。

1
2
3
4
5
class PropGroup(bpy.types.PropertyGroup):
    # PropetyGroupを追加
    my_int: bpy.props.IntProperty()
    my_float: bpy.props.FloatProperty()
    my_string: bpy.props.StringProperty()

作成するには、bpy.types.PropertyGroup を継承したクラスに
クラス変数として Property を定義します。
( : は Python3 の型指定をするためのもの)

1
bpy.types.Material.my_settings = bpy.props.PointerProperty(type=PropGroup)

そして、追加したい Type に対して POinterProperty で PropertyGroup を追加します。

1
bpy.data.materials[0].my_settings.my_int = 10

PropertyGroup を作成すると、このように groupName.prop のような
グループ階層を追加することができます。

Addon で追加する

Blender の Addon で追加する場合は

のように、 クラス定義と Property への登録処理をする構造を
作成すれば OK です。