Dev:JA/Ref/Release Notes/4.40/python api

提供: wiki
移動先: 案内検索

元記事:Python API - Blender Developer Documentation

Blender 4.4: Python API

互換性のなくなる変更

Blender タイプのサブクラス化

Blender タイプ(OperatorPropertyGroup など)を元に、自身の __new__/__init__ コンストラクタを定義した Python 定義のクラスは、汎用の位置引数とキーワード引数を渡して親の対応する関数を呼び出さないといけなくなりました

import bpy
class AwesomeRaytracer(bpy.types.RenderEngine):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        ...

Paint

  • paint.brushpaint.eraser_brush が読み込み専用のプロパティになりました。(9e8c037375)

GPU

  • POLYLINE_FLAT_COLOR または POLYLINE_SMOOTH_COLORPOLYLINE_UNIFORM_COLOR で描画、もしくは幅が2以上の線を FLAT_COLOR または SMOOTH_COLORUNIFORM_COLOR で描いた場合、下記のルールが適用されるようになりました。
    • pos 属性は F32 形式の FLOAT フェッチタイプを使用すること。
    • color 属性は F32 形式の FLOAT フェッチタイプまたは 4コンポーネントU8 と、フェッチモードに INT_TO_FLOAT_UNIT を使用すること。
    • 各属性は4バイトで揃える必要があります。
    • プリミティブタイプは GPU_PRIM_LINES または GPU_PRIM_LINE_STRIPGPU_PRIM_LINE_LOOP にする必要があります。
    • インデックスバッファを使用した描画の場合、プリミティブリスタートインデックスを入れてはいけません。

Grease Pencil

  • Texture Mapping(テクスチャマッピング)モディファイアーの Influence(影響)から、頂点グループを削除しました。(c452d5d9e8)

Video Sequencer

  • bpy.types.Sequence と関連するすべてのタイプを bpy.types.Strip にリネームしました。完全なリストは下記を参照してください。
  • Text(テキスト)ストリップの align_xalign_yanchor_xanchor_y にリネーム。プロパティ alignment_x は正しく行揃えするように。(77a5478c0f)

ユーザーインターフェイス

  • UILayout.template_icon() がビルトインのアイコンを通常サイズで表示、ボタンにあわせてスケールが変化しないように。(1f88645728)

