Blender拡張をやる
概要
Blenderのノードの最終段階の絵面をそのままネットワークに送り出す必要があって自作した。
ChatGPTくんがだす情報がちょっと古くて無理ってなりながら。
APIについては公式が当てになる。嬉しい。
Tips
Macでコンソールを見る
Terminalから
exec "/Applications/Blender.app/Contents/MacOS/Blender"
でいける。
色んなログが見れて面白い。
スクリプトのリロード
スクリプトのリロードはBlenderマークからできる。Blenderマーク>System>Reload Scripts
他の手として、BlenderのPython Consoleで bpy.ops.script.reload() を実行すると、連続実行が楽。
ほかにも設定が大変だけどTCPサーバをBlender内に立ててreloadを実行する拡張があったりする。
ただなんかReloadの対象は「インストール先のフォルダで直にいじった場合」のようなので、うーん、、
VSCodeで編集、バージョン管理してるフォルダをgoで書いたfolder watcherで監視、編集のたびに送り出して、
Reload Script をPython Consoleから実行している。まあまあ楽。
ただこのReload、スクリプト編集してreload~とか何度も実行すると低確率で落ちる。
落ちると、後述の問題が出る。
Pythonフォーマッター
VSCodeのPythonLinterとして Black Formatter を使うと楽。 Format on saveをオンにすると効く。
拡張をいじってるとBlenderが落ちる
落ちた後、特定のファイルを開き直すのが面倒臭いので、shell scriptにした。
exec Blender.app/中略/Blender になってるので、コンソールもついでに開ける。
reopen.sh
#!/usr/bin/env bash
set -euo pipefail
# Path to Blender binary (adjust if needed)
BLENDER="/Applications/Blender.app/Contents/MacOS/Blender"
ADDONS_TO_ENABLE=("save_texture_stub")
# ここにコードを書くと強制的にenableにできるが、落ちることがある。
PY_EXPR=""
#"import bpy; addons = [$(printf "'%s'," "${ADDONS_TO_ENABLE[@]}" | sed 's/,$//')]; [bpy.ops.preferences.addon_enable(module=a) for a in addons]"
# If arguments are provided, pass them directly to Blender
if [ "$#" -gt 0 ]; then
exec "$BLENDER" "$@" --python-expr "$PY_EXPR"
fi
# Helper: pick the latest installed Blender user dir under ~/Library/Application Support/Blender/
LATEST_VER_DIR() {
local base="$HOME/Library/Application Support/Blender"
if [ ! -d "$base" ]; then
return 1
fi
# Find version-like directories (e.g., 4.2, 4.1, 4.0, 3.6) and pick the highest
local latest
latest=$(ls -1 "$base" | grep -E '^[0-9]+\.[0-9]+' | sort -V | tail -n1 || true)
if [ -n "${latest:-}" ] && [ -d "$base/$latest" ]; then
printf '%s\n' "$base/$latest"
return 0
fi
return 1
}
open_last_or_default() {
local verdir
verdir=$(LATEST_VER_DIR) || verdir="$HOME/Library/Application Support/Blender/4.2"
# 1) Try recent-files.txt (first non-empty, existing path)
local recent="$verdir/config/recent-files.txt"
if [ -f "$recent" ]; then
# Read first non-empty line; handle spaces in file paths safely
local last
last=$(grep -v '^[[:space:]]*$' "$recent" | head -n1 || true)
if [ -n "${last:-}" ] && [ -e "$last" ]; then
exec "$BLENDER" "$last" --python-expr "$PY_EXPR"
fi
fi
# 2) Fallback to quit.blend (previous session snapshot)
local quit1="$verdir/config/quit.blend"
if [ -f "$quit1" ]; then
exec "$BLENDER" "$quit1" --python-expr "$PY_EXPR"
fi
# 3) As a last resort, just launch Blender
exec "$BLENDER" --python-expr "$PY_EXPR"
}
open_last_or_default
Blenderが落ちると原因になったExtensionをDisableにされる
これが一番鬱陶しい。
exec時にPythonコードを渡すことで強制的にenableにできるが、これを書くと開いた瞬間に落ちる。
あー、、すでにenableかどうかを見てないからかもしれない、、いつかやってみよう。