Clojure nREPL で Blender を操作できる Basilisp Blender を試してみた。
Blender Python API
御存知の方も多いと思いますが、Blender には 公式の SDK として Python 製の bpy というものがあります。
Basilisp (Python 上で動く Clojure 処理系)
で、こっちはほとんど誰も知らないと思いますが、Python 上で動く Clojure 処理系で Basilisp というものがあります。(私も知りませんでした。さすがユーザ数よりも処理系が多いと言われる Lisp。と思いましたが、Clojure の仕様に準拠しているのは珍しいかも)
Basilisp Blender Extension
そんな Basilisp を使って bpy を呼ぶ、Basilip Blender Extension というアドオンを作成された方がいて、おもしろそうだったので試してみました。
試した動画
画面左が Blender (v4.5.3)、画面右上がエディタ(helix)、画面右下がターミナルです。
nREPL でコードを実行しています。Emacs CIDER とか使えば、エディタだけで動かせると思います。
私は Emacs は使わないので、$ lein repl :connect で nREPL に接続して、tmux を使ってターミナルにコードを送っています。
使い方
インストール
Basilip Blender の releases ページから、最新の basilisp_blender_extension-x.x.x.zip をダウンロードします。
その後、Blender の プリファレンスで、エクステンションを入手→ディスクからインストール を押下し、先ほどダウンロードした zip ファイルを選択します。

アドオンで Basilisp Blender Extension が有効になっていることを確認します。

そうすると、出力パネルの最下部に Basilisp nREPL server というのが表示されます。
server、port とフォルダ先を指定します。.blend ファイルを置いているフォルダと同じでいいと思います。(フォルダ先には、basilisp.edn と scratch.lpy ファイルが自動で追加されます。)
START SERVER を押下すると、nREPL サーバが起動します。

nREPL クライアントの起動
ターミナルで以下を実行して接続します。
$ lein repl :connect 64644
なんか、ワーニングっぽいのがいろいろ出ますが普通に使えます。
コードの実行
上記動画で試したコードです。
どんなことができるかまだよくわかっていないですが、(dir bpy.ops/mesh) とかを使って調べれるのでぼちぼち調べていこうと思います。
(ns bpy-test
(:import bpy
math))
(dir bpy)
(dir bpy/ops)
(dir bpy.ops/action)
(defn clear-mesh-objects []
(.select-all bpy.ops/object ** :action "DESELECT")
(.select-by-type bpy.ops/object ** :type "MESH")
(.delete bpy.ops/object))
(clear-mesh-objects)
(->> (dir bpy.ops/mesh)
(filter #(re-find #"add" %))
(map prn))
(.primitive-monkey-add bpy.ops/mesh)
(for [x [-3 0 3]]
(.primitive-cube-add bpy.ops/mesh **
:location [x 2 2]))
以上です。
Discussion