元記事:Python API - Blender Developer Documentation
bpy.props
API に定義されるプロパティが,ユーザー定義のカスタムプロパティとして同じコンテナに格納されなくなりました。
そのため、今後は Pythonの「辞書のような」構文で直接アクセスできなくなりました。
例えば、bpy.context.scene['cycles'] では、Cycles のシーン設定にアクセスできません。
get_transform と set_transform bpy.props アクセサこれらの新しいコールバックにより、デフォルト(IDProperty ベースの)ストレージシステムを使用しつつ、値の編集ができます。
これらは bpy.props で定義されたプロパティに対し、基礎となる IDProperty ストレージへの直接アクセスが完全に未対応になったために必要になりました。つまり、get/set のみを使用して値のトランスフォームを行っていたが、まだ IDProperty に格納していた古いコードが、もう通用しなくなったということです。
以下関連のメモです:
読み込み専用プロパティは新しい options フラグ、READ_ONLY を使用して定義してください。
get/set はデフォルトシステム外でデータを格納する時にのみ使用してください。
set がなく、get のみの場合は、強制的に読み込み専用プロパティになります(以前と同じ挙動)。get がなく、set のみの場合はエラーになるようになりました。get と get_transform、または set と set_transform の両方のコールバックは必要ありません。既存の get/set コールバック同様、get_/set_transform コールバックは常に その bpy.props プロパティ定義により決められた制限に合わせた値(同じまたは互換性のあるタイプ、必要な範囲、同じ次元・長さの Vector プロパティなど)を生成する必要があります。
メモ:最初のベンチマークでは、'transform' バージョンの get/set は「実際の」get/set より何倍か高速でした。
●従来
del obj['cycles']
# または…
obj.property_unset('cycles')
●今後
obj.property_unset('cycles')
●従来
# ノーチェックのため非常に危険
# 割り当てた辞書風データのコンテンツで実行
obj['cycles'] = another_obj['cycles']
●今後
作業中。内容を再帰的にコピーするアイデアはありますが、GroupProperty レベル自体でこの機能の処理も改善できるかも…
●従来
old_prop = obj['old_data']['old_prop']
obj.new_data.new_prop = old_prop
●今後
# これは `bl_system_properties_get` に想定している主な用途
sys_props = obj.bl_system_properties_get()
old_prop = sys_props['old_data']['old_prop']
obj.new_data.new_prop = old_prop
●従来
# getter コールバック関数の
# トリガーなしでのプロパティ取得
my_var = obj.my_addon['my_prop']
# setter や update コールバック関数の
# トリガーなしでのプロパティ設定
obj.my_addon['my_prop'] = 1
●今後
もう直接アクセスには対応していません。依存する必要のないコードに書き換える必要があるでしょう。そうしたくない場合は、皆さんの getter/setter 関数にチェックするフラグを定義(ここを参照)、もしくは明示的なカスタム getter と setter で(カスタムプロパティ同様に)強制的にカスタムデータストレージを使用してください。
このような RNA プロパティシステム処理のバイパスは全くお勧めできません。やるなら自己責任でどうぞ!
Blender は様々なバンドル Python モジュールとともにリリースされていますが、これらはパブリック API の一部としてドキュメント化はされておらず、スクリプトがこれらをインポートする可能性もあります。
下記のモジュールはプライベートになりました。スクリプトから使用しないでください。
animsys_refactorbl_console_utilsbl_i18n_utilsbl_previews_utilsbl_rna_utilsbl_text_utilsbl_ui_utilsbpy_restrict_stateconsole_pythonconsole_shellgraphviz_exportkeyingsets_utilsrna_inforna_manual_referencerna_xml廃止予定の BGL API を削除。(decd88f67e)
廃止予定の Image.bindcode を削除。代わりに gpu.texture.from_image(image) と新しい gpu.types.GPUTexture タイプを使用してください。(decd88f67e)
GLSL ソースファイルからの直接シェーダー生成を削除 (11063b5b90)
Python 描画ハンドラ内部での描画時、gpu.texture.from_image から返ってきたテクスチャは、draw_texture_2d(is_scene_linear_with_rec709_srgb_target=True) または IMAGE_SCENE_LINEAR_TO_REC709_SRGB ビルトインシェーダーで描画する必要があります。これはレンダーターゲットがシーンリニア色空間内であることが判っている場合は必要ありません。(e2dc63c5de)
EEVEE のレンダーエンジン識別子が、BLENDER_EEVEE_NEXT から BLENDER_EEVEE に変更されました。(4fe75da973)
多数のレンダーパスの不明瞭な略語を避けるようリネームされました。例えば、'DiffCol' は 'Diffuse Color'、'IndexMA' は 'Material Index'、'Z' は 'Depth' などです。(PR#141675、PR#142731)
scene.eevee.gtao_distance がビューレイヤーに移動し、view_layer.eevee.ambient_occlusion_distance にリネームしました。(1c29a2e2e5)
SceneEEVEE プロパティの gtao_quality、use_gtao が削除されました。(they did nothing since 4.2). (1c29a2e2e5)
Brush タイプの enum プロパティ名の接頭辞が、_tool から _brush_type (例えば brush.sculpt_tool が brush.sculpt_brush_type)に変更されました。(ab3c129dd9)
tool_settings 構造体からモード固有の Paint 構造体に unified_paint_settings 構造体を移動しました(例:scene.tool_settings.unified_paint_settings は、scene.tool_settings.sculpt.unified_paint_settings になります)。(4434a30d40)
Radial symmetry がシーンのツール設定(scene.tool_settings.sculpt.radial_symmetry など)から mesh(mesh.radial_symmetry)に移動しました。(d73b8dd4f3)
Brush の curve と curve_preset プロパティがそれぞれ curve_distance_falloff と curve_distance_falloff_preset にリネーム。 (327a1925cf)
brush.curve_preset と brush.sculpt_curves_falloff_preset オペレーターが削除されました。これらの機能はテンプレートを通じたカーブの直接制御で置き換えられました。(0f3c6da272)
controll
ImageTexture のプロパティ、filter_type、use_mipmap、use_mipmap_gauss、filter_lightprobes、filter_eccentricity、use_filter_size_min が削除されました(これらは2.80以降何もしていませんでした)。(PR#139978)VSE がコンテクストに別のシーンを使用するように:
context.workspace.sequencer_scene(または短く context.sequencer_scene)が、現在のワークスペースで全シーケンスエディターが使用しているシーンです。context.scene はウィンドウ内のアクティブシーンを指しています(これは VSE が使用しているシーンとは違う可能性があります!)新しく追加された image(画像)とエフェクトストリップ(これは start_frame と相対値で間接的に期間がコントロールされています)の end_frame プロパティが、複数の画像ストリップの同時追加に対応するため、length で置き換えられました。(PR#143974)
ストリップ追加オペレーターが、追加後にストリップのトランスフォームが可能な move_strips プロパティを使用するように。このプロパティはデフォルトで有効になっており、これらのオペレーターがモーダルになります。(PR#138382)
context.active_file がもうアセットシェルフで利用できなくなりました。代わりに context.asset を使用してください。(7cd26d37ea)
bpy.types.AssetHandle が削除されました。代わりに AssetRepresentation を使用してください。(85878cf541)
bpy.types.AssetCatalogPath が削除されました。これはどこも使用していない、または利用できませんでした。(bafb63a654)
UILayout.template_asset_view() が削除されました。これはアセットシェルフにとって代わられました。(ae9ca35e3b)
navigation_bar、execution_buts。(dd43eae0d3)tab_active、tab_inactive、tab_outline。これらは通常のタブウィジェットカラーに追従するようになりました。(e8735c3203)panelcolors(header、back、sub_back を含む)。グローバルスタイリングの panel_header、panel_back、panel_sub_back で置き換えられました。(7818082d02)廃止予定のコンポジターノードが削除されました。(#140355)
廃止予定の Combine(合成)と Separate(分離)系ノードが削除されました。(#135376)
Point Density(点密度)テクスチャノードが削除されました。(#140292)
Sky(大気)テクスチャノードの sun_direction、turbidity、ground_albedo 入力が削除されました。(ab21755aaf)
ツリーインターフェイスアイテムの識別子による参照が可能に。(6f2988f0af)
scene.use_nodes が廃止予定になり、6.0で削除される予定です。現在、常に True を返し、設定してもなんの効果もありません。(PR#143578).
scene.node_tree が削除されました。代わりに scene.compositing_node_group を使用してください。(PR#143619)
基本的なノードツリーを作成するには下記を参照してください。
# 古い方法によるデフォルトコンポジティングノードツリー作成
scene.use_nodes = True # Node tree with default nodes is created here
default_render_layers = scene.node_tree.nodes["Render Layers"]
...
# 新しい方法によるノードツリー作成
tree = bpy.data.node_groups.new("My new comp", "CompositorNodeTree")
scene.compositing_node_group = tree
rlayers = tree.nodes.new(type="CompositorNodeRLayers")
output = tree.nodes.new(type='NodeGroupOutput')
tree.interface.new_socket(name="Image", in_out="OUTPUT", socket_type="NodeSocketColor")
tree.links.new(output.inputs["Image"], rlayers.outputs["Image"])
rlayers.location[0] -= 1.5 * rlayers.width
directory と file_name を二つの違う入力と取るように。
bpy.types.CompositorNodeOutputFile.file_slotsbpy.types.CompositorNodeOutputFile.layer_slotsbpy.types.CompositorNodeOutputFile.base_pathbpy.types.CompositorNodeOutputFile.directorybpy.types.CompositorNodeOutputFile.file_namebpy.types.CompositorNodeOutputFile.file_output_items# 4.5でのカスタム名の入力ソケットの設定
file_output_node = ...
file_output_node.file_slots[0].path = "my_custom_socket_name"
# 5.0:
file_output_node = ...
file_output_node.file_output_items[0].name = "my_custom_socket_name"
SpaceNodeEditor.geometry_nodes_type と SpaceNodeEditor.geometry_nodes_tool_tree がそれぞれ node_tree_sub_type と selected_node_group にリネームされました。(3d7c8d022e)
コンポジティングの Color(カラー)ノードの出力ソケットを "RGBA" から "Color"(カラー)にリネーム。(fff3af04c4)
コンポジターの Gamma(ガンマ)ノードの CompositorNodeGamma は、その対になるシェーダーノードの ShaderNodeGamma で置き換えられました。緩和策のサンプル:
# 旧:
n = bpy.context.scene.node_tree.nodes.new("CompositorNodeGamma")
# 新:
n = bpy.context.scene.node_tree.nodes.new("ShaderNodeGamma")
廃止予定の Scene.alembic_export API を削除。これは2.8から廃止予定で、対応するインポートもありません。実際のインポート・エクスポートオペレーターに変更はなく、bpy.ops.wm.alembic_import と bpy.ops.wm.alembic_export としてそのままあります。(ec4db5825d)
bpy.ops.wm.alembic_export(上記)のオプションである、visible_objects_only オペレーターを削除。(7c75651b3b)
bpy.ops.wm.usd_import の import_subdiv オペレーターを import_subdivision にリネーム。(fe54725113)
bpy.ops.wm.usd_import の attr_import_mode オペレーターを property_import_mode にリネーム。(c2cf3783c4)
bpy.ops.wm.usd_export の export_textures オペレーターオプションを削除。これは export_textures_mode オプションが代替となります。(b248c83027)
bpy.ops.wm.usd_export の allow_unicode オペレーターオプションをデフォルトで true に変更。(f7210eabd8)
bpy.ops.wm.usd_export の visible_objects_only オペレーターオプションを削除。(7c75651b3b)
UV layer pin プロパティが、このプロパティアクセス時に対応する他の属性を勝手に作成しなくなりました。代わりに _ensure() 関数で、確実な同名の属性を作ります。(e1c121cd6a)
UV の選択が、全 UV マップ間で共有されるように。
.uv_select_vert (面コーナー).uv_select_edge (面の辺).uv_select_face (面)BMesh の属性:
bmesh.types.BMLoop.uv_select_vert.bmesh.types.BMLoop.uv_select_edge.bmesh.types.BMFace.uv_select.bmesh.types.BMesh.uv_select_sync_valid.BMesh のメソッド:
bmesh.types.BMLoop.uv_select_vert_set().
bmesh.types.BMLoop.uv_select_edge_set().
bmesh.types.BMFace.uv_select_set().
bmesh.types.BMesh.uv_select_flush_mode().
bmesh.types.BMesh.uv_select_flush().
bmesh.types.BMesh.uv_select_flush_shared().
bmesh.types.BMesh.uv_select_sync_from_mesh().
bmesh.types.BMesh.uv_select_sync_to_mesh().
bmesh.types.BMesh.uv_select_foreach_set().
bmesh.types.BMesh.uv_select_foreach_set_from_mesh().
詳細は bmesh.types API ドキュメントを参照してください。
削除:
下記の UV 選択プロパティが削除されました。
bpy.types.MeshUVLoopLayer.vertex_selection.
bpy.types.MeshUVLoopLayer.edge_selection.
bmesh.types.BMLoopUV.select.
bmesh.types.BMLoopUV.select_edge.
bpy.types.UIList.layout_type の GRID 列挙値が削除されました。eef971e377)RNA_ADD アイコンが Blender 自体が使用しておらず、削除されました。(c8468f5cfa)bpy.types.UILayout.emboss 内の RADIAL_MENU 列挙値を PIE_MENU にリネーム。(c7b91903df).| 以前 | 以降 |
|---|---|
bpy.types.GPencilStrokePoint |
bpy.types.AnnotationStrokePoint |
bpy.types.GPencilStroke |
bpy.types.AnnotationStroke |
bpy.types.GPencilFrame |
bpy.types.AnnotationFrame |
bpy.types.GPencilFrames |
bpy.types.AnnotationFrames |
bpy.types.GPencilLayer |
bpy.types.AnnotationLayer |
bpy.types.GPencilLayers |
bpy.types.AnnotationLayers |
bpy.types.GreasePencil |
bpy.types.Annotation |
bpy.types.BlendDataGreasePencils |
bpy.types.BlendDataAnnotations |
プロパティ:
| 以前 | 以降 |
|---|---|
bpy.data.grease_pencils |
bpy.types.annotations |
MovieClip.grease_pencil |
MovieClip.annotation |
NodeTree.grease_pencil |
NodeTree.annotation |
Scene.grease_pencil |
Scene.annotation |
SpaceImageEditor.grease_pencil |
SpaceImageEditor.annotation |
SpaceSequenceEditor.grease_pencil |
SpaceSequenceEditor.annotation |
MovieTrackingTrack.grease_pencil |
MovieTrackingTrack.annotation |
Grease Pencil に関連する一部の RNA タイプがリネーム:
| 以前 | 以降 |
|---|---|
bpy.types.GreasePencilv3 |
bpy.types.GreasePencil |
bpy.data.grease_pencils_v3 |
bpy.data.grease_pencils |
ボーンの hide プロパティ(bpy.data.armatures["Armature"].bones[0].hide など)が、編集ボーンの可視性に影響するように。ボーンの可視性をオブジェクトまたはポーズモードで影響させるには、ポーズボーンの新しいプロパティ(bpy.data.objects["Armature"].pose.bones[0].hide など)を使用してください。編集ボーンのこのプロパティは今も存在しており、変更はありません。
ポーズボーンに選択状態が格納される select プロパティ(bpy.data.objects["Armature"].pose.bones[0].select など)が付きました。選択は編集モードの出入りで編集ボーンと同期されます。
ボーン自体の select、select_head、select_tail プロパティ(bpy.data.armatures["Armature"].bones[0].select など)は削除されました。代わりに編集ボーンの同名のプロパティ(bpy.data.armatures["Armature"].edit_bones[0].select など)を使用してください。
activate_new_action プロパティが poselib.create_pose_asset オペレーターから削除されました。このプロパティはすでに4.5から廃止予定になっており、なんの効果もありませんでした。(debd0c0877)
context.space_data.action ポインタが Dope Sheet コンテクストから削除されました (d1962be44c)。代わりに context.active_action を使用してください。
action.layer_prev と action.layer_next オペレーターが削除されました。(19bf803e51)
keyframe_insert() のオプションのパラメータで、廃止予定で何の機能もなかった INSERTKEY_XYZ_TO_RGB フラグが完全に削除されました。(e6f1cd6a29)
旧 Action API から(4.4で導入された)現在の API へのコードの移植をシンプルにする新しい関数とパラメータ。(dbcb701eb2):
channelbag.fcurves.new() と action.fcurve_ensure_for_datablock() に、F カーブが配置されるチャンネルグループを決める group_name パラメータが追加されました。そのグループが存在しない場合は作成されます。bpy_extras.anim_utils.action_ensure_channelbag_for_slot(action, slot)。与えられたスロット用の ActionChannelbag を返し、必要であれば、その channelbag を入れる新規レイヤーと新規キーフレームストリップも作成します。channelbag.fcurves.ensure() は、channelbag.fcurves.new() と同じパラメータを取りますが、もし F カーブが既存であれば、単にそれを返します。旧 Action API が削除されました (1395abc502)。これには action.fcurves、action.groups、action.id_root プロパティも範囲に入ります。action.fcurves と action.groups の代わりに、channelbag のこれらのプロパティにアクセスしてください。アクションの各スロットには channelbag を格納できます。bpy_extras.anim_utils の便利関数を使用して取得するか、既存の物を確保してください。
次の旧コードの場合は:
# 検索:
found_fcurve = action.fcurves.find("location", index=2)
# 作成:
new_fcurve = action.fcurves.new("location", index=2, action_group="Name")
下記のコードで置き換えます:
# 検索:
channelbag = anim_utils.action_get_channelbag_for_slot(action, action_slot)
found_fcurve = channelbag.fcurves.find("location", index=2)
# 作成:
channelbag = anim_utils.action_ensure_channelbag_for_slot(action, action_slot)
new_fcurve = channelbag.fcurves.new("location", index=2, group_name="Name")
この旧コードの場合は:
# F-Curve の存在を保証:
fcurve = action.fcurves.find("location", index=2, action_group="Name")
if not fcurve:
fcurve = action.fcurves.new("location", index=2, action_group="Name")
このコードで置き換えます:
# F-Curve の存在を保証:
channelbag = anim_utils.action_ensure_channelbag_for_slot(action, action_slot)
fcurve = channelbag.fcurves.ensure("location", index=2, group_name="Name")
同様に、action.groups の代わりに channelbag.groups を使用します。
グループパラメータの名前が違うことに注意してください (action_group は group_name になります)。これがグループの名前であり、グループ自体の参照ではないことを明確にするためです。
Blender 4.4以降、アクション自体に特定のデータブロックタイプとの結びつきはありません。これはアクションスロットに移行しました。そのため、action.id_root は action_slot.target_id_type で置き換えられました。
また、4.4へのアップグレード(英文)には、旧コードから現在の API へ移植するサンプルが多数あります。もちろん、上記で解説した Blender 5.0での変更はありませんが、いい俯瞰となるでしょう。
mathutils タイプがネイティブなバッファプロトコルに対応しました。これにより、例えば Vector の基底型が以前は float64 だったのが float32 になるようなことが起こります。(b856b6010e)
外部レンダーエンジンで Closure(クロージャ)、Bundle(バンドル)、Repeat Zone(リピートゾーン)に対応するため、インラインシェーダーノードツリーを取得する新しい API が追加されました。さらにこれはノードグループのインライン化と、リルートとミュート中のノードの削除することで、シェーダーノードのエクスポートを単純化できます。(c3f49cd24e)
詳細は Python API ドキュメントを参照してください。
PointCache.compression プロパティが削除されました。現在のキャッシュは常に圧縮されているためです。(PR#144356)DEPTH24_STENCIL8 と DEPTH_COMPONENT24 が廃止予定になりました。
これらを使用している場合は、Depth32f 版に変換します。(#140644)
UINT_24_8 データタイプが廃止予定に。使用していた場合は FLOAT を使用しているとみなされます。(#140715)
world.use_nodes が廃止予定となり、6.0で削除される予定です。現在これは常に True を返し、設定しても何の効果もありません。(PR#142342)# 古い方法によるデフォルトワールドノードツリー作成
scene.world = bpy.data.worlds.new("My new world")
scene.world.use_nodes = True # ここでデフォルトノードによるノードツリーを作成
...
# 新しい方法によるノードツリー作成
scene.world = bpy.data.worlds.new("My new world") # ここでデフォルトノードによるノードツリーを作成
scene.world.use_nodes = True # 廃止予定、効果なし
material.use_nodes が廃止予定になり、6.0で削除されます。現在これは常に True を返し、設定しても何の効果もありません。(PR#141278)# 古い方法によるデフォルトマテリアルノードツリー作成
mat = bpy.data.materials.new("My new material")
obj = ... # アクティブオブジェクト取得
obj.active_material = mat
mat.use_nodes = True # デフォルトノードツリー作成
# 新しい方法によるデフォルトマテリアルノードツリー作成
mat = bpy.data.materials.new("My new material") # Creates a default node tree
obj = ... # アクティブオブジェクト取得
obj.active_material = mat
mat.use_nodes = True # 廃止予定、効果なし
path_from_module で、struct やプロパティの Python モジュールパスを問い合わせることができるように。(df7273930f)
bpy.types.CollectionExports に、コレクションエクスポーターを作成、削除、並べ替える三つの新しい RNA 関数を追加。(7f0d15b31f):
collection.exporters.new('IO_FH_alembic', name="Alembic")collection.exporters.remove(exporter)collection.exporters.move(0, 1)
with の対象で logging_set(True) を呼び出すことで、コンテクストメンバのログを取る機能を追加。処理中にアクセスされたメンバのログを取り、どのメンバがオーバーライド可能かどうかが不明な時のデバッグを支援してくれそうです。(439fe8a1a0)import bpy
from bpy import context
my_objects = [context.scene.camera]
with context.temp_override(selected_objects=my_objects) as override:
override.logging_set(True) # Enable logging.
bpy.ops.object.delete()
bpy.context ロギングカテゴリの置き換えとなる context ロギングカテゴリを通じて、全コンテクストメンバのアクセスの全体的なログを取ります。(e2872c0bfe)./blender --log-level trace --log "context"
すでにカスタムの OpenColorIO コンフィギュレーションが可能になっていますが、Working Space(ワーキング空間)オプションの追加により、Linear Rec.709以外のシーンリニア色空間がより一般的になるでしょう。
ワーキング空間とは関係なく同じ色空間を取得するため、エクスポーターはマテリアル、ライト、その他の色を Linear Rec.709に変換できます。インポーターは Linear Rec.709からシーンリニアに変換できます。
もう一つの方法として、もしファイルフォーマットが color-space メタデータに対応していれば、bpy.data.colorspace.working_space_interop_id をワーキング空間の確認に使用できます。一般的な値は lin_rec709_scene、lin_rec2020_scene、lin_ap1_scene(ACEScg)です。
mathutils.geometry.intersect_point_line_segment 関数を追加。intersect_point_line と似ていますが、ラインセグメントの端で範囲制限します。(44d04ad857)
bpy.data.file_path_foreach() を追加、これは blend ファイル内で使用されている各ファイルパスのコールバック関数です (d33a6a1723)。このコールバック関数は巡回済みのパスを置き換える新しいパスを返します。