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~とか何度も実行すると低確率で落ちる。

落ちると、後述の問題が出る。


スクリーンショット 2025-08-14 22.37.38.png



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かどうかを見てないからかもしれない、、いつかやってみよう。