🎉

⑤[VSCode][Blernder]VSCodeでBlernder5.0のpythonスクリプトを実行する。

に公開

第1回 [環境構築]Blender MCPのはじめかた。(Blender MCP x Claude Desktop)
第2回 [環境構築]Blender MCPのはじめかた。(Blender MCP x Github Copilot)
第3回 [環境構築]Blender MCPのはじめかた。(Blender MCP x Cursor)
第4回 Blernder MCPを使わずpythonスクリプトを生成する。
第5回 [環境構築]VSCodeでBlernder5.0のpythonスクリプトを実行する。
第6回 ChatGPTでPythonスクリプト生成→アルファベットアニメ生成をやってみた。

要は環境構築の話で。ホントは一番最初にやりそうなテーマなんだけど、まー紆余曲折を経て第5回になりました。前提として「Blender MCPはそんなでも...」ってのがモチベーションです。

成果物

https://github.com/aaaa1597/Python-VSCodeBlender5PythonScript.git

Abstract

  • VSCodeでのBlernder5.0のpythonスクリプトの実行方法の説明

前提

  • 第4回で説明した環境(Blender,Python3.x,ChatGPT)は構築済。
  • ココからソースコード一式をClone(もしくはダウンロード)

ざっくり手順

  1. Blender側で常駐のTCPサーバーを起動し、pythonスクリプトを待つ
  2. 受け取ったBlenderで、Pythonスクリプトを実行
  3. VSCode側でBlenderにPythonスクリプトを送り付ける

1. Blender側で常駐のTCPサーバーを起動し、pythonスクリプトを待つ

GithubからDownLoadした一式から、blender_server_startup.blendをダブルクリックする。
すでに、TCPサーバー起動を仕込んでいるのでBlender起動するだけでOK.

2. VSCode側でBlenderにPythonスクリプトを送り付ける

send_to_blender.pyをVSCodeで開いて実行(VSCodeの実行とデバッグを押下)する。
実行するコードはこれ↓

send_to_blender.py
import os
import time
import socket
import sys
from pathlib import Path

# ======= 設定(環境変数で上書き可) ===============
HOST = os.getenv("BLENDER_HOST", "127.0.0.1")
PORT = int(os.getenv("BLENDER_PORT", "5000"))
# ==============================================

def is_server_ready(host: str, port: int, timeoutsec: float) -> bool:
  """ host:portが疎通できるか timeoutsecまで繰り返し試す """
  deadline = time.time() + timeoutsec
  while time.time() < deadline:
    try:
      with socket.create_connection((host, port), timeout=0.5):
        return True
    except OSError:
      time.sleep(0.2)
  return False

def send_concat(files):
  """ 複数ペイロードを結合して1回の送信で実行させる """
  parts = []
  for p in files:
    t = Path(p).read_text(encoding="utf-8").rstrip()
    parts.append(t)

  payload = "\nprint('--- payload separator ---')\n".join(parts) + "\n"
  print(f"[VS2Blend] Sending {len(files)} payload(s) to {HOST}:{PORT}.")

  with socket.create_connection((HOST, PORT), timeout=3.0) as s:
    s.sendall(payload.encode("utf-8"))
    try:
      s.settimeout(2.0)
      resp = s.recv(65536)
      print(resp.decode("utf-8", errors="replace"))
    except Exception:
      pass
  print(f"[VS2Blend] done.")

def main():
  files = sys.argv[1:]
  if not files:
    print("[VS2Blend] usage: send_to_blender.py <file1.py> <file2.py> ...", file=sys.stderr)
    sys.exit(2)

  # 先にBlender側のサーバが起動しているかを確認(手動起動)
  if not is_server_ready(HOST, PORT, 3.0):
    print(f"[VS2Blend] Blender TCP server not ready at {HOST}:{PORT}.", file=sys.stderr)
    print(" - 先に blender_server_startup.blend をダブルクリックで起動してください。", file=sys.stderr)
    sys.exit(1)

  send_concat(files)

if __name__ == "__main__" :
  main()

3. 受け取ったBlenderで、Pythonスクリプトを実行

手順2で実行するだけで、Blenderが受信しPythonスクリプトを実行するのでこの手順では確認するだけ。
下記の様に"hello world!"が表示されればOK。これで開発準備完了。

.vscode/launch.jsonの"console"の行に"externalTerminal"を設定しているのでコマンドプロンプトで実行されてる。"internalTerminal"に設定するとVSCodeのプロンプトに出力される。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Send to Blender",
      "type": "debugpy",
      "request": "launch",
      "program": "${workspaceFolder}/send_to_blender.py",
      "args": [
        "${workspaceFolder}/ki001.py"
      ],
-     "console": "internalTerminal",  // 実行ログをVSCodeのターミナルに出力する
+     "console": "externalTerminal",  // 実行ログをVSCodeのターミナルに出力する
      "cwd": "${workspaceFolder}",      // カレントフォルダ設定
      "justMyCode": true,               // 自分んコードだけをステップインする(外部ライブラリはスキップ)
      "env": {
        "PYTHONUNBUFFERED": "1",        // 出力行バッファリングを切ってprintの表示を即時にする
        // 必要に応じてここで上書き可能
        // "BLENDER_EXE": "c:\\Program Files\\..."
      }
    }
  ]
}

分かったら簡単だけど、むずかったー。
これでPythonスクリプトがはかどるはず。

以上です。
お役に立ちますように。。。

Discussion