Actions

  • アクションに [../animation_rigging/#slotted-actions スロット]が付き、アクションの割り当てと編集に変更が必要です。詳しい更新方法は下記の説明をお読みください。

追加

bpy.app

  • 属性 bpy.app.portable は、インストールされている Blender がポータブル版かどうかを示し、WITH_INSTALL_PORTABLE ビルドオプションと一致します。(481a8b67d4)
  • 属性 bpy.app.module は、Blender が Python モジュールとして実行中かどうかを示します。(a6b293daac)

Grease Pencil

  • frame.drawing プロパティ用のセッターを追加。(dc6e879d0f).
    • ドローイングをどこか(他のレイヤーやオブジェクト)からコピーするのに利用可能です:frame.drawing = other_drawing
  • 新しいプロパティ is_expanded をレイヤーグループに追加(e5bdfd533b). そのレイヤーグループがレイヤーツリー UI 内で開いていれば True を返します。
  • ドローイングのストロークを並べ替える関数を追加。drawing.reorder_strokes(new_indices=[...])。(a265b591be)
  • color_tag 列挙プロパティをレイヤーグループに追加し、カラータグを公開。(36d69e8491).
  • Texture Mapping(テクスチャマッピング)モディファイアーから頂点グループの影響を削除。(c452d5d9e8)

Curves

  • 新しい Curves.reorder_curves(new_indices=[...])。カーブを並べ替えます。(a265b591be)
  • 新しい Curves.set_types()。カーブタイプを変更します。(5db88ff2e3)

ノード

  • 新しい Node.color_tag プロパティ。ノードのカラータグ(Texture、Vector、Output など…)に対応する列挙アイテムを返します。(6cd33510c3)
  • 新しい bl_use_group_interface プロパティを、カスタムノードツリー用に追加可能に。ノードグループ用の一部のビルトイン UI を無効化できます。(ebfbc7757b)

マスクポイント

  • 新しい select_left_handleselect_right_handleselect_control_pointselect_single_handle プロパティ。(462d887114)

Python モジュールとしての Blender 利用

PyPI の bpy パッケージが、Blender で使用している VFX ライブラリへのアクセスを提供するように。(PR#133082)

大半は PyPI で個別のパッケージとして入手可能ですが、Blender と同じバージョンやビルドオプションではない場合があります。この所為で、Blender とデータをやり取りする際にエラーが発生する可能性がありますが、一致するバージョンを使用することで解決できます。

import bpy

# Blender バンドルの VFX ライブラリを sys.path に追加
bpy.utils.expose_bundled_modules()

# 必要なライブラリをインポート
import pxr
import MaterialX
import OpenImageIO
import PyOpenColorIO
import pyopenvdb

Slotted Actions(スロット化アクション)

互換性のなくなる変更

アクションの割り当て(datablock.animation_data.action = some_action)は、特定の条件下ではアクションスロットを自動割り当てを行わないため、そのデータブロックがアニメーションされないままになることがあります。

アクションの最初のスロットを強制的に割り当てるには、割り当ての後に datablock.animation_data.action_slot = some_action.slots[0] を追加します。これは、最初のスロットの target_id_typeUNSPECIFIED または datablock.id_type と同じであることが前提です。この前提はバージョニングされたアクションのみ有効です。

注意
NLA ストリップまたはアクションコンストレイントへのアクションの割り当てでは、少し動作が違います。strip.action = some_action または constraint.action = some_action では、常に target_id_type と互換性のある最初のスロットが自動で割り当てられます。割り当て後の状態が同じである(アクションがアニメーションする)ため、実際には後方互換性があることになります。


追記

スロット化アクションは、アクションを完全にレイヤー化する、進行中の取り組みの一つです。レイヤー化はまだ対応していませんが、データモデルはレイヤーとストリップに対応しています。これは、スロット化アクション用の新しいAPIに反映されています。

import bpy

# アクションは以前に作成済み
action = bpy.data.actions.new("SuzanneAction")

# スロットの作成は ID タイプと名前が必要
slot = action.slots.new(id_type='OBJECT', name="Suzanne")
print(f"slot type={slot.target_id_type} name={slot.name_display} identifier={slot.identifier}")
# 出力:
#   slot type=OBJECT name=Suzanne identifier=OBSuzanne

# F カーブとチャンネルグループは単一レイヤーにある無限キーフレームストリップに格納されるように
layer = action.layers.new("Layer")
strip = layer.strips.new(type='KEYFRAME')
channelbag = strip.channelbag(slot, ensure=True)

# F カーブとグループはチャンネルバッグに以前の `action` と同じ API で作成
# F カーブとグループ自体は今も完全に以前と同じ API
fcurve = channelbag.fcurves.new("location", index=1)
group = channelbag.groups.new("Object Transform")
fcurve.group = group

# アクションの割り当ては自動的に Suzanne の ID タイプ+名前と一致するスロットを選択:
suzanne = bpy.data.objects["Suzanne"]
anim_data = suzanne.animation_data_create()
anim_data.action = action

# 明示的なスロット割り当てが必要な場合:
anim_data.action_slot = action.slots[0]

# 複数のスロットがアクションにあり、互換性のある最初の物が欲しい時は
# 下のコードを使用すること。`anim_data.action_suitable_slots` は、
# アクション割り当て後に使用可能。これはそのアクションのアクション
# スロットのリストだが、中は anim_data のオーナー(ここでは Suzanne)
# と互換性のある物のみ
anim_data.action_slot = anim_data.action_suitable_slots[0]

# 代わりに 'last_slot_identifier'(最後に使用した識別子)を
# 設定することで、自動割り当てスロットを決定させることも可能
anim_data.last_slot_identifier = 'OBDancing Monkey'
anim_data.action = action
print(anim_data.action_slot.identifier)
# 出力: OBDancing Monkey(そのアクションにスロットがある場合)

# 特定のスロットでアニメーションを行っているデータブロックを取得
for action in bpy.data.actions:
    print(f"Action: {action.name}")
    for slot in action.slots:
        print(f"  slot {slot.identifier} is ", end="")
        slot_users = slot.users()
        if not slot_users:
            print("unused")
            continue
        print("used by:")
        for datablock in slot_users:
            print(f"    - {datablock!r}")

上のコードは低レベルの機能を紹介しています。必要なのは、F カーブがアクションに存在するのを確認することだけです。指定のデータブロックをアニメーションさせたい場合は、下記の便利な関数が使用できます。

import bpy

# あらかじめアクションは作成しておくこと
action = bpy.data.actions.new("SuzanneAction")

# アクションを割り当て、Blender に Suzanne との関係を知らせる
suzanne = bpy.data.objects["Suzanne"]
suzanne.animation_data_create().action = action

# F カーブを作成
loc_x = action.fcurve_ensure_for_datablock(suzanne, "location", index=0)
loc_y = action.fcurve_ensure_for_datablock(suzanne, "location", index=1)
loc_z = action.fcurve_ensure_for_datablock(suzanne, "location", index=2)

単に特定のスロット用のチャンネルバッグを探したい時のために、これにも便利な関数があります。この関数はアクションに最大1レイヤー、1キーフレームストリップしかないことを前提としており、この前提は Blender 4.4内の全アクションに当てはまります。この関数を呼び出すことで、将来マルチレイヤーのアニメーションが実装された時に、そのコードに注意が必要になることを示す、いい指標となります。

import bpy
from bpy_extras import anim_utils

# Suzanne はすでにアニメーションされていると仮定
suzanne = bpy.data.objects["Suzanne"]
action = suzanne.animation_data.action
action_slot = suzanne.animation_data.action_slot
channelbag = anim_utils.action_get_channelbag_for_slot(action, action_slot)

# これでチャンネルバッグ内の F カーブにアクセス可能に
for fcurve in channelbag.fcurves:
  print(f"FCurve: {fcurve.data_path}[{fcurve.array_index}]")

下は旧バージョンの Blender で動作するコードで、4.4でも動作します。

import bpy

# 単にオブジェクトを取得し、キー挿入を開始。これはアクションを
# レイヤー、キーフレームストリップ、チャンネルバッグ、スロット
# とともに作成し、アクションとスロットを Suzanne に割り当てます
suzanne = bpy.data.objects["Suzanne"]
suzanne.keyframe_insert("location", index=0)
suzanne.keyframe_insert("location", index=1)
suzanne.keyframe_insert("location", index=2)
注意
データモデルは複数のレイヤーと、レイヤー毎に複数のストリップを持つことができるようになっていますが、現在、Blender は単一レイヤーと単一キーフレームストリップのみに制限されています。ストリップは無限長で、移動できません。


廃止予定

Action タイプの旧関数と属性が 'backward-compatible legacy API'(後方互換性用旧 API) とマークされました。これらはすべて最初のアクションスロットのデータのみ処理を行い、必要ならデータ構造体を作成します。

旧 API 新 API
action.fcurves action.layers[0].strips[0].channelbag(action.slots[0]).fcurves
action.groups action.layers[0].strips[0].channelbag(action.slots[0]).groups
action.id_root action.slots[0].target_id_type

この旧 API は Blender 5.0 で廃止される予定です。


ビデオシーケンサーストリップ

互換性の失われる変更

タイプ bpy.types.Sequence が、関連するタイプもすべて bpy.types.Strip にリネームされました。(d3ba70190b)

下記はそのフルリストです。

4.3 4.4
bpy.types.Sequence bpy.types.Strip
bpy.types.EffectSequence bpy.types.EffectStrip
bpy.types.AddSequence bpy.types.AddStrip
bpy.types.AdjustmentSequence bpy.types.AdjustmentStrip
bpy.types.AlphaOverSequence bpy.types.AlphaOverStrip
bpy.types.AlphaUnderSequence bpy.types.AlphaUnderStrip
bpy.types.ColorMixSequence bpy.types.ColorMixStrip
bpy.types.ColorSequence bpy.types.ColorStrip
bpy.types.CrossSequence bpy.types.CrossStrip
bpy.types.GammaCrossSequence bpy.types.GammaCrossStrip
bpy.types.GaussianBlurSequence bpy.types.GaussianBlurStrip
bpy.types.GlowSequence bpy.types.GlowStrip
bpy.types.MulticamSequence bpy.types.MulticamStrip
bpy.types.MultiplySequence bpy.types.MultiplyStrip
bpy.types.OverDropSequence bpy.types.OverDropStrip
bpy.types.SpeedControlSequence bpy.types.SpeedControlStrip
bpy.types.SubtractSequence bpy.types.SubtractStrip
bpy.types.TextSequence bpy.types.TextStrip
bpy.types.TransformSequence bpy.types.TransformStrip
bpy.types.WipeSequence bpy.types.WipeStrip
bpy.types.ImageSequence bpy.types.ImageStrip
bpy.types.MaskSequence bpy.types.MaskStrip
bpy.types.MetaSequence bpy.types.MetaStrip
bpy.types.MovieClipSequence bpy.types.MovieClipStrip
bpy.types.MovieSequence bpy.types.MovieStrip
bpy.types.SceneSequence bpy.types.SceneStrip
bpy.types.SoundSequence bpy.types.SoundStrip
bpy.types.SequenceColorBalanceData bpy.types.StripColorBalanceData
bpy.types.SequenceColorBalance bpy.types.StripColorBalance
bpy.types.SequenceCrop bpy.types.StripCrop
bpy.types.SequenceElement bpy.types.StripElement
bpy.types.SequenceElements bpy.types.StripElements
bpy.types.SequenceModifier bpy.types.StripModifier
bpy.types.SequenceModifiers bpy.types.StripModifiers
bpy.types.SequenceProxy bpy.types.StripProxy
bpy.types.SequenceTransform bpy.types.StripTransform
bpy.types.SequencesMeta bpy.types.StripsMeta
bpy.types.SequencesTopLevel bpy.types.StripsTopLevel

廃止予定

bpy.types.Strip(従来は bpy.types.Sequence)を「sequence」として参照するプロパティは廃止予定になり、「strip」に名前を変えた新しいプロパティが追加されました。旧プロパティは5.0まで利用可能ですが、アドオン開発者は新しいプロパティ名を使用するようアドオンを更新することが推奨されます。

廃止予定のプロパティ 新しいプロパティ
context.active_sequence_strip context.active_strip
context.selected_editable_sequences context.selected_editable_strips
context.selected_sequences context.selected_strips
context.sequences context.strips
SequenceEditor.sequences SequenceEditor.strips
SequenceEditor.sequences_all SequenceEditor.strips_all
MetaStrip.sequences MetaStrip.strips