Blender with Python #1: UIの基本構成
最近、三次元点群データを扱う機会が増えてきました。バックグラウンドの違う人たちとデータを共有する状況になりつつあるので、Python APIを提供していてデータを簡単に可視化できるソフトウェアを探していたところ、Blenderに辿り着きました。ただ、Blenderのコトはほとんど知らない状態だったので、とりあえずBlender APIに用語として出てくるUIコンポーネントWindow, Screen, Area, Space が何を指しているのか探りました。
Pythonパッケージ:bpy
Blenderが提供する Python パッケージ bpy には、bpy.data と bpy.contextというモジュールがあります。私の大味な理解では、bpy.dataはメッシュオブジェクトやマテリアルなどデータ(data)にアクセスするためのモジュールです。そして、それらが置かれている動的な状況(context)にアクセスするためのモジュールがbpy.contextというかんじです。例えば、座標系のスケール、シェーディングの設定、オブジェクトリストやUIコンポーネント(WindowやScreenなど)の状態にアクセスできます(基本的にread only)。また、アクティブまたは被選択状態のオブジェクトやコンポーネントにアクセスしたいときはbpy.contextを使います。
Window
Blender起動時に現れる画面領域がWindow (ウィンドウ)です。Windowの縦(横)サイズ情報は bpy.context.window.height (width) で読み取れます。
Screen
Screen (スクリーン) は、Window上部のタブから切り替えられる LayoutやModeling、Scriptingなどのワークスペース(スクリーンと同義?)です。
スクリーンを"Scripting"に切り替え、コンソールに次のようにbpy.context.screenまたはbpy.context.window.screenを入力するとアクティブなスクリーンが出力されます。Blenderにおける「アクティブ」は「現在操作している」というかんじの意味です。「選択」とはまた別の意味をもつので注意です。
>>> bpy.context.screen
bpy.data.screens['Scripting']
なお、Blender起動時のアクティブワークスペースは"Layout"です。任意の種類のスクリーン情報にアクセスするには、bpy.data.screens['Layout']というようにbpy.dataに属するモジュールを使うことで可能です。
Area
Area (エリア)は、Window内に展開されているサブウィンドウです。下画像のようにスクリーン"Layout"をアクティブにすると、4つのサブウィンドウが展開されます。
エリアに表示するエディタの種類は、それぞれのエリア右上のプルダウンメニューから切り替えることができます。
コンソールにbpy.context.areaと入力すると、アクティブエリアが属するスクリーンの種類が出力されます。また、bpy.context.area.typeと入力すると、アクティブエリアに表示されているエディタの種類が出力されます。
>>> bpy.context.area
bpy.data.screens['Scripting']...Area
>>> bpy.context.area.type
'CONSOLE'
アクティブスクリーンを構成するエリア情報は、bpy.context.screen.areasにリストとして保持されています。以下では、スクリーン"Scripting"をアクティブにした場合に展開されるエリア(エディタ)の種類を表示させています。なお、bpyではメンバ変数名が複数形の場合はそのメンバ変数は基本的にリスト型か辞書型のようです。
>>> bpy.context.screen.areas[0].type
'PROPERTIES'
>>> bpy.context.screen.areas[1].type
'OUTLINER'
>>> bpy.context.screen.areas[2].type
'INFO'
>>> bpy.context.screen.areas[3].type
'OUTLINER'
>>> bpy.context.screen.areas[4].type
'TEXT_EDITOR'
>>> bpy.context.screen.areas[5].type
'VIEW_3D'
>>> bpy.context.screen.areas[6].type
'CONSOLE'
前小節のスクリーンの場合と同様に、任意のスクリーンに属するエリア情報にアクセスするには、bpy.dataのモジュールを使うことで可能です(例: bpy.data.screens['Layout'].areas[0])。
Space
Space (スペース)は、どうやらエリア(エディタ)に関するオプション項目のようです(まだ理解が浅いです)。たとえば、エリア"3D viewport"のスペース "SpaceView3D"は、画像に示すような3Dカーソルの表示設定やグリッドの間隔、オブジェクトのライティングやカラーの情報が格納されたメンバをもっています。それらの設定は、下のコードのように変更することができます。
# 以下、私の環境ではareas[3]はエリア'3D_VIEW'(3D Viewport)に対応しています。環境や作業状況によって異なるかもしれません。
>>> spc = bpy.data.screens['Layout'].areas[3].spaces[0]
# 3Dカーソルを非表示
>>> spc.overlay.show_cursor = False
# グリッド間隔を10に設定
>>> spc.overlay.grid_scale = 10
# オブジェクトの表示(シェーディング)方法をソリッドに変更 (選択肢は 'WIREFRAME', 'SOLID', 'MATERIAL', 'RENDERED')
>>> spc.shading.type='SOLID'
# ライティングをフラットに変更 (選択肢は 'MATCAP','STUDIO','FLAT')
>>> spc.shading.light = 'FLAT'
# オブジェクトのカラーリングをマテリアルに変更 (選択肢は 'MATERIAL', 'SINGLE', 'OBJECT', 'RANDOM', 'VERTEX', 'TEXTURE')
>>> spc.shading.color_type='MATERIAL'
# 背景タイプをビューポートに変更 (選択肢は 'THEME', 'WORLD', 'VIEWPORT')
>>> spc.shading.background_type = 'VIEWPORT'
# オブジェクトのアウトラインを非表示にする
>>> spc.shading.show_object_outline = False
# 背景色を黒にする
>>> spc.shading.background_color = (0,0,0)