Dev:JA/Ref/Release Notes/5.00/python api
元記事:Python API - Blender Developer Documentation
目次
- 1 Blender 5.0: Python API
- 2 作成:
Blender 5.0: Python API
互換性のなくなる変更
実行時定義のプロパティストレージデータへの(未対応)アクセスの削除
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 より何倍か高速でした。
エクステンションと他の Python コード更新用チップ
リセット
●従来
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
GPU
-
廃止予定の 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)
Render
-
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)
Paint
-
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
Image
ImageTextureのプロパティ、filter_type、use_mipmap、use_mipmap_gauss、filter_lightprobes、filter_eccentricity、use_filter_size_minが削除されました(これらは2.80以降何もしていませんでした)。(PR#139978)
VSE
-
VSE がコンテクストに別のシーンを使用するように:
context.workspace.sequencer_scene(または短くcontext.sequencer_scene)が、現在のワークスペースで全シーケンスエディターが使用しているシーンです。context.sceneはウィンドウ内のアクティブシーンを指しています(これは VSE が使用しているシーンとは違う可能性があります!)
-
新しく追加された image(画像)とエフェクトストリップ(これは
start_frameと相対値で間接的に期間がコントロールされています)のend_frameプロパティが、複数の画像ストリップの同時追加に対応するため、lengthで置き換えられました。(PR#143974) -
ストリップ追加オペレーターが、追加後にストリップのトランスフォームが可能な
move_stripsプロパティを使用するように。このプロパティはデフォルトで有効になっており、これらのオペレーターがモーダルになります。(PR#138382)
Assets
-
context.active_fileがもうアセットシェルフで利用できなくなりました。代わりにcontext.assetを使用してください。(7cd26d37ea) -
bpy.types.AssetHandleが削除されました。代わりにAssetRepresentationを使用してください。(85878cf541) -
bpy.types.AssetCatalogPathが削除されました。これはどこも使用していない、または利用できませんでした。(bafb63a654) -
UILayout.template_asset_view()が削除されました。これはアセットシェルフにとって代わられました。(ae9ca35e3b)
Theme
- 下記のエディター毎のテーマプロパティが削除されました。
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)
Nodes
-
廃止予定のコンポジターノードが削除されました。(#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
- File Output(ファイル出力)ノードが、
directoryとfile_nameを二つの違う入力と取るように。- 削除:
bpy.types.CompositorNodeOutputFile.file_slotsbpy.types.CompositorNodeOutputFile.layer_slotsbpy.types.CompositorNodeOutputFile.base_path- 追加:
bpy.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")
Alembic
-
廃止予定の
Scene.alembic_exportAPI を削除。これは2.8から廃止予定で、対応するインポートもありません。実際のインポート・エクスポートオペレーターに変更はなく、bpy.ops.wm.alembic_importとbpy.ops.wm.alembic_exportとしてそのままあります。(ec4db5825d) -
bpy.ops.wm.alembic_export(上記)のオプションである、visible_objects_onlyオペレーターを削除。(7c75651b3b)
USD
-
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)
ロギング
- バックグラウンドレンダー進捗も含め、ログ出力のフォーマットが変更されました。この出力を解析するアドオンやレンダーファームは更新が必要になるでしょう。
Mesh
-
UV layer
pinプロパティが、このプロパティアクセス時に対応する他の属性を勝手に作成しなくなりました。代わりに_ensure()関数で、確実な同名の属性を作ります。(e1c121cd6a) -
UV の選択が、全 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).
アノテーションとグリースペンシル
- アノテーションに関する RNA タイプとプロパティがリネームされました。 タイプ:
| 以前 | 以降 |
|---|---|
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_pencilsbpy.types.annotationsMovieClip.grease_pencilMovieClip.annotationNodeTree.grease_pencilNodeTree.annotationScene.grease_pencilScene.annotationSpaceImageEditor.grease_pencilSpaceImageEditor.annotationSpaceSequenceEditor.grease_pencilSpaceSequenceEditor.annotationMovieTrackingTrack.grease_pencilMovieTrackingTrack.annotation -
Grease Pencil に関連する一部の RNA タイプがリネーム:
以前 以降 bpy.types.GreasePencilv3bpy.types.GreasePencilbpy.data.grease_pencils_v3bpy.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 カーブが既存であれば、単にそれを返します。
-
旧
ActionAPI が削除されました (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")
下記のコードで置き換えます:
```python
# 検索:
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
mathutilsタイプがネイティブなバッファプロトコルに対応しました。これにより、例えばVectorの基底型が以前はfloat64だったのがfloat32になるようなことが起こります。(b856b6010e)
インラインシェーダーノード
外部レンダーエンジンで Closure(クロージャ)、Bundle(バンドル)、Repeat Zone(リピートゾーン)に対応するため、インラインシェーダーノードツリーを取得する新しい API が追加されました。さらにこれはノードグループのインライン化と、リルートとミュート中のノードの削除することで、シェーダーノードのエクスポートを単純化できます。(c3f49cd24e)
詳細は Python API ドキュメントを参照してください。
ポイントキャッシュ
PointCache.compressionプロパティが削除されました。現在のキャッシュは常に圧縮されているためです。(PR#144356)
廃止予定
GPU
-
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
mathutils.geometry.intersect_point_line_segment関数を追加。intersect_point_lineと似ていますが、ラインセグメントの端で範囲制限します。(44d04ad857)
コア
bpy.data.file_path_foreach()を追加、これは blend ファイル内で使用されている各ファイルパスのコールバック関数です (d33a6a1723)。このコールバック関数は巡回済みのパスを置き換える新しいパスを返します。