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

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

元記事:Python API - Blender Developer Documentation

Blender 4.1: Python API

Python 3.11

Python が VFX platform 2024に合わせてバージョン 3.11にアップグレードしました。

Enum ID プロパティ

整数型(integer)プロパティが列挙(enum)型アイテムに対応しました。92cf9dd2f2d7f4d8d380d4b1dcc17f6c2b5b175d

UI を通じた列挙アイテムの編集は未対応です(技術的な理由は上のコミットメッセージを見てください)。

列挙アイテムは整数型プロパティに id_properties_ui Python メソッドを使用して追加できます。as_dict メソッドを使用してプロパティの列挙リストアイテムを取得できます。

my_object["my_prop"] = 2
ui_data = my_object.id_properties_ui("my_prop")
ui_data.update(items=[
    ("TOMATOES", "Tomatoes", "Solanum lycopersicum"),
    ("CUCUMBERS", "Cucumbers", "Cucumis sativus"),
    ("RADISHES", "Radishes", "Raphanus raphanistrum"),
])
print(ui_data.as_dict())

既存の便利なラッパー関数も同様に対応しています。

from rna_prop_ui import rna_idprop_ui_create

rna_idprop_ui_create(my_object, "my_prop", default=2, items=[
    ("TOMATOES", "Tomatoes", "Solanum lycopersicum"),
    ("CUCUMBERS", "Cucumbers", "Cucumis sativus"),
    ("RADISHES", "Radishes", "Raphanus raphanistrum"),
])

列挙アイテムの付いた整数型プロパティは、UI 内でドロップダウンボタンとして表示されます。

Id property enums.png

レイアウトパネル

Blenderに新しく "layout panel" が追加されました。このパネルは draw 関数内で定義され、新たな登録は必要ありません。

これにより、パネル内の開閉可能なセクションの作成に必要なコード量が大幅に削減されます。(f824476bd5f81f98f9b969661e8e9ac4d50a55218896446f7e72084018bf7a45306a83d92e22f34addd06eeb8f7495600c3a42a1c664c8b4de958ede)

import bpy
from bpy.props import BoolProperty

class LayoutDemoPanel(bpy.types.Panel):
    bl_label = "Layout Panel Demo"
    bl_idname = "SCENE_PT_layout_panel"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "scene"

    def draw(self, context):
        layout = self.layout
        scene = context.scene

        layout.label(text="Before")

        header, panel = layout.panel("my_panel_id", default_closed=False)
        header.label(text="Hello World")
        if panel:
            panel.label(text="Success")

        header, panel = layout.panel_prop(scene, "show_demo_panel")
        header.label(text="My Panel")
        if panel:
            panel.prop(scene, "frame_start")
            panel.prop(scene, "frame_end")

        layout.label(text="After")

bpy.utils.register_class(LayoutDemoPanel)
bpy.types.Scene.show_demo_panel = BoolProperty(default=False)
Layout panels python.png

互換性の失われる変更

