目次
- 1 使い方
- 2 メニューを作成する
- 3 メニューに項目を追加する
- 4 メニューを置き換える
- 5 ダイアログ/ポップアップを表示する
- 6 パネルを作成する
- 7 サブパネル
- 8 列/行を作成する (column / row)
- 9 グリッドフロー (grid_flow / column_flow)
- 10 スプリット (split)
- 11 プロパティ欄を作成する (prop)
- 12 オブジェクトを選択する
- 13 ドロップダウンリストを作成する
- 14 GUI を作成する
- 15 アイコンを表示する
- 16 項目に色を付ける (alert)
- 17 項目の順序
- 18 パイメニューを作成する
- 19 メニューからパイメニューを開く
- 20 パネルを条件に応じて表示する (poll)
- 21 パネルを一時的に無効化する
- 22 モジュールの読み込み順/パネルの順序
- 23 パネルを動的に登録する
- 24 サイドバータブ
- 25 スペシャルメニューに項目を追加する
- 26 パネル (Panel)
- 27 イベント (Event)
- 28 prop_search
- 29 メッセージを出力する (report)
- 30 プログレスバー
- 31 ヘッダー
- 32 UILayout
- 33 UIList
- 34 Tips
- 35 まとめ
- 36 Blender Icons
- 37 Icon Viewer
- 38 Layout Practice
使い方
参考:
Blender の UI を制御する | はじめての Blender アドオン開発
How to create a custom UI? – Blender Stack Exchange
メニューを作成する
参考:
Menu | Blender Python API [Official]
メニューに項目を追加する
サブメニューを追加する。
class EXAMPLE_MT_sub_menu(bpy.types.Menu):
bl_idname = 'example.sub_menu'
bl_label = "Sub Menu"
bl_description = "Example Sub Menu"
def draw(self, context):
layout = self.layout
layout.operator('transform.resize')
def menu_func(self, context):
layout = self.laytout
layout.separator()
layout.menu('example.sub_menu')
def register():
bpy.utils.register_class(EXAMPLE_MT_sub_menu)
bpy.types.EXAMPLE_MT_main_menu.append(menu_func)
def def unregister():
bpy.utils.unregister_class(EXAMPLE_MT_sub_menu)
bpy.types.EXAMPLE_MT_main_menu.remove(menu_func)
Code language: Python (python)
参考:
サブメニューを作成する | はじめての Blender アドオン開発
Official keymap example does not work? – Blender Developer Talk
How to add a custom object entry to the add menu? – Blender Stack Exchange
How to add a custom menu item to the object menu? – Blender Stack Exchange
Deleting unwanted New objects in the “add Object” menu – Blender Stack Exchange
Operator docstrings displayed on buttons, not in search mode – Blender Stack Exchange
メニューを置き換える
参考:
How to delete an existing menu? – Blender Stack Exchange
ダイアログ/ポップアップを表示する
参考:
Blender の UI を制御する 3 | はじめての Blender アドオン開発
Blender でボタンが押されたときポップアップウインドウを表示する (dskjal) – GitHub Gist
Creating pop-up panels with user UI in Blender add-on | Interplanety
Dialog Box | Blender Python API [Official]
パネルを作成する
サイドバーパネル
class MYTOOL_PT_render(bpy.types.Panel):
"""My Tool"""
bl_idname = "MYTOOL_PT_render"
bl_label = "Render"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = "My Tool"
def draw(self, context):
layout = self.layout
scene = context.scene
layout.label(text="Size:")
row = layout.row(align=True)
row.prop(scene, "resolution_x")
row.prop(scene, "resolution_y")
layout.label(text="Are You Ready?:")
row = layout.row()
row.scale_y = 1.5
row.operator("render.render")
def register():
bpy.utils.register_class(MYTOOL_PT_render)
def unregister():
bpy.utils.unregister_class(MYTOOL_PT_render)
if __name__ == "__main__":
register()
Code language: Python (python)
参考:
Blender 2.8 の Python 実行で UI パネルを追加する | MR が楽しい
Blender 2.8 で UI パネルに自作のプロパティを追加する | MR が楽しい
bpy.types.Panel | Blender Python API [Official]
How to change the location of an addon in the UI – Blender Stack Exchange
コード:
templates_py/ui_tool_simple.py – blender/blender – GitHub
templates_py/ui_panel.py – blender/blender – GitHub
サブパネル
パネルを実装するクラスで、bl_parent_id
を指定する。
class VIEW3D_PT_overlay_example(bpy.types.Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'HEADER'
bl_parent_id = 'VIEW3D_PT_overlay'
bl_label = "Example"
@classmethod
def poll(cls, context):
return context.active_object and context.active_object.type == 'MESH'
def draw(self, context):
layout = self.layout
col = layout.column()
col.label(text="Hello, World")
def register():
bpy.utils.register_class(VIEW3D_PT_overlay_example)
def unregister():
bpy.utils.unregister_class(VIEW3D_PT_overlay_example)
Code language: Python (python)
参考:
bpy.types.Panel.bl_parent_id | Blender Python API [Official]
How can I know if a panel is the parent of other subpanels? – Blender Stack Exchange
Best way to store options for panels – Blender Stack Exchange
列/行を作成する (column / row)
参考:
User interface elements alignment by columns | Interplanety
User Interface Layout – Best Practice | Blender Python API [Official]
How do I use multiple columns in my add-on UI? – Blender Stack Exchange
グリッドフロー (grid_flow / column_flow)
参考:
bpy.types.UILayout.grid_flow | Blender Python API [Official]
bpy.types.UILayout.column_flow | Blender Python API [Official]
Column Align – Blender Stack Exchange
スプリット (split)
参考:
bpy.types.UILayout.split | Blender Python API [Official]
bpy.types.UILayout.use_property_split | Blender Python API [Official]
keeping a UIlayout box a specific width percentage – Blender Artists Community
How to control spacing/alignment of Label + Horizontal Enum Property? – Blender Stack Exchange
how to create UIList with auto-aligned three columns? – Blender Stack Exchange
プロパティ欄を作成する (prop)
必須
- data
- property
任意
- text
- text_ctxt
- translate
- icon
- expand
- slider
- toggle
- icon_only
- event
- full_event
- emboss
- index
- icon_value
- invert_checkbox
参考:
bpy.types.UILayout.prop | Blender Python API [Official]
オブジェクトを選択する
スポイトアイコン付きのオブジェクト選択欄を作成する。
参考:
Object selection box with eyedropper – Blender Stack Exchange
Make the eyedropper tool available in add-ons via Python – Right-Click Select
ドロップダウンリストを作成する
参考:
create drop-down list in menu panel – Blender Stack Exchange
GUI を作成する
参考:
Addon のチェックボックスの追加とプロパティへのアクセス | ぬの部屋 (仮)
Code Snippets/Interface | wiki.blender.jp
アイコンを表示する
- 使用できるアイコンを確認する → Icon Viewer
- オンラインで探す → Blendicons
参考:
UILayout.prop | Blender Python API [Official]
UILayout.label | Blender Python API [Official]
New icons for Blender 2.8x – Blender Developer Talk [Official]
2.8 Outlined/Coloured Icon Adaptation – Blender Developer Talk [Official]
Colored icons in add-on – Blender Developer Talk [Official]
New icons for Blender 2.8 – Blender Artists Community
2.8 Outlined/Coloured Icon Adaptation – Blender Artists Community
How to edit 2.8 UI icons? – Blender Stack Exchange
項目に色を付ける (alert)
参考:
In Python is it possible to change the background color of a property ui? – Blender Stack Exchange
項目の順序
append
:最後に追加するprepend
:最初に追加する
コード:
append – bpy_types.py at 2e06c223cc – GitHub
prepend – bpy_types.py at 2e06c223cc – GitHub
_GenericUI – bpy_types.py at 2e06c223cc – GitHub
参考:
Rearranging elements of a panel – Blender Stack Exchange
パイメニューを作成する
参考:
Blender でオリジナルのマーキングメニューを作成する方法 | Harkerblog
Permanently expanded submenu in pie menu – Blender Artists Community
Is there a way to add a custom Pie Menu in 2.8? – Blender Stack Exchange
Pie Menus with custom positions – Blender Stack Exchange
How to properly overwrite Blender default keys with Pie Menu hotkeys – Blender Stack Exchange
Mesh / Object Mode with Pie menu? – Blender Stack Exchange
Make a Pie-Specials Menu, dependent on selection type – Blender Stack Exchange
Can the mesh select mode menu converted to a pie menu in Blender 2.72? – Blender Stack Exchange
メニューからパイメニューを開く
オブジェクトコンテキストメニューからスナップパイメニューを開く。
import bpy
def custom_memu(self, context):
layout = self.layout
op = layout.operator("wm.call_menu_pie", text="Snap")
op.name = "VIEW3D_MT_snap_pie"
layout.separator()
def register():
bpy.types.VIEW3D_MT_object_context_menu.prepend(custom_menu)
def unregister():
bpy.types.VIEW3D_MT_object_context_menu.remove(custom_menu)
if __name__ == '__main__':
register()
Code language: Python (python)
参考:
pie menu inside pie menu – Blender Stack Exchange
パネルを条件に応じて表示する (poll)
条件を判定してパネルの表示・非表示を切り替えるにはクラスメソッド poll
を定義する。
@classmethod
def poll(cls, context):
return context.object is not None
Code language: Python (python)
コード:
Blender で選択されているオブジェクトがメッシュで名前が Cube の時だけ UI を表示する (dskjal) – GitHub Gist
参考:
Simple Object Panel | Blender Python API [Official]
パネルを一時的に無効化する
enabled
プロパティに False
を指定する。
class MYTOOL_PT_test(bpy.types.Panel)
# ...
def draw(self, context)
layout = self.layout
col = layout.column()
col.enabled = False
col.prop(scene, ...)
Code language: Python (python)
参考:
UILayout.enabled | Blender Python API [Official]
How to disable a single component in a custom panel? – Blender Artists Community
モジュールの読み込み順/パネルの順序
参考:
How to know the order in which scripts are loaded? – Blender Artists Community
How I can define the order of the panels? – Blender Stack Exchange
パネルを動的に登録する
参考:
Change Blender’s Preferences Dynamically – Blender Stack Exchange
サイドバータブ
参考:
Human Interface Guidelines/Sidebar Tabs | Blender Developer Wiki [Official]
Trouble with Vertical Toolbar Tabs! Any idea or script to fix this mess? – Blender Artists Community
Remove addons from tabs in 3d window – Blender Stack Exchange
N Panel Tab Clutter – Right-Click Select
Right Toolbar needs improvment in 2.8 – Right-Click Select
More options for reordering Workspaces and Sidebar tabs – Right-Click Select
The Toolbar/Sidebar Interface Issue – Blender Developer Talk [Official]
sidebar custom colors for tabs – Blender Stack Exchange
スペシャルメニューに項目を追加する
参考:
スペシャルメニューに任意のメニューを追加するアドオンを作る方法 | 気まぐれブロマガ
Blender 2.8: Where is the Specials Menu? | Blender 3D Architect
パネル (Panel)
bl_region_type
:表示形態を指定する
WINDOW
HEADER
CHANNELS
TEMPORARY
UI
TOOLS
TOOL_PROPS
PREVIEW
HUD
NAVIGATION_BAR
EXECUTE
FOOTER
TOOL_HEADER
bl_space_type
:表示するエディター/場所を指定する
VIEW_3D
IMAGE_EDITOR
NODE_EDITOR
SEQUENCE_EDITOR
CLIP_EDITOR
DOPESHEET_EDITOR
GRAPH_EDITOR
NLA_EDITOR
TEXT_EDITOR
CONSOLE
INFO
TOPBAR
STATUSBAR
OUTLINER
PROPERTIES
FILE_BROWSER
SPREADSHEET
PREFERENCES
参考:
Creating panels for placing Blender add-ons user interface (UI) | Interplanety
Panel (bpy.types.Panel) | Blender Python API [Official]
How to change the location of an addon in the UI – Blender Stack Exchange
イベント (Event)
参考:
スクリプトでマウスやキーボードのイベントを扱う方法 – Qiita
Event (bpy.types.Event) | Blender Python API [Official]
prop_search
参考:
prop_search の使い方 | blender-script メモ
Object selection box in addon – Blender Stack Exchange
Limit “prop_search” to Specific Types of Objects – Blender Stack Exchange
Search custom properties in objects on the scene – Blender Stack Exchange
メッセージを出力する (report)
参考:
Blender 2.8 で UI パネルの処理にエラーメッセージの表示を追加する | MR が楽しい
bpy.types.Operator.report | Blender Python API [Official]
Is it possible to print to the Report window in the Info view? – Blender Stack Exchange
How to script add-on info and warnings? – Blender Stack Exchange
プログレスバー
参考:
How to show to the user a progression in a script? – Blender Stack Exchange
ヘッダー
参考:
Timeline header python modification – Blender Stack Exchange
Add custom menu at specific location in the header – Blender Stack Exchange
UILayout
参考:
UILayout | Blender Python API [Official]
UIList
参考:
UIList | Blender Python API [Official]
Tips
参考:
User Interface Layout – Best Practice | Blender Python API [Official]
List Manipulation – Best Practice | Blender Python API [Official]
まとめ
参考:
アドオンのメニューを追加する/既存メニューを完全に置き換える/他アドオンのメニューも保持する | 忘却まとめ
メニューの作り方/様々なレイアウト要素の紹介 | 忘却まとめ
Cookbook/Code snippets/Interface | BlenderWiki (archive)
Blender Icons
リポジトリ:
Shrinks99/blender-icons: Blender’s icons have all been stored in a single svg file – GitHub
デモ:
Blendicons (wilkinson.graphics)
Icon Viewer
テキストエディター
サイドバーで「Dev」タブを開いて、「Icon Viewer」パネルでアイコン一覧を確認する。
Python コンソール
ヘッダーの「Icon Viewer」ボタンを押して、ダイアログでアイコン一覧を確認する。
ドキュメント:
Icon Viewer | Blender Manual [Official]
参考:
Blender 2.8 で Icon Viewer を使ってアイコンの ID を確認する | MR が楽しい
Icon Viewer – 標準装備アイコンの名前を確認できる | CGrad Project
Layout Practice
学習用サンプル
入手:
Layout Practice – UI Layoutを学習するアドオン | Gumroad
UI Layout を学習するアドオン | Bookyakuno
参考: