Blenderアドオン開発
ref
Create New Project
Create project foler
VSCodeでCtrl + Alt + P > New Addon auto_load templateでproject作成
なぜかvenv消しても補完されている
たまたま雰囲気で補完できているだけのようだ
Create venv
code:cmd
activate
code:venv
venv\Scripts\activate.ps1
VSCode設定
python プラグイン設定だけと思ってたらTerminalも設定が必要だった
VSCode拡張で「Ruff : "charliermarsh.ruff"」をインストールする
typeの一覧
Menu panelの作り方
命名規則がある
Collectionの追加
現在のシーン上のコレクションを全部挙げる
PointerPropertyで保持したデータは使えない?
PointerProperty -> objectに変換する手段がない気がする
nameは取得できる
勝手に生えるプロパティ
code:py
# これでなぜか"name"が生えてくる
class CUSTOM_PG_objectCollection(PropertyGroup):
#name: StringProperty() -> Instantiated by default coll_ptr: PointerProperty(
name="Collection",
type=bpy.types.Collection)
is_merge: BoolProperty()
code:pythonsample.py
def register():
# Custom scene properties
bpy.types.Scene.custom = CollectionProperty(type = CUSTOM_PG_objectCollection)
bpy.types.Scene.custom_index = IntProperty(update = update_custom_index)
class hogehoge (View3dSidePanel, Panel):
def draw(self,context) :
scn = context.scene
idx = scn.custom_index
try:
except IndexError:
pass
else:
layout.label(text = item.name, icon="OUTLINER_COLLECTION") #nameが使える とはいっても5倍程度のようだ
頻繁に実行される処理では気にしたほうがいいぐらいかも
layout
layout.layout.use_property_split =True
プロパティのラベルとボタンを分割表示します。
FloatPropertyを利用するときや、多くのプロパティを並べて表示したい時に便利です。
プロパティの横にキーフレーム追加ボタンを表示するオプション(use_property_decorate)を設定できます
https://gyazo.com/283a120e6b5bc0afbfb91a4f021791b7
bpy.path
os.pathみたいなやつ
Icon
標準アドオン:IconViewerで見れる
VIEW3D_MT_select_edit_meshとか
ExportHelper
fileをexportするaddonで使う
継承先でself.filename_extを追加する
file_browser.py
順番入れ替え、追加機能付きのリスト draw_ui_list()
from bl_ui.generic_ui_list import draw_ui_list
順番入れ替え、追加機能付きのリスト
以下のようにつかえたが、スクロール操作ができなかった(4.0.1)
まだ不安定なようだ
code:list.py
class YFX_EXPORTER_PT_shapekey_settings_panel(View3dSidePanel, bpy.types.Panel):
bl_label = "Shapekey Settings"
bl_idname = "YFX_EXPORTER_PT_shapekey_settings_panel"
bl_parent_id = "YFX_EXPORTER_PT_collection_setting_panel"
def draw(self, context: bpy_types.Context) -> None:
layout = self.layout
draw_ui_list(
layout,
context,
class_name="YFX_EXPORTER_UL_shapekey",
list_path=shapekey_settings_path + ".shapekeys",
active_index_path=shapekey_settings_path + ".shapekey_index",
unique_id="yfx_exporter_collection_shapekey_ui_list",
)
UILayout.propのファイルブラウザ
再帰の上限
手元で確認 -> 1000回が上限のようだ
code:py
>> import sys
>> sys.getrecursionlimit()
1000
コレクション一覧のポップアップメニューが翻訳される問題
RNA_def_property_flag
Cだと「RNA_def_property_flag(prop, PROP_ENUM_NO_TRANSLATE);」で回避できるらしい
結論:無理
結局、末尾にスペースをつけることで回避した
code:op.py
return [
(
c.name,
c.name + " ", # Append a space for non-translatable version
c.name,
"OUTLINER_COLLECTION",
idx,
)
for idx, c in enumerate(bpy.data.collections)
if c.name not in custom_collections and bpy.context.scene.user_of_id(c)
]
EnumPropertyの注意
コールバックの使用には既知のバグがあり、Python はコールバックによって返された文字列への参照を保持する必要があり、そうしないと Blender が誤動作したりクラッシュしたりすることがあります。
There is a known bug with using a callback, Python must keep a reference to the strings returned by the callback or Blender will misbehave or even crash.
多言語対応
descriptionの末尾には勝手に「.」が付与されるため、翻訳英文には末尾ピリオド不要
report通知はToolTops扱い
Object.find_armature
複数Armatureがあったらどうなるん?
Mesh
シェイプキーは絶対座標を保持している
bpy_prop_collection
blenderAPIのcollection型
APIが返す配列は大体これ
foreach_getとか便利そうなのも入ってる
shapekeyを取り出すのもこれでいける
source_shapekey = key_blocks.get(source)