Foreach

  • foreach_getforeach_set が、8、16、64ビットの内部ストレージに最適化されました。(PR#115761)
  • foreach_set が、より正確な境界チェックを行うようになり、従来こっそり不正な書き込みを行っていた場所では、TypeError が発生します。

Light Probes

  • Lightprobe タイプのアイテムがリネームされました。bpy.types.LightProbe.type bpy.types.BlendDataProbes.new()bpy.ops.object.lightprobe_add() に影響します。
    • CUBEMAPSPHERE
    • PLANARPLANE
    • GRIDVOLUME
  • show_data が廃止予定になりました。代わりに use_data_display を使用してください。
  • LightProbe に、自身の data_display_size プロパティが付きました。

Mesh

  • スカルプトのマスク値が汎用属性に格納されるように。(f2bcd73bd25625d6b5c1194a4199e96fc5fafa2e)
    • 名前は ".sculpt_mask"(FLOAT タイプ)
    • マスクのアクセス、追加、削除がシンプルになりました。
      • Mesh.vertex_paint_mask プロパティで集合(collection)ではなく、この属性が直接返ってきます。
      • Mesh.vertex_paint_mask_ensure() と、Mesh.vertex_paint_mask_remove() 関数で、属性の追加と削除が可能。
  • Meshauto_smooth プロパティがモディファイアーノードグループアセットで置き換えられました。(89e3ba4e25c9ff921b2584c294cbc38c3d344c34)
    • use_auto_smooth は削除されました。スムーズとスムーズ以外のタグが混ざっている場合、面コーナーの法線が自動的に使用されます。メッシュはカスタム法線が存在していれば、常にそれを使うようになりました。
    • auto_smooth_angle は削除されました。"sharp_edge" 属性をコントロールするモディファイアー(またはオペレーター)で置き換えられました。つまり、もう(オブジェクトなしの)メッシュ単体では、角度による自動スムージングに関することは何も知ることはできなくなったということです。
    • create_normals_splitcalc_normals_splitfree_normals_split が削除され、もっとシンプルな Mesh.corner_normals 集合プロパティ(bpy_prop_collection)によって置き換えられました。これは法線のキャッシュへのアクセスを与えるため、関連データに変更がある時は自動的に更新されます。
    • MeshLoop.normal が読み込み専用プロパティになりました。カスタム法線は normals_split_custom_set または normals_split_custom_set_from_vertices で作成してください。

Material

Sequencer

  • ストリップの変換フィルタータイプの SUBSAMPLING_3x3 が、BOX にリネームされました。bpy.types.SequenceTransform.filter に影響します。(PR#117584)

View Layer

  • Scene.view_layers.move() メソッドを追加、ビューレイヤーを再配置できます。(PR#117037)

Nodes

  • 一部ノード(Store Named Attribute など)が一度に存在するすべてのソケットタイプを持つ代わりに、動的なソケットタイプを使用するようになりました。つまり、node.outputs[some_index] のようなことをしても、もうこれらのノードでは同じ動作はしなくなってしまったということです。代わりにもっと信頼性の高い node.outputs[some_socket_identifier] を使用してください。(8149678d5e1d6e0d00668c3f209736721401b4e9)

追記

  • Preferences.filepaths.asset_libraries.new/remove メソッドを追加。(0061f2f65030)
  • ID.session_uid 読み込み専用プロパティを追加。(c68b22cfdf)
  • NodesModifierBake.bake_id 読み込み専用プロパティを追加。(7149424087)
  • NodesModifierBake.node 読み込み専用プロパティを追加。(65b722bc3003)
  • ShapeKey.points プロパティを追加。(7d77caab9b)

シェイプキーのロック

シェイプキーをユーザーがロックし、スカルプトや編集モードによる不意の編集の防止が可能になりました (b350d7a4c311ec6a3065ac89febafc3ba6bd43a2)。アクティブシェイプをトポロジーの変更なしでトランスフォームするオペレーターを実装している、またはすでにこのチェックを行っている他のビルトインオペレーターを呼び出しているアドオンは、これらのコードにチェックを追加することを考えた方がいいかもしれません。

ビルトインオペレーターの例:

  • mesh.vertices_smooth はアクティブシェイプをトランスフォームするためチェックします。
  • mesh.subdivide はトポロジーを変更するのでチェックしません。
  • object.transform_apply は(アクティブシェイプキーの選択がなんであれ)同じトランスフォームを全シェイプに適用するため、チェックしません。
  • mesh.polybuild_extrude_at_cursor_move は、内部的に他のチェックを行うオペレーターを呼び出すため、チェックします。

チェックの実装のサンプル:

from bpy_extras.object_utils import object_report_if_active_shape_key_is_locked

def execute(self, context):
  if object_report_if_active_shape_key_is_locked(context.object, self):
    return {'CANCELLED'}