dskjal
広告
広告

Blender 2.79 の UI スクリプト集

カテゴリ:blender

Blender 2.80 ではスクリプトの書き方が大きく変更された。従来のスクリプトは Blender 2.80 では動作しない。古いスクリプトを 2.80 に移植する方法はBlender 2.79 のスクリプトを 2.80 にアップデートするを参照。

スクリプトの実行方法

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

スクリプトの実行

スクリプトの実行

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

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

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

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

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

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

カスタムボタンの作成

以下のコードはカスタムボタンクラスだ。ボタンの文字が text で、押すとコンソールに pushed を表示する。一番最後の行はクラスの登録を行う。登録しないとオペレーターも UI を表示するパネルも使えない。

この最後の行はスクリプト内のすべてのクラスを登録する。パネルに配置しないと表示できないので、このまま実行しても何もおこらない。

このオペレーターをパネルの draw から呼び出せばボタンが表示される。

self.layout.operator("bl_idname に設定した名前") で呼び出せる。

UI を配置する

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

実行結果

実行結果

Blender 2.8 から bpy.utils.register_module(__name__) が使えなくなった。そのため登録が必要なクラスのタプル(上記のコードでは classes)を作成し、ループでひとつずつクラスを登録している。

UI の配置場所

クラスの bl_region_type プロパティによってどこに表示されるかがきまる。

文字列と配置場所との対応は以下のようになっている。

bl_region_type とその配置場所

bl_region_type とその配置場所

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

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

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

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

レイアウト

ボタンを横に並べる

ボタンを横に並べる

ボタンを横に並べる

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

ボタンを左揃えで配置

左揃え

左揃え

グループ化

グループ化

グループ化

ラベルとアイコン

ラベルとアイコン

ラベルとアイコン

ポップアップ

ポップアップ

ポップアップ

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

開閉パネル

class MY_PROPS(bpy.types.PropertyGroup):
    ui_is_open : bpy.props.BoolProperty(name='ui_is_open', default=True)

class MYUI_PT_UI(bpy.types.Panel):
    def draw(self, context):
        my_props = bpy.types.Scene.my_props
        col = self.layout.column(align=True)
        col.prop(my_props, 'ui_is_open', text='見出しテキスト', icon='TRIA_DOWN' if my_props.ui_is_open else 'TRIA_RIGHT', emboss=False)
        if my_props.lineart_ui_is_open:
            # ここに中身を書く

classes = (
  MY_PROPS,
  MYUI_PT_UI
)
def register():
    for cls in classes:
        bpy.utils.register_class(cls)
    bpy.types.Scene.my_props = bpy.props.PointerProperty(type=MY_PROPS)

def unregister():
    if hasattr(bpy.types.Scene, "my_props"): del bpy.types.Scene.my_props
    for cls in classes:
        bpy.utils.unregister_class(cls)

if __name__ == "__main__":
    register()

そのほかのコード

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

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

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

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

現在のモードの保存

# 古いモードの保存
old_mode = bpy.context.object.mode

# モードの設定
bpy.ops.object.mode_set(mode=old_mode)

関連リンク

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

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

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

メッシュやボーン関連

Blender PythonのMeshデータアクセスのチートシート

Blender Python のボーンアクセスチートシート

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

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

Blender 記事の目次


広告
広告

カテゴリ