Blender の UI スクリプト集

カテゴリ:blender

Blender のバージョンは 2.75.

スクリプトの実行方法

テキストエディタにコードを入力し,スクリプト実行を押すのが簡単だ.

run script
スクリプトの実行

このときテキストの拡張子を .py にして登録にチェックを入れると, 次回ファイルを開いた時に自動的にスクリプトが実行される.

auto run
ファイルを開いた時にスクリプトを自動実行

これはリグを配布するとき等に必須になるが,脆弱性の原因にもなる. なのでデフォルトでは自動実行はされないようになっている. 自動実行を有効にするには Ctrl + Alt + U でユーザー設定を開き,ファイルタブの Python スクリプトの自動実行にチェックを入れる.

enable auto run
スクリプトの自動実行を有効にする

カスタムボタンの作成

以下のコードはカスタムボタンクラスだ. ボタンの文字が text で,押すとコンソールに pushed を表示する. 一番最後の行はクラスの登録を行う. 登録しないとオペレーターも UI を表示するパネルも使えない. この最後の行はスクリプト内のすべてのクラスを登録する. パネルに配置しないと表示できないので,このまま実行しても何もおこらない.

このオペレーターをパネルの draw から呼び出せばボタンが表示される. self.layout.operator("bl_idname に設定した名前") で呼び出せる.

UI を配置する

以下のコードは Properties Shelf にボタンを表示する. ボタンのコードにクラス UI を追加しただけだ.

実行結果
実行結果

クラスの bl_region_type プロパティによってどこに表示されるかがきまる. 文字列と配置場所との対応は以下のようになっている.

bl_region_type
bl_region_type とその配置場所

具体的には以下のようになる.

bl_region_type が "TOOLS" のとき,タブの文字を bl_category で指定できる.

特定のオブジェクトが選択されているときだけ表示する

poll クラスメソッドを使う. 以下のコードは選択されているオブジェクトがメッシュで名前が Cube の時だけ UI を表示する.

レイアウト

ボタンを横に並べる

ボタンを横に並べる
ボタンを横に並べる

以降は draw の内容だけを書く.

ボタンを左揃えで配置

左揃え
左揃え

グループ化

グループ化
グループ化

ラベルとアイコン

ラベルとアイコン
ラベルとアイコン

ポップアップ

ポップアップ
ポップアップ

以下のコードはボタンが押されたときポップアップウインドウを表示する. execute はダイアログの OK が押されたときに呼ばれる. キャンセルしたいときはダイアログ外をクリックする.

そのほかのコード

現在のモードを調べる

  context.active_object.mode == 'POSE'

モードの変更

  bpy.ops.object.mode_set(mode='OBJECT')

Blender のテキストウインドウにテキストを出力

  t = bpy.data.texts.new('new text')
  t.write(text='test')

シーンからオブジェクトを削除

  o = bpy.context.active_object
  bpy.context.scene.objects.unlink(o)

ボーン

ボーンは以下の三種類の方法でアクセスできる. エディットモードで行う作業は edit_bones, ポーズモードで行う作業は pose.bones で行う.

  bpy.data.objects['Armature'].data.bones
  bpy.data.objects['Armature'].data.edit_bones
  bpy.data.objects['Armature'].pose.bones

アーマチュアの追加

  bpy.ops.object.add(type='ARMATURE', enter_editmode=True, location=(0,0,0))

ボーンの追加

ボーンの追加はエディットモードで行う.

  bpy.ops.object.mode_set(mode='EDIT')
  bone = bpy.data.objects['Armature'].data.edit_bones.new('Bone')
  bone.head = (0,0,0)
  bone.tail = (0,0,1)
  
  #デフォームを使わない
  bone.use_deform = False

ポーズボーンのパス

  bpy.data.objects['Armature'].pose.bones

ポーズボーンのローカル座標

  bpy.data.objects['Armature'].pose.bones['Bone'].location

ポーズボーンのローカル回転

以下の回転モードがある.

  • rotation_axis_angle
  • rotation_euler
  • rotation_quaternion
  bpy.data.objects['Armature'].pose.bones['Bone'].rotation_quaternion

回転モードは rotation_mode で調べられる.

  if bpy.data.objects['Armature'].pose.bones['Bone'].rotation_mode == 'QUATERNION':

ポーズボーンのアーマチュア座標

head や tail はアーマチュア座標で表示される. ポーズボーンの位置が必要な時は head を使えばいい.

  bpy.data.objects['Armature'].pose.bones['Bone'].head

ポーズボーンのワールド座標

ボーンのアーマチュア座標をアーマチュアのワールド行列で変換すると得られる.

  amt = bpy.data.objects['Armature']
  amt.matrix_world * amt.pose.bones['Bone'].head

ポーズボーンを隠す

  bpy.data.objects['Armature'].pose.bones['Bone'].bone.hide = True

ポーズボーンの選択

  bpy.data.objects['Armature'].pose.bones['Bone'].bone.select = True

位置回転スケールのロック

  pose_bone = bpy.data.objects['Armature'].pose.bones['Bone']
  pose_bone.lock_location = [True]*3
  pose_bone.lock_scale = [True]*3
  pose_bone.lock_rotation = [True]*3
  pose_bone.lock_rotation_w = True

関連リンク

公式ドキュメントにはより複雑なボタン配置やそのほかの機能が紹介されている. http://wiki.blender.org/index.php/Dev:Py/Scripts/Cookbook/Code_snippets/Interface

オブジェクトを作る3つの方法

from_pydata を使ったメッシュの作成例

スクリプトをプラグインにするには [Blender] Blenderプラグインの作り方 を参照.

[Blender] アドオンのインストール・アップデート・アンインストール方法のまとめ

Blender 記事の